arena_lib/src/editor/tools_sky.lua

673 lines
22 KiB
Lua
Executable File

local S = minetest.get_translator("arena_lib")
local function fill_tempsky() end
local function get_celvault_formspec() end
local function get_sky_params() end
local function get_sun_params() end
local function get_moon_params() end
local function get_stars_params() end
local function get_clouds_params() end
local function colstr() end
local function get_palette_col_and_sorted_table() end
local function compare_elem() end
local temp_sky_settings = {} -- KEY = p_name; VALUE = {all the sky settings}
local sky_tools = {
"arena_lib:sky",
"",
"",
"",
"",
"",
"",
"",
"arena_lib:editor_return",
"arena_lib:editor_quit",
}
minetest.register_tool("arena_lib:editor_sky", {
description = S("Set sky"),
inventory_image = "arenalib_editor_sky.png",
groups = {not_in_creative_inventory = 1, oddly_breakable_by_hand = "2"},
on_place = function() end,
on_drop = function() end,
on_use = function(itemstack, user, pointed_thing)
local mod = user:get_meta():get_string("arena_lib_editor.mod")
local arena_name = user:get_meta():get_string("arena_lib_editor.arena")
local id, arena = arena_lib.get_arena_by_name(mod, arena_name)
local p_name = user:get_player_name()
fill_tempsky(p_name, arena)
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "sky"))
end
})
function arena_lib.give_sky_tools(player)
player:get_inventory():set_list("main", sky_tools)
end
----------------------------------------------
---------------FUNZIONI LOCALI----------------
----------------------------------------------
function fill_tempsky(p_name, arena)
temp_sky_settings[p_name] = table.copy(arena.celestial_vault)
if not temp_sky_settings[p_name].sky then
temp_sky_settings[p_name].sky = {sky_color = {}, textures = {}}
end
if not temp_sky_settings[p_name].sun then
temp_sky_settings[p_name].sun = {}
end
if not temp_sky_settings[p_name].moon then
temp_sky_settings[p_name].moon = {}
end
if not temp_sky_settings[p_name].stars then
temp_sky_settings[p_name].stars = {}
end
if not temp_sky_settings[p_name].clouds then
temp_sky_settings[p_name].clouds = {speed = {}}
end
end
function get_celvault_formspec(p_name, section)
local formspec = {
"formspec_version[4]",
"size[9.72,10]",
"position[0.5,0.5]",
"no_prepend[]",
"style_type[image_button;border=false]",
-- bottoni
"container[1,1]",
"tooltip[sky_btn;" .. S("Sky") .."]",
"tooltip[sun_btn;" .. S("Sun") .."]",
"tooltip[moon_btn;" .. S("Moon") .."]",
"tooltip[stars_btn;" .. S("Stars") .. "]",
"tooltip[clouds_btn;" .. S("Clouds") .. "]",
"image_button[0,0;1,1;arenalib_sky_sky.png;sky_btn;]",
"image_button[1.6,0;1,1;arenalib_sky_sun.png;sun_btn;]",
"image_button[3.2,0;1,1;arenalib_sky_moon.png;moon_btn;]",
"image_button[4.8,0;1,1;arenalib_sky_stars.png;stars_btn;]",
"image_button[6.4,0;1,1;arenalib_sky_cloud.png;clouds_btn;]",
"container_end[]",
"container[1,2.2]",
-- <dove saranno i vari campi a seconda del tipo>
"button[2,6.7;1.9,0.7;reset;" .. S("Reset") .."]",
"button[4,6.7;1.9,0.7;apply;" .. S("Apply") .."]",
"container_end[]",
}
local fields = {}
if section == "sky" then
fields = get_sky_params(p_name)
elseif section == "sun" then
fields = get_sun_params(p_name)
elseif section == "moon" then
fields = get_moon_params(p_name)
elseif section == "stars" then
fields = get_stars_params(p_name)
else
fields = get_clouds_params(p_name)
end
for k,v in pairs(fields) do
table.insert(formspec, #formspec-2, v)
end
return table.concat(formspec, "")
end
function get_sky_params(p_name)
local temp_sky = temp_sky_settings[p_name].sky
local clouds = true
local sky_type = 1
if temp_sky.clouds ~= nil and temp_sky.clouds == false then
clouds = false
end
if temp_sky.type == "skybox" then
sky_type = 2
elseif temp_sky.type == "plain" then
sky_type = 3
end
local temp_sky_col = temp_sky.sky_color
local palette_str, palette_id = get_palette_col_and_sorted_table() -- palette id KEY = hex value, VALUE = id
local sky_params = {}
local sky = {
"label[0,0.25;" .. S("Type") .. "]",
"dropdown[0,0.5;3.75,0.6;sky_type;regular,skybox,plain;" .. sky_type .. ";]",
"checkbox[4.2,0.78;sky_clouds;" .. S("Clouds") .. ";" .. tostring(clouds) .. "]"
}
if sky_type == 1 then
sky_params = {
"container[0,1.6]",
"label[0,0;" .. S("Day sky") .. "]",
"dropdown[0,0.2;2.5,0.6;day_sky;" .. palette_str .. ";" .. (palette_id[colstr(temp_sky_col.day_sky)] or 1) .. "]",
"label[2.6,0;" .. S("Dawn sky") .. "]",
"dropdown[2.6,0.2;2.5,0.6;dawn_sky;" .. palette_str .. ";" .. (palette_id[colstr(temp_sky_col.dawn_sky)] or 1) .. "]",
"label[5.2,0;" .. S("Night sky") .. "]",
"dropdown[5.2,0.2;2.5,0.6;night_sky;" .. palette_str .. ";" .. (palette_id[colstr(temp_sky_col.night_sky)] or 1) .. "]",
"label[0,1.05;" .. S("Day horizon") .. "]",
"dropdown[0,1.25;2.5,0.6;day_horizon;" .. palette_str .. ";" .. (palette_id[colstr(temp_sky_col.day_horizon)] or 1) .. "]",
"label[2.6,1.05;" .. S("Dawn horizon") .. "]",
"dropdown[2.6,1.25;2.5,0.6;dawn_horizon;" .. palette_str .. ";" .. (palette_id[colstr(temp_sky_col.dawn_horizon)] or 1) .. "]",
"label[5.2,1.05;" .. S("Night horizon") .. "]",
"dropdown[5.2,1.25;2.5,0.6;night_horizon;" .. palette_str .. ";" .. (palette_id[colstr(temp_sky_col.night_horizon)] or 1) .. "]",
"label[0,2.1;" .. S("Indoors") .. "]",
"dropdown[0,2.3;2.5,0.6;indoors;" .. palette_str .. ";" .. (palette_id[colstr(temp_sky_col.indoors)] or 1) .. "]",
"container_end[]",
"checkbox[0,5.5;custom_fog_tint;" .. S("Custom fog tint") .. ";" .. (temp_sky_col.fog_tint_type == "custom" and "true" or "false") .. "]"
}
if temp_sky_col.fog_tint_type == "custom" then
local fog_params = {
"label[2.6,2.1;" .. S("Fog sun tint") .. "]",
"dropdown[2.6,2.3;2.5,0.6;fog_sun_tint;" .. palette_str .. ";" .. (palette_id[colstr(temp_sky_col.fog_sun_tint)] or 1) .. "]",
"label[5.2,2.1;" .. S("Fog moon tint") .. "]",
"dropdown[5.2,2.3;2.5,0.6;fog_moon_tint;" .. palette_str .. ";" .. (palette_id[colstr(temp_sky_col.fog_moon_tint)] or 1) .. "]"
}
for k, v in pairs(fog_params) do
table.insert(sky_params, #sky_params-3, v)
end
end
else
sky_params = {
"container[0,4.5]",
"label[2.2,0.25;" .. S("Base colour") .. "]",
"dropdown[2.2,0.5;3.75,0.6;base_color;" .. palette_str .. ";" .. (palette_id[temp_sky.base_color] or 1) .. "]",
"container_end[]"
}
if sky_type == 2 then
local skybox = {
"container[0,1.6]",
"field[0,0;3.75,0.6;top;" .. S("Top") .. ";" .. (temp_sky.textures[1] or "" ) .. "]",
"field[4.15,0;3.75,0.6;bottom;" .. S("Bottom") .. ";" .. (temp_sky.textures[2] or "") .. "]",
"field[0,1;3.75,0.6;west;" .. S("West") .. ";" .. (temp_sky.textures[3] or "") .. "]",
"field[4.15,1;3.75,0.6;east;" .. S("East") .. ";" .. (temp_sky.textures[4] or "") .. "]",
"field[0,2;3.75,0.6;north;" .. S("North") .. ";" .. (temp_sky.textures[5] or "") .. "]",
"field[4.15,2;3.75,0.6;south;" .. S("South") .. ";" .. (temp_sky.textures[6] or "") .. "]",
"container_end[]",
}
for k, v in pairs(skybox) do
table.insert(sky_params, #sky_params-3, v)
end
end
end
for k, v in pairs(sky_params) do
table.insert(sky, #sky, v)
end
return sky
end
function get_sun_params(p_name)
local temp_sun = temp_sky_settings[p_name].sun
local is_sun_visible = temp_sun.visible ~= false
local is_sunrise_visible = temp_sun.sunrise_visible ~= false
local sun = {
"checkbox[0,0.78;sun_visible;" .. S("Visible sun") .. ";" .. tostring(is_sun_visible) .. "]",
"checkbox[4,0.78;sunrise_visible;" .. S("Visible sunrise") .. ";" .. tostring(is_sunrise_visible) .. "]",
"container[0,1.6]",
"container_end[]"
}
if is_sun_visible then
local sun_params = {
"field[0,0;3.75,0.6;sun_texture;" .. S("Texture") .. ";" .. (temp_sun.texture or "sun.png") .. "]",
"field[0,1;3.75,0.6;sun_tonemap;" .. S("Tonemap") .. ";" .. (temp_sun.tonemap or "sun_tonemap.png") .. "]",
"field[0,2;1,0.6;sun_size;" .. S("Size") .. ";" .. (temp_sun.scale or 1) .. "]"
}
for k, v in pairs(sun_params) do
table.insert(sun, #sun, v)
end
end
if is_sunrise_visible then
local sunrise_params = {
"field[4.15,0;3.75,0.6;sunrise_texture;" .. S("Sunrise texture") .. ";" .. (temp_sun.sunrise or "sunrisebg.png") .. "]",
}
for k, v in pairs(sunrise_params) do
table.insert(sun, #sun, v)
end
end
return sun
end
function get_moon_params(p_name)
local temp_moon = temp_sky_settings[p_name].moon
local is_moon_visible = temp_moon.visible ~= false
local moon = {
"checkbox[0,0.78;moon_visible;" .. S("Visible moon") .. ";" .. tostring(is_moon_visible) .. "]",
}
if is_moon_visible then
local moon_params = {
"container[0,1.6]",
"field[0,0;3.75,0.6;moon_texture;" .. S("Texture") ..";" .. (temp_moon.texture or "moon.png") .. "]",
"field[0,1;3.75,0.6;moon_tonemap;" .. S("Tonemap") .. ";" .. (temp_moon.tonemap or "moon_tonemap.png") .. "]",
"field[0,2;1,0.6;moon_size;" .. S("Size") .. ";" .. (temp_moon.scale or 1 ) .. "]",
"container_end[]"
}
for k, v in pairs(moon_params) do
table.insert(moon, #moon, v)
end
end
return moon
end
function get_stars_params(p_name)
local temp_stars = temp_sky_settings[p_name].stars
local are_stars_visible = temp_stars.visible ~= false
local stars = {
"checkbox[0,0.78;stars_visible;" .. S("Visible stars") .. ";" .. tostring(are_stars_visible) .. "]",
}
if are_stars_visible then
local palette_str, palette_id = get_palette_col_and_sorted_table()
local stars_params = {
"field[6.9,0.7;1,0.6;stars_size;" .. S("Size") .. ";" .. (temp_stars.scale or 1) .. "]",
"container[0,1.6]",
"label[0,-0.2;" .. S("Colour") .. "]",
"dropdown[0,0;3.75,0.6;stars_color;" .. palette_str .. ";" .. (palette_id[temp_stars.star_color] or 1) .. "]",
"field[4.15,0;3.75,0.6;stars_count;" .. S("Count") .. ";" .. (temp_stars.count or 1000) .. "]",
"container_end[]"
}
for k, v in pairs(stars_params) do
table.insert(stars, #stars, v)
end
end
return stars
end
function get_clouds_params(p_name)
local temp_clouds = temp_sky_settings[p_name].clouds
local are_clouds_visible = temp_sky_settings[p_name].sky.clouds ~= false
local clouds = {}
if not are_clouds_visible then
clouds = {
"hypertext[0,0.85;7,1;name; <global size=18 font=mono halign=center color=#e6482e><b>" .. S("Clouds must be enabled first to change their parameters") .. "</b>]",
}
else
local palette_str, palette_id = get_palette_col_and_sorted_table()
clouds = {
"container[0,0.5]",
"label[0,0;" .. S("Density") .. "]",
"label[0,0.5;0]",
"label[7.6,0.5;1]",
"scrollbaroptions[min=0;max=100;arrows=hide]",
"scrollbar[0.3,0.35;7.15,0.3;horizontal;clouds_density;" .. ((temp_clouds.density or 0.4) * 100) .. "]",
"label[0,1.2;" .. S("Colour") .. "]",
"dropdown[0,1.4;3.75,0.6;clouds_color;" .. palette_str .. ";" .. (palette_id[temp_clouds.color] or 1) .. "]",
"label[4.15,1.2;" .. S("Ambient") .. "]",
"dropdown[4.15,1.4;3.75,0.6;clouds_ambient;" .. palette_str .. ";" .. (palette_id[temp_clouds.ambient] or 1) .. "]",
"label[0,2.25;" .. S("Thickness") .. "]",
"field[0,2.45;1,0.6;clouds_thickness;;" .. (temp_clouds.thickness or 16) .. "]",
"label[1.7,2.25;" .. S("Height") .. "]",
"field[1.7,2.45;1,0.6;clouds_height;;" .. (temp_clouds.height or 120) .. "]",
"label[4.15,2.25;" .. S("Speed") .. "]",
"label[4.15,2.75;X]",
"field[4.45,2.45;1,0.6;clouds_speed_x;;" .. (temp_clouds.speed.x or 0) .. "]",
"label[5.8,2.75;Z]",
"field[6.1,2.45;1,0.6;clouds_speed_z;;" .. (temp_clouds.speed.x or -2) .. "]",
"container_end[]"
}
end
return clouds
end
function colstr(col)
if type(col) == "table" then
return minetest.rgba(col.r, col.g, col.b)
else
return col
end
end
function get_palette_col_and_sorted_table()
-- inverto chiavi con valori
local inverted = {}
for k in pairs(arena_lib.PALETTE) do
table.insert(inverted, k)
end
table.sort(inverted, function(a, b) return a:lower() < b:lower() end)
local palette = ""
local palette_table = {}
local i = 1
for _, col in pairs(inverted) do
palette = palette .. col .. ","
palette_table[arena_lib.PALETTE[col]] = i
i = i+1
end
return palette:sub(1, -2), palette_table
end
function compare_elem(t1,t2)
return minetest.serialize(t1) == minetest.serialize(t2)
end
----------------------------------------------
---------------GESTIONE CAMPI-----------------
----------------------------------------------
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "arena_lib:settings_sky" then return end
local p_name = player:get_player_name()
local temp_sky = temp_sky_settings[p_name].sky
local temp_sky_col = temp_sky.sky_color
local temp_sun = temp_sky_settings[p_name].sun
local temp_moon = temp_sky_settings[p_name].moon
local temp_stars = temp_sky_settings[p_name].stars
local temp_clouds = temp_sky_settings[p_name].clouds
local mod = player:get_meta():get_string("arena_lib_editor.mod")
local arena_name = player:get_meta():get_string("arena_lib_editor.arena")
local id, arena = arena_lib.get_arena_by_name(mod, arena_name)
local celvault = arena.celestial_vault
-- se abbandona...
if fields.quit then
if next(celvault) then
if celvault.sky then player:set_sky(celvault.sky) end
if celvault.sun then player:set_sun(celvault.sun) end
if celvault.moon then player:set_moon(celvault.moon) end
if celvault.stars then player:set_stars(celvault.stars) end
if celvault.clouds then player:set_clouds(celvault.clouds) end
else
arena_lib.temp.reset_celestial_vault(player)
end
temp_sky_settings[p_name] = nil
return
-- ...o se ripristina, non c'è bisogno di andare oltre
elseif fields.reset then
arena_lib.set_celestial_vault(p_name, mod, arena_name, "all", nil, true)
arena_lib.temp.reset_celestial_vault(player)
fill_tempsky(p_name, arena)
-- TODO: there is some Minetest related bug that doesn't allow to instantly update dropdown fields.
-- Too tired to backtrack for now and open an issue, maybe one day
minetest.close_formspec(p_name, "arena_lib:settings_sky")
-- riapro il formspec sul quale mi trovavo
minetest.after(0.1, function()
if fields.day_sky then
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "sky"))
elseif fields.sun_size then
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "sun"))
elseif fields.moon_size then
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "moon"))
elseif fields.stars_count then
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "stars"))
else
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "clouds"))
end
end)
return
end
-- se cambia sezione, non c'è bisogno di controllare il resto (dato che viene automatico cambiare
-- e poi premere "Applica")
if fields.sky_btn then
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "sky"))
return
elseif fields.sun_btn then
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "sun"))
return
elseif fields.moon_btn then
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "moon"))
return
elseif fields.stars_btn then
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "stars"))
return
elseif fields.clouds_btn then
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "clouds"))
return
end
local palette = arena_lib.PALETTE
--
-- aggiorna i vari parametri
--
-- cielo
if fields.base_color then
temp_sky.base_color = palette[fields.base_color]
end
if fields.day_sky then
temp_sky_col.day_sky = palette[fields.day_sky]
end
if fields.day_horizon then
temp_sky_col.day_horizon = palette[fields.day_horizon]
end
if fields.dawn_sky then
temp_sky_col.dawn_sky = palette[fields.dawn_sky]
end
if fields.dawn_horizon then
temp_sky_col.dawn_horizon = palette[fields.dawn_horizon]
end
if fields.night_sky then
temp_sky_col.night_sky = palette[fields.night_sky]
end
if fields.night_horizon then
temp_sky_col.night_horizon = palette[fields.night_horizon]
end
if fields.indoors then
temp_sky_col.indoors = palette[fields.indoors]
end
if fields.fog_sun_tint then
temp_sky_col.fog_sun_tint = palette[fields.fog_sun_tint]
end
if fields.fog_moon_tint then
temp_sky_col.fog_moon_tint = palette[fields.fog_moon_tint]
end
if fields.sky_type == "skybox" and fields.top then
temp_sky.textures[1] = fields.top
temp_sky.textures[2] = fields.bottom
temp_sky.textures[3] = fields.west
temp_sky.textures[4] = fields.east
temp_sky.textures[5] = fields.north
temp_sky.textures[6] = fields.south
end
-- sole
if fields.sun_texture then
temp_sun.texture = fields.sun_texture
end
if fields.sun_tonemap then
temp_sun.tonemap = fields.sun_tonemap
end
if fields.sunrise_texture then
temp_sun.sunrise = fields.sunrise_texture
end
if fields.sun_size then
temp_sun.scale = tonumber(fields.sun_size) or temp_sun.scale
end
-- luna
if fields.moon_texture then
temp_moon.texture = fields.moon_texture
end
if fields.moon_tonemap then
temp_moon.tonemap = fields.moon_tonemap
end
if fields.moon_size then
temp_moon.scale = tonumber(fields.moon_size) or temp_moon.scale
end
-- stelle
if fields.stars_color then
temp_stars.star_color = palette[fields.stars_color]
end
if fields.stars_count then
temp_stars.count = tonumber(fields.stars_count) or temp_stars.count
end
if fields.stars_size then
temp_stars.scale = tonumber(fields.stars_size) or temp_stars.scale
end
-- nuvole
if fields.clouds_density then
temp_clouds.density = minetest.explode_scrollbar_event(fields.clouds_density).value / 100
end
if fields.clouds_color then
temp_clouds.color = palette[fields.clouds_color]
end
if fields.clouds_ambient then
temp_clouds.ambient = palette[fields.clouds_ambient]
end
if fields.clouds_thickness then
temp_clouds.thickness = tonumber(fields.clouds_thickness) or temp_clouds.thickness
end
if fields.clouds_height then
temp_clouds.height = tonumber(fields.clouds_height) or temp_clouds.height
end
if fields.clouds_speed_x then
temp_clouds.speed.x = tonumber(fields.clouds_speed_x) or temp_clouds.speed.x
end
if fields.clouds_speed_z then
temp_clouds.speed.z = tonumber(fields.clouds_speed_z) or temp_clouds.speed.z
end
-- controlla i vari campi che aggiornano il formspec
if fields.sky_clouds then
temp_sky.clouds = fields.sky_clouds == "true" and true or false
elseif fields.custom_fog_tint then
temp_sky_col.fog_tint_type = fields.custom_fog_tint == "true" and "custom" or "default"
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "sky"))
elseif fields.sky_type then
temp_sky.type = fields.sky_type
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "sky"))
elseif fields.sun_visible then
temp_sun.visible = fields.sun_visible == "true" and true or false
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "sun"))
elseif fields.sunrise_visible then
temp_sun.sunrise_visible = fields.sunrise_visible == "true" and true or false
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "sun"))
elseif fields.moon_visible then
temp_moon.visible = fields.moon_visible == "true" and true or false
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "moon"))
elseif fields.stars_visible then
temp_stars.visible = fields.stars_visible == "true" and true or false
minetest.show_formspec(p_name, "arena_lib:settings_sky", get_celvault_formspec(p_name, "stars"))
end
-- applica
if fields.apply then
local same_sky = compare_elem(arena.celestial_vault.sky or {textures={}, sky_color={}}, temp_sky_settings[p_name].sky)
local same_sun = compare_elem(arena.celestial_vault.sun or {}, temp_sky_settings[p_name].sun)
local same_moon = compare_elem(arena.celestial_vault.moon or {}, temp_sky_settings[p_name].moon)
local same_stars = compare_elem(arena.celestial_vault.stars or {}, temp_sky_settings[p_name].stars)
local same_clouds = compare_elem(arena.celestial_vault.clouds or {speed={}}, temp_sky_settings[p_name].clouds)
if not same_sky then arena_lib.set_celestial_vault(p_name, mod, arena_name, "sky", temp_sky_settings[p_name].sky, true) end
if not same_sun then arena_lib.set_celestial_vault(p_name, mod, arena_name, "sun", temp_sky_settings[p_name].sun, true) end
if not same_moon then arena_lib.set_celestial_vault(p_name, mod, arena_name, "moon", temp_sky_settings[p_name].moon, true) end
if not same_stars then arena_lib.set_celestial_vault(p_name, mod, arena_name, "stars", temp_sky_settings[p_name].stars, true) end
if not same_clouds then arena_lib.set_celestial_vault(p_name, mod, arena_name, "clouds", temp_sky_settings[p_name].clouds, true) end
end
player:set_sky(temp_sky)
player:set_sun(temp_sun)
player:set_moon(temp_moon)
player:set_stars(temp_stars)
player:set_clouds(temp_clouds)
end)