diff options
author | Benoit Bolsee <benoit.bolsee@online.be> | 2008-03-10 00:42:03 +0300 |
---|---|---|
committer | Benoit Bolsee <benoit.bolsee@online.be> | 2008-03-10 00:42:03 +0300 |
commit | 822e51bd2d663f82d360d474192718660cc9a35c (patch) | |
tree | 524fb7a0d13fd702bce374a876a714f894ffcf68 /source/gameengine/Ketsji | |
parent | ce7a21047f50c0e26ce55134ba434543c247d894 (diff) |
BGE memleak fixed: mesh/material not deleted when switching scene
Diffstat (limited to 'source/gameengine/Ketsji')
-rw-r--r-- | source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp | 22 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_ISceneConverter.h | 2 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_KetsjiEngine.cpp | 6 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Scene.cpp | 11 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Scene.h | 7 |
5 files changed, 21 insertions, 27 deletions
diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp index 7b2c514db8a..465a021cd43 100644 --- a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp +++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp @@ -682,8 +682,6 @@ void KX_ConvertODEEngineObject(KX_GameObject* gameobj, #endif //WIN32 -static GEN_Map<GEN_HashedPtr,btCollisionShape*> map_gamemesh_to_bulletshape; - // forward declarations static btCollisionShape* CreateBulletShapeFromMesh(RAS_MeshObject* meshobj, bool polytope) { @@ -701,14 +699,6 @@ static btCollisionShape* CreateBulletShapeFromMesh(RAS_MeshObject* meshobj, bool int numPoints = 0; btVector3* points = 0; - btCollisionShape** shapeptr = map_gamemesh_to_bulletshape[GEN_HashedPtr(meshobj)]; - - // Mesh has already been converted: reuse - if (shapeptr) - { - //return *shapeptr; - } - // Mesh has no polygons! int numpolys = meshobj->NumPolygons(); if (!numpolys) @@ -850,7 +840,6 @@ static btCollisionShape* CreateBulletShapeFromMesh(RAS_MeshObject* meshobj, bool if (numvalidpolys > 0) { - //map_gamemesh_to_bulletshape.insert(GEN_HashedPtr(meshobj),collisionMeshShape); if (!polytope) { bool useQuantization = true; @@ -1200,17 +1189,6 @@ void KX_ConvertBulletObject( class KX_GameObject* gameobj, void KX_ClearBulletSharedShapes() { - int numshapes = map_gamemesh_to_bulletshape.size(); - int i; - btCollisionShape*shape=0; - for (i=0;i<numshapes ;i++) - { - shape = *map_gamemesh_to_bulletshape.at(i); - //delete shape; - } - - map_gamemesh_to_bulletshape.clear(); - } #endif diff --git a/source/gameengine/Ketsji/KX_ISceneConverter.h b/source/gameengine/Ketsji/KX_ISceneConverter.h index 2e4250dfe1e..b2ec49b31ac 100644 --- a/source/gameengine/Ketsji/KX_ISceneConverter.h +++ b/source/gameengine/Ketsji/KX_ISceneConverter.h @@ -55,6 +55,8 @@ public: class RAS_IRenderTools* rendertools, class RAS_ICanvas* canvas)=0; + virtual void RemoveScene(class KX_Scene *scene)=0; + virtual void SetAlwaysUseExpandFraming(bool to_what) = 0; virtual void SetNewFileName(const STR_String& filename) = 0; diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index 9e5efad803b..b879dd2ebee 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -993,7 +993,7 @@ void KX_KetsjiEngine::StopEngine() for (sceneit = m_scenes.begin();sceneit != m_scenes.end() ; sceneit++) { KX_Scene* scene = *sceneit; - delete scene; + m_sceneconverter->RemoveScene(scene); } m_scenes.clear(); @@ -1217,7 +1217,7 @@ void KX_KetsjiEngine::RemoveScheduledScenes() KX_Scene* scene = *sceneit; if (scene->GetName()==scenename) { - delete scene; + m_sceneconverter->RemoveScene(scene); m_scenes.erase(sceneit); break; } @@ -1315,7 +1315,7 @@ void KX_KetsjiEngine::ReplaceScheduledScenes() KX_Scene* scene = *sceneit; if (scene->GetName() == oldscenename) { - delete scene; + m_sceneconverter->RemoveScene(scene); KX_Scene* tmpscene = CreateScene(newscenename); m_scenes[i]=tmpscene; PostProcessScene(tmpscene); diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index f9fc503f406..633b57ef209 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -75,6 +75,7 @@ #include "NG_NetworkScene.h" #include "PHY_IPhysicsEnvironment.h" #include "KX_IPhysicsController.h" +#include "KX_BlenderSceneConverter.h" #include "BL_SkinDeformer.h" #include "BL_DeformableGameObject.h" @@ -120,7 +121,8 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, m_adi(adi), m_networkDeviceInterface(ndi), m_active_camera(NULL), - m_ueberExecutionPriority(0) + m_ueberExecutionPriority(0), + m_sceneConverter(NULL) { m_suspendedtime = 0.0; m_suspendeddelta = 0.0; @@ -783,6 +785,8 @@ void KX_Scene::NewRemoveObject(class CValue* gameobj) //m_active_camera->Release(); m_active_camera = NULL; } + if (m_sceneConverter) + m_sceneConverter->UnregisterGameObject(newobj); } @@ -1277,6 +1281,11 @@ void KX_Scene::SetNodeTree(SG_Tree* root) m_objecttree = root; } +void KX_Scene::SetSceneConverter(class KX_BlenderSceneConverter* sceneConverter) +{ + m_sceneConverter = sceneConverter; +} + void KX_Scene::SetPhysicsEnvironment(class PHY_IPhysicsEnvironment* physEnv) { m_physicsEnvironment = physEnv; diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h index b857f4f591e..4c3b1d2e558 100644 --- a/source/gameengine/Ketsji/KX_Scene.h +++ b/source/gameengine/Ketsji/KX_Scene.h @@ -86,6 +86,7 @@ class RAS_IRasterizer; class RAS_IRenderTools; class SCA_JoystickManager; class btCollisionShape; +class KX_BlenderSceneConverter; /** * The KX_Scene holds all data for an independent scene. It relates * KX_Objects to the specific objects in the modules. @@ -136,10 +137,12 @@ protected: SCA_MouseManager* m_mousemgr; SCA_TimeEventManager* m_timemgr; + // Scene converter where many scene entities are registered + // Used to deregister objects that are deleted + class KX_BlenderSceneConverter* m_sceneConverter; /** * physics engine abstraction */ - //e_PhysicsEngine m_physicsEngine; //who needs this ? class PHY_IPhysicsEnvironment* m_physicsEnvironment; @@ -517,6 +520,8 @@ public: bool IsClearingZBuffer(); void EnableZBufferClearing(bool isclearingZbuffer); + void SetSceneConverter(class KX_BlenderSceneConverter* sceneConverter); + class PHY_IPhysicsEnvironment* GetPhysicsEnvironment() { return m_physicsEnvironment; |