1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-02-22 12:39:59 +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);
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<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())
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<MW
const MWWorld::Store<ESM::Cell>& cells = mStore.get<ESM::Cell>();
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);

View File

@ -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;