]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Force-update shadows when the world is changed (#12364)
authorx2048 <codeforsmile@gmail.com>
Thu, 26 May 2022 20:28:34 +0000 (22:28 +0200)
committerGitHub <noreply@github.com>
Thu, 26 May 2022 20:28:34 +0000 (22:28 +0200)
src/client/client.cpp
src/client/shadows/dynamicshadowsrender.cpp
src/client/shadows/dynamicshadowsrender.h

index 8ab96b7d10bfccba91013cedc61d97f0e66a602c..e078dc530bd2eb69fc61e26b681dd9fd1ae6874d 100644 (file)
@@ -530,6 +530,7 @@ void Client::step(float dtime)
        {
                int num_processed_meshes = 0;
                std::vector<v3s16> blocks_to_ack;
+               bool force_update_shadows = false;
                while (!m_mesh_update_thread.m_queue_out.empty())
                {
                        num_processed_meshes++;
@@ -556,9 +557,11 @@ void Client::step(float dtime)
 
                                        if (is_empty)
                                                delete r.mesh;
-                                       else
+                                       else {
                                                // Replace with the new mesh
                                                block->mesh = r.mesh;
+                                               force_update_shadows = true;
+                                       }
                                }
                        } else {
                                delete r.mesh;
@@ -583,6 +586,10 @@ void Client::step(float dtime)
 
                if (num_processed_meshes > 0)
                        g_profiler->graphAdd("num_processed_meshes", num_processed_meshes);
+
+               auto shadow_renderer = RenderingEngine::get_shadow_renderer();
+               if (shadow_renderer && force_update_shadows)
+                       shadow_renderer->setForceUpdateShadowMap();
        }
 
        /*
index c13cfe252894af9adc2e63ed137d5ad0df399b9e..b8ceeb6239e48eaef04d6d31926a1aced79bc2e3 100644 (file)
@@ -242,7 +242,7 @@ void ShadowRenderer::updateSMTextures()
 
                // detect if SM should be regenerated
                for (DirectionalLight &light : m_light_list) {
-                       if (light.should_update_map_shadow) {
+                       if (light.should_update_map_shadow || m_force_update_shadow_map) {
                                light.should_update_map_shadow = false;
                                m_current_frame = 0;
                                reset_sm_texture = true;
@@ -271,14 +271,14 @@ void ShadowRenderer::updateSMTextures()
                        // should put some gl* fn here
 
 
-                       if (m_current_frame < m_map_shadow_update_frames) {
+                       if (m_current_frame < m_map_shadow_update_frames || m_force_update_shadow_map) {
                                m_driver->setRenderTarget(shadowMapTargetTexture, reset_sm_texture, true,
                                                video::SColor(255, 255, 255, 255));
                                renderShadowMap(shadowMapTargetTexture, light);
 
                                // Render transparent part in one pass.
                                // This is also handled in ClientMap.
-                               if (m_current_frame == m_map_shadow_update_frames - 1) {
+                               if (m_current_frame == m_map_shadow_update_frames - 1 || m_force_update_shadow_map) {
                                        if (m_shadow_map_colored) {
                                                m_driver->setRenderTarget(0, false, false);
                                                m_driver->setRenderTarget(shadowMapTextureColors,
@@ -298,7 +298,7 @@ void ShadowRenderer::updateSMTextures()
                        ++m_current_frame;
 
                // pass finished, swap textures and commit light changes
-               if (m_current_frame == m_map_shadow_update_frames) {
+               if (m_current_frame == m_map_shadow_update_frames || m_force_update_shadow_map) {
                        if (shadowMapClientMapFuture != nullptr)
                                std::swap(shadowMapClientMapFuture, shadowMapClientMap);
 
@@ -306,6 +306,7 @@ void ShadowRenderer::updateSMTextures()
                        for (DirectionalLight &light : m_light_list)
                                light.commitFrustum();
                }
+               m_force_update_shadow_map = false;
        }
 }
 
@@ -432,7 +433,10 @@ void ShadowRenderer::renderShadowMap(video::ITexture *target,
                m_driver->setTransform(video::ETS_WORLD,
                                map_node->getAbsoluteTransformation());
 
-               map_node->renderMapShadows(m_driver, material, pass, m_current_frame, m_map_shadow_update_frames);
+               int frame = m_force_update_shadow_map ? 0 : m_current_frame;
+               int total_frames = m_force_update_shadow_map ? 1 : m_map_shadow_update_frames;
+
+               map_node->renderMapShadows(m_driver, material, pass, frame, total_frames);
                break;
        }
 }
index 0e4ef6b70cd29ee220845531cf2a6644db2c0832..2e3b58f6f9e90d6fbd6e73caa7d6d584cd621c94 100644 (file)
@@ -74,6 +74,7 @@ class ShadowRenderer
        void removeNodeFromShadowList(scene::ISceneNode *node);
 
        void update(video::ITexture *outputTarget = nullptr);
+       void setForceUpdateShadowMap() { m_force_update_shadow_map = true; }
        void drawDebug();
 
        video::ITexture *get_texture()
@@ -131,6 +132,7 @@ class ShadowRenderer
        bool m_shadows_enabled;
        bool m_shadows_supported;
        bool m_shadow_map_colored;
+       bool m_force_update_shadow_map;
        u8 m_map_shadow_update_frames; /* Use this number of frames to update map shaodw */
        u8 m_current_frame{0}; /* Current frame */
        f32 m_perspective_bias_xy;