From 88820cd31c2fe21c8c16ee547a3335131e8ba009 Mon Sep 17 00:00:00 2001 From: x2048 Date: Wed, 26 Oct 2022 22:26:09 +0200 Subject: [PATCH] Shadow list improvements (#12898) * Remove redundant checks when attaching SM texture to entities. Some of the checks were broken, leading to crashes when shadow intensity is set to 0 * Avoid memory leak in shadow casters list when wield mesh changes item stacks --- src/client/shadows/dynamicshadowsrender.cpp | 9 +++------ src/client/wieldmesh.cpp | 14 +++++++------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/client/shadows/dynamicshadowsrender.cpp b/src/client/shadows/dynamicshadowsrender.cpp index fd3841d2d..e9b2053e3 100644 --- a/src/client/shadows/dynamicshadowsrender.cpp +++ b/src/client/shadows/dynamicshadowsrender.cpp @@ -107,8 +107,7 @@ void ShadowRenderer::disable() } for (auto node : m_shadow_node_array) - if (node.shadowMode & E_SHADOW_MODE::ESM_RECEIVE) - node.node->setMaterialTexture(TEXTURE_LAYER_SHADOW, nullptr); + node.node->setMaterialTexture(TEXTURE_LAYER_SHADOW, nullptr); } void ShadowRenderer::initialize() @@ -180,8 +179,7 @@ void ShadowRenderer::addNodeToShadowList( if (!node) return; m_shadow_node_array.emplace_back(node, shadowMode); - if (shadowMode == ESM_RECEIVE || shadowMode == ESM_BOTH) - node->setMaterialTexture(TEXTURE_LAYER_SHADOW, shadowMapTextureFinal); + node->setMaterialTexture(TEXTURE_LAYER_SHADOW, shadowMapTextureFinal); } void ShadowRenderer::removeNodeFromShadowList(scene::ISceneNode *node) @@ -258,8 +256,7 @@ void ShadowRenderer::updateSMTextures() assert(shadowMapTextureFinal != nullptr); for (auto &node : m_shadow_node_array) - if (node.shadowMode == ESM_RECEIVE || node.shadowMode == ESM_BOTH) - node.node->setMaterialTexture(TEXTURE_LAYER_SHADOW, shadowMapTextureFinal); + node.node->setMaterialTexture(TEXTURE_LAYER_SHADOW, shadowMapTextureFinal); } if (!m_shadow_node_array.empty() && !m_light_list.empty()) { diff --git a/src/client/wieldmesh.cpp b/src/client/wieldmesh.cpp index d546d52ff..155b5ecc4 100644 --- a/src/client/wieldmesh.cpp +++ b/src/client/wieldmesh.cpp @@ -223,6 +223,11 @@ WieldMeshSceneNode::WieldMeshSceneNode(scene::ISceneManager *mgr, s32 id, bool l dummymesh->drop(); // m_meshnode grabbed it m_shadow = RenderingEngine::get_shadow_renderer(); + + if (m_shadow) { + // Add mesh to shadow caster + m_shadow->addNodeToShadowList(m_meshnode); + } } WieldMeshSceneNode::~WieldMeshSceneNode() @@ -230,8 +235,8 @@ WieldMeshSceneNode::~WieldMeshSceneNode() sanity_check(g_extrusion_mesh_cache); // Remove node from shadow casters. m_shadow might be an invalid pointer! - if (auto shadow = RenderingEngine::get_shadow_renderer()) - shadow->removeNodeFromShadowList(m_meshnode); + if (m_shadow) + m_shadow->removeNodeFromShadowList(m_meshnode); if (g_extrusion_mesh_cache->drop()) g_extrusion_mesh_cache = nullptr; @@ -552,11 +557,6 @@ void WieldMeshSceneNode::changeToMesh(scene::IMesh *mesh) // need to normalize normals when lighting is enabled (because of setScale()) m_meshnode->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, m_lighting); m_meshnode->setVisible(true); - - if (m_shadow) { - // Add mesh to shadow caster - m_shadow->addNodeToShadowList(m_meshnode); - } } void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result)