diff --git a/apps/openmw/mwrender/objectpaging.cpp b/apps/openmw/mwrender/objectpaging.cpp index 516734f2a5..c51fb21103 100644 --- a/apps/openmw/mwrender/objectpaging.cpp +++ b/apps/openmw/mwrender/objectpaging.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include #include @@ -465,72 +466,76 @@ namespace MWRender { } - std::map ObjectPaging::collectESM3References( - float size, const osg::Vec2i& startCell, ESM::ReadersCache& readers) const + namespace { - std::map refs; - const auto& store = MWBase::Environment::get().getWorld()->getStore(); - for (int cellX = startCell.x(); cellX < startCell.x() + size; ++cellX) + std::map collectESM3References( + float size, const osg::Vec2i& startCell, ESM::ReadersCache& readers) { - for (int cellY = startCell.y(); cellY < startCell.y() + size; ++cellY) + std::map refs; + const auto& store = MWBase::Environment::get().getWorld()->getStore(); + for (int cellX = startCell.x(); cellX < startCell.x() + size; ++cellX) { - const ESM::Cell* cell = store.get().searchStatic(cellX, cellY); - if (!cell) - continue; - for (size_t i = 0; i < cell->mContextList.size(); ++i) + for (int cellY = startCell.y(); cellY < startCell.y() + size; ++cellY) { - try + const ESM::Cell* cell = store.get().searchStatic(cellX, cellY); + if (!cell) + continue; + for (size_t i = 0; i < cell->mContextList.size(); ++i) { - const std::size_t index = static_cast(cell->mContextList[i].index); - const ESM::ReadersCache::BusyItem reader = readers.get(index); - cell->restore(*reader, i); - ESM::CellRef ref; - ESM::MovedCellRef cMRef; - bool deleted = false; - bool moved = false; - while (ESM::Cell::getNextRef( - *reader, ref, deleted, cMRef, moved, ESM::Cell::GetNextRefMode::LoadOnlyNotMoved)) + try { - if (moved) - continue; - - if (std::find(cell->mMovedRefs.begin(), cell->mMovedRefs.end(), ref.mRefNum) - != cell->mMovedRefs.end()) - continue; - - int type = store.findStatic(ref.mRefID); - if (!typeFilter(type, size >= 2)) - continue; - if (deleted) + const std::size_t index = static_cast(cell->mContextList[i].index); + const ESM::ReadersCache::BusyItem reader = readers.get(index); + cell->restore(*reader, i); + ESM::CellRef ref; + ESM::MovedCellRef cMRef; + bool deleted = false; + bool moved = false; + while (ESM::Cell::getNextRef( + *reader, ref, deleted, cMRef, moved, ESM::Cell::GetNextRefMode::LoadOnlyNotMoved)) { - refs.erase(ref.mRefNum); - continue; + if (moved) + continue; + + if (std::find(cell->mMovedRefs.begin(), cell->mMovedRefs.end(), ref.mRefNum) + != cell->mMovedRefs.end()) + continue; + + int type = store.findStatic(ref.mRefID); + if (!typeFilter(type, size >= 2)) + continue; + if (deleted) + { + refs.erase(ref.mRefNum); + continue; + } + refs[ref.mRefNum] = std::move(ref); } - refs[ref.mRefNum] = std::move(ref); + } + catch (const std::exception& e) + { + Log(Debug::Warning) << "Failed to collect references from cell \"" << cell->getDescription() + << "\": " << e.what(); + continue; } } - catch (const std::exception& e) + + for (auto [ref, deleted] : cell->mLeasedRefs) { - Log(Debug::Warning) << "Failed to collect references from cell \"" << cell->getDescription() - << "\": " << e.what(); - continue; + if (deleted) + { + refs.erase(ref.mRefNum); + continue; + } + int type = store.findStatic(ref.mRefID); + if (!typeFilter(type, size >= 2)) + continue; + refs[ref.mRefNum] = std::move(ref); } } - for (auto [ref, deleted] : cell->mLeasedRefs) - { - if (deleted) - { - refs.erase(ref.mRefNum); - continue; - } - int type = store.findStatic(ref.mRefID); - if (!typeFilter(type, size >= 2)) - continue; - refs[ref.mRefNum] = std::move(ref); - } } + return refs; } - return refs; } osg::ref_ptr ObjectPaging::createChunk(float size, const osg::Vec2f& center, bool activeGrid, diff --git a/apps/openmw/mwrender/objectpaging.hpp b/apps/openmw/mwrender/objectpaging.hpp index 6085887b9c..11be6009ca 100644 --- a/apps/openmw/mwrender/objectpaging.hpp +++ b/apps/openmw/mwrender/objectpaging.hpp @@ -1,7 +1,7 @@ #ifndef OPENMW_MWRENDER_OBJECTPAGING_H #define OPENMW_MWRENDER_OBJECTPAGING_H -#include +#include #include #include @@ -11,15 +11,6 @@ namespace Resource { class SceneManager; } -namespace MWWorld -{ - class ESMStore; -} - -namespace ESM -{ - class ReadersCache; -} namespace MWRender { @@ -82,9 +73,6 @@ namespace MWRender const RefTracker& getRefTracker() const { return mRefTracker; } RefTracker& getWritableRefTracker() { return mRefTrackerLocked ? mRefTrackerNew : mRefTracker; } - std::map collectESM3References( - float size, const osg::Vec2i& startCell, ESM::ReadersCache& readers) const; - std::mutex mSizeCacheMutex; typedef std::map SizeCache; SizeCache mSizeCache;