#1 added clouds support
parent
16037f0a78
commit
ce01877bbf
75
README.md
75
README.md
|
@ -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
228
api.lua
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
118
demo.lua
|
@ -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)
|
||||
|
|
2
init.lua
2
init.lua
|
@ -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")
|
||||
|
|
|
@ -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.
|
|
@ -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
|
Loading…
Reference in New Issue