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
This commit is contained in:
x2048 2022-10-26 22:26:09 +02:00 committed by GitHub
parent 16266397ed
commit 88820cd31c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 13 deletions

@ -107,7 +107,6 @@ void ShadowRenderer::disable()
} }
for (auto node : m_shadow_node_array) 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);
} }
@ -180,7 +179,6 @@ void ShadowRenderer::addNodeToShadowList(
if (!node) if (!node)
return; return;
m_shadow_node_array.emplace_back(node, shadowMode); 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);
} }
@ -258,7 +256,6 @@ void ShadowRenderer::updateSMTextures()
assert(shadowMapTextureFinal != nullptr); assert(shadowMapTextureFinal != nullptr);
for (auto &node : m_shadow_node_array) 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);
} }

@ -223,6 +223,11 @@ WieldMeshSceneNode::WieldMeshSceneNode(scene::ISceneManager *mgr, s32 id, bool l
dummymesh->drop(); // m_meshnode grabbed it dummymesh->drop(); // m_meshnode grabbed it
m_shadow = RenderingEngine::get_shadow_renderer(); m_shadow = RenderingEngine::get_shadow_renderer();
if (m_shadow) {
// Add mesh to shadow caster
m_shadow->addNodeToShadowList(m_meshnode);
}
} }
WieldMeshSceneNode::~WieldMeshSceneNode() WieldMeshSceneNode::~WieldMeshSceneNode()
@ -230,8 +235,8 @@ WieldMeshSceneNode::~WieldMeshSceneNode()
sanity_check(g_extrusion_mesh_cache); sanity_check(g_extrusion_mesh_cache);
// Remove node from shadow casters. m_shadow might be an invalid pointer! // Remove node from shadow casters. m_shadow might be an invalid pointer!
if (auto shadow = RenderingEngine::get_shadow_renderer()) if (m_shadow)
shadow->removeNodeFromShadowList(m_meshnode); m_shadow->removeNodeFromShadowList(m_meshnode);
if (g_extrusion_mesh_cache->drop()) if (g_extrusion_mesh_cache->drop())
g_extrusion_mesh_cache = nullptr; 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()) // need to normalize normals when lighting is enabled (because of setScale())
m_meshnode->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, m_lighting); m_meshnode->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, m_lighting);
m_meshnode->setVisible(true); 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) void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result)