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:
parent
466a7cedbb
commit
181c894e4c
2 changed files with 20 additions and 12 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue