diff options
author | Piotr Dziwinski <piotrdz@gmail.com> | 2013-10-13 14:44:12 +0200 |
---|---|---|
committer | Piotr Dziwinski <piotrdz@gmail.com> | 2013-10-13 14:44:12 +0200 |
commit | 9017dbbbdb1f59971b17976d7cf95fe39469d82a (patch) | |
tree | 6b791f48c9167eebaa428a432081196a89d9c389 /src/graphics/engine | |
parent | ccb63bd29e0cc7957be53cb40889496d04527d7a (diff) | |
download | colobot-9017dbbbdb1f59971b17976d7cf95fe39469d82a.tar.gz colobot-9017dbbbdb1f59971b17976d7cf95fe39469d82a.tar.bz2 colobot-9017dbbbdb1f59971b17976d7cf95fe39469d82a.zip |
Fixed CTerrain-related memory leaks
Diffstat (limited to 'src/graphics/engine')
-rw-r--r-- | src/graphics/engine/engine.cpp | 26 | ||||
-rw-r--r-- | src/graphics/engine/terrain.cpp | 19 | ||||
-rw-r--r-- | src/graphics/engine/terrain.h | 2 |
3 files changed, 45 insertions, 2 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); |