summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/graphics/engine/engine.cpp21
-rw-r--r--src/graphics/engine/modelmanager.cpp12
-rw-r--r--src/graphics/engine/modelmanager.h4
-rw-r--r--src/object/robotmain.cpp4
4 files changed, 40 insertions, 1 deletions
diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp
index e2ef569..274e179 100644
--- a/src/graphics/engine/engine.cpp
+++ b/src/graphics/engine/engine.cpp
@@ -591,6 +591,27 @@ void CEngine::CopyBaseObject(int sourceBaseObjRank, int destBaseObjRank)
assert(destBaseObjRank >= 0 && destBaseObjRank < static_cast<int>( m_baseObjects.size() ));
m_baseObjects[destBaseObjRank] = m_baseObjects[sourceBaseObjRank];
+
+ EngineBaseObject& p1 = m_baseObjects[destBaseObjRank];
+
+ if (! p1.used)
+ return;
+
+ 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];
+ p4.staticBufferId = 0;
+ }
+ }
+ }
}
void CEngine::AddBaseObjTriangles(int baseObjRank, const std::vector<VertexTex2>& vertices,
diff --git a/src/graphics/engine/modelmanager.cpp b/src/graphics/engine/modelmanager.cpp
index c23b79d..35b7e7a 100644
--- a/src/graphics/engine/modelmanager.cpp
+++ b/src/graphics/engine/modelmanager.cpp
@@ -111,6 +111,8 @@ bool CModelManager::AddModelCopy(const std::string& fileName, bool mirrored, int
m_engine->CopyBaseObject((*it).second.baseObjRank, copyBaseObjRank);
m_engine->SetObjectBaseRank(objRank, copyBaseObjRank);
+ m_copiesBaseRanks.push_back(copyBaseObjRank);
+
return true;
}
@@ -128,6 +130,16 @@ int CModelManager::GetModelBaseObjRank(const std::string& fileName, bool mirrore
return (*it).second.baseObjRank;
}
+void CModelManager::DeleteAllModelCopies()
+{
+ for (int baseObjRank : m_copiesBaseRanks)
+ {
+ m_engine->DeleteBaseObject(baseObjRank);
+ }
+
+ m_copiesBaseRanks.clear();
+}
+
void CModelManager::UnloadModel(const std::string& fileName, bool mirrored)
{
auto it = m_models.find(FileInfo(fileName, mirrored));
diff --git a/src/graphics/engine/modelmanager.h b/src/graphics/engine/modelmanager.h
index 601d636..a7f9805 100644
--- a/src/graphics/engine/modelmanager.h
+++ b/src/graphics/engine/modelmanager.h
@@ -53,6 +53,9 @@ public:
//! Returns the rank of base engine object of given loaded model
int GetModelBaseObjRank(const std::string& fileName, bool mirrored);
+ //! Deletes all copied objects
+ void DeleteAllModelCopies();
+
//! Unloads the given model
void UnloadModel(const std::string& fileName, bool mirrored);
//! Unloads all models
@@ -91,6 +94,7 @@ private:
}
};
std::map<FileInfo, ModelInfo> m_models;
+ std::vector<int> m_copiesBaseRanks;
CEngine* m_engine;
};
diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp
index e14af78..733bf6b 100644
--- a/src/object/robotmain.cpp
+++ b/src/object/robotmain.cpp
@@ -34,7 +34,7 @@
#include "graphics/engine/engine.h"
#include "graphics/engine/lightman.h"
#include "graphics/engine/lightning.h"
-#include "graphics/engine/modelfile.h"
+#include "graphics/engine/modelmanager.h"
#include "graphics/engine/particle.h"
#include "graphics/engine/planet.h"
#include "graphics/engine/pyro.h"
@@ -1047,6 +1047,7 @@ void CRobotMain::ChangePhase(Phase phase)
FlushDisplayInfo();
m_engine->SetRankView(0);
m_engine->DeleteAllObjects();
+ Gfx::CModelManager::GetInstancePointer()->DeleteAllModelCopies();
m_engine->SetWaterAddColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f));
m_engine->SetBackground("");
m_engine->SetBackForce(false);
@@ -3736,6 +3737,7 @@ void CRobotMain::ScenePerso()
{
DeleteAllObjects(); // removes all the current 3D Scene
m_engine->DeleteAllObjects();
+ Gfx::CModelManager::GetInstancePointer()->DeleteAllModelCopies();
m_terrain->FlushRelief(); // all flat
m_terrain->FlushBuildingLevel();
m_terrain->FlushFlyingLimit();