diff --git a/src/frontend/LevelFrontend.cpp b/src/frontend/LevelFrontend.cpp index d70f09ba2..2143a4778 100644 --- a/src/frontend/LevelFrontend.cpp +++ b/src/frontend/LevelFrontend.cpp @@ -147,3 +147,7 @@ const ContentGfxCache& LevelFrontend::getContentGfxCache() const { LevelController& LevelFrontend::getController() const { return controller; } + +Weather& LevelFrontend::getWeather() { + return weather; +} diff --git a/src/frontend/LevelFrontend.hpp b/src/frontend/LevelFrontend.hpp index 451f88675..28c8a5832 100644 --- a/src/frontend/LevelFrontend.hpp +++ b/src/frontend/LevelFrontend.hpp @@ -1,5 +1,7 @@ #pragma once +#include "world/Weather.hpp" + #include class Assets; @@ -15,6 +17,7 @@ class LevelFrontend { LevelController& controller; Assets& assets; std::unique_ptr contentCache; + Weather weather {}; public: LevelFrontend( Engine& engine, @@ -28,4 +31,5 @@ public: const ContentGfxCache& getContentGfxCache() const; ContentGfxCache& getContentGfxCache(); LevelController& getController() const; + Weather& getWeather(); }; diff --git a/src/frontend/screens/LevelScreen.cpp b/src/frontend/screens/LevelScreen.cpp index 33b637531..613384b7b 100644 --- a/src/frontend/screens/LevelScreen.cpp +++ b/src/frontend/screens/LevelScreen.cpp @@ -81,7 +81,7 @@ LevelScreen::LevelScreen( auto resetChunks = [=](bool) { player->chunks->saveAndClear(); - renderer->clear(); + renderer->resetCache(); }; keepAlive(settings.graphics.backlight.observe(resetChunks)); keepAlive(settings.graphics.softLighting.observe(resetChunks)); @@ -94,7 +94,7 @@ LevelScreen::LevelScreen( })); keepAlive(input.addCallback(BIND_CHUNKS_RELOAD, [=]() { player->chunks->saveAndClear(); - renderer->clear(); + renderer->resetCache(); return false; })); controller->preQuitCallbacks.listen([this]() { @@ -153,7 +153,7 @@ void LevelScreen::loadDecorations() { } auto data = io::read_object(CLIENT_FILE); if (data.has("weather")) { - renderer->getWeather().deserialize(data["weather"]); + frontend->getWeather().deserialize(data["weather"]); } } @@ -161,7 +161,7 @@ void LevelScreen::saveDecorations() { io::create_directory("world:client"); auto data = dv::object(); - data["weather"] = renderer->getWeather().serialize(); + data["weather"] = frontend->getWeather().serialize(); io::write_json(CLIENT_FILE, data, true); } @@ -257,7 +257,7 @@ void LevelScreen::update(float delta) { hud->update(hudVisible); - const Weather& weather = renderer->getWeather(); + const Weather& weather = frontend->getWeather(); const Player& player = playerController->getPlayer(); const Camera& camera = *player.currentCamera; decorator->update(paused ? 0.0f : delta, camera, weather); diff --git a/src/graphics/render/Decorator.cpp b/src/graphics/render/Decorator.cpp index b988898ce..4e2a79518 100644 --- a/src/graphics/render/Decorator.cpp +++ b/src/graphics/render/Decorator.cpp @@ -24,6 +24,7 @@ #include "voxels/Chunks.hpp" #include "window/Camera.hpp" #include "world/Level.hpp" +#include "world/Weather.hpp" #include "WorldRenderer.hpp" namespace fs = std::filesystem; diff --git a/src/graphics/render/WorldRenderer.cpp b/src/graphics/render/WorldRenderer.cpp index 353c5fabd..01168e602 100644 --- a/src/graphics/render/WorldRenderer.cpp +++ b/src/graphics/render/WorldRenderer.cpp @@ -51,6 +51,7 @@ #include "window/Window.hpp" #include "world/Level.hpp" #include "world/LevelEvents.hpp" +#include "world/Weather.hpp" #include "world/World.hpp" #include "debug/Logger.hpp" @@ -84,6 +85,7 @@ WorldRenderer::WorldRenderer( level(frontend.getLevel()), player(player), assets(*engine.getAssets()), + weather(frontend.getWeather()), frustumCulling(std::make_unique()), lineBatch(std::make_unique()), batch3d(std::make_unique(BATCH3D_CAPACITY)), @@ -590,7 +592,7 @@ void WorldRenderer::renderBlockOverlay(const DrawContext& wctx) { batch3d->flush(); } -void WorldRenderer::clear() { +void WorldRenderer::resetCache() { chunksRenderer->clear(); } diff --git a/src/graphics/render/WorldRenderer.hpp b/src/graphics/render/WorldRenderer.hpp index d56c21cbf..49add0351 100644 --- a/src/graphics/render/WorldRenderer.hpp +++ b/src/graphics/render/WorldRenderer.hpp @@ -4,7 +4,6 @@ #include "typedefs.hpp" #include "presets/WeatherPreset.hpp" -#include "world/Weather.hpp" #include "window/Camera.hpp" #include "util/ObjectsKeeper.hpp" @@ -36,6 +35,7 @@ class Skybox; class TextsRenderer; class CloudsRenderer; struct EngineSettings; +struct Weather; class WorldRenderer final : public util::ObjectsKeeper { public: @@ -54,7 +54,7 @@ public: PostProcessing& postProcessing ); - void clear(); + void resetCache(); void setDebug(bool flag); @@ -66,6 +66,7 @@ private: const Level& level; Player& player; const Assets& assets; + Weather& weather; std::unique_ptr frustumCulling; std::unique_ptr lineBatch; std::unique_ptr batch3d; @@ -77,13 +78,11 @@ private: std::unique_ptr debugLines; std::unique_ptr precipitation; std::unique_ptr cloudsRenderer; - Weather weather {}; float timer = 0.0f; bool debug = false; bool lightsDebug = false; bool gbufferPipeline = false; - bool dirtySettings = false; /// @brief Render block selection lines diff --git a/src/logic/scripting/lua/libs/libweather.cpp b/src/logic/scripting/lua/libs/libweather.cpp index 76a94a68b..1ae25156b 100644 --- a/src/logic/scripting/lua/libs/libweather.cpp +++ b/src/logic/scripting/lua/libs/libweather.cpp @@ -2,6 +2,7 @@ #include "world/Level.hpp" #include "world/World.hpp" +#include "world/Weather.hpp" using namespace scripting; @@ -9,6 +10,11 @@ static Weather& require_weather() { if (level == nullptr) { throw std::runtime_error("world is not open"); } + if (renderer == nullptr) { + throw std::runtime_error( + "world frontend is not initialized yet (wait for on_hud_open event)" + ); + } return renderer->getWeather(); }