forked from Mirrorlandia_minetest/minetest
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:
parent
16266397ed
commit
88820cd31c
@ -107,8 +107,7 @@ 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShadowRenderer::initialize()
|
void ShadowRenderer::initialize()
|
||||||
@ -180,8 +179,7 @@ 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShadowRenderer::removeNodeFromShadowList(scene::ISceneNode *node)
|
void ShadowRenderer::removeNodeFromShadowList(scene::ISceneNode *node)
|
||||||
@ -258,8 +256,7 @@ 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_shadow_node_array.empty() && !m_light_list.empty()) {
|
if (!m_shadow_node_array.empty() && !m_light_list.empty()) {
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user