diff --git a/src/frontend/screens/LevelScreen.cpp b/src/frontend/screens/LevelScreen.cpp index bf452c20..73e235d7 100644 --- a/src/frontend/screens/LevelScreen.cpp +++ b/src/frontend/screens/LevelScreen.cpp @@ -45,12 +45,14 @@ LevelScreen::LevelScreen(Engine* engine, std::unique_ptr level) keepAlive(settings.graphics.backlight.observe([=](bool) { controller->getLevel()->chunks->saveAndClear(); + worldRenderer->clear(); })); keepAlive(settings.camera.fov.observe([=](double value) { controller->getPlayer()->camera->setFov(glm::radians(value)); })); keepAlive(Events::getBinding(BIND_CHUNKS_RELOAD).onactived.add([=](){ controller->getLevel()->chunks->saveAndClear(); + worldRenderer->clear(); })); animator = std::make_unique(); diff --git a/src/graphics/render/ChunksRenderer.cpp b/src/graphics/render/ChunksRenderer.cpp index 76af55d2..c79791df 100644 --- a/src/graphics/render/ChunksRenderer.cpp +++ b/src/graphics/render/ChunksRenderer.cpp @@ -79,6 +79,12 @@ void ChunksRenderer::unload(const Chunk* chunk) { } } +void ChunksRenderer::clear() { + meshes.clear(); + inwork.clear(); + threadPool.clearQueue(); +} + std::shared_ptr ChunksRenderer::getOrRender(const std::shared_ptr& chunk, bool important) { auto found = meshes.find(glm::ivec2(chunk->x, chunk->z)); if (found == meshes.end()) { diff --git a/src/graphics/render/ChunksRenderer.hpp b/src/graphics/render/ChunksRenderer.hpp index 353877a0..89691c4e 100644 --- a/src/graphics/render/ChunksRenderer.hpp +++ b/src/graphics/render/ChunksRenderer.hpp @@ -39,6 +39,7 @@ public: std::shared_ptr render(const std::shared_ptr& chunk, bool important); void unload(const Chunk* chunk); + void clear(); std::shared_ptr getOrRender(const std::shared_ptr& chunk, bool important); std::shared_ptr get(Chunk* chunk); diff --git a/src/graphics/render/WorldRenderer.cpp b/src/graphics/render/WorldRenderer.cpp index 78cfba29..56cd662b 100644 --- a/src/graphics/render/WorldRenderer.cpp +++ b/src/graphics/render/WorldRenderer.cpp @@ -410,3 +410,7 @@ void WorldRenderer::drawBorders( } lineBatch->flush(); } + +void WorldRenderer::clear() { + renderer->clear(); +} diff --git a/src/graphics/render/WorldRenderer.hpp b/src/graphics/render/WorldRenderer.hpp index 13bdb185..06e4bb63 100644 --- a/src/graphics/render/WorldRenderer.hpp +++ b/src/graphics/render/WorldRenderer.hpp @@ -96,4 +96,6 @@ public: float delta, bool pause ); + + void clear(); }; diff --git a/src/util/ThreadPool.hpp b/src/util/ThreadPool.hpp index 9acd1902..3bc7f86e 100644 --- a/src/util/ThreadPool.hpp +++ b/src/util/ThreadPool.hpp @@ -237,6 +237,11 @@ namespace util { jobsMutexCondition.notify_one(); } + void clearQueue() { + std::lock_guard lock(jobsMutex); + jobs = {}; + } + /// @brief If false: worker will be blocked until it's result performed void setStandaloneResults(bool flag) { standaloneResults = flag;