diff --git a/res/presets/weather/clear.json b/res/presets/weather/clear.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/res/presets/weather/clear.json @@ -0,0 +1 @@ +{} diff --git a/res/presets/weather/fog.json b/res/presets/weather/fog.json index ccf38e15..e9c3a2b3 100644 --- a/res/presets/weather/fog.json +++ b/res/presets/weather/fog.json @@ -1,5 +1,5 @@ { - "fog_opacity": 0.99, + "fog_opacity": 0.98, "fog_dencity": 3.6, "fog_curve": 0.25, "clouds": 0.8 diff --git a/res/scripts/stdcmd.lua b/res/scripts/stdcmd.lua index 95b37007..42aae5ee 100644 --- a/res/scripts/stdcmd.lua +++ b/res/scripts/stdcmd.lua @@ -264,6 +264,20 @@ console.add_command( end ) +console.add_command( + "weather.set name:str time:num=1", + "Change weather", + function (args, kwargs) + local filename = file.find("presets/weather/"..args[1]..".json") + if not filename then + return "weather preset not found" + end + local preset = json.parse(file.read(filename)) + gfx.weather.change(preset, args[2]) + return "weather set to "..filename.." preset ("..tostring(args[2]).." s)" + end +) + console.cheats = { "blocks.fill", "tp", @@ -271,5 +285,6 @@ console.cheats = { "time.set", "time.daycycle", "entity.despawn", - "player.respawn" + "player.respawn", + "weather.set", } diff --git a/src/graphics/render/WorldRenderer.cpp b/src/graphics/render/WorldRenderer.cpp index 9fd1536b..3d3a6ef5 100644 --- a/src/graphics/render/WorldRenderer.cpp +++ b/src/graphics/render/WorldRenderer.cpp @@ -154,22 +154,6 @@ void WorldRenderer::renderLevel( ) { weather.update(delta); - if (timer > 1.0f && weather.b.fall.texture.empty() && timer < 2.0f) { - weather.b.deserialize(io::read_json("res:presets/weather/snow.json")); - weather.t = 0.0f; - weather.speed = 0.5f; - weather.update(delta); - } - - if (timer > 15.0f && weather.a.fall.texture.empty()) { - std::swap(weather.a, weather.b); - weather.b = {}; - weather.b.deserialize(io::read_json("res:presets/weather/fog.json")); - weather.t = 0.0f; - weather.speed = 0.1f; - weather.update(delta); - } - texts->render(ctx, camera, settings, hudVisible, false); bool culling = engine.getSettings().graphics.frustumCulling.get(); diff --git a/src/graphics/render/WorldRenderer.hpp b/src/graphics/render/WorldRenderer.hpp index cb0b902c..2b415568 100644 --- a/src/graphics/render/WorldRenderer.hpp +++ b/src/graphics/render/WorldRenderer.hpp @@ -47,6 +47,14 @@ struct Weather { a.intensity = 1.0f - t; } + void change(WeatherPreset preset, float time) { + std::swap(a, b); + b = std::move(preset); + t = 0.0f; + speed = 1.0f / glm::max(time, 1.e-5f); + update(0.0f); + } + float fogOpacity() const { return b.fogOpacity * t + a.fogOpacity * (1.0f - t); } diff --git a/src/logic/scripting/lua/libs/api_lua.hpp b/src/logic/scripting/lua/libs/api_lua.hpp index 1b7d42d6..8b068d4c 100644 --- a/src/logic/scripting/lua/libs/api_lua.hpp +++ b/src/logic/scripting/lua/libs/api_lua.hpp @@ -46,6 +46,7 @@ extern const luaL_Reg utf8lib[]; extern const luaL_Reg vec2lib[]; // vecn.cpp extern const luaL_Reg vec3lib[]; // vecn.cpp extern const luaL_Reg vec4lib[]; // vecn.cpp +extern const luaL_Reg weatherlib[]; // gfx.weather extern const luaL_Reg worldlib[]; // Components diff --git a/src/logic/scripting/lua/libs/libweather.cpp b/src/logic/scripting/lua/libs/libweather.cpp new file mode 100644 index 00000000..8544ab0d --- /dev/null +++ b/src/logic/scripting/lua/libs/libweather.cpp @@ -0,0 +1,16 @@ +#include "libhud.hpp" + +using namespace scripting; + +static int l_change(lua::State* L) { + WeatherPreset weather {}; + weather.deserialize(lua::tovalue(L, 1)); + float time = lua::tonumber(L, 2); + renderer->weather.change(std::move(weather), time); + return 0; +} + +const luaL_Reg weatherlib[] = { + {"change", wrap_hud}, + {NULL, NULL} +}; diff --git a/src/logic/scripting/scripting_hud.cpp b/src/logic/scripting/scripting_hud.cpp index 478b4f9e..dc7a0339 100644 --- a/src/logic/scripting/scripting_hud.cpp +++ b/src/logic/scripting/scripting_hud.cpp @@ -36,6 +36,7 @@ void scripting::on_frontend_init(Hud* hud, WorldRenderer* renderer) { lua::openlib(L, "gfx", "blockwraps", blockwrapslib); lua::openlib(L, "gfx", "particles", particleslib); lua::openlib(L, "gfx", "text3d", text3dlib); + lua::openlib(L, "gfx", "weather", weatherlib); load_script("hud_classes.lua");