diff --git a/apps/openmw/mwworld/worldmodel.cpp b/apps/openmw/mwworld/worldmodel.cpp index a4299dc4ca..6a9d61b9f1 100644 --- a/apps/openmw/mwworld/worldmodel.cpp +++ b/apps/openmw/mwworld/worldmodel.cpp @@ -62,28 +62,23 @@ namespace }; } -MWWorld::CellStore& MWWorld::WorldModel::getCellStore(const ESM::Cell* cell) +MWWorld::CellStore& MWWorld::WorldModel::getOrInsertCellStore(const ESM::Cell& cell) { - CellStore* cellStore = &mCells.emplace(cell->mId, CellStore(MWWorld::Cell(*cell), mStore, mReaders)).first->second; - if (cell->mData.mFlags & ESM::Cell::Interior) - { - auto result = mInteriors.find(cell->mName); + const auto it = mCells.find(cell.mId); + if (it != mCells.end()) + return it->second; + return insertCellStore(cell); +} - if (result == mInteriors.end()) - result = mInteriors.emplace(cell->mName, cellStore).first; - - return *result->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 - { - ESM::ExteriorCellLocation extIndex(cell->getGridX(), cell->getGridY(), ESM::Cell::sDefaultWorldspaceId); - std::map::iterator result = mExteriors.find(extIndex); - - if (result == mExteriors.end()) - result = mExteriors.emplace(extIndex, cellStore).first; - - return *result->second; - } + mExteriors.emplace( + ESM::ExteriorCellLocation(cell.getGridX(), cell.getGridY(), ESM::Cell::sDefaultWorldspaceId), &cellStore); + return cellStore; } void MWWorld::WorldModel::clear() @@ -390,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; @@ -421,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 1048a27e84..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;