Fixed CTerrain-related memory leaks
parent
ccb63bd29e
commit
9017dbbbdb
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue