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;