summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPiotr Dziwinski <piotrdz@gmail.com>2013-10-13 14:44:12 +0200
committerPiotr Dziwinski <piotrdz@gmail.com>2013-10-13 14:44:12 +0200
commit9017dbbbdb1f59971b17976d7cf95fe39469d82a (patch)
tree6b791f48c9167eebaa428a432081196a89d9c389 /src
parentccb63bd29e0cc7957be53cb40889496d04527d7a (diff)
downloadcolobot-9017dbbbdb1f59971b17976d7cf95fe39469d82a.tar.gz
colobot-9017dbbbdb1f59971b17976d7cf95fe39469d82a.tar.bz2
colobot-9017dbbbdb1f59971b17976d7cf95fe39469d82a.zip
Fixed CTerrain-related memory leaks
Diffstat (limited to 'src')
-rw-r--r--src/graphics/engine/engine.cpp26
-rw-r--r--src/graphics/engine/terrain.cpp19
-rw-r--r--src/graphics/engine/terrain.h2
-rw-r--r--src/object/robotmain.cpp3
4 files changed, 47 insertions, 3 deletions
diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp
index 669ea42..e973eec 100644
--- a/src/graphics/engine/engine.cpp
+++ b/src/graphics/engine/engine.cpp
@@ -600,6 +600,31 @@ void CEngine::DeleteBaseObject(int baseObjRank)
void CEngine::DeleteAllBaseObjects()
{
+ for (int baseObjRank = 0; baseObjRank < static_cast<int>( m_baseObjects.size() ); baseObjRank++)
+ {
+ EngineBaseObject& p1 = m_baseObjects[baseObjRank];
+ if (! p1.used)
+ continue;
+
+ for (int l2 = 0; l2 < static_cast<int>( p1.next.size() ); l2++)
+ {
+ EngineBaseObjTexTier& p2 = p1.next[l2];
+
+ for (int l3 = 0; l3 < static_cast<int>( p2.next.size() ); l3++)
+ {
+ EngineBaseObjLODTier& p3 = p2.next[l3];
+
+ for (int l4 = 0; l4 < static_cast<int>( p3.next.size() ); l4++)
+ {
+ EngineBaseObjDataTier& p4 = p3.next[l4];
+
+ m_device->DestroyStaticBuffer(p4.staticBufferId);
+ p4.staticBufferId = 0;
+ }
+ }
+ }
+ }
+
m_baseObjects.clear();
}
@@ -817,6 +842,7 @@ int CEngine::CreateObject()
m_objects[objRank].drawWorld = true;
m_objects[objRank].distance = 0.0f;
+ m_objects[objRank].baseObjRank = -1;
m_objects[objRank].shadowRank = -1;
return objRank;
diff --git a/src/graphics/engine/terrain.cpp b/src/graphics/engine/terrain.cpp
index 4fe3057..4b5384e 100644
--- a/src/graphics/engine/terrain.cpp
+++ b/src/graphics/engine/terrain.cpp
@@ -90,7 +90,7 @@ bool CTerrain::Generate(int mosaicCount, int brickCountPow2, float brickSize,
std::vector<int>(dim).swap(m_textures);
dim = m_mosaicCount*m_mosaicCount;
- std::vector<int>(dim).swap(m_objRanks);
+ std::vector<int>(dim, -1).swap(m_objRanks);
return true;
}
@@ -258,6 +258,23 @@ TerrainRes CTerrain::GetResource(const Math::Vector &p)
void CTerrain::FlushRelief()
{
m_relief.clear();
+ m_resources.clear();
+ m_textures.clear();
+
+ for (int objRank : m_objRanks)
+ {
+ if (objRank == -1)
+ continue;
+
+ int baseObjRank = m_engine->GetObjectBaseRank(objRank);
+
+ if (baseObjRank != -1)
+ m_engine->DeleteBaseObject(baseObjRank);
+
+ m_engine->DeleteObject(objRank);
+ }
+
+ m_objRanks.clear();
}
/**
diff --git a/src/graphics/engine/terrain.h b/src/graphics/engine/terrain.h
index e2317c4..e618691 100644
--- a/src/graphics/engine/terrain.h
+++ b/src/graphics/engine/terrain.h
@@ -239,7 +239,7 @@ public:
//! Generates a level in the terrain
bool GenerateMaterials(int *id, float min, float max, float slope, float freq, Math::Vector center, float radius);
- //! Clears the relief data to zero
+ //! Clears the relief, resources and all other associated data
void FlushRelief();
//! Load relief from image
bool LoadRelief(const std::string& fileName, float scaleRelief, bool adjustBorder);
diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp
index 1748c57..6fe85d3 100644
--- a/src/object/robotmain.cpp
+++ b/src/object/robotmain.cpp
@@ -1104,6 +1104,7 @@ void CRobotMain::ChangePhase(Phase phase)
ChangePause(false);
FlushDisplayInfo();
m_engine->SetRankView(0);
+ m_terrain->FlushRelief();
m_engine->DeleteAllObjects();
Gfx::CModelManager::GetInstancePointer()->DeleteAllModelCopies();
m_engine->SetWaterAddColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f));
@@ -3842,9 +3843,9 @@ void CRobotMain::Convert()
void CRobotMain::ScenePerso()
{
DeleteAllObjects(); // removes all the current 3D Scene
+ m_terrain->FlushRelief();
m_engine->DeleteAllObjects();
Gfx::CModelManager::GetInstancePointer()->DeleteAllModelCopies();
- m_terrain->FlushRelief(); // all flat
m_terrain->FlushBuildingLevel();
m_terrain->FlushFlyingLimit();
m_lightMan->FlushLights();