Skip to content

Commit

Permalink
Shadow list improvements (minetest#12898)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
x2048 committed Oct 26, 2022
1 parent 1626639 commit 88820cd
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 13 deletions.
9 changes: 3 additions & 6 deletions src/client/shadows/dynamicshadowsrender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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()) {
Expand Down
14 changes: 7 additions & 7 deletions src/client/wieldmesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -223,15 +223,20 @@ 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()
{
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;
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 88820cd

Please sign in to comment.