#1 added clouds support

master
Arturas Norkus 2018-04-14 16:15:16 +03:00
parent 16037f0a78
commit ce01877bbf
7 changed files with 444 additions and 293 deletions

View File

@ -1,50 +1,81 @@
# Skylayer
Minetest utility mod to help manage sky transitions. Mod includes smooth transition between users given base sky colors (for plain sky type). Tracks multiple sky definitions and display latest one. Each player have own list of sky layers.
## FAQ
Does this mod support sun or clouds?
- No. Only plain sky color and skybox images based sky is supported (no sun, clouds, moon and etc).
## Usage samples
Expected to be configured by other mods. See demo.lua for detailed examples with chat commands. Demo by default is disabled and can be enabled by uncommenting file include inside init.lua.
### Sample with commented parameters
```
local sl = {}
sl.name = "sample_sky_with_clouds"
sl.sky_data = {
-- These parameters used for minetest set_sky api,
-- please refer MT lua_api docs for parameter details.
bgcolor = {r=0, g=100, b=255}, -- table, color in RGB format, optional.
type = "plain", -- string, available types: regular, skybox, plain.
textures = nil, -- table, textures for skybox type.
clouds = true, -- boolean, flag if clouds should appear in front of "skybox" or "plain" types.
-- These optional parameter are skylayer specific,
-- if set they may override parameters above.
gradient_colors = {{r=68, g=34, b=153}, {r=68, g=68, b=221}}, -- table, color points used to create gradient based on world time, if set bgcolor will be overrided by color generated from gradient
gradient_min_value = 0, -- number, works like gradient start point offset from starting point
gradient_max_value = 1000, -- number, works like gradient end point from starting point
}
sl.clouds_data = {
-- These optional parameters used for minetest set_clouds api,
-- please refer MT lua_api docs for paramater details.
density = 0.4, -- number, clouds density from 0 (no clouds) to 1 (full clouds).
color = "#fff0f0e5", -- string, basic cloud color with alpha channel.
ambient = "#000000", -- string, cloud color lower bound.
height = 120, -- number, cloud height
thickness = 16, -- number, cloud thickness in nodes.
speed = {x=5, z=-40}, -- table, speed + direction in nodes per second.
-- These optional parameter are skylayer specific,
-- if set they may override parameters above.
gradient_colors = {{r=68, g=34, b=153}, {r=68, g=68, b=221}}, -- table, color points used to create gradient based on world time, if set color will be overrided by color generated from gradient
gradient_min_value = 0, -- number, works like gradient start point offset from starting point
gradient_max_value = 1000, -- number, works like gradient end point from starting point
}
skylayer.add_layer(player_name, sl)
```
### Gradient supported sky definition sample
```
local sl = {}
sl.layer_type = skylayer.SKY_PLAIN
sl.name = "plain_sample_sky"
sl.data = {gradient_data={}}
sl.data.gradient_data.colors = {
{r=68, g=34, b=153},
{r=254, g=174, b=45},
{r=59, g=12, b=189}
sl.sky_data = {
gradient_colors = {
{r=68, g=34, b=153},
{r=254, g=174, b=45},
{r=59, g=12, b=189}
}
}
sl.data.gradient_data.min_value = 0
sl.data.gradient_data.max_value = 1000
skylayer.add_layer(player_name, sl)
```
### Single solid color sky (no smooth transition)
```
local sl = {}
sl.layer_type = skylayer.SKY_SOLID_COLOR
sl.name = "solid_black"
sl.data = {}
sl.data.color = {r=0, g=0, b=0}
sl.sky_data = {
bgcolor = {r=0, g=0, b=0}
}
skylayer.add_layer(player_name, sl)
```
### Skybox image based sky
```
local sl = {}
sl.layer_type = skylayer.SKY_SKYBOX
sl.name = "stars_sky"
sl.data = {}
sl.data.skybox = {
{r=0, g=0, b=0},
"skybox",
{
sl.sky_data = {
bgcolor = {r=0, g=0, b=0},
type = "skybox",
textures = {
"skylayer_demo_stars_sky.png",
"skylayer_demo_stars_sky.png",
"skylayer_demo_stars_sky.png",

228
api.lua
View File

@ -5,195 +5,15 @@
-- Credits: xeranas
-------------------------
-- include skylayer core functions
local modpath = minetest.get_modpath("skylayer");
local core = dofile(modpath.."/core.lua")
skylayer = {}
-- flag for enable / disable skylayer temporally if needed
skylayer.enabled = true
-- supported skylayer types
skylayer.SKY_PLAIN = "plain"
skylayer.SKY_SOLID_COLOR = "solid_color"
skylayer.SKY_SKYBOX = "skybox"
-- helps track total dtime
local timer = 0
local gradient_default_min_value = 0
local gradient_default_max_value = 1000
-- how often sky will be updated in seconds
skylayer.update_interval = 4
-- keeps player related data such as player itself and own sky layers
local sky_players = {}
-- adds player to sky layer affected players list
local add_player = function(player)
local data = {}
data.id = player:get_player_name()
data.player = player
data.skylayers = {}
table.insert(sky_players, data)
end
-- remove player from sky layer affected players list
local remove_player = function(player_name)
if #sky_players == 0 then
return
end
for k, player_data in ipairs(sky_players) do
if player_data.id == player_name then
set_default_sky(player_data.player)
table.remove(sky_players, k)
return
end
end
end
local get_player_by_name = function(player_name)
if player_name == nil then
return nil
end
if #minetest.get_connected_players() == 0 then
return nil
end
for i, player in ipairs(minetest.get_connected_players()) do
if player:get_player_name() == player_name then
return player
end
end
return nil
end
local get_player_data = function(player_name)
if #sky_players == 0 then
return nil
end
for k, player_data in ipairs(sky_players) do
if player_data.id == player_name then
return player_data
end
end
end
local create_new_player_data = function(player_name)
local player_data = get_player_data(player_name)
if player_data == nil then
local player = get_player_by_name(player_name)
if player == nil then
minetest.log("error", "Fail to resolve player '" .. player_name .. "'")
return
end
add_player(player)
return get_player_data(player_name)
end
return player_data
end
-- sets default / regular sky for player
local set_default_sky = function(player)
player:set_sky(nil, "regular", nil)
end
-- resolves latest skylayer based on added layer time
local get_latest_layer = function(layers)
if #layers == 0 then
return nil
end
local latest_layer = nil
for k, layer in ipairs(layers) do
if latest_layer == nil then
latest_layer = layer
else
if layer.added_time >= latest_layer.added_time then
latest_layer = layer
end
end
end
return latest_layer
end
local convert_to_rgb = function(minval, maxval, current_val, colors)
local max_index = #colors - 1
local val = (current_val-minval) / (maxval-minval) * max_index + 1.0
local index1 = math.floor(val)
local index2 = math.min(math.floor(val)+1, max_index + 1)
local f = val - index1
local c1 = colors[index1]
local c2 = colors[index2]
return {
r=math.floor(c1.r + f*(c2.r - c1.r)),
g=math.floor(c1.g + f*(c2.g-c1.g)),
b=math.floor(c1.b + f*(c2.b - c1.b))
}
end
-- Returns current layer color in {r, g, b} format
local get_current_layer_color = function(layer_data)
-- min timeofday value 0; max timeofday value 1. So sky color gradient range will be between 0 and 1 * skycolor.max_value.
local timeofday = minetest.get_timeofday()
local min_val = layer_data.gradient_data.min_value
if min_val == nil then
min_val = gradient_default_min_value
end
local max_val = layer_data.gradient_data.max_value
if max_val == nil then
max_val = gradient_default_max_value
end
local rounded_time = math.floor(timeofday * max_val)
local gradient_colors = layer_data.gradient_data.colors
local color = convert_to_rgb(min_val, max_val, rounded_time, gradient_colors)
return color
end
local update_plain_sky = function(player, layer_data)
local color = get_current_layer_color(layer_data)
player:set_sky(color, "plain", nil, false)
end
local update_solid_color_sky = function(player, layer_data)
player:set_sky(layer_data.color, "plain", nil, false)
end
local update_skybox_sky = function(player, layer_data)
player:set_sky(layer_data.skybox[1], layer_data.skybox[2], layer_data.skybox[3])
end
local update_sky = function(player, timer)
local player_data = get_player_data(player:get_player_name())
if player_data == nil then return end
local current_layer = get_latest_layer(player_data.skylayers)
if current_layer == nil then
return
end
if current_layer.updated == false or timer >= skylayer.update_interval then
current_layer.updated = os.time()
if current_layer.layer_type == skylayer.SKY_PLAIN then
update_plain_sky(player, current_layer.data)
return
end
if current_layer.layer_type == skylayer.SKY_SOLID_COLOR then
update_solid_color_sky(player, current_layer.data)
return
end
if current_layer.layer_type == skylayer.SKY_SKYBOX then
update_skybox_sky(player, current_layer.data)
return
end
end
-- set flag for enable / disable skylayer
skylayer.is_enabled = function(enabled)
core.settings.enabled = enabled
end
skylayer.add_layer = function(player_name, layer)
@ -202,9 +22,9 @@ skylayer.add_layer = function(player_name, layer)
return
end
local player_data = get_player_data(player_name)
local player_data = core.get_player_data(player_name)
if player_data == nil then
player_data = create_new_player_data(player_name)
player_data = core.create_new_player_data(player_name)
end
if player_data == nil then
@ -217,7 +37,7 @@ skylayer.add_layer = function(player_name, layer)
end
skylayer.remove_layer = function(player_name, layer_name)
local player_data = get_player_data(player_name)
local player_data = core.get_player_data(player_name)
if player_data == nil or player_data.skylayers == nil then
return
end
@ -230,36 +50,12 @@ skylayer.remove_layer = function(player_name, layer_name)
if layer.name == layer_name then
table.remove(player_data.skylayers, k)
if #player_data.skylayers == 0 then
local player = get_player_by_name(player_name)
local player = core.get_player_by_name(player_name)
if player ~= nil then
set_default_sky(player)
core.set_default_sky(player)
end
end
return
end
end
end
minetest.register_globalstep(function(dtime)
if skylayer.enabled == false then
return
end
if #minetest.get_connected_players() == 0 then
return
end
-- timer addition calculated outside of players loop
timer = timer + dtime;
for k, player in ipairs(minetest.get_connected_players()) do
update_sky(player, timer)
end
-- reset timer outside of loop to make sure that all players sky will be updated
if timer >= skylayer.update_interval then
timer = 0
end
end)

252
core.lua Normal file
View File

@ -0,0 +1,252 @@
-------------------------
-- Sky Layers: Core
-- License: MIT
-- Credits: xeranas
-- Thanks: Perkovec for colorise utils (github.com/Perkovec/colorise-lua)
-------------------------
local modpath = minetest.get_modpath("skylayer");
local colorise = dofile(modpath.."/thirdparty/colorise-lua/colorise.lua")
local core = {}
core.settings = {}
-- flag to disable skylayer at global step
core.settings.enabled = true
-- default gradient interval values
core.settings.gradient_default_min_value = 0
core.settings.gradient_default_max_value = 1000
-- how often sky will be updated in seconds
core.settings.update_interval = 4
-- helps track total dtime
core.timer = 0
core.default_clouds = nil
-- keeps player related data such as player itself and own sky layers
core.sky_players = {}
-- adds player to sky layer affected players list
core.add_player = function(player)
local data = {}
data.id = player:get_player_name()
data.player = player
data.skylayers = {}
table.insert(core.sky_players, data)
end
-- remove player from sky layer affected players list
core.remove_player = function(player_name)
if #core.sky_players == 0 then
return
end
for k, player_data in ipairs(core.sky_players) do
if player_data.id == player_name then
set_default_sky(player_data.player)
table.remove(core.sky_players, k)
return
end
end
end
core.get_player_by_name = function(player_name)
if player_name == nil then
return nil
end
if #minetest.get_connected_players() == 0 then
return nil
end
for i, player in ipairs(minetest.get_connected_players()) do
if player:get_player_name() == player_name then
return player
end
end
return nil
end
core.get_player_data = function(player_name)
if #core.sky_players == 0 then
return nil
end
for k, player_data in ipairs(core.sky_players) do
if player_data.id == player_name then
return player_data
end
end
end
core.create_new_player_data = function(player_name)
local player_data = core.get_player_data(player_name)
if player_data == nil then
local player = core.get_player_by_name(player_name)
if player == nil then
minetest.log("error", "Fail to resolve player '" .. player_name .. "'")
return
end
core.add_player(player)
return core.get_player_data(player_name)
end
return player_data
end
-- sets default / regular sky for player
core.set_default_sky = function(player)
player:set_sky(nil, "regular", nil)
player:set_clouds(core.default_clouds)
end
-- resolves latest skylayer based on added layer time
core.get_latest_layer = function(layers)
if #layers == 0 then
return nil
end
local latest_layer = nil
for k, layer in ipairs(layers) do
if latest_layer == nil then
latest_layer = layer
else
if layer.added_time >= latest_layer.added_time then
latest_layer = layer
end
end
end
return latest_layer
end
core.convert_to_rgb = function(minval, maxval, current_val, colors)
local max_index = #colors - 1
local val = (current_val-minval) / (maxval-minval) * max_index + 1.0
local index1 = math.floor(val)
local index2 = math.min(math.floor(val)+1, max_index + 1)
local f = val - index1
local c1 = colors[index1]
local c2 = colors[index2]
return {
r=math.floor(c1.r + f*(c2.r - c1.r)),
g=math.floor(c1.g + f*(c2.g-c1.g)),
b=math.floor(c1.b + f*(c2.b - c1.b))
}
end
-- Returns current gradient color in {r, g, b} format
core.calculate_current_gradient_color = function(gradient_colors, min_val, max_val)
if gradient_colors == nil then return nil end
local timeofday = minetest.get_timeofday()
if min_val == nil then
min_val = core.settings.gradient_default_min_value
end
if max_val == nil then
max_val = core.settings.gradient_default_max_value
end
local rounded_time = math.floor(timeofday * max_val)
return core.convert_to_rgb(min_val, max_val, rounded_time, gradient_colors)
end
-- Returns current sky color in {r, g, b} format
core.get_current_layer_color = function(gradient_colors, min_val, max_val)
return core.calculate_current_gradient_color(gradient_colors, min_val, max_val)
end
-- Returns current cloud color in hex format
core.get_current_cloud_color = function(gradient_colors, min_val, max_val)
local rgb_color = core.calculate_current_gradient_color(gradient_colors, min_val, max_val)
if rgb_color == nil then return nil end
return colorise.rgb2hex({rgb_color.r, rgb_color.g, rgb_color.b})
end
core.update_sky_details = function(player, sky_data, clouds_default)
if sky_data == nil then return end
local sky_color = core.get_current_layer_color(
sky_data.gradient_colors,
sky_data.gradient_min_value,
sky_data.gradient_max_value)
local bgcolor = sky_data.bgcolor
if sky_color ~= nil then
bgcolor = sky_color
end
local sky_type = "plain" -- default
if sky_data.type ~= nil then
sky_type = sky_data.type
end
local clouds = clouds_default
if sky_data.clouds ~= nil then
clouds = sky_data.clouds
end
player:set_sky(bgcolor, sky_type, sky_data.textures, clouds)
end
core.update_clouds_details = function(player, clouds_data)
if clouds_data == nil then return end
local cloud_color = core.get_current_cloud_color(
clouds_data.gradient_colors,
clouds_data.gradient_min_value,
clouds_data.gradient_max_value)
if cloud_color == nil then
cloud_color = clouds_data.color
end
player:set_clouds({
color = cloud_color,
density = clouds_data.density,
ambient = clouds_data.ambient,
height = clouds_data.height,
thickness = clouds_data.thickness,
speed = clouds_data.speed})
end
core.update_sky = function(player, timer)
local player_data = core.get_player_data(player:get_player_name())
if player_data == nil then return end
local current_layer = core.get_latest_layer(player_data.skylayers)
if current_layer == nil then
return
end
if skylayer.update_interval == nil then
skylayer.update_interval = core.settings.update_interval
end
if current_layer.updated == false or core.timer >= skylayer.update_interval then
current_layer.updated = os.time()
core.update_sky_details(player, current_layer.sky_data, current_layer.clouds_data ~= nil)
core.update_clouds_details(player, current_layer.clouds_data)
end
end
minetest.register_on_joinplayer(function(player)
if core.default_clouds == nil then
core.default_clouds = player:get_clouds()
end
end)
minetest.register_globalstep(function(dtime)
if core.settings.enabled == false then
return
end
if #minetest.get_connected_players() == 0 then
return
end
-- timer addition calculated outside of players loop
core.timer = core.timer + dtime;
for k, player in ipairs(minetest.get_connected_players()) do
core.update_sky(player, core.timer)
end
-- reset timer outside of loop to make sure that all players sky will be updated
if core.timer >= core.settings.update_interval then
core.timer = 0
end
end)
return core

118
demo.lua
View File

@ -8,70 +8,80 @@
-- Credits: xeranas
-------------------------
local add_rainbow_sky = function(player_name)
local sl = {}
sl.layer_type = skylayer.SKY_PLAIN
sl.name = "rainbow_sky"
sl.data = {gradient_data={}}
sl.data.gradient_data.colors = {
{r=68, g=34, b=153},
{r=59, g=12, b=189},
{r=51, g=17, b=187},
{r=68, g=68, b=221},
{r=17, g=170, b=187},
{r=18, g=189, b=185},
{r=34, g=204, b=170},
{r=105, g=208, b=37},
{r=170, g=204, b=34},
{r=208, g=195, b=16},
{r=204, g=187, b=51},
{r=254, g=174, b=45},
{r=255, g=153, b=51},
{r=255, g=102, b=68},
{r=255, g=68, b=34},
{r=255, g=51, b=17},
{r=248, g=12, b=18},
{r=255, g=51, b=17},
{r=255, g=68, b=34},
{r=255, g=102, b=68},
{r=255, g=153, b=51},
{r=254, g=174, b=45},
{r=204, g=187, b=51},
{r=208, g=195, b=16},
{r=170, g=204, b=34},
{r=105, g=208, b=37},
{r=34, g=204, b=170},
{r=18, g=189, b=185},
{r=17, g=170, b=187},
{r=68, g=68, b=221},
{r=51, g=17, b=187},
{r=59, g=12, b=189}
sl.sky_data = {
gradient_colors = {
{r=68, g=34, b=153},
{r=59, g=12, b=189},
{r=51, g=17, b=187},
{r=68, g=68, b=221},
{r=17, g=170, b=187},
{r=18, g=189, b=185},
{r=34, g=204, b=170},
{r=105, g=208, b=37},
{r=170, g=204, b=34},
{r=208, g=195, b=16},
{r=204, g=187, b=51},
{r=254, g=174, b=45},
{r=255, g=153, b=51},
{r=255, g=102, b=68},
{r=255, g=68, b=34},
{r=255, g=51, b=17},
{r=248, g=12, b=18},
{r=255, g=51, b=17},
{r=255, g=68, b=34},
{r=255, g=102, b=68},
{r=255, g=153, b=51},
{r=254, g=174, b=45},
{r=204, g=187, b=51},
{r=208, g=195, b=16},
{r=170, g=204, b=34},
{r=105, g=208, b=37},
{r=34, g=204, b=170},
{r=18, g=189, b=185},
{r=17, g=170, b=187},
{r=68, g=68, b=221},
{r=51, g=17, b=187},
{r=59, g=12, b=189}
}
}
sl.clouds_data = {
gradient_colors = {
{r=34, g=204, b=170},
{r=105, g=208, b=37},
{r=170, g=204, b=34},
{r=208, g=195, b=16},
{r=204, g=187, b=51},
{r=254, g=174, b=45},
{r=255, g=68, b=34},
{r=255, g=102, b=68},
{r=255, g=153, b=51},
{r=254, g=174, b=45},
{r=59, g=12, b=189}
},
speed = {x=110, z=-400}
}
sl.data.gradient_data.min_value = 0
sl.data.gradient_data.max_value = 1000
skylayer.add_layer(player_name, sl)
end
local add_solid_black_sky = function(player_name)
local sl = {}
sl.layer_type = skylayer.SKY_SOLID_COLOR
sl.name = "solid_black"
sl.data = {}
sl.data.color = {r=0, g=0, b=0}
sl.sky_data = {
bgcolor = {r=0, g=0, b=0}
}
skylayer.add_layer(player_name, sl)
end
local add_stars_sky = function(player_name)
local sl = {}
sl.layer_type = skylayer.SKY_SKYBOX
sl.name = "stars_sky"
sl.data = {}
sl.data.skybox = {
{r=0, g=0, b=0},
"skybox",
{
sl.sky_data = {
bgcolor = {r=0, g=0, b=0},
type = "skybox",
textures = {
"skylayer_demo_stars_sky.png",
"skylayer_demo_stars_sky.png",
"skylayer_demo_stars_sky.png",
@ -83,7 +93,7 @@ local add_stars_sky = function(player_name)
skylayer.add_layer(player_name, sl)
end
minetest.register_chatcommand("sl_add_rainbow_sky", {
minetest.register_chatcommand("sl_demo1_on", {
params = "<player_name>",
description = "Change sky for player",
func = function(name, player_name)
@ -94,7 +104,7 @@ minetest.register_chatcommand("sl_add_rainbow_sky", {
end
})
minetest.register_chatcommand("sl_rm_rainbow_sky", {
minetest.register_chatcommand("sl_demo1_off", {
params = "<player_name>",
description = "Change sky for player",
func = function(name, player_name)
@ -105,7 +115,7 @@ minetest.register_chatcommand("sl_rm_rainbow_sky", {
end
})
minetest.register_chatcommand("sl_add_black_sky", {
minetest.register_chatcommand("sl_demo2_on", {
params = "<player_name>",
description = "Change sky for player",
func = function(name, player_name)
@ -116,7 +126,7 @@ minetest.register_chatcommand("sl_add_black_sky", {
end
})
minetest.register_chatcommand("sl_rm_black_sky", {
minetest.register_chatcommand("sl_demo2_off", {
params = "<player_name>",
description = "Change sky for player",
func = function(name, player_name)
@ -127,7 +137,7 @@ minetest.register_chatcommand("sl_rm_black_sky", {
end
})
minetest.register_chatcommand("sl_add_stars_sky", {
minetest.register_chatcommand("sl_demo3_on", {
params = "<player_name>",
description = "Change sky for player",
func = function(name, player_name)
@ -138,7 +148,7 @@ minetest.register_chatcommand("sl_add_stars_sky", {
end
})
minetest.register_chatcommand("sl_rm_stars_sky", {
minetest.register_chatcommand("sl_demo3_off", {
params = "<player_name>",
description = "Change sky for player",
func = function(name, player_name)

View File

@ -9,4 +9,4 @@ local modpath = minetest.get_modpath("skylayer");
dofile(modpath.."/api.lua")
-- uncomment to enable demo
--dofile(modpath.."/demo.lua")
dofile(modpath.."/demo.lua")

21
thirdparty/colorise-lua/LICENCE vendored Normal file
View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2015
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

41
thirdparty/colorise-lua/colorise.lua vendored Normal file
View File

@ -0,0 +1,41 @@
local c = {}
c.hex2rgb = function (hex)
hex = hex:gsub("#","")
return tonumber("0x"..hex:sub(1,2)), tonumber("0x"..hex:sub(3,4)), tonumber("0x"..hex:sub(5,6))
end
c.hex2rgba = function (hex)
hex = hex:gsub("#","")
return tonumber("0x"..hex:sub(1,2)), tonumber("0x"..hex:sub(3,4)), tonumber("0x"..hex:sub(5,6)), tonumber("0x"..hex:sub(7,8))
end
c.rgb2hex = function (rgb)
local hexadecimal = '#'
for key = 1, #rgb do
local value = rgb[key]
local hex = ''
while(value > 0)do
local index = math.fmod(value, 16) + 1
value = math.floor(value / 16)
hex = string.sub('0123456789ABCDEF', index, index) .. hex
end
if(string.len(hex) == 0)then
hex = '00'
elseif(string.len(hex) == 1)then
hex = '0' .. hex
end
hexadecimal = hexadecimal .. hex
end
return hexadecimal
end
c.rgba2hex = function(rgb)
return c.rgb2hex (rgb)
end
return c