Commit: ff2ec0566208a3594ef46577062a97119cfe9b2c
Author: Mitchell Stokes
Date:   Wed May 14 19:11:08 2014 -0700
https://developer.blender.org/rBff2ec0566208a3594ef46577062a97119cfe9b2c

Fix T40199: bge.logic.LibFree() could cause crashes by leaving dangling 
pointers in the rasterizer.

===================================================================

M       source/gameengine/Converter/KX_BlenderSceneConverter.cpp
M       source/gameengine/Rasterizer/RAS_BucketManager.h

===================================================================

diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp 
b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
index 7d7f8eb..88fd10b 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
@@ -1382,10 +1382,42 @@ bool KX_BlenderSceneConverter::FreeBlendFile(struct 
Main *maggie)
        }
 
        vector<pair<KX_Scene*,RAS_MeshObject*> >::iterator meshit;
+       RAS_BucketManager::BucketList::iterator bit;
+       list<RAS_MeshSlot>::iterator msit;
+       RAS_BucketManager::BucketList buckets;
+
        size = m_meshobjects.size();
        for (i=0, meshit=m_meshobjects.begin(); i<size; ) {
                RAS_MeshObject *me= (*meshit).second;
                if (IS_TAGGED(me->GetMesh())) {
+                       // Before deleting the mesh object, make sure the 
rasterizer is
+                       // no longer referencing it.
+                       buckets = 
meshit->first->GetBucketManager()->GetSolidBuckets();
+                       for (bit=buckets.begin(); bit!=buckets.end(); bit++) {
+                               msit = (*bit)->msBegin();
+
+                               while (msit != (*bit)->msEnd()) {
+                                       if (msit->m_mesh == meshit->second)
+                                               (*bit)->RemoveMesh(&(*msit++));
+                                       else
+                                               msit++;
+                               }
+                       }
+
+                       // And now the alpha buckets
+                       buckets = 
meshit->first->GetBucketManager()->GetAlphaBuckets();
+                       for (bit=buckets.begin(); bit!=buckets.end(); bit++) {
+                               msit = (*bit)->msBegin();
+
+                               while (msit != (*bit)->msEnd()) {
+                                       if (msit->m_mesh == meshit->second)
+                                               (*bit)->RemoveMesh(&(*msit++));
+                                       else
+                                               msit++;
+                               }
+                       }
+
+                       // Now it should be safe to delete
                        delete (*meshit).second;
                        *meshit = m_meshobjects.back();
                        m_meshobjects.pop_back();
@@ -1536,7 +1568,8 @@ RAS_MeshObject 
*KX_BlenderSceneConverter::ConvertMeshSpecial(KX_Scene* kx_scene,
                        }
                }
        }
-       
+
+       m_currentScene = kx_scene; // This needs to be set in case we LibLoaded 
earlier
        RAS_MeshObject *meshobj = BL_ConvertMesh((Mesh *)me, NULL, kx_scene, 
this, false);
        
kx_scene->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
        m_map_mesh_to_gamemesh.clear(); /* This is at runtime so no need to 
keep this, BL_ConvertMesh adds */
diff --git a/source/gameengine/Rasterizer/RAS_BucketManager.h 
b/source/gameengine/Rasterizer/RAS_BucketManager.h
index f8c6375..5ed212e 100644
--- a/source/gameengine/Rasterizer/RAS_BucketManager.h
+++ b/source/gameengine/Rasterizer/RAS_BucketManager.h
@@ -39,7 +39,9 @@
 
 class RAS_BucketManager
 {
+public:
        typedef std::vector<class RAS_MaterialBucket*> BucketList;
+private:
        BucketList m_SolidBuckets;
        BucketList m_AlphaBuckets;

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to