diff --git a/src/frontend/screens/LevelScreen.cpp b/src/frontend/screens/LevelScreen.cpp index f3694d85..eab517da 100644 --- a/src/frontend/screens/LevelScreen.cpp +++ b/src/frontend/screens/LevelScreen.cpp @@ -76,13 +76,14 @@ LevelScreen::LevelScreen( engine, *controller, *renderer, assets, *player ); - keepAlive(settings.graphics.backlight.observe([=](bool) { - player->chunks->saveAndClear(); - renderer->clear(); - })); - keepAlive(settings.graphics.denseRender.observe([=](bool) { + auto resetChunks = [=](bool) { player->chunks->saveAndClear(); renderer->clear(); + }; + keepAlive(settings.graphics.backlight.observe(resetChunks)); + keepAlive(settings.graphics.softLighting.observe(resetChunks)); + keepAlive(settings.graphics.denseRender.observe([=](bool flag) { + resetChunks(flag); frontend->getContentGfxCache().refresh(); })); keepAlive(settings.camera.fov.observe([=](double value) { diff --git a/src/graphics/render/BlocksRenderer.cpp b/src/graphics/render/BlocksRenderer.cpp index 6df7967e..f2788df3 100644 --- a/src/graphics/render/BlocksRenderer.cpp +++ b/src/graphics/render/BlocksRenderer.cpp @@ -9,7 +9,7 @@ #include "lighting/Lightmap.hpp" #include "frontend/ContentGfxCache.hpp" -const glm::vec3 BlocksRenderer::SUN_VECTOR(0.528265f, 0.833149f, -0.163704f); +const glm::vec3 BlocksRenderer::SUN_VECTOR(0.528265, 0.833149, -0.163704); const float DIRECTIONAL_LIGHT_FACTOR = 0.3f; BlocksRenderer::BlocksRenderer( @@ -35,8 +35,7 @@ BlocksRenderer::BlocksRenderer( blockDefsCache = content.getIndices()->blocks.getDefs(); } -BlocksRenderer::~BlocksRenderer() { -} +BlocksRenderer::~BlocksRenderer() = default; /// Basic vertex add method void BlocksRenderer::vertex( @@ -480,6 +479,7 @@ void BlocksRenderer::render( ) { bool denseRender = this->denseRender; bool densePass = this->densePass; + bool enableAO = settings.graphics.softLighting.get(); for (const auto drawGroup : *content.drawGroups) { int begin = beginEnds[drawGroup][0]; if (begin == 0) { @@ -516,7 +516,7 @@ void BlocksRenderer::render( switch (def.getModel(state.userbits).type) { case BlockModelType::BLOCK: blockCube({x, y, z}, texfaces, def, vox.state, !def.shadeless, - def.ambientOcclusion); + def.ambientOcclusion && enableAO); break; case BlockModelType::XSPRITE: { if (!denseRender) @@ -527,7 +527,7 @@ void BlocksRenderer::render( case BlockModelType::AABB: { if (!denseRender) blockAABB({x, y, z}, texfaces, &def, vox.state.rotation, - !def.shadeless, def.ambientOcclusion); + !def.shadeless, def.ambientOcclusion && enableAO); break; } case BlockModelType::CUSTOM: { @@ -537,7 +537,7 @@ void BlocksRenderer::render( def, vox.state, !def.shadeless, - def.ambientOcclusion + def.ambientOcclusion && enableAO ); break; } @@ -561,6 +561,7 @@ SortingMeshData BlocksRenderer::renderTranslucent( size_t totalSize = 0; bool densePass = this->densePass; + bool enableAO = settings.graphics.softLighting.get(); for (const auto drawGroup : *content.drawGroups) { int begin = beginEnds[drawGroup][0]; if (begin == 0) { @@ -594,7 +595,7 @@ SortingMeshData BlocksRenderer::renderTranslucent( switch (def.getModel(state.userbits).type) { case BlockModelType::BLOCK: blockCube({x, y, z}, texfaces, def, vox.state, !def.shadeless, - def.ambientOcclusion); + def.ambientOcclusion && enableAO); break; case BlockModelType::XSPRITE: { blockXSprite(x, y, z, glm::vec3(1.0f), @@ -602,13 +603,24 @@ SortingMeshData BlocksRenderer::renderTranslucent( break; } case BlockModelType::AABB: { - blockAABB({x, y, z}, texfaces, &def, vox.state.rotation, - !def.shadeless, def.ambientOcclusion); + blockAABB( + {x, y, z}, + texfaces, + &def, + vox.state.rotation, + !def.shadeless, + def.ambientOcclusion && enableAO + ); break; } case BlockModelType::CUSTOM: { - blockCustomModel({x, y, z}, def, vox.state, - !def.shadeless, def.ambientOcclusion); + blockCustomModel( + {x, y, z}, + def, + vox.state, + !def.shadeless, + def.ambientOcclusion && enableAO + ); break; } default: diff --git a/src/io/settings_io.cpp b/src/io/settings_io.cpp index f4e89338..6e94db9f 100644 --- a/src/io/settings_io.cpp +++ b/src/io/settings_io.cpp @@ -79,6 +79,7 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) { builder.add("ssao", &settings.graphics.ssao); builder.add("shadows-quality", &settings.graphics.shadowsQuality); builder.add("dense-render-distance", &settings.graphics.denseRenderDistance); + builder.add("soft-lighting", &settings.graphics.softLighting); builder.section("ui"); builder.add("language", &settings.ui.language); diff --git a/src/settings.hpp b/src/settings.hpp index ee35d5a4..9b3fa363 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -85,6 +85,8 @@ struct GraphicsSettings { IntegerSetting shadowsQuality {0, 0, 3}; /// @brief Dense render distance IntegerSetting denseRenderDistance {56, 0, 10'000}; + /// @brief Soft lighting for blocks + FlagSetting softLighting {true}; }; struct PathfindingSettings {