mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-21 18:40:01 +00:00
Skip already visited cells when looking for ptr
This commit is contained in:
parent
466a7cedbb
commit
181c894e4c
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user