From 1b116240a331e4f18edfe09eb703255835ff9179 Mon Sep 17 00:00:00 2001 From: elsid Date: Fri, 26 May 2023 21:48:38 +0200 Subject: [PATCH 1/3] Try return existing CellStore from WorldModel::getCellStore first --- apps/openmw/mwworld/worldmodel.cpp | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/apps/openmw/mwworld/worldmodel.cpp b/apps/openmw/mwworld/worldmodel.cpp index a4299dc4ca..57f09090a2 100644 --- a/apps/openmw/mwworld/worldmodel.cpp +++ b/apps/openmw/mwworld/worldmodel.cpp @@ -64,26 +64,18 @@ namespace MWWorld::CellStore& MWWorld::WorldModel::getCellStore(const ESM::Cell* cell) { - CellStore* cellStore = &mCells.emplace(cell->mId, CellStore(MWWorld::Cell(*cell), mStore, mReaders)).first->second; + const auto it = mCells.find(cell->mId); + if (it != mCells.end()) + return it->second; + + CellStore& cellStore = mCells.emplace_hint(it, cell->mId, CellStore(Cell(*cell), mStore, mReaders))->second; if (cell->mData.mFlags & ESM::Cell::Interior) - { - auto result = mInteriors.find(cell->mName); - - if (result == mInteriors.end()) - result = mInteriors.emplace(cell->mName, cellStore).first; - - return *result->second; - } + mInteriors.emplace(cell->mName, &cellStore); else - { - ESM::ExteriorCellLocation extIndex(cell->getGridX(), cell->getGridY(), ESM::Cell::sDefaultWorldspaceId); - std::map::iterator result = mExteriors.find(extIndex); + mExteriors.emplace( + ESM::ExteriorCellLocation(cell->getGridX(), cell->getGridY(), ESM::Cell::sDefaultWorldspaceId), &cellStore); - if (result == mExteriors.end()) - result = mExteriors.emplace(extIndex, cellStore).first; - - return *result->second; - } + return cellStore; } void MWWorld::WorldModel::clear() From 466a7cedbb0b0300ccf66b1570d3b85eecd65175 Mon Sep 17 00:00:00 2001 From: elsid Date: Fri, 26 May 2023 21:58:35 +0200 Subject: [PATCH 2/3] Convert pointer to referece where nullptr is not acceptable --- apps/openmw/mwworld/worldmodel.cpp | 18 +++++++++--------- apps/openmw/mwworld/worldmodel.hpp | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/openmw/mwworld/worldmodel.cpp b/apps/openmw/mwworld/worldmodel.cpp index 57f09090a2..f1521049dc 100644 --- a/apps/openmw/mwworld/worldmodel.cpp +++ b/apps/openmw/mwworld/worldmodel.cpp @@ -62,18 +62,18 @@ namespace }; } -MWWorld::CellStore& MWWorld::WorldModel::getCellStore(const ESM::Cell* cell) +MWWorld::CellStore& MWWorld::WorldModel::getCellStore(const ESM::Cell& cell) { - const auto it = mCells.find(cell->mId); + const auto it = mCells.find(cell.mId); if (it != mCells.end()) return it->second; - CellStore& cellStore = mCells.emplace_hint(it, cell->mId, CellStore(Cell(*cell), mStore, mReaders))->second; - if (cell->mData.mFlags & ESM::Cell::Interior) - mInteriors.emplace(cell->mName, &cellStore); + CellStore& cellStore = mCells.emplace_hint(it, cell.mId, CellStore(Cell(cell), mStore, mReaders))->second; + if (cell.mData.mFlags & ESM::Cell::Interior) + mInteriors.emplace(cell.mName, &cellStore); else mExteriors.emplace( - ESM::ExteriorCellLocation(cell->getGridX(), cell->getGridY(), ESM::Cell::sDefaultWorldspaceId), &cellStore); + ESM::ExteriorCellLocation(cell.getGridX(), cell.getGridY(), ESM::Cell::sDefaultWorldspaceId), &cellStore); return cellStore; } @@ -386,7 +386,7 @@ MWWorld::Ptr MWWorld::WorldModel::getPtr(const ESM::RefId& name) for (iter = cells.extBegin(); iter != cells.extEnd(); ++iter) { - CellStore& cellStore = getCellStore(&(*iter)); + CellStore& cellStore = getCellStore(*iter); Ptr ptr = getPtrAndCache(name, cellStore); @@ -396,7 +396,7 @@ MWWorld::Ptr MWWorld::WorldModel::getPtr(const ESM::RefId& name) for (iter = cells.intBegin(); iter != cells.intEnd(); ++iter) { - CellStore& cellStore = getCellStore(&(*iter)); + CellStore& cellStore = getCellStore(*iter); Ptr ptr = getPtrAndCache(name, cellStore); @@ -413,7 +413,7 @@ void MWWorld::WorldModel::getExteriorPtrs(const ESM::RefId& name, std::vector& cells = mStore.get(); for (MWWorld::Store::iterator iter = cells.extBegin(); iter != cells.extEnd(); ++iter) { - CellStore& cellStore = getCellStore(&(*iter)); + CellStore& cellStore = getCellStore(*iter); Ptr ptr = getPtrAndCache(name, cellStore); diff --git a/apps/openmw/mwworld/worldmodel.hpp b/apps/openmw/mwworld/worldmodel.hpp index 1048a27e84..48cf9624ca 100644 --- a/apps/openmw/mwworld/worldmodel.hpp +++ b/apps/openmw/mwworld/worldmodel.hpp @@ -51,7 +51,7 @@ namespace MWWorld std::size_t mPtrIndexUpdateCounter = 0; ESM::RefNum mLastGeneratedRefnum; - CellStore& getCellStore(const ESM::Cell* cell); + CellStore& getCellStore(const ESM::Cell& cell); CellStore* getInteriorOrNull(std::string_view name); Ptr getPtrAndCache(const ESM::RefId& name, CellStore& cellStore); From 181c894e4c7fbe89cc635037ec0514da17998eb1 Mon Sep 17 00:00:00 2001 From: elsid Date: Fri, 26 May 2023 22:50:16 +0200 Subject: [PATCH 3/3] Skip already visited cells when looking for ptr --- apps/openmw/mwworld/worldmodel.cpp | 26 +++++++++++++++----------- apps/openmw/mwworld/worldmodel.hpp | 6 +++++- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/apps/openmw/mwworld/worldmodel.cpp b/apps/openmw/mwworld/worldmodel.cpp index f1521049dc..6a9d61b9f1 100644 --- a/apps/openmw/mwworld/worldmodel.cpp +++ b/apps/openmw/mwworld/worldmodel.cpp @@ -62,19 +62,22 @@ namespace }; } -MWWorld::CellStore& MWWorld::WorldModel::getCellStore(const ESM::Cell& cell) +MWWorld::CellStore& MWWorld::WorldModel::getOrInsertCellStore(const ESM::Cell& cell) { const auto it = mCells.find(cell.mId); if (it != mCells.end()) return it->second; + return insertCellStore(cell); +} - CellStore& cellStore = mCells.emplace_hint(it, cell.mId, CellStore(Cell(cell), mStore, mReaders))->second; +MWWorld::CellStore& MWWorld::WorldModel::insertCellStore(const ESM::Cell& cell) +{ + CellStore& cellStore = mCells.emplace(cell.mId, CellStore(Cell(cell), mStore, mReaders)).first->second; if (cell.mData.mFlags & ESM::Cell::Interior) mInteriors.emplace(cell.mName, &cellStore); else mExteriors.emplace( ESM::ExteriorCellLocation(cell.getGridX(), cell.getGridY(), ESM::Cell::sDefaultWorldspaceId), &cellStore); - return cellStore; } @@ -382,23 +385,24 @@ MWWorld::Ptr MWWorld::WorldModel::getPtr(const ESM::RefId& name) // Now try the other cells const MWWorld::Store& cells = mStore.get(); - MWWorld::Store::iterator iter; - for (iter = cells.extBegin(); iter != cells.extEnd(); ++iter) + for (auto iter = cells.extBegin(); iter != cells.extEnd(); ++iter) { - CellStore& cellStore = getCellStore(*iter); + if (mCells.contains(iter->mId)) + continue; - Ptr ptr = getPtrAndCache(name, cellStore); + Ptr ptr = getPtrAndCache(name, insertCellStore(*iter)); if (!ptr.isEmpty()) return ptr; } - for (iter = cells.intBegin(); iter != cells.intEnd(); ++iter) + for (auto iter = cells.intBegin(); iter != cells.intEnd(); ++iter) { - CellStore& cellStore = getCellStore(*iter); + if (mCells.contains(iter->mId)) + continue; - Ptr ptr = getPtrAndCache(name, cellStore); + Ptr ptr = getPtrAndCache(name, insertCellStore(*iter)); if (!ptr.isEmpty()) return ptr; @@ -413,7 +417,7 @@ void MWWorld::WorldModel::getExteriorPtrs(const ESM::RefId& name, std::vector& cells = mStore.get(); for (MWWorld::Store::iterator iter = cells.extBegin(); iter != cells.extEnd(); ++iter) { - CellStore& cellStore = getCellStore(*iter); + CellStore& cellStore = getOrInsertCellStore(*iter); Ptr ptr = getPtrAndCache(name, cellStore); diff --git a/apps/openmw/mwworld/worldmodel.hpp b/apps/openmw/mwworld/worldmodel.hpp index 48cf9624ca..300adbe2db 100644 --- a/apps/openmw/mwworld/worldmodel.hpp +++ b/apps/openmw/mwworld/worldmodel.hpp @@ -51,8 +51,12 @@ namespace MWWorld std::size_t mPtrIndexUpdateCounter = 0; ESM::RefNum mLastGeneratedRefnum; - CellStore& getCellStore(const ESM::Cell& cell); + CellStore& getOrInsertCellStore(const ESM::Cell& cell); + + CellStore& insertCellStore(const ESM::Cell& cell); + CellStore* getInteriorOrNull(std::string_view name); + Ptr getPtrAndCache(const ESM::RefId& name, CellStore& cellStore); void writeCell(ESM::ESMWriter& writer, CellStore& cell) const;