mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 09:15:29 +01:00 
			
		
		
		
	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:
		@@ -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()) {
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user