mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-03-30 07:21:12 +00:00
Update CellStore::mMergedRefs lazily.
This commit is contained in:
parent
93342af1f9
commit
f3adcab9c5
@ -430,7 +430,7 @@ namespace MWWorld
|
||||
{
|
||||
mMovedHere.insert(std::make_pair(object.getBase(), from));
|
||||
}
|
||||
updateMergedRefs();
|
||||
requestMergedRefsUpdate();
|
||||
}
|
||||
|
||||
MWWorld::Ptr CellStore::moveTo(const Ptr& object, CellStore* cellToMoveTo)
|
||||
@ -462,14 +462,14 @@ namespace MWWorld
|
||||
originalCell->moveTo(object, cellToMoveTo);
|
||||
}
|
||||
|
||||
updateMergedRefs();
|
||||
requestMergedRefsUpdate();
|
||||
return MWWorld::Ptr(object.getBase(), cellToMoveTo);
|
||||
}
|
||||
|
||||
cellToMoveTo->moveFrom(object, this);
|
||||
mMovedToAnotherCell.insert(std::make_pair(object.getBase(), cellToMoveTo));
|
||||
|
||||
updateMergedRefs();
|
||||
requestMergedRefsUpdate();
|
||||
MWWorld::Ptr ptr(object.getBase(), cellToMoveTo);
|
||||
const Class& cls = ptr.getClass();
|
||||
if (cls.hasInventoryStore(ptr))
|
||||
@ -509,13 +509,19 @@ namespace MWWorld
|
||||
const std::map<LiveCellRefBase*, MWWorld::CellStore*>& mMovedToAnotherCell;
|
||||
};
|
||||
|
||||
void CellStore::updateMergedRefs()
|
||||
void CellStore::requestMergedRefsUpdate()
|
||||
{
|
||||
mRechargingItemsUpToDate = false;
|
||||
mMergedRefsNeedsUpdate = true;
|
||||
}
|
||||
|
||||
void CellStore::updateMergedRefs() const
|
||||
{
|
||||
mMergedRefs.clear();
|
||||
mRechargingItemsUpToDate = false;
|
||||
MergeVisitor visitor(mMergedRefs, mMovedHere, mMovedToAnotherCell);
|
||||
CellStoreImp::forEachInternal(visitor, *this);
|
||||
CellStoreImp::forEachInternal(visitor, const_cast<CellStore&>(*this));
|
||||
visitor.merge();
|
||||
mMergedRefsNeedsUpdate = false;
|
||||
}
|
||||
|
||||
bool CellStore::movedHere(const MWWorld::Ptr& ptr) const
|
||||
@ -670,6 +676,8 @@ namespace MWWorld
|
||||
|
||||
std::size_t CellStore::count() const
|
||||
{
|
||||
if (mMergedRefsNeedsUpdate)
|
||||
updateMergedRefs();
|
||||
return mMergedRefs.size();
|
||||
}
|
||||
|
||||
@ -836,7 +844,7 @@ namespace MWWorld
|
||||
|
||||
ESM::visit([&](auto&& cell) { loadRefs(cell, refNumToID); }, mCellVariant);
|
||||
|
||||
updateMergedRefs();
|
||||
requestMergedRefsUpdate();
|
||||
}
|
||||
|
||||
bool CellStore::isExterior() const
|
||||
@ -1022,10 +1030,6 @@ namespace MWWorld
|
||||
}
|
||||
}
|
||||
|
||||
// Do another update here to make sure objects referred to by MVRF tags can be found
|
||||
// This update is only needed for old saves that used the old copy&delete way of moving objects
|
||||
updateMergedRefs();
|
||||
|
||||
while (reader.isNextSub("MVRF"))
|
||||
{
|
||||
reader.cacheSubName();
|
||||
|
@ -128,7 +128,7 @@ namespace MWWorld
|
||||
mHasState = true;
|
||||
CellRefList<T>& list = get<T>();
|
||||
LiveCellRefBase* ret = &list.insert(*ref);
|
||||
updateMergedRefs();
|
||||
requestMergedRefsUpdate();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -198,6 +198,8 @@ namespace MWWorld
|
||||
if (mState != State_Loaded)
|
||||
return false;
|
||||
|
||||
if (mMergedRefsNeedsUpdate)
|
||||
updateMergedRefs();
|
||||
if (mMergedRefs.empty())
|
||||
return true;
|
||||
|
||||
@ -225,6 +227,9 @@ namespace MWWorld
|
||||
if (mState != State_Loaded)
|
||||
return false;
|
||||
|
||||
if (mMergedRefsNeedsUpdate)
|
||||
updateMergedRefs();
|
||||
|
||||
for (unsigned int i = 0; i < mMergedRefs.size(); ++i)
|
||||
{
|
||||
if (!isAccessible(mMergedRefs[i]->mData, mMergedRefs[i]->mRef))
|
||||
@ -247,6 +252,8 @@ namespace MWWorld
|
||||
if (mState != State_Loaded)
|
||||
return false;
|
||||
|
||||
if (mMergedRefsNeedsUpdate)
|
||||
updateMergedRefs();
|
||||
if (mMergedRefs.empty())
|
||||
return true;
|
||||
|
||||
@ -368,7 +375,8 @@ namespace MWWorld
|
||||
|
||||
// Merged list of ref's currently in this cell - i.e. with added refs from mMovedHere, removed refs from
|
||||
// mMovedToAnotherCell
|
||||
std::vector<LiveCellRefBase*> mMergedRefs;
|
||||
mutable std::vector<LiveCellRefBase*> mMergedRefs;
|
||||
mutable bool mMergedRefsNeedsUpdate = false;
|
||||
|
||||
// Get the Ptr for the given ref which originated from this cell (possibly moved to another cell at this point).
|
||||
Ptr getCurrentPtr(MWWorld::LiveCellRefBase* ref);
|
||||
@ -377,7 +385,8 @@ namespace MWWorld
|
||||
void moveFrom(const MWWorld::Ptr& object, MWWorld::CellStore* from);
|
||||
|
||||
/// Repopulate mMergedRefs.
|
||||
void updateMergedRefs();
|
||||
void requestMergedRefsUpdate();
|
||||
void updateMergedRefs() const;
|
||||
|
||||
// (item, max charge)
|
||||
typedef std::vector<std::pair<LiveCellRefBase*, float>> TRechargingItems;
|
||||
|
Loading…
x
Reference in New Issue
Block a user