mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-03-12 04:14:05 +00:00
Add explicit dependency to World from Scene
To avoid redundant MWBase::Environment::get().getWorld() calls and virtual calls.
This commit is contained in:
parent
9320fb50ab
commit
b32a787cd8
@ -273,7 +273,7 @@ namespace MWBase
|
||||
|
||||
virtual float getDistanceToFacedObject() = 0;
|
||||
|
||||
virtual float getMaxActivationDistance() = 0;
|
||||
virtual float getMaxActivationDistance() const = 0;
|
||||
|
||||
/// Returns a pointer to the object the provided object would hit (if within the
|
||||
/// specified distance), and the point where the hit occurs. This will attempt to
|
||||
@ -548,7 +548,7 @@ namespace MWBase
|
||||
const osg::Vec3f& worldPos, const osg::Quat& orient, MWWorld::Ptr& bow, float speed, float attackStrength) = 0;
|
||||
virtual void updateProjectilesCasters() = 0;
|
||||
|
||||
virtual void applyLoopingParticles(const MWWorld::Ptr& ptr) = 0;
|
||||
virtual void applyLoopingParticles(const MWWorld::Ptr& ptr) const = 0;
|
||||
|
||||
virtual const std::vector<std::string>& getContentFiles() const = 0;
|
||||
|
||||
|
@ -40,6 +40,7 @@
|
||||
#include "cellvisitors.hpp"
|
||||
#include "cellstore.hpp"
|
||||
#include "cellpreloader.hpp"
|
||||
#include "worldimp.hpp"
|
||||
|
||||
namespace
|
||||
{
|
||||
@ -97,7 +98,7 @@ namespace
|
||||
return model;
|
||||
}
|
||||
|
||||
void addObject(const MWWorld::Ptr& ptr, MWPhysics::PhysicsSystem& physics,
|
||||
void addObject(const MWWorld::Ptr& ptr, const MWWorld::World& world, MWPhysics::PhysicsSystem& physics,
|
||||
MWRender::RenderingManager& rendering, std::set<ESM::RefNum>& pagedRefs)
|
||||
{
|
||||
if (ptr.getRefData().getBaseNode() || physics.getActor(ptr))
|
||||
@ -123,7 +124,7 @@ namespace
|
||||
rendering.addWaterRippleEmitter(ptr);
|
||||
|
||||
// Restore effect particles
|
||||
MWBase::Environment::get().getWorld()->applyLoopingParticles(ptr);
|
||||
world.applyLoopingParticles(ptr);
|
||||
|
||||
if (!model.empty())
|
||||
ptr.getClass().insertObject(ptr, model, rotation, physics);
|
||||
@ -131,7 +132,8 @@ namespace
|
||||
MWBase::Environment::get().getLuaManager()->objectAddedToScene(ptr);
|
||||
}
|
||||
|
||||
void addObject(const MWWorld::Ptr& ptr, const MWPhysics::PhysicsSystem& physics, DetourNavigator::Navigator& navigator)
|
||||
void addObject(const MWWorld::Ptr& ptr, const MWWorld::World& world, const MWPhysics::PhysicsSystem& physics,
|
||||
DetourNavigator::Navigator& navigator)
|
||||
{
|
||||
if (const auto object = physics.getObject(ptr))
|
||||
{
|
||||
@ -145,7 +147,7 @@ namespace
|
||||
|
||||
const auto center = (aabbMax + aabbMin) * 0.5f;
|
||||
|
||||
const auto distanceFromDoor = MWBase::Environment::get().getWorld()->getMaxActivationDistance() * 0.5f;
|
||||
const auto distanceFromDoor = world.getMaxActivationDistance() * 0.5f;
|
||||
const auto toPoint = aabbMax.x() - aabbMin.x() < aabbMax.y() - aabbMin.y()
|
||||
? btVector3(distanceFromDoor, 0, 0)
|
||||
: btVector3(0, distanceFromDoor, 0);
|
||||
@ -183,7 +185,7 @@ namespace
|
||||
}
|
||||
else if (physics.getActor(ptr))
|
||||
{
|
||||
navigator.addAgent(MWBase::Environment::get().getWorld()->getPathfindingHalfExtents(ptr));
|
||||
navigator.addAgent(world.getPathfindingHalfExtents(ptr));
|
||||
}
|
||||
}
|
||||
|
||||
@ -318,7 +320,6 @@ namespace MWWorld
|
||||
ListAndResetObjectsVisitor visitor;
|
||||
|
||||
cell->forEach(visitor);
|
||||
const auto world = MWBase::Environment::get().getWorld();
|
||||
for (const auto& ptr : visitor.mObjects)
|
||||
{
|
||||
if (const auto object = mPhysics->getObject(ptr))
|
||||
@ -329,7 +330,7 @@ namespace MWWorld
|
||||
}
|
||||
else if (mPhysics->getActor(ptr))
|
||||
{
|
||||
mNavigator.removeAgent(world->getPathfindingHalfExtents(ptr));
|
||||
mNavigator.removeAgent(mWorld.getPathfindingHalfExtents(ptr));
|
||||
mRendering.removeActorPath(ptr);
|
||||
mPhysics->remove(ptr);
|
||||
}
|
||||
@ -350,17 +351,17 @@ namespace MWWorld
|
||||
if (cell->getCell()->hasWater())
|
||||
mNavigator.removeWater(osg::Vec2i(cellX, cellY));
|
||||
|
||||
if (const auto pathgrid = world->getStore().get<ESM::Pathgrid>().search(*cell->getCell()))
|
||||
if (const auto pathgrid = mWorld.getStore().get<ESM::Pathgrid>().search(*cell->getCell()))
|
||||
mNavigator.removePathgrid(*pathgrid);
|
||||
|
||||
mNavigator.update(world->getPlayerPtr().getRefData().getPosition().asVec3());
|
||||
mNavigator.update(mWorld.getPlayerPtr().getRefData().getPosition().asVec3());
|
||||
|
||||
MWBase::Environment::get().getMechanicsManager()->drop (cell);
|
||||
|
||||
mRendering.removeCell(cell);
|
||||
MWBase::Environment::get().getWindowManager()->removeCell(cell);
|
||||
|
||||
MWBase::Environment::get().getWorld()->getLocalScripts().clearCell (cell);
|
||||
mWorld.getLocalScripts().clearCell (cell);
|
||||
|
||||
MWBase::Environment::get().getSoundManager()->stopSound (cell);
|
||||
mActiveCells.erase(cell);
|
||||
@ -375,8 +376,6 @@ namespace MWWorld
|
||||
|
||||
Log(Debug::Info) << "Loading cell " << cell->getCell()->getDescription();
|
||||
|
||||
const auto world = MWBase::Environment::get().getWorld();
|
||||
|
||||
const int cellX = cell->getCell()->getGridX();
|
||||
const int cellY = cell->getCell()->getGridY();
|
||||
|
||||
@ -423,12 +422,12 @@ namespace MWWorld
|
||||
}
|
||||
}
|
||||
|
||||
if (const auto pathgrid = world->getStore().get<ESM::Pathgrid>().search(*cell->getCell()))
|
||||
if (const auto pathgrid = mWorld.getStore().get<ESM::Pathgrid>().search(*cell->getCell()))
|
||||
mNavigator.addPathgrid(*cell->getCell(), *pathgrid);
|
||||
|
||||
// register local scripts
|
||||
// do this before insertCell, to make sure we don't add scripts from levelled creature spawning twice
|
||||
MWBase::Environment::get().getWorld()->getLocalScripts().addCell (cell);
|
||||
mWorld.getLocalScripts().addCell (cell);
|
||||
|
||||
if (respawn)
|
||||
cell->respawn();
|
||||
@ -459,7 +458,7 @@ namespace MWWorld
|
||||
else
|
||||
mPhysics->disableWater();
|
||||
|
||||
const auto player = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
||||
const auto player = mWorld.getPlayerPtr();
|
||||
|
||||
// The player is loaded before the scene and by default it is grounded, with the scene fully loaded, we validate and correct this.
|
||||
if (player.mCell == cell) // Only run once, during initial cell load.
|
||||
@ -498,14 +497,14 @@ namespace MWWorld
|
||||
if (currentGridCenter)
|
||||
{
|
||||
float centerX, centerY;
|
||||
MWBase::Environment::get().getWorld()->indexToPosition(currentGridCenter->x(), currentGridCenter->y(), centerX, centerY, true);
|
||||
mWorld.indexToPosition(currentGridCenter->x(), currentGridCenter->y(), centerX, centerY, true);
|
||||
float distance = std::max(std::abs(centerX-pos.x()), std::abs(centerY-pos.y()));
|
||||
const float maxDistance = Constants::CellSizeInUnits / 2 + mCellLoadingThreshold; // 1/2 cell size + threshold
|
||||
if (distance <= maxDistance)
|
||||
return *currentGridCenter;
|
||||
}
|
||||
osg::Vec2i newCenter;
|
||||
MWBase::Environment::get().getWorld()->positionToIndex(pos.x(), pos.y(), newCenter.x(), newCenter.y());
|
||||
mWorld.positionToIndex(pos.x(), pos.y(), newCenter.x(), newCenter.y());
|
||||
return newCenter;
|
||||
}
|
||||
|
||||
@ -559,7 +558,7 @@ namespace MWWorld
|
||||
mRendering.getPagedRefnums(newGrid, mPagedRefs);
|
||||
|
||||
std::size_t refsToLoad = 0;
|
||||
const auto cellsToLoad = [&playerCellX,&playerCellY,&refsToLoad](CellStoreCollection& collection, int range) -> std::vector<std::pair<int,int>>
|
||||
const auto cellsToLoad = [&] (CellStoreCollection& collection, int range) -> std::vector<std::pair<int,int>>
|
||||
{
|
||||
std::vector<std::pair<int, int>> cellsPositionsToLoad;
|
||||
for (int x = playerCellX - range; x <= playerCellX + range; ++x)
|
||||
@ -568,7 +567,7 @@ namespace MWWorld
|
||||
{
|
||||
if (!isCellInCollection(x, y, collection))
|
||||
{
|
||||
refsToLoad += MWBase::Environment::get().getWorld()->getExterior(x, y)->count();
|
||||
refsToLoad += mWorld.getExterior(x, y)->count();
|
||||
cellsPositionsToLoad.emplace_back(x, y);
|
||||
}
|
||||
}
|
||||
@ -624,12 +623,12 @@ namespace MWWorld
|
||||
{
|
||||
if (!isCellInCollection(x, y, mActiveCells))
|
||||
{
|
||||
CellStore *cell = MWBase::Environment::get().getWorld()->getExterior(x, y);
|
||||
CellStore *cell = mWorld.getExterior(x, y);
|
||||
loadCell(cell, loadingListener, changeEvent, pos);
|
||||
}
|
||||
}
|
||||
|
||||
CellStore* current = MWBase::Environment::get().getWorld()->getExterior(playerCellX, playerCellY);
|
||||
CellStore* current = mWorld.getExterior(playerCellX, playerCellY);
|
||||
MWBase::Environment::get().getWindowManager()->changeCell(current);
|
||||
|
||||
if (changeEvent)
|
||||
@ -645,7 +644,7 @@ namespace MWWorld
|
||||
|
||||
mRendering.getResourceSystem()->setExpiryDelay(1.f);
|
||||
|
||||
const MWWorld::Store<ESM::Cell> &cells = MWBase::Environment::get().getWorld()->getStore().get<ESM::Cell>();
|
||||
const MWWorld::Store<ESM::Cell> &cells = mWorld.getStore().get<ESM::Cell>();
|
||||
|
||||
Loading::Listener* loadingListener = MWBase::Environment::get().getWindowManager()->getLoadingScreen();
|
||||
Loading::ScopedLoad load(loadingListener);
|
||||
@ -657,7 +656,7 @@ namespace MWWorld
|
||||
{
|
||||
loadingListener->setLabel("Testing exterior cells ("+std::to_string(i)+"/"+std::to_string(cells.getExtSize())+")...");
|
||||
|
||||
CellStore *cell = MWBase::Environment::get().getWorld()->getExterior(it->mData.mX, it->mData.mY);
|
||||
CellStore *cell = mWorld.getExterior(it->mData.mX, it->mData.mY);
|
||||
loadCell(cell, nullptr, false, osg::Vec3f(it->mData.mX + 0.5f, it->mData.mY + 0.5f, 0) * Constants::CellSizeInUnits);
|
||||
|
||||
auto iter = mActiveCells.begin();
|
||||
@ -690,7 +689,7 @@ namespace MWWorld
|
||||
|
||||
mRendering.getResourceSystem()->setExpiryDelay(1.f);
|
||||
|
||||
const MWWorld::Store<ESM::Cell> &cells = MWBase::Environment::get().getWorld()->getStore().get<ESM::Cell>();
|
||||
const MWWorld::Store<ESM::Cell> &cells = mWorld.getStore().get<ESM::Cell>();
|
||||
|
||||
Loading::Listener* loadingListener = MWBase::Environment::get().getWindowManager()->getLoadingScreen();
|
||||
Loading::ScopedLoad load(loadingListener);
|
||||
@ -702,9 +701,9 @@ namespace MWWorld
|
||||
{
|
||||
loadingListener->setLabel("Testing interior cells ("+std::to_string(i)+"/"+std::to_string(cells.getIntSize())+")...");
|
||||
|
||||
CellStore *cell = MWBase::Environment::get().getWorld()->getInterior(it->mName);
|
||||
CellStore *cell = mWorld.getInterior(it->mName);
|
||||
ESM::Position position;
|
||||
MWBase::Environment::get().getWorld()->findInteriorPosition(it->mName, position);
|
||||
mWorld.findInteriorPosition(it->mName, position);
|
||||
loadCell(cell, nullptr, false, position.asVec3());
|
||||
|
||||
auto iter = mActiveCells.begin();
|
||||
@ -737,16 +736,16 @@ namespace MWWorld
|
||||
|
||||
mRendering.enableTerrain(cell->isExterior());
|
||||
|
||||
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||
MWWorld::Ptr old = world->getPlayerPtr();
|
||||
world->getPlayer().setCell(cell);
|
||||
MWWorld::Ptr old = mWorld.getPlayerPtr();
|
||||
mWorld.getPlayer().setCell(cell);
|
||||
|
||||
MWWorld::Ptr player = world->getPlayerPtr();
|
||||
MWWorld::Ptr player = mWorld.getPlayerPtr();
|
||||
mRendering.updatePlayerPtr(player);
|
||||
|
||||
if (adjustPlayerPos) {
|
||||
world->moveObject(player, pos.asVec3());
|
||||
world->rotateObject(player, pos.asRotationVec3());
|
||||
if (adjustPlayerPos)
|
||||
{
|
||||
mWorld.moveObject(player, pos.asVec3());
|
||||
mWorld.rotateObject(player, pos.asRotationVec3());
|
||||
|
||||
player.getClass().adjustPosition(player, true);
|
||||
}
|
||||
@ -756,14 +755,15 @@ namespace MWWorld
|
||||
|
||||
mPhysics->updatePtr(old, player);
|
||||
|
||||
world->adjustSky();
|
||||
mWorld.adjustSky();
|
||||
|
||||
mLastPlayerPos = player.getRefData().getPosition().asVec3();
|
||||
}
|
||||
|
||||
Scene::Scene (MWRender::RenderingManager& rendering, MWPhysics::PhysicsSystem *physics,
|
||||
Scene::Scene(MWWorld::World& world, MWRender::RenderingManager& rendering, MWPhysics::PhysicsSystem *physics,
|
||||
DetourNavigator::Navigator& navigator)
|
||||
: mCurrentCell (nullptr), mCellChanged (false), mPhysics(physics), mRendering(rendering), mNavigator(navigator)
|
||||
: mCurrentCell (nullptr), mCellChanged (false)
|
||||
, mWorld(world), mPhysics(physics), mRendering(rendering), mNavigator(navigator)
|
||||
, mCellLoadingThreshold(1024.f)
|
||||
, mPreloadDistance(Settings::Manager::getInt("preload distance", "Cells"))
|
||||
, mPreloadEnabled(Settings::Manager::getBool("preload enabled", "Cells"))
|
||||
@ -804,7 +804,7 @@ namespace MWWorld
|
||||
|
||||
void Scene::changeToInteriorCell (const std::string& cellName, const ESM::Position& position, bool adjustPlayerPos, bool changeEvent)
|
||||
{
|
||||
CellStore *cell = MWBase::Environment::get().getWorld()->getInterior(cellName);
|
||||
CellStore *cell = mWorld.getInterior(cellName);
|
||||
bool useFading = (mCurrentCell != nullptr);
|
||||
if (useFading)
|
||||
MWBase::Environment::get().getWindowManager()->fadeScreenOut(0.5);
|
||||
@ -816,12 +816,11 @@ namespace MWWorld
|
||||
|
||||
if(mCurrentCell != nullptr && *mCurrentCell == *cell)
|
||||
{
|
||||
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||
world->moveObject(world->getPlayerPtr(), position.asVec3());
|
||||
world->rotateObject(world->getPlayerPtr(), position.asRotationVec3());
|
||||
mWorld.moveObject(mWorld.getPlayerPtr(), position.asVec3());
|
||||
mWorld.rotateObject(mWorld.getPlayerPtr(), position.asRotationVec3());
|
||||
|
||||
if (adjustPlayerPos)
|
||||
world->getPlayerPtr().getClass().adjustPosition(world->getPlayerPtr(), true);
|
||||
mWorld.getPlayerPtr().getClass().adjustPosition(mWorld.getPlayerPtr(), true);
|
||||
MWBase::Environment::get().getWindowManager()->fadeScreenIn(0.5);
|
||||
return;
|
||||
}
|
||||
@ -850,7 +849,7 @@ namespace MWWorld
|
||||
mRendering.configureFog(mCurrentCell->getCell());
|
||||
|
||||
// Sky system
|
||||
MWBase::Environment::get().getWorld()->adjustSky();
|
||||
mWorld.adjustSky();
|
||||
|
||||
if (changeEvent)
|
||||
mCellChanged = true;
|
||||
@ -868,14 +867,14 @@ namespace MWWorld
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
|
||||
MWBase::Environment::get().getWorld()->positionToIndex (position.pos[0], position.pos[1], x, y);
|
||||
mWorld.positionToIndex (position.pos[0], position.pos[1], x, y);
|
||||
|
||||
if (changeEvent)
|
||||
MWBase::Environment::get().getWindowManager()->fadeScreenOut(0.5);
|
||||
|
||||
changeCellGrid(position.asVec3(), x, y, changeEvent);
|
||||
|
||||
CellStore* current = MWBase::Environment::get().getWorld()->getExterior(x, y);
|
||||
CellStore* current = mWorld.getExterior(x, y);
|
||||
changePlayerCell(current, position, adjustPlayerPos);
|
||||
|
||||
if (changeEvent)
|
||||
@ -896,20 +895,20 @@ namespace MWWorld
|
||||
{
|
||||
InsertVisitor insertVisitor(cell, loadingListener);
|
||||
cell.forEach (insertVisitor);
|
||||
insertVisitor.insert([&] (const MWWorld::Ptr& ptr) { addObject(ptr, *mPhysics, mRendering, mPagedRefs); });
|
||||
insertVisitor.insert([&] (const MWWorld::Ptr& ptr) { addObject(ptr, *mPhysics, mNavigator); });
|
||||
insertVisitor.insert([&] (const MWWorld::Ptr& ptr) { addObject(ptr, mWorld, *mPhysics, mRendering, mPagedRefs); });
|
||||
insertVisitor.insert([&] (const MWWorld::Ptr& ptr) { addObject(ptr, mWorld, *mPhysics, mNavigator); });
|
||||
}
|
||||
|
||||
void Scene::addObjectToScene (const Ptr& ptr)
|
||||
{
|
||||
try
|
||||
{
|
||||
addObject(ptr, *mPhysics, mRendering, mPagedRefs);
|
||||
addObject(ptr, *mPhysics, mNavigator);
|
||||
MWBase::Environment::get().getWorld()->scaleObject(ptr, ptr.getCellRef().getScale());
|
||||
addObject(ptr, mWorld, *mPhysics, mRendering, mPagedRefs);
|
||||
addObject(ptr, mWorld, *mPhysics, mNavigator);
|
||||
mWorld.scaleObject(ptr, ptr.getCellRef().getScale());
|
||||
if (mCurrentCell != nullptr)
|
||||
{
|
||||
const auto player = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
||||
const auto player = mWorld.getPlayerPtr();
|
||||
mNavigator.update(player.getRefData().getPosition().asVec3());
|
||||
}
|
||||
}
|
||||
@ -929,13 +928,13 @@ namespace MWWorld
|
||||
mNavigator.removeObject(DetourNavigator::ObjectId(object));
|
||||
if (mCurrentCell != nullptr)
|
||||
{
|
||||
const auto player = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
||||
const auto player = mWorld.getPlayerPtr();
|
||||
mNavigator.update(player.getRefData().getPosition().asVec3());
|
||||
}
|
||||
}
|
||||
else if (mPhysics->getActor(ptr))
|
||||
{
|
||||
mNavigator.removeAgent(MWBase::Environment::get().getWorld()->getPathfindingHalfExtents(ptr));
|
||||
mNavigator.removeAgent(mWorld.getPathfindingHalfExtents(ptr));
|
||||
}
|
||||
mPhysics->remove(ptr);
|
||||
mRendering.removeObject (ptr);
|
||||
@ -1020,7 +1019,7 @@ namespace MWWorld
|
||||
if (dt<=1e-06) return;
|
||||
std::vector<PositionCellGrid> exteriorPositions;
|
||||
|
||||
const MWWorld::ConstPtr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
||||
const MWWorld::ConstPtr player = mWorld.getPlayerPtr();
|
||||
osg::Vec3f playerPos = player.getRefData().getPosition().asVec3();
|
||||
osg::Vec3f moved = playerPos - mLastPlayerPos;
|
||||
osg::Vec3f predictedPos = playerPos + moved / dt * mPredictionTime;
|
||||
@ -1070,13 +1069,13 @@ namespace MWWorld
|
||||
try
|
||||
{
|
||||
if (!door.getCellRef().getDestCell().empty())
|
||||
preloadCell(MWBase::Environment::get().getWorld()->getInterior(door.getCellRef().getDestCell()));
|
||||
preloadCell(mWorld.getInterior(door.getCellRef().getDestCell()));
|
||||
else
|
||||
{
|
||||
osg::Vec3f pos = door.getCellRef().getDoorDest().asVec3();
|
||||
int x,y;
|
||||
MWBase::Environment::get().getWorld()->positionToIndex (pos.x(), pos.y(), x, y);
|
||||
preloadCell(MWBase::Environment::get().getWorld()->getExterior(x,y), true);
|
||||
mWorld.positionToIndex (pos.x(), pos.y(), x, y);
|
||||
preloadCell(mWorld.getExterior(x,y), true);
|
||||
exteriorPositions.emplace_back(pos, gridCenterToBounds(getNewGridCenter(pos)));
|
||||
}
|
||||
}
|
||||
@ -1090,7 +1089,7 @@ namespace MWWorld
|
||||
|
||||
void Scene::preloadExteriorGrid(const osg::Vec3f& playerPos, const osg::Vec3f& predictedPos)
|
||||
{
|
||||
if (!MWBase::Environment::get().getWorld()->isCellExterior())
|
||||
if (!mWorld.isCellExterior())
|
||||
return;
|
||||
|
||||
int halfGridSizePlusOne = mHalfGridSize + 1;
|
||||
@ -1100,7 +1099,7 @@ namespace MWWorld
|
||||
cellX = mCurrentGridCenter.x(); cellY = mCurrentGridCenter.y();
|
||||
|
||||
float centerX, centerY;
|
||||
MWBase::Environment::get().getWorld()->indexToPosition(cellX, cellY, centerX, centerY, true);
|
||||
mWorld.indexToPosition(cellX, cellY, centerX, centerY, true);
|
||||
|
||||
for (int dx = -halfGridSizePlusOne; dx <= halfGridSizePlusOne; ++dx)
|
||||
{
|
||||
@ -1110,14 +1109,14 @@ namespace MWWorld
|
||||
continue; // only care about the outer (not yet loaded) part of the grid
|
||||
|
||||
float thisCellCenterX, thisCellCenterY;
|
||||
MWBase::Environment::get().getWorld()->indexToPosition(cellX+dx, cellY+dy, thisCellCenterX, thisCellCenterY, true);
|
||||
mWorld.indexToPosition(cellX+dx, cellY+dy, thisCellCenterX, thisCellCenterY, true);
|
||||
|
||||
float dist = std::max(std::abs(thisCellCenterX - playerPos.x()), std::abs(thisCellCenterY - playerPos.y()));
|
||||
dist = std::min(dist,std::max(std::abs(thisCellCenterX - predictedPos.x()), std::abs(thisCellCenterY - predictedPos.y())));
|
||||
float loadDist = Constants::CellSizeInUnits / 2 + Constants::CellSizeInUnits - mCellLoadingThreshold + mPreloadDistance;
|
||||
|
||||
if (dist < loadDist)
|
||||
preloadCell(MWBase::Environment::get().getWorld()->getExterior(cellX+dx, cellY+dy));
|
||||
preloadCell(mWorld.getExterior(cellX+dx, cellY+dy));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1133,7 +1132,7 @@ namespace MWWorld
|
||||
{
|
||||
for (int dy = -mHalfGridSize; dy <= mHalfGridSize; ++dy)
|
||||
{
|
||||
mPreloader->preload(MWBase::Environment::get().getWorld()->getExterior(x+dx, y+dy), mRendering.getReferenceTime());
|
||||
mPreloader->preload(mWorld.getExterior(x+dx, y+dy), mRendering.getReferenceTime());
|
||||
if (++numpreloaded >= mPreloader->getMaxCacheSize())
|
||||
break;
|
||||
}
|
||||
@ -1196,7 +1195,7 @@ namespace MWWorld
|
||||
|
||||
void Scene::preloadFastTravelDestinations(const osg::Vec3f& playerPos, const osg::Vec3f& /*predictedPos*/, std::vector<PositionCellGrid>& exteriorPositions) // ignore predictedPos here since opening dialogue with travel service takes extra time
|
||||
{
|
||||
const MWWorld::ConstPtr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
||||
const MWWorld::ConstPtr player = mWorld.getPlayerPtr();
|
||||
ListFastTravelDestinationsVisitor listVisitor(mPreloadDistance, player.getRefData().getPosition().asVec3());
|
||||
|
||||
for (MWWorld::CellStore* cellStore : mActiveCells)
|
||||
@ -1208,13 +1207,13 @@ namespace MWWorld
|
||||
for (ESM::Transport::Dest& dest : listVisitor.mList)
|
||||
{
|
||||
if (!dest.mCellName.empty())
|
||||
preloadCell(MWBase::Environment::get().getWorld()->getInterior(dest.mCellName));
|
||||
preloadCell(mWorld.getInterior(dest.mCellName));
|
||||
else
|
||||
{
|
||||
osg::Vec3f pos = dest.mPos.asVec3();
|
||||
int x,y;
|
||||
MWBase::Environment::get().getWorld()->positionToIndex( pos.x(), pos.y(), x, y);
|
||||
preloadCell(MWBase::Environment::get().getWorld()->getExterior(x,y), true);
|
||||
mWorld.positionToIndex( pos.x(), pos.y(), x, y);
|
||||
preloadCell(mWorld.getExterior(x,y), true);
|
||||
exteriorPositions.emplace_back(pos, gridCenterToBounds(getNewGridCenter(pos)));
|
||||
}
|
||||
}
|
||||
|
@ -62,6 +62,7 @@ namespace MWWorld
|
||||
class Player;
|
||||
class CellStore;
|
||||
class CellPreloader;
|
||||
class World;
|
||||
|
||||
enum class RotationOrder
|
||||
{
|
||||
@ -85,6 +86,7 @@ namespace MWWorld
|
||||
CellStore* mCurrentCell; // the cell the player is in
|
||||
CellStoreCollection mActiveCells;
|
||||
bool mCellChanged;
|
||||
MWWorld::World& mWorld;
|
||||
MWPhysics::PhysicsSystem *mPhysics;
|
||||
MWRender::RenderingManager& mRendering;
|
||||
DetourNavigator::Navigator& mNavigator;
|
||||
@ -131,7 +133,7 @@ namespace MWWorld
|
||||
|
||||
public:
|
||||
|
||||
Scene (MWRender::RenderingManager& rendering, MWPhysics::PhysicsSystem *physics,
|
||||
Scene(MWWorld::World& world, MWRender::RenderingManager& rendering, MWPhysics::PhysicsSystem *physics,
|
||||
DetourNavigator::Navigator& navigator);
|
||||
|
||||
~Scene();
|
||||
|
@ -201,7 +201,7 @@ namespace MWWorld
|
||||
|
||||
mWeatherManager.reset(new MWWorld::WeatherManager(*mRendering, mStore));
|
||||
|
||||
mWorldScene.reset(new Scene(*mRendering.get(), mPhysics.get(), *mNavigator));
|
||||
mWorldScene.reset(new Scene(*this, *mRendering.get(), mPhysics.get(), *mNavigator));
|
||||
}
|
||||
|
||||
void World::fillGlobalVariables()
|
||||
@ -1035,7 +1035,7 @@ namespace MWWorld
|
||||
return mWorldScene->markCellAsUnchanged();
|
||||
}
|
||||
|
||||
float World::getMaxActivationDistance ()
|
||||
float World::getMaxActivationDistance() const
|
||||
{
|
||||
if (mActivationDistanceOverride >= 0)
|
||||
return static_cast<float>(mActivationDistanceOverride);
|
||||
@ -3175,7 +3175,7 @@ namespace MWWorld
|
||||
mProjectileManager->updateCasters();
|
||||
}
|
||||
|
||||
void World::applyLoopingParticles(const MWWorld::Ptr& ptr)
|
||||
void World::applyLoopingParticles(const MWWorld::Ptr& ptr) const
|
||||
{
|
||||
const MWWorld::Class &cls = ptr.getClass();
|
||||
if (cls.isActor())
|
||||
|
@ -396,7 +396,7 @@ namespace MWWorld
|
||||
///< Place an object in a safe place next to \a referenceObject. \a direction and \a distance specify the wanted placement
|
||||
/// relative to \a referenceObject (but the object may be placed somewhere else if the wanted location is obstructed).
|
||||
|
||||
float getMaxActivationDistance() override;
|
||||
float getMaxActivationDistance() const override;
|
||||
|
||||
void indexToPosition (int cellX, int cellY, float &x, float &y, bool centre = false)
|
||||
const override;
|
||||
@ -643,7 +643,7 @@ namespace MWWorld
|
||||
const osg::Vec3f& worldPos, const osg::Quat& orient, MWWorld::Ptr& bow, float speed, float attackStrength) override;
|
||||
void updateProjectilesCasters() override;
|
||||
|
||||
void applyLoopingParticles(const MWWorld::Ptr& ptr) override;
|
||||
void applyLoopingParticles(const MWWorld::Ptr& ptr) const override;
|
||||
|
||||
const std::vector<std::string>& getContentFiles() const override;
|
||||
void breakInvisibility (const MWWorld::Ptr& actor) override;
|
||||
|
Loading…
x
Reference in New Issue
Block a user