Added support for new minetest sky api features (sky_colors, sun, moon, etc)
parent
569305ff12
commit
cadefd3fd5
|
@ -0,0 +1 @@
|
|||
/.idea/
|
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2016 Artūras Norkus
|
||||
Copyright (c) 2016 rautars
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
236
README.md
236
README.md
|
@ -1,11 +1,189 @@
|
|||
# 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.
|
||||
Minetest utility mod to help manage sky transitions.
|
||||
Mod includes the smooth transition between users given base sky colors (for plain sky type).
|
||||
Tracks multiple sky definitions and display the latest one. Each player has own list of sky layers.
|
||||
|
||||
## Data Structures
|
||||
Skylayer mod related data structures explained.
|
||||
|
||||
`ColorSpec` - a table of color value (0..255) in format `{r, g, b}`, e.g.:
|
||||
|
||||
```
|
||||
{r=68, g=34, b=153}
|
||||
```
|
||||
|
||||
`GradientSpec` - an array of `ColorSpec` that defines gradient points, e.g.:
|
||||
|
||||
```
|
||||
{{r=68, g=34, b=153}, {r=68, g=68, b=221}}
|
||||
```
|
||||
|
||||
`GradientSky` - a table with parameter names matching original minetest lua api `sky_color` table parameters.
|
||||
Main difference is that values are `GradientSpec` type:
|
||||
|
||||
```
|
||||
gradient_sky = {
|
||||
day_sky = GradientSpec,
|
||||
day_horizon = GradientSpec,
|
||||
dawn_sky = GradientSpec,
|
||||
dawn_horizon = GradientSpec,
|
||||
night_sky = GradientSpec,
|
||||
night_horizon = GradientSpec,
|
||||
indoors = GradientSpec,
|
||||
fog_sun_tint = GradientSpec,
|
||||
fog_moon_tint = GradientSpec,
|
||||
}
|
||||
```
|
||||
|
||||
`SkyData` - a table with properties used for directly for `set_sky` with additional `skylayer` mod
|
||||
properties for gradient support.
|
||||
|
||||
```
|
||||
sky_data = {
|
||||
-- same properties as set_sky api:
|
||||
base_color = ..,
|
||||
type = ..,
|
||||
textures = ..,
|
||||
clouds = ..,
|
||||
sky_color = ..,
|
||||
|
||||
-- skylayer-specific properties, if set some of above properties will be overiden:
|
||||
|
||||
-- overrides base_color property with gradient support.
|
||||
gradient_colors = GradientSpec
|
||||
|
||||
-- overrides sky_color properties with gradient support.
|
||||
gradient_sky = {
|
||||
day_sky = GradientSpec,
|
||||
day_horizon = GradientSpec,
|
||||
dawn_sky = GradientSpec,
|
||||
dawn_horizon = GradientSpec,
|
||||
night_sky = GradientSpec,
|
||||
night_horizon = GradientSpec,
|
||||
indoors = GradientSpec,
|
||||
fog_sun_tint = GradientSpec,
|
||||
fog_moon_tint = GradientSpec,
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
`SunData` a table which matches minetest `set_sun` parameters, no `skylayer` specifics.
|
||||
|
||||
`MoonData` a table which matches minetest `set_moon` parameters, no `skylayer` specifics.
|
||||
|
||||
`StarsData` a table with properties used for directly for `set_stars` with additional `skylayer` mod properties for gradient support.
|
||||
|
||||
```
|
||||
stars_data = {
|
||||
-- same set of properties as set_stars api:
|
||||
visible = ..,
|
||||
count = ..,
|
||||
star_color = ..,
|
||||
scale = ..,
|
||||
|
||||
-- skylayer-specific properties, if set some of above properties will be overiden:
|
||||
gradient_star_colors = GradientSpec
|
||||
}
|
||||
```
|
||||
|
||||
`CloundsData` a table with properties used for directly for `set_clouds` with additional `skylayer` mod properties for gradient support.
|
||||
|
||||
```
|
||||
clouds_data = {
|
||||
-- same set of properties as set_clouds api:
|
||||
density = ..,
|
||||
color = ..,
|
||||
ambient = ..,
|
||||
height = ..,
|
||||
height = ..,
|
||||
thickness = ..,
|
||||
speed = ..,
|
||||
|
||||
-- skylayer-specific properties, if set some of above properties will be overiden:
|
||||
gradient_colors = GradientSpec
|
||||
gradient_ambient_colors = GradientSpec
|
||||
}
|
||||
```
|
||||
|
||||
## 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.
|
||||
The Skylayer mod designed to be configured by other mods. See demo.lua for examples and pre-builds commands for quick tests.
|
||||
Demo by default is disabled and can be enabled by uncommenting file include inside init.lua.
|
||||
|
||||
### Gradient plain color with clouds
|
||||
|
||||
### Sample with commented parameters
|
||||
```
|
||||
local sl = {}
|
||||
sl.name = "gradient_plain_with_clouds_sky"
|
||||
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.sun_data = {
|
||||
visible = false
|
||||
}
|
||||
sl.moon_data = {
|
||||
visible = false
|
||||
}
|
||||
skylayer.add_layer(player_name, sl)
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
```
|
||||
-- Datatype:
|
||||
-- GradientSpec - a table in format {ColorSpec, ColorSpec}, (e.g. {{r=68, g=34, b=153}, {r=68, g=68, b=221}}) could be many gradient points.
|
||||
|
||||
|
||||
local sl = {}
|
||||
sl.name = "sample_sky_with_clouds"
|
||||
sl.sky_data = {
|
||||
|
@ -15,11 +193,58 @@ sl.sky_data = {
|
|||
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.
|
||||
sky_color = nil, -- table, a location and envinronment focused sky colors.
|
||||
|
||||
-- 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_colors = GradientSpec -- table, color points used to create gradient based on world time, if set bgcolor will be overrided by color generated from gradient
|
||||
gradient_sky = {
|
||||
day_sky = GradientSpec,
|
||||
day_horizon = GradientSpec,
|
||||
dawn_sky = GradientSpec,
|
||||
dawn_horizon = GradientSpec,
|
||||
night_sky = GradientSpec,
|
||||
night_horizon = GradientSpec,
|
||||
indoors = GradientSpec,
|
||||
fog_sun_tint = GradientSpec,
|
||||
fog_moon_tint = GradientSpec,
|
||||
} -- supports similar set of parameters as minetest api but in gradient type instead, in case some parameter is not set then default value will be used as documented for sky_colors.
|
||||
}
|
||||
|
||||
sl.sun_data = {
|
||||
-- These optional parameters used for minetest set_sun api,
|
||||
-- please refer MT lua_api docs for paramater details.
|
||||
visible: Boolean for whether the sun is visible. (default: true)
|
||||
texture: A regular texture for the sun. Setting to "" will re-enable the mesh sun. (default: "sun.png")
|
||||
tonemap: A 512x1 texture containing the tonemap for the sun (default: "sun_tonemap.png")
|
||||
sunrise: A regular texture for the sunrise texture. (default: "sunrisebg.png")
|
||||
sunrise_visible: Boolean for whether the sunrise texture is visible. (default: true)
|
||||
scale: Float controlling the overall size of the sun. (default: 1)
|
||||
}
|
||||
|
||||
sl.moon_data = {
|
||||
-- These optional parameters used for minetest set_moon api,
|
||||
-- please refer MT lua_api docs for paramater details.
|
||||
parameters is a table with the following optional fields:
|
||||
visible: Boolean for whether the moon is visible. (default: true)
|
||||
texture: A regular texture for the moon. Setting to "" will re-enable the mesh moon. (default: "moon.png")
|
||||
tonemap: A 512x1 texture containing the tonemap for the moon (default: "moon_tonemap.png")
|
||||
scale: Float controlling the overall size of the moon (default: 1)
|
||||
}
|
||||
|
||||
sl.stars_data = {
|
||||
-- These optional parameters used for minetest set_moon api,
|
||||
-- please refer MT lua_api docs for paramater details.
|
||||
visible: Boolean for whether the stars are visible. (default: true)
|
||||
count: Integer number to set the number of stars in the skybox. Only applies to "skybox" and "regular" skyboxes. (default: 1000)
|
||||
star_color: ColorSpec, sets the colors of the stars, alpha channel is used to set overall star brightness. (default: #ebebff69)
|
||||
scale: Float controlling the overall size of the stars (default: 1)
|
||||
|
||||
-- These optional parameter are skylayer specific,
|
||||
-- if set they may override parameters above.
|
||||
gradient_colors = GradientSpec -- table, same as sky gradient color, if set star_color will be overrided by color generated from gradient
|
||||
}
|
||||
|
||||
sl.clouds_data = {
|
||||
-- These optional parameters used for minetest set_clouds api,
|
||||
-- please refer MT lua_api docs for paramater details.
|
||||
|
@ -32,8 +257,9 @@ sl.clouds_data = {
|
|||
|
||||
-- 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, same as sky gradient color, if set color will be overrided by color generated from gradient
|
||||
gradient_colors = GradientSpec -- table, same as sky gradient color, if set color will be overrided by color generated from gradient
|
||||
}
|
||||
|
||||
skylayer.add_layer(player_name, sl)
|
||||
|
||||
```
|
||||
|
|
5
api.lua
5
api.lua
|
@ -1,8 +1,9 @@
|
|||
-------------------------
|
||||
-- Sky Layers: API
|
||||
|
||||
-- Git: https://gitlab.com/rautars/skylayer
|
||||
-- License: MIT
|
||||
-- Credits: xeranas
|
||||
-- Credits: rautars
|
||||
-------------------------
|
||||
|
||||
-- include skylayer core functions
|
||||
|
@ -33,6 +34,8 @@ skylayer.add_layer = function(player_name, layer)
|
|||
end
|
||||
layer.added_time = os.time()
|
||||
layer.updated = false
|
||||
layer.update_interval = layer.update_interval and layer.update_interval or core.settings.update_interval
|
||||
|
||||
table.insert(player_data.skylayers, layer)
|
||||
end
|
||||
|
||||
|
|
290
core.lua
290
core.lua
|
@ -1,8 +1,9 @@
|
|||
-------------------------
|
||||
-- Sky Layers: Core
|
||||
|
||||
-- Git: https://gitlab.com/rautars/skylayer
|
||||
-- License: MIT
|
||||
-- Credits: xeranas
|
||||
-- Credits: rautars
|
||||
-- Thanks: Perkovec for colorise utils (github.com/Perkovec/colorise-lua)
|
||||
-------------------------
|
||||
|
||||
|
@ -27,10 +28,25 @@ core.settings.update_interval = 4
|
|||
core.timer = 0
|
||||
|
||||
core.default_clouds = nil
|
||||
core.default_moon = nil
|
||||
core.default_sun = nil
|
||||
core.default_stars = nil
|
||||
core.default_sky_color = nil
|
||||
|
||||
-- keeps player related data such as player itself and own sky layers
|
||||
core.sky_players = {}
|
||||
|
||||
-- flag for minetest legacy version (< 5.1.1), value will be initialized lazily
|
||||
core.legacy = nil
|
||||
|
||||
-- A helper function to imitate ternary operator for inline if/else checks
|
||||
core.ternary = function(condition, trueVal, falseVal)
|
||||
if condition then
|
||||
return trueVal
|
||||
end
|
||||
return falseVal
|
||||
end
|
||||
|
||||
-- adds player to sky layer affected players list
|
||||
core.add_player = function(player)
|
||||
local data = {}
|
||||
|
@ -96,16 +112,22 @@ end
|
|||
|
||||
-- sets default / regular sky for player
|
||||
core.reset_sky = function(player)
|
||||
core.set_default_sky(player)
|
||||
core.set_default_clouds(player)
|
||||
end
|
||||
|
||||
core.set_default_sky = function(player)
|
||||
player:set_sky(nil, "regular", nil)
|
||||
end
|
||||
|
||||
core.set_default_clouds = function(player)
|
||||
player:set_clouds(core.default_clouds)
|
||||
if core.legacy then
|
||||
player:set_sky(nil, "regular", nil)
|
||||
else
|
||||
player:set_sky({
|
||||
base_color = nil,
|
||||
type = "regular",
|
||||
textures = nil,
|
||||
clouds = true,
|
||||
sky_color = core.default_sky_color
|
||||
})
|
||||
player:set_moon(core.default_moon)
|
||||
player:set_sun(core.default_sun)
|
||||
player:set_stars(core.default_stars)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-- resolves latest skylayer based on added layer time
|
||||
|
@ -131,30 +153,31 @@ 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 index2 = math.min(math.floor(val) + 1, max_index + 1)
|
||||
local f = val - index1
|
||||
local c1 = colors[index1]
|
||||
local c1 = colors[math.max(index1, 1)]
|
||||
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))
|
||||
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)
|
||||
|
||||
local rounded_time = math.floor(minetest.get_timeofday() * max_val)
|
||||
return core.convert_to_rgb(min_val, max_val, rounded_time, gradient_colors)
|
||||
end
|
||||
|
||||
|
@ -164,67 +187,188 @@ core.get_current_layer_color = function(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)
|
||||
core.calculate_color_hex_value = 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.resolve_sky_color = function(sky_data)
|
||||
local sky_color = sky_data.sky_color
|
||||
local gradient_sky = sky_data.gradient_sky
|
||||
|
||||
if sky_color == nil and gradient_sky == nil then
|
||||
return core.default_sky_color
|
||||
end
|
||||
|
||||
if sky_color == nil then
|
||||
sky_color = {}
|
||||
end
|
||||
|
||||
-- merge user set color values with worlds defaults
|
||||
local merged_sky_color = {
|
||||
day_sky = sky_color.day_sky and sky_color.day_sky or core.default_sky_color.day_sky,
|
||||
day_horizon = sky_color.day_horizon and sky_color.day_horizon or core.default_sky_color.day_horizon,
|
||||
dawn_sky = sky_color.dawn_sky and sky_color.dawn_sky or core.default_sky_color.dawn_sky,
|
||||
dawn_horizon = sky_color.dawn_horizon and sky_color.dawn_horizon or core.default_sky_color.dawn_horizon,
|
||||
night_sky = sky_color.night_sky and sky_color.night_sky or core.default_sky_color.night_sky,
|
||||
night_horizon = sky_color.night_horizon and sky_color.night_horizon or core.default_sky_color.night_horizon,
|
||||
indoors = sky_color.indoors and sky_color.indoors or core.default_sky_color.indoors,
|
||||
fog_sun_tint = sky_color.fog_sun_tint and sky_color.fog_sun_tint or core.default_sky_color.fog_sun_tint,
|
||||
fog_moon_tint = sky_color.fog_moon_tint and sky_color.fog_moon_tint or core.default_sky_color.fog_moon_tint,
|
||||
fog_tint_type = sky_color.fog_tint_type and sky_color.fog_tint_type or core.default_sky_color.fog_tint_type
|
||||
}
|
||||
|
||||
if gradient_sky == nil then
|
||||
return merged_sky_color
|
||||
end
|
||||
|
||||
local time_of_day = math.floor(minetest.get_timeofday() * 1000)
|
||||
|
||||
if gradient_sky.day_sky ~= nil and time_of_day > 190 and time_of_day < 800 then
|
||||
merged_sky_color.day_sky = core.calculate_color_hex_value(gradient_sky.day_sky, 200, 750)
|
||||
end
|
||||
if gradient_sky.day_horizon ~= nil and time_of_day > 190 and time_of_day < 800 then
|
||||
merged_sky_color.day_horizon = core.calculate_color_hex_value(gradient_sky.day_horizon, 200, 750)
|
||||
end
|
||||
if gradient_sky.dawn_sky ~= nil and time_of_day >= 750 and time_of_day <= 850 then
|
||||
merged_sky_color.dawn_sky = core.calculate_color_hex_value(gradient_sky.dawn_sky, 750, 850)
|
||||
end
|
||||
if gradient_sky.dawn_horizon ~= nil and time_of_day >= 750 and time_of_day <= 850 then
|
||||
merged_sky_color.dawn_horizon = core.calculate_color_hex_value(gradient_sky.dawn_horizon, 750, 850)
|
||||
end
|
||||
if time_of_day >= 800 or time_of_day <= 190 then
|
||||
local night_sky_min = time_of_day >= 800 and 800 or 0
|
||||
local night_sky_max = time_of_day >= 800 and 1000 or 200
|
||||
if gradient_sky.night_sky ~= nil then
|
||||
merged_sky_color.night_sky = core.calculate_color_hex_value(gradient_sky.night_sky, night_sky_min, night_sky_max)
|
||||
end
|
||||
if gradient_sky.night_horizon ~= nil then
|
||||
merged_sky_color.night_horizon = core.calculate_color_hex_value(gradient_sky.night_horizon, night_sky_min, night_sky_max)
|
||||
end
|
||||
if gradient_sky.fog_moon_tint ~= nil then
|
||||
merged_sky_color.fog_moon_tint = core.calculate_color_hex_value(gradient_sky.fog_moon_tint, night_sky_min, night_sky_max)
|
||||
end
|
||||
elseif gradient_sky.fog_sun_tint ~= nil then
|
||||
merged_sky_color.fog_sun_tint = core.calculate_color_hex_value(gradient_sky.fog_sun_tint, 200, 750)
|
||||
end
|
||||
if gradient_sky.indoors ~= nil then
|
||||
merged_sky_color.indoors = core.calculate_color_hex_value(gradient_sky.indoors)
|
||||
end
|
||||
return merged_sky_color
|
||||
end
|
||||
|
||||
core.update_sky_details = function(player, sky_layer)
|
||||
local sky_data = sky_layer.sky_data
|
||||
|
||||
if sky_data == nil then
|
||||
if sky_layer.reset_defaults == true then
|
||||
core.set_default_sky(player)
|
||||
sky_layer.reset_defaults = false
|
||||
end
|
||||
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
|
||||
local bg_color = sky_data.base_color and sky_data.base_color or sky_data.bgcolor -- fallback to bgcolor legacy parameter
|
||||
if sky_data.gradient_colors ~= nil then
|
||||
bg_color = core.get_current_layer_color(
|
||||
sky_data.gradient_colors,
|
||||
sky_data.gradient_min_value,
|
||||
sky_data.gradient_max_value)
|
||||
end
|
||||
local sky_type = "plain" -- default
|
||||
if sky_data.type ~= nil then
|
||||
sky_type = sky_data.type
|
||||
|
||||
local sky_type = sky_data.type and sky_data.type or "plain"
|
||||
if sky_data.type == nil and (sky_data.sky_color ~= nil or sky_data.gradient_sky ~= nil) then
|
||||
sky_type = "regular"
|
||||
end
|
||||
local clouds = sky_layer.clouds_data ~= nil
|
||||
if sky_data.clouds ~= nil then
|
||||
clouds = sky_data.clouds
|
||||
|
||||
if core.legacy then
|
||||
player:set_sky(
|
||||
bg_color,
|
||||
sky_type,
|
||||
sky_data.textures,
|
||||
core.ternary(sky_layer.clouds_data or sky_data.clouds ~= nil, sky_data.clouds == true, true)
|
||||
)
|
||||
else
|
||||
player:set_sky({
|
||||
base_color = bg_color,
|
||||
type = sky_type,
|
||||
textures = sky_data.textures,
|
||||
clouds = core.ternary(sky_layer.clouds_data or sky_data.clouds ~= nil, sky_data.clouds == true, true),
|
||||
sky_color = core.resolve_sky_color(sky_data)
|
||||
})
|
||||
end
|
||||
player:set_sky(bgcolor, sky_type, sky_data.textures, clouds)
|
||||
end
|
||||
|
||||
core.update_moon_details = function(player, sky_layer)
|
||||
local moon_data = sky_layer.moon_data
|
||||
if moon_data == nil then
|
||||
return
|
||||
end
|
||||
player:set_moon(moon_data)
|
||||
end
|
||||
|
||||
core.update_sun_details = function(player, sky_layer)
|
||||
local sun_data = sky_layer.sun_data
|
||||
if sun_data == nil then
|
||||
return
|
||||
end
|
||||
player:set_sun(sun_data)
|
||||
end
|
||||
|
||||
core.update_stars_details = function(player, sky_layer)
|
||||
local stars_data = sky_layer.stars_data
|
||||
if stars_data == nil then
|
||||
return
|
||||
end
|
||||
|
||||
local _stars_color = core.calculate_color_hex_value(
|
||||
stars_data.gradient_star_colors,
|
||||
stars_data.gradient_star_min_value,
|
||||
stars_data.gradient_star_max_value)
|
||||
local star_brightness = stars_data.brightness and stars_data.brightness or "69"
|
||||
|
||||
player:set_stars({
|
||||
visible = core.ternary(stars_data.visible, stars_data.visible, core.default_stars.visible),
|
||||
count = stars_data.count and stars_data.count or core.default_stars.count,
|
||||
star_color = _stars_color and _stars_color .. star_brightness or core.default_stars.star_color,
|
||||
scale = stars_data.scale and stars_data.scale or core.default_stars.scale
|
||||
})
|
||||
end
|
||||
|
||||
core.update_clouds_details = function(player, sky_layer)
|
||||
local clouds_data = sky_layer.clouds_data
|
||||
|
||||
if clouds_data == nil then
|
||||
if sky_layer.reset_defaults == true then
|
||||
core.set_default_clouds(player)
|
||||
sky_layer.reset_defaults = false
|
||||
end
|
||||
if clouds_data == nil then
|
||||
return
|
||||
end
|
||||
|
||||
local cloud_color = core.get_current_cloud_color(
|
||||
local cloud_color = core.calculate_color_hex_value(
|
||||
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
|
||||
|
||||
local ambient_color = core.calculate_color_hex_value(
|
||||
clouds_data.gradient_ambient_color,
|
||||
clouds_data.gradient_ambient_min_value,
|
||||
clouds_data.gradient_ambient_max_value)
|
||||
|
||||
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})
|
||||
color = cloud_color and clouds_data.color or core.default_clouds.color,
|
||||
density = clouds_data.density and clouds_data.density or core.default_clouds.density,
|
||||
ambient = ambient_color and clouds_data.ambient or core.default_clouds.ambient,
|
||||
height = clouds_data.height and clouds_data.height or core.default_clouds.height,
|
||||
thickness = clouds_data.thickness and clouds_data.thickness or core.default_clouds.thickness,
|
||||
speed = clouds_data.speed and clouds_data.speed or core.default_clouds.speed
|
||||
})
|
||||
end
|
||||
|
||||
core.post_update_processing = function(player, player_data, sky_layer)
|
||||
if sky_layer.reset_defaults == true then
|
||||
core.reset_sky(player)
|
||||
sky_layer.reset_defaults = false
|
||||
end
|
||||
|
||||
player_data.last_active_layer = sky_layer.name
|
||||
if player_data.last_active_layer == nil or player_data.last_active_layer ~= sky_layer.name then
|
||||
sky_layer.reset_defaults = true
|
||||
end
|
||||
end
|
||||
|
||||
core.update_sky = function(player, timer)
|
||||
|
@ -232,23 +376,18 @@ core.update_sky = function(player, timer)
|
|||
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 current_layer == nil then return end
|
||||
|
||||
if skylayer.update_interval == nil then
|
||||
skylayer.update_interval = core.settings.update_interval
|
||||
end
|
||||
|
||||
if player_data.last_active_layer == nil or player_data.last_active_layer ~= current_layer.name then
|
||||
current_layer.reset_defaults = true
|
||||
end
|
||||
player_data.last_active_layer = current_layer.name
|
||||
|
||||
if current_layer.updated == false or core.timer >= skylayer.update_interval then
|
||||
if current_layer.updated == false or core.timer >= current_layer.update_interval then
|
||||
current_layer.updated = os.time()
|
||||
core.update_sky_details(player, current_layer)
|
||||
core.update_clouds_details(player, current_layer)
|
||||
if core.legacy == false then
|
||||
core.update_moon_details(player, current_layer)
|
||||
core.update_sun_details(player, current_layer)
|
||||
core.update_stars_details(player, current_layer)
|
||||
end
|
||||
core.post_update_processing(player, player_data, current_layer)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -256,6 +395,25 @@ minetest.register_on_joinplayer(function(player)
|
|||
if core.default_clouds == nil then
|
||||
core.default_clouds = player:get_clouds()
|
||||
end
|
||||
|
||||
if core.legacy == nil then
|
||||
core.legacy = player.get_moon == nil and true or false
|
||||
end
|
||||
|
||||
if core.default_moon == nil then
|
||||
core.default_moon = player.get_moon and player:get_moon() or {}
|
||||
core.default_moon.texture = "" -- according set_moon api description, empty string used for setting default texture.
|
||||
end
|
||||
if core.default_sun == nil then
|
||||
core.default_sun = player.get_sun and player:get_sun() or {}
|
||||
core.default_sun.texture = ""
|
||||
end
|
||||
if core.default_stars == nil then
|
||||
core.default_stars = player.get_stars and player:get_stars() or {}
|
||||
end
|
||||
if core.default_sky_color == nil then
|
||||
core.default_sky_color = player.get_sky_color and player:get_sky_color() or {}
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
|
|
282
demo.lua
282
demo.lua
|
@ -1,85 +1,93 @@
|
|||
-------------------------
|
||||
-- Sky Layers: Demo
|
||||
-- for testing skylayer api
|
||||
-- Allows quickly test skylayer api
|
||||
|
||||
-- Demo disabled by default, see init.lua to enable it.
|
||||
-- Git: https://gitlab.com/rautars/skylayer
|
||||
|
||||
-- License: MIT
|
||||
-- Credits: xeranas
|
||||
-- Credits: rautars
|
||||
|
||||
-------------------------
|
||||
|
||||
local add_rainbow_sky = function(player_name)
|
||||
local gradient_plain_with_clouds_sky = function(player_name)
|
||||
local sl = {}
|
||||
sl.name = "rainbow_sky"
|
||||
sl.name = "gradient_plain_with_clouds_sky"
|
||||
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}
|
||||
{ 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}
|
||||
{ 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}
|
||||
speed = { x = 110, z = -400 }
|
||||
}
|
||||
sl.sun_data = {
|
||||
visible = false
|
||||
}
|
||||
sl.moon_data = {
|
||||
visible = false
|
||||
}
|
||||
skylayer.add_layer(player_name, sl)
|
||||
end
|
||||
|
||||
local add_solid_black_sky = function(player_name)
|
||||
local plain_without_clouds_sky = function(player_name)
|
||||
local sl = {}
|
||||
sl.name = "solid_black"
|
||||
sl.name = "plain_without_clouds_sky"
|
||||
sl.sky_data = {
|
||||
bgcolor = {r=0, g=0, b=0}
|
||||
base_color = { r = 0, g = 0, b = 0 },
|
||||
clouds = false
|
||||
}
|
||||
skylayer.add_layer(player_name, sl)
|
||||
end
|
||||
|
||||
local add_stars_sky = function(player_name)
|
||||
local skybox_with_defaults_sky = function(player_name)
|
||||
local sl = {}
|
||||
sl.name = "stars_sky"
|
||||
sl.name = "skybox_with_defaults_sky"
|
||||
sl.sky_data = {
|
||||
bgcolor = {r=0, g=0, b=0},
|
||||
type = "skybox",
|
||||
textures = {
|
||||
"skylayer_demo_stars_sky.png",
|
||||
|
@ -90,71 +98,119 @@ local add_stars_sky = function(player_name)
|
|||
"skylayer_demo_stars_sky.png"
|
||||
}
|
||||
}
|
||||
sl.stars_data = {
|
||||
visible = false
|
||||
}
|
||||
skylayer.add_layer(player_name, sl)
|
||||
end
|
||||
|
||||
minetest.register_chatcommand("sl_demo1_on", {
|
||||
params = "<player_name>",
|
||||
description = "Change sky for player",
|
||||
func = function(name, player_name)
|
||||
if player_name == nil or player_name == "" then
|
||||
player_name = name
|
||||
end
|
||||
add_rainbow_sky(player_name)
|
||||
end
|
||||
})
|
||||
local custom_moon_with_gradient_stars_sky = function(player_name)
|
||||
local sl = {}
|
||||
sl.name = "custom_moon_with_gradient_stars_sky"
|
||||
sl.moon_data = {
|
||||
texture = "cold_moon.png",
|
||||
}
|
||||
sl.stars_data = {
|
||||
scale = 2,
|
||||
gradient_star_colors = {
|
||||
{r=100, g=26, b=0},
|
||||
{r=100, g=76, b=0},
|
||||
{r=100, g=0, b=24},
|
||||
}
|
||||
}
|
||||
skylayer.add_layer(player_name, sl)
|
||||
end
|
||||
|
||||
minetest.register_chatcommand("sl_demo1_off", {
|
||||
params = "<player_name>",
|
||||
description = "Change sky for player",
|
||||
func = function(name, player_name)
|
||||
if player_name == nil or player_name == "" then
|
||||
player_name = name
|
||||
end
|
||||
skylayer.remove_layer(player_name, "rainbow_sky")
|
||||
end
|
||||
})
|
||||
local custom_sun_with_default_sky = function(player_name)
|
||||
local sl = {}
|
||||
sl.name = "custom_sun_with_default_sky"
|
||||
sl.sun_data = {
|
||||
texture = "hot_sun.png",
|
||||
scale = 3
|
||||
}
|
||||
skylayer.add_layer(player_name, sl)
|
||||
end
|
||||
|
||||
minetest.register_chatcommand("sl_demo2_on", {
|
||||
params = "<player_name>",
|
||||
description = "Change sky for player",
|
||||
func = function(name, player_name)
|
||||
if player_name == nil or player_name == "" then
|
||||
player_name = name
|
||||
end
|
||||
add_solid_black_sky(player_name)
|
||||
end
|
||||
})
|
||||
local plain_sky_colors_with_defaults_sky = function(player_name)
|
||||
local sl = {}
|
||||
sl.name = "plain_sky_colors_with_defaults_sky"
|
||||
sl.sky_data = {
|
||||
sky_color = {
|
||||
day_sky = "#FBF704",
|
||||
day_horizon = "#F704FB",
|
||||
dawn_sky = "#EB1914",
|
||||
dawn_horizon = "#49FF00",
|
||||
night_sky = "#0F00FF",
|
||||
night_horizon = "#FF5200",
|
||||
indoors = "#D9EE11",
|
||||
fog_sun_tint = "#E0901F",
|
||||
fog_moon_tint = "#6E9A65"
|
||||
}
|
||||
}
|
||||
skylayer.add_layer(player_name, sl)
|
||||
end
|
||||
|
||||
minetest.register_chatcommand("sl_demo2_off", {
|
||||
params = "<player_name>",
|
||||
description = "Change sky for player",
|
||||
func = function(name, player_name)
|
||||
if player_name == nil or player_name == "" then
|
||||
player_name = name
|
||||
end
|
||||
skylayer.remove_layer(player_name, "solid_black")
|
||||
end
|
||||
})
|
||||
local gradient_plain_sky_colors_with_defaults_sky = function(player_name)
|
||||
local sl = {}
|
||||
sl.name = "gradient_plain_sky_colors_with_defaults_sky"
|
||||
sl.sky_data = {
|
||||
gradient_sky = {
|
||||
day_sky = {
|
||||
{ r = 100, g = 0, b = 6},
|
||||
{ r = 6, g = 100, b = 0},
|
||||
{ r = 0, g = 6, b = 100}
|
||||
},
|
||||
day_horizon = {
|
||||
{ r = 100, g = 56, b = 0},
|
||||
{ r = 42, g = 100, b = 0},
|
||||
{ r = 92, g = 100, b = 0}
|
||||
},
|
||||
night_sky = {
|
||||
{ r = 0, g = 255, b = 87},
|
||||
{ r = 250, g = 187, b = 100},
|
||||
{ r = 255, g = 82, b = 0}
|
||||
},
|
||||
night_horizon = {
|
||||
{ r = 87, g = 100, b = 0},
|
||||
{ r = 0, g = 87, b = 100},
|
||||
{ r = 100, g = 0, b = 87}
|
||||
},
|
||||
}
|
||||
}
|
||||
skylayer.add_layer(player_name, sl)
|
||||
end
|
||||
|
||||
minetest.register_chatcommand("sl_demo3_on", {
|
||||
params = "<player_name>",
|
||||
description = "Change sky for player",
|
||||
func = function(name, player_name)
|
||||
if player_name == nil or player_name == "" then
|
||||
player_name = name
|
||||
end
|
||||
add_stars_sky(player_name)
|
||||
end
|
||||
})
|
||||
local sky_definitions = {}
|
||||
table.insert(sky_definitions, {name = "gradient_plain_with_clouds_sky", func = gradient_plain_with_clouds_sky})
|
||||
table.insert(sky_definitions, {name = "plain_without_clouds_sky", func = plain_without_clouds_sky})
|
||||
table.insert(sky_definitions, {name = "skybox_with_defaults_sky", func = skybox_with_defaults_sky})
|
||||
table.insert(sky_definitions, {name = "custom_moon_with_gradient_stars_sky", func = custom_moon_with_gradient_stars_sky})
|
||||
table.insert(sky_definitions, {name = "custom_sun_with_default_sky", func = custom_sun_with_default_sky})
|
||||
table.insert(sky_definitions, {name = "plain_sky_colors_with_defaults_sky", func = plain_sky_colors_with_defaults_sky})
|
||||
table.insert(sky_definitions, {name = "gradient_plain_sky_colors_with_defaults_sky", func = gradient_plain_sky_colors_with_defaults_sky})
|
||||
|
||||
minetest.register_chatcommand("sl_demo3_off", {
|
||||
params = "<player_name>",
|
||||
description = "Change sky for player",
|
||||
func = function(name, player_name)
|
||||
if player_name == nil or player_name == "" then
|
||||
player_name = name
|
||||
-- register commands for demo for sky definitions from sky_definitions array
|
||||
local counter = 1
|
||||
for key, definition in pairs(sky_definitions) do
|
||||
minetest.register_chatcommand("sl_demo" .. counter .. "_on", {
|
||||
params = "<player_name>",
|
||||
description = "Sets sky ".. definition.name .." for a player",
|
||||
func = function(name, player_name)
|
||||
if player_name == nil or player_name == "" then
|
||||
player_name = name
|
||||
end
|
||||
definition.func(player_name)
|
||||
end
|
||||
skylayer.remove_layer(player_name, "stars_sky")
|
||||
end
|
||||
})
|
||||
})
|
||||
minetest.register_chatcommand("sl_demo" .. counter .. "_off", {
|
||||
params = "<player_name>",
|
||||
description = "Turn off sky ".. definition.name .. " for a player",
|
||||
func = function(name, player_name)
|
||||
if player_name == nil or player_name == "" then
|
||||
player_name = name
|
||||
end
|
||||
skylayer.remove_layer(player_name, definition.name)
|
||||
end
|
||||
})
|
||||
counter = counter + 1
|
||||
end
|
||||
|
|
3
init.lua
3
init.lua
|
@ -1,8 +1,9 @@
|
|||
-------------------------------
|
||||
-- Sky Layers: initialization
|
||||
|
||||
-- Git: https://gitlab.com/rautars/skylayer
|
||||
-- License: MIT
|
||||
-- Credits: xeranas
|
||||
-- Credits: rautars
|
||||
-------------------------------
|
||||
|
||||
local modpath = minetest.get_modpath("skylayer");
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 912 B |
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
Loading…
Reference in New Issue