From 1f9adff26fd79f03f9d6616ef70976f0fc81ee0c Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Tue, 10 Jul 2012 02:05:06 +0000 Subject: 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. --- source/gameengine/Physics/Bullet/CcdPhysicsController.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'source/gameengine/Physics/Bullet') diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index e63724fffc6..0a105ee1c1a 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -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::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) { -- cgit v1.2.3