diff options
Diffstat (limited to 'src/graphics')
-rw-r--r-- | src/graphics/engine/engine.cpp | 21 | ||||
-rw-r--r-- | src/graphics/engine/modelmanager.cpp | 12 | ||||
-rw-r--r-- | src/graphics/engine/modelmanager.h | 4 |
3 files changed, 37 insertions, 0 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; }; |