Fix for a crash caused by ReplaceMesh changing an objects physics shape. CcdShapeConstructionInfo::UpdateMesh() would change the CcdShapeConstructionInfo's m_meshObject, but didn't change m_meshShapeMap, which means the CcdShapeConstructionInfo object's destructor would not find it's m_meshObject in the m_meshShapeMap. This leaves some nasty dangling pointers laying around which caused issues if the scene was re-run, or the scene was changed to one that also had the mesh.
Note: This fix could cause other issues with shared physics meshes. In general, we may want to re-evaluate how we handle updating potentially shared physics meshes.
This commit is contained in:
		@@ -2048,6 +2048,15 @@ bool CcdShapeConstructionInfo::UpdateMesh(class KX_GameObject* gameobj, class RA
 | 
			
		||||
		m_forceReInstance= true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Make sure to also replace the mesh in the shape map! Otherwise we leave dangling references when we free.
 | 
			
		||||
	// Note, this whole business could cause issues with shared meshes. If we update one mesh, do we replace
 | 
			
		||||
	// them all?
 | 
			
		||||
	std::map<RAS_MeshObject*,CcdShapeConstructionInfo*>::iterator mit = m_meshShapeMap.find(m_meshObject);
 | 
			
		||||
	if (mit != m_meshShapeMap.end()) {
 | 
			
		||||
		m_meshShapeMap.erase(mit);
 | 
			
		||||
		m_meshShapeMap[meshobj] = this;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	m_meshObject= meshobj;
 | 
			
		||||
	
 | 
			
		||||
	if (dm) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user