1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-03-29 04:20:29 +00:00

Convert PositionCellGrid into a struct

This commit is contained in:
elsid 2023-10-29 13:05:15 +01:00
parent 491a59b035
commit d71b422615
No known key found for this signature in database
GPG Key ID: 4DE04C198CBA7625
6 changed files with 36 additions and 24 deletions

View File

@ -84,6 +84,7 @@ add_openmw_dir (mwworld
store esmstore fallback actionrepair actionsoulgem livecellref actiondoor store esmstore fallback actionrepair actionsoulgem livecellref actiondoor
contentloader esmloader actiontrap cellreflist cellref weather projectilemanager contentloader esmloader actiontrap cellreflist cellref weather projectilemanager
cellpreloader datetimemanager groundcoverstore magiceffects cell ptrregistry cellpreloader datetimemanager groundcoverstore magiceffects cell ptrregistry
positioncellgrid
) )
add_openmw_dir (mwphysics add_openmw_dir (mwphysics

View File

@ -29,15 +29,15 @@
namespace namespace
{ {
template <class Contained> template <class Contained>
bool contains(const std::vector<MWWorld::CellPreloader::PositionCellGrid>& container, const Contained& contained, bool contains(const std::vector<MWWorld::PositionCellGrid>& container, const Contained& contained, float tolerance)
float tolerance)
{ {
for (const auto& pos : contained) for (const auto& pos : contained)
{ {
bool found = false; bool found = false;
for (const auto& pos2 : container) for (const auto& pos2 : container)
{ {
if ((pos.first - pos2.first).length2() < tolerance * tolerance && pos.second == pos2.second) if ((pos.mPosition - pos2.mPosition).length2() < tolerance * tolerance
&& pos.mCellBounds == pos2.mCellBounds)
{ {
found = true; found = true;
break; break;
@ -52,7 +52,6 @@ namespace
namespace MWWorld namespace MWWorld
{ {
struct ListModelsVisitor struct ListModelsVisitor
{ {
bool operator()(const MWWorld::ConstPtr& ptr) bool operator()(const MWWorld::ConstPtr& ptr)
@ -170,7 +169,7 @@ namespace MWWorld
{ {
public: public:
TerrainPreloadItem(const std::vector<osg::ref_ptr<Terrain::View>>& views, Terrain::World* world, TerrainPreloadItem(const std::vector<osg::ref_ptr<Terrain::View>>& views, Terrain::World* world,
const std::vector<CellPreloader::PositionCellGrid>& preloadPositions) const std::vector<PositionCellGrid>& preloadPositions)
: mAbort(false) : mAbort(false)
, mTerrainViews(views) , mTerrainViews(views)
, mWorld(world) , mWorld(world)
@ -183,8 +182,8 @@ namespace MWWorld
for (unsigned int i = 0; i < mTerrainViews.size() && i < mPreloadPositions.size() && !mAbort; ++i) for (unsigned int i = 0; i < mTerrainViews.size() && i < mPreloadPositions.size() && !mAbort; ++i)
{ {
mTerrainViews[i]->reset(); mTerrainViews[i]->reset();
mWorld->preload(mTerrainViews[i], mPreloadPositions[i].first, mPreloadPositions[i].second, mAbort, mWorld->preload(mTerrainViews[i], mPreloadPositions[i].mPosition, mPreloadPositions[i].mCellBounds,
mLoadingReporter); mAbort, mLoadingReporter);
} }
mLoadingReporter.complete(); mLoadingReporter.complete();
} }
@ -197,7 +196,7 @@ namespace MWWorld
std::atomic<bool> mAbort; std::atomic<bool> mAbort;
std::vector<osg::ref_ptr<Terrain::View>> mTerrainViews; std::vector<osg::ref_ptr<Terrain::View>> mTerrainViews;
Terrain::World* mWorld; Terrain::World* mWorld;
std::vector<CellPreloader::PositionCellGrid> mPreloadPositions; std::vector<PositionCellGrid> mPreloadPositions;
Loading::Reporter mLoadingReporter; Loading::Reporter mLoadingReporter;
}; };
@ -375,7 +374,7 @@ namespace MWWorld
mTerrainPreloadItem->wait(listener); mTerrainPreloadItem->wait(listener);
} }
void CellPreloader::abortTerrainPreloadExcept(const CellPreloader::PositionCellGrid* exceptPos) void CellPreloader::abortTerrainPreloadExcept(const PositionCellGrid* exceptPos)
{ {
if (exceptPos && contains(mTerrainPreloadPositions, std::array{ *exceptPos }, Constants::CellSizeInUnits)) if (exceptPos && contains(mTerrainPreloadPositions, std::array{ *exceptPos }, Constants::CellSizeInUnits))
return; return;
@ -384,10 +383,10 @@ namespace MWWorld
mTerrainPreloadItem->abort(); mTerrainPreloadItem->abort();
mTerrainPreloadItem->waitTillDone(); mTerrainPreloadItem->waitTillDone();
} }
setTerrainPreloadPositions(std::vector<CellPreloader::PositionCellGrid>()); setTerrainPreloadPositions(std::vector<PositionCellGrid>());
} }
void CellPreloader::setTerrainPreloadPositions(const std::vector<CellPreloader::PositionCellGrid>& positions) void CellPreloader::setTerrainPreloadPositions(const std::vector<PositionCellGrid>& positions)
{ {
if (positions.empty()) if (positions.empty())
{ {
@ -417,7 +416,7 @@ namespace MWWorld
} }
} }
bool CellPreloader::isTerrainLoaded(const CellPreloader::PositionCellGrid& position, double referenceTime) const bool CellPreloader::isTerrainLoaded(const PositionCellGrid& position, double referenceTime) const
{ {
return mLoadedTerrainTimestamp + mResourceSystem->getSceneManager()->getExpiryDelay() > referenceTime return mLoadedTerrainTimestamp + mResourceSystem->getSceneManager()->getExpiryDelay() > referenceTime
&& contains(mLoadedTerrainPositions, std::array{ position }, Constants::CellSizeInUnits); && contains(mLoadedTerrainPositions, std::array{ position }, Constants::CellSizeInUnits);

View File

@ -1,12 +1,10 @@
#ifndef OPENMW_MWWORLD_CELLPRELOADER_H #ifndef OPENMW_MWWORLD_CELLPRELOADER_H
#define OPENMW_MWWORLD_CELLPRELOADER_H #define OPENMW_MWWORLD_CELLPRELOADER_H
#include "positioncellgrid.hpp"
#include <components/sceneutil/workqueue.hpp> #include <components/sceneutil/workqueue.hpp>
#include <map>
#include <osg/Vec3f>
#include <osg/Vec4i>
#include <osg/ref_ptr> #include <osg/ref_ptr>
#include <map> #include <map>
@ -79,12 +77,11 @@ namespace MWWorld
void setWorkQueue(osg::ref_ptr<SceneUtil::WorkQueue> workQueue); void setWorkQueue(osg::ref_ptr<SceneUtil::WorkQueue> workQueue);
typedef std::pair<osg::Vec3f, osg::Vec4i> PositionCellGrid;
void setTerrainPreloadPositions(const std::vector<PositionCellGrid>& positions); void setTerrainPreloadPositions(const std::vector<PositionCellGrid>& positions);
void syncTerrainLoad(Loading::Listener& listener); void syncTerrainLoad(Loading::Listener& listener);
void abortTerrainPreloadExcept(const PositionCellGrid* exceptPos); void abortTerrainPreloadExcept(const PositionCellGrid* exceptPos);
bool isTerrainLoaded(const CellPreloader::PositionCellGrid& position, double referenceTime) const; bool isTerrainLoaded(const PositionCellGrid& position, double referenceTime) const;
void setTerrain(Terrain::World* terrain); void setTerrain(Terrain::World* terrain);
void reportStats(unsigned int frameNumber, osg::Stats& stats) const; void reportStats(unsigned int frameNumber, osg::Stats& stats) const;

View File

@ -0,0 +1,16 @@
#ifndef OPENMW_APPS_OPENMW_MWWORLD_POSITIONCELLGRID_H
#define OPENMW_APPS_OPENMW_MWWORLD_POSITIONCELLGRID_H
#include <osg/Vec3f>
#include <osg/Vec4i>
namespace MWWorld
{
struct PositionCellGrid
{
osg::Vec3f mPosition;
osg::Vec4i mCellBounds;
};
}
#endif

View File

@ -603,7 +603,7 @@ namespace MWWorld
mPreloader->setTerrain(mRendering.getTerrain()); mPreloader->setTerrain(mRendering.getTerrain());
if (mRendering.pagingUnlockCache()) if (mRendering.pagingUnlockCache())
mPreloader->abortTerrainPreloadExcept(nullptr); mPreloader->abortTerrainPreloadExcept(nullptr);
if (!mPreloader->isTerrainLoaded(std::make_pair(pos, newGrid), mRendering.getReferenceTime())) if (!mPreloader->isTerrainLoaded(PositionCellGrid{ pos, newGrid }, mRendering.getReferenceTime()))
preloadTerrain(pos, playerCellIndex.mWorldspace, true); preloadTerrain(pos, playerCellIndex.mWorldspace, true);
mPagedRefs.clear(); mPagedRefs.clear();
mRendering.getPagedRefnums(newGrid, mPagedRefs); mRendering.getPagedRefnums(newGrid, mPagedRefs);
@ -1093,8 +1093,8 @@ namespace MWWorld
osg::Vec3f predictedPos = playerPos + moved / dt * mPredictionTime; osg::Vec3f predictedPos = playerPos + moved / dt * mPredictionTime;
if (mCurrentCell->isExterior()) if (mCurrentCell->isExterior())
exteriorPositions.emplace_back( exteriorPositions.push_back(PositionCellGrid{
predictedPos, gridCenterToBounds(getNewGridCenter(predictedPos, &mCurrentGridCenter))); predictedPos, gridCenterToBounds(getNewGridCenter(predictedPos, &mCurrentGridCenter)) });
mLastPlayerPos = playerPos; mLastPlayerPos = playerPos;
@ -1305,7 +1305,7 @@ namespace MWWorld
const ESM::ExteriorCellLocation cellIndex const ESM::ExteriorCellLocation cellIndex
= ESM::positionToExteriorCellLocation(pos.x(), pos.y(), extWorldspace); = ESM::positionToExteriorCellLocation(pos.x(), pos.y(), extWorldspace);
preloadCellWithSurroundings(mWorld.getWorldModel().getExterior(cellIndex)); preloadCellWithSurroundings(mWorld.getWorldModel().getExterior(cellIndex));
exteriorPositions.emplace_back(pos, gridCenterToBounds(getNewGridCenter(pos))); exteriorPositions.push_back(PositionCellGrid{ pos, gridCenterToBounds(getNewGridCenter(pos)) });
} }
} }
} }

View File

@ -5,6 +5,7 @@
#include <osg/Vec4i> #include <osg/Vec4i>
#include <osg/ref_ptr> #include <osg/ref_ptr>
#include "positioncellgrid.hpp"
#include "ptr.hpp" #include "ptr.hpp"
#include <memory> #include <memory>
@ -122,8 +123,6 @@ namespace MWWorld
void requestChangeCellGrid(const osg::Vec3f& position, const osg::Vec2i& cell, bool changeEvent = true); void requestChangeCellGrid(const osg::Vec3f& position, const osg::Vec2i& cell, bool changeEvent = true);
typedef std::pair<osg::Vec3f, osg::Vec4i> PositionCellGrid;
void preloadCells(float dt); void preloadCells(float dt);
void preloadTeleportDoorDestinations(const osg::Vec3f& playerPos, const osg::Vec3f& predictedPos, void preloadTeleportDoorDestinations(const osg::Vec3f& playerPos, const osg::Vec3f& predictedPos,
std::vector<PositionCellGrid>& exteriorPositions); std::vector<PositionCellGrid>& exteriorPositions);