Fixed CTerrain-related memory leaks
parent
ccb63bd29e
commit
9017dbbbdb
|
@ -600,6 +600,31 @@ void CEngine::DeleteBaseObject(int baseObjRank)
|
||||||
|
|
||||||
void CEngine::DeleteAllBaseObjects()
|
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();
|
m_baseObjects.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -817,6 +842,7 @@ int CEngine::CreateObject()
|
||||||
|
|
||||||
m_objects[objRank].drawWorld = true;
|
m_objects[objRank].drawWorld = true;
|
||||||
m_objects[objRank].distance = 0.0f;
|
m_objects[objRank].distance = 0.0f;
|
||||||
|
m_objects[objRank].baseObjRank = -1;
|
||||||
m_objects[objRank].shadowRank = -1;
|
m_objects[objRank].shadowRank = -1;
|
||||||
|
|
||||||
return objRank;
|
return objRank;
|
||||||
|
|
|
@ -90,7 +90,7 @@ bool CTerrain::Generate(int mosaicCount, int brickCountPow2, float brickSize,
|
||||||
std::vector<int>(dim).swap(m_textures);
|
std::vector<int>(dim).swap(m_textures);
|
||||||
|
|
||||||
dim = m_mosaicCount*m_mosaicCount;
|
dim = m_mosaicCount*m_mosaicCount;
|
||||||
std::vector<int>(dim).swap(m_objRanks);
|
std::vector<int>(dim, -1).swap(m_objRanks);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -258,6 +258,23 @@ TerrainRes CTerrain::GetResource(const Math::Vector &p)
|
||||||
void CTerrain::FlushRelief()
|
void CTerrain::FlushRelief()
|
||||||
{
|
{
|
||||||
m_relief.clear();
|
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
|
//! Generates a level in the terrain
|
||||||
bool GenerateMaterials(int *id, float min, float max, float slope, float freq, Math::Vector center, float radius);
|
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();
|
void FlushRelief();
|
||||||
//! Load relief from image
|
//! Load relief from image
|
||||||
bool LoadRelief(const std::string& fileName, float scaleRelief, bool adjustBorder);
|
bool LoadRelief(const std::string& fileName, float scaleRelief, bool adjustBorder);
|
||||||
|
|
|
@ -1104,6 +1104,7 @@ void CRobotMain::ChangePhase(Phase phase)
|
||||||
ChangePause(false);
|
ChangePause(false);
|
||||||
FlushDisplayInfo();
|
FlushDisplayInfo();
|
||||||
m_engine->SetRankView(0);
|
m_engine->SetRankView(0);
|
||||||
|
m_terrain->FlushRelief();
|
||||||
m_engine->DeleteAllObjects();
|
m_engine->DeleteAllObjects();
|
||||||
Gfx::CModelManager::GetInstancePointer()->DeleteAllModelCopies();
|
Gfx::CModelManager::GetInstancePointer()->DeleteAllModelCopies();
|
||||||
m_engine->SetWaterAddColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f));
|
m_engine->SetWaterAddColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f));
|
||||||
|
@ -3842,9 +3843,9 @@ void CRobotMain::Convert()
|
||||||
void CRobotMain::ScenePerso()
|
void CRobotMain::ScenePerso()
|
||||||
{
|
{
|
||||||
DeleteAllObjects(); // removes all the current 3D Scene
|
DeleteAllObjects(); // removes all the current 3D Scene
|
||||||
|
m_terrain->FlushRelief();
|
||||||
m_engine->DeleteAllObjects();
|
m_engine->DeleteAllObjects();
|
||||||
Gfx::CModelManager::GetInstancePointer()->DeleteAllModelCopies();
|
Gfx::CModelManager::GetInstancePointer()->DeleteAllModelCopies();
|
||||||
m_terrain->FlushRelief(); // all flat
|
|
||||||
m_terrain->FlushBuildingLevel();
|
m_terrain->FlushBuildingLevel();
|
||||||
m_terrain->FlushFlyingLimit();
|
m_terrain->FlushFlyingLimit();
|
||||||
m_lightMan->FlushLights();
|
m_lightMan->FlushLights();
|
||||||
|
|
Loading…
Reference in New Issue