1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-06-19 22:11:34 +00:00

Skip already visited cells when looking for ptr

This commit is contained in:
elsid 2023-05-26 22:50:16 +02:00
parent 466a7cedbb
commit 181c894e4c
No known key found for this signature in database
GPG key ID: 4DE04C198CBA7625
2 changed files with 20 additions and 12 deletions

View file

@ -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); const auto it = mCells.find(cell.mId);
if (it != mCells.end()) if (it != mCells.end())
return it->second; 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) if (cell.mData.mFlags & ESM::Cell::Interior)
mInteriors.emplace(cell.mName, &cellStore); mInteriors.emplace(cell.mName, &cellStore);
else else
mExteriors.emplace( mExteriors.emplace(
ESM::ExteriorCellLocation(cell.getGridX(), cell.getGridY(), ESM::Cell::sDefaultWorldspaceId), &cellStore); ESM::ExteriorCellLocation(cell.getGridX(), cell.getGridY(), ESM::Cell::sDefaultWorldspaceId), &cellStore);
return cellStore; return cellStore;
} }
@ -382,23 +385,24 @@ MWWorld::Ptr MWWorld::WorldModel::getPtr(const ESM::RefId& name)
// Now try the other cells // Now try the other cells
const MWWorld::Store<ESM::Cell>& cells = mStore.get<ESM::Cell>(); const MWWorld::Store<ESM::Cell>& cells = mStore.get<ESM::Cell>();
MWWorld::Store<ESM::Cell>::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()) if (!ptr.isEmpty())
return ptr; 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()) if (!ptr.isEmpty())
return ptr; return ptr;
@ -413,7 +417,7 @@ void MWWorld::WorldModel::getExteriorPtrs(const ESM::RefId& name, std::vector<MW
const MWWorld::Store<ESM::Cell>& cells = mStore.get<ESM::Cell>(); const MWWorld::Store<ESM::Cell>& cells = mStore.get<ESM::Cell>();
for (MWWorld::Store<ESM::Cell>::iterator iter = cells.extBegin(); iter != cells.extEnd(); ++iter) for (MWWorld::Store<ESM::Cell>::iterator iter = cells.extBegin(); iter != cells.extEnd(); ++iter)
{ {
CellStore& cellStore = getCellStore(*iter); CellStore& cellStore = getOrInsertCellStore(*iter);
Ptr ptr = getPtrAndCache(name, cellStore); Ptr ptr = getPtrAndCache(name, cellStore);

View file

@ -51,8 +51,12 @@ namespace MWWorld
std::size_t mPtrIndexUpdateCounter = 0; std::size_t mPtrIndexUpdateCounter = 0;
ESM::RefNum mLastGeneratedRefnum; 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); CellStore* getInteriorOrNull(std::string_view name);
Ptr getPtrAndCache(const ESM::RefId& name, CellStore& cellStore); Ptr getPtrAndCache(const ESM::RefId& name, CellStore& cellStore);
void writeCell(ESM::ESMWriter& writer, CellStore& cell) const; void writeCell(ESM::ESMWriter& writer, CellStore& cell) const;