1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-06-01 08:41:31 +00:00

Remove redundant MWBase::Environment::get().getWorld() calls

This commit is contained in:
elsid 2022-05-06 20:36:25 +02:00
parent f03360b666
commit 9320fb50ab
No known key found for this signature in database
GPG key ID: B845CB9FEE18AB40
2 changed files with 44 additions and 36 deletions

View file

@ -0,0 +1,20 @@
#ifndef OPENMW_MWWORLD_CELLUTILS_H
#define OPENMW_MWWORLD_CELLUTILS_H
#include <components/misc/constants.hpp>
#include <components/esm3/cellid.hpp>
#include <cmath>
namespace MWWorld
{
inline ESM::CellId::CellIndex positionToIndex(float x, float y)
{
return {
static_cast<int>(std::floor(x / Constants::CellSizeInUnits)),
static_cast<int>(std::floor(y / Constants::CellSizeInUnits))
};
}
}
#endif

View file

@ -78,6 +78,7 @@
#include "contentloader.hpp" #include "contentloader.hpp"
#include "esmloader.hpp" #include "esmloader.hpp"
#include "cellutils.hpp"
namespace MWWorld namespace MWWorld
{ {
@ -1276,11 +1277,10 @@ namespace MWWorld
MWWorld::Ptr World::moveObject(const Ptr& ptr, const osg::Vec3f& position, bool movePhysics, bool moveToActive) MWWorld::Ptr World::moveObject(const Ptr& ptr, const osg::Vec3f& position, bool movePhysics, bool moveToActive)
{ {
int cellX, cellY; const auto index = MWWorld::positionToIndex(position.x(), position.y());
positionToIndex(position.x(), position.y(), cellX, cellY);
CellStore* cell = ptr.getCell(); CellStore* cell = ptr.getCell();
CellStore* newCell = getExterior(cellX, cellY); CellStore* newCell = getExterior(index.mX, index.mY);
bool isCellActive = getPlayerPtr().isInCell() && getPlayerPtr().getCell()->isExterior() && mWorldScene->isCellActive(*newCell); bool isCellActive = getPlayerPtr().isInCell() && getPlayerPtr().getCell()->isExterior() && mWorldScene->isCellActive(*newCell);
if (cell->isExterior() || (moveToActive && isCellActive && ptr.getClass().isActor())) if (cell->isExterior() || (moveToActive && isCellActive && ptr.getClass().isActor()))
@ -1518,8 +1518,9 @@ namespace MWWorld
void World::positionToIndex (float x, float y, int &cellX, int &cellY) const void World::positionToIndex (float x, float y, int &cellX, int &cellY) const
{ {
cellX = static_cast<int>(std::floor(x / Constants::CellSizeInUnits)); const auto index = MWWorld::positionToIndex(x, y);
cellY = static_cast<int>(std::floor(y / Constants::CellSizeInUnits)); cellX = index.mX;
cellY = index.mY;
} }
void World::queueMovement(const Ptr &ptr, const osg::Vec3f &velocity) void World::queueMovement(const Ptr &ptr, const osg::Vec3f &velocity)
@ -2074,11 +2075,6 @@ namespace MWWorld
struct GetDoorMarkerVisitor struct GetDoorMarkerVisitor
{ {
GetDoorMarkerVisitor(std::vector<World::DoorMarker>& out)
: mOut(out)
{
}
std::vector<World::DoorMarker>& mOut; std::vector<World::DoorMarker>& mOut;
bool operator()(const MWWorld::Ptr& ptr) bool operator()(const MWWorld::Ptr& ptr)
@ -2104,11 +2100,7 @@ namespace MWWorld
else else
{ {
cellid.mPaged = true; cellid.mPaged = true;
MWBase::Environment::get().getWorld()->positionToIndex( cellid.mIndex = MWWorld::positionToIndex(ref.mRef.getDoorDest().pos[0], ref.mRef.getDoorDest().pos[1]);
ref.mRef.getDoorDest().pos[0],
ref.mRef.getDoorDest().pos[1],
cellid.mIndex.mX,
cellid.mIndex.mY);
} }
newMarker.dest = cellid; newMarker.dest = cellid;
@ -2124,7 +2116,7 @@ namespace MWWorld
void World::getDoorMarkers (CellStore* cell, std::vector<World::DoorMarker>& out) void World::getDoorMarkers (CellStore* cell, std::vector<World::DoorMarker>& out)
{ {
GetDoorMarkerVisitor visitor(out); GetDoorMarkerVisitor visitor {out};
cell->forEachType<ESM::Door>(visitor); cell->forEachType<ESM::Door>(visitor);
} }
@ -2210,9 +2202,8 @@ namespace MWWorld
throw std::runtime_error("copyObjectToCell(): cannot copy object to null cell"); throw std::runtime_error("copyObjectToCell(): cannot copy object to null cell");
if (cell->isExterior()) if (cell->isExterior())
{ {
int cellX, cellY; const auto index = MWWorld::positionToIndex(pos.pos[0], pos.pos[1]);
positionToIndex(pos.pos[0], pos.pos[1], cellX, cellY); cell = mCells.getExterior(index.mX, index.mY);
cell = mCells.getExterior(cellX, cellY);
} }
MWWorld::Ptr dropped = MWWorld::Ptr dropped =
@ -2819,10 +2810,9 @@ namespace MWWorld
// door to exterior // door to exterior
if (door->getDestCell().empty()) if (door->getDestCell().empty())
{ {
int x, y;
ESM::Position doorDest = door->getDoorDest(); ESM::Position doorDest = door->getDoorDest();
positionToIndex(doorDest.pos[0], doorDest.pos[1], x, y); const auto index = MWWorld::positionToIndex(doorDest.pos[0], doorDest.pos[1]);
source = getExterior(x, y); source = getExterior(index.mX, index.mY);
} }
// door to interior // door to interior
else else
@ -3154,7 +3144,7 @@ namespace MWWorld
const osg::Vec3f sourcePos = worldPos + orient * osg::Vec3f(0,-1,0) * 64.f; const osg::Vec3f sourcePos = worldPos + orient * osg::Vec3f(0,-1,0) * 64.f;
// Early out if the launch position is underwater // Early out if the launch position is underwater
bool underwater = MWBase::Environment::get().getWorld()->isUnderwater(MWMechanics::getPlayer().getCell(), worldPos); bool underwater = isUnderwater(MWMechanics::getPlayer().getCell(), worldPos);
if (underwater) if (underwater)
{ {
MWMechanics::projectileHit(actor, Ptr(), bow, projectile, worldPos, attackStrength); MWMechanics::projectileHit(actor, Ptr(), bow, projectile, worldPos, attackStrength);
@ -3415,15 +3405,12 @@ namespace MWWorld
struct AddDetectedReferenceVisitor struct AddDetectedReferenceVisitor
{ {
AddDetectedReferenceVisitor(std::vector<Ptr>& out, const Ptr& detector, World::DetectionType type, float squaredDist)
: mOut(out), mDetector(detector), mSquaredDist(squaredDist), mType(type)
{
}
std::vector<Ptr>& mOut; std::vector<Ptr>& mOut;
Ptr mDetector; Ptr mDetector;
float mSquaredDist; float mSquaredDist;
World::DetectionType mType; World::DetectionType mType;
const MWWorld::ESMStore& mStore;
bool operator() (const MWWorld::Ptr& ptr) bool operator() (const MWWorld::Ptr& ptr)
{ {
if ((ptr.getRefData().getPosition().asVec3() - mDetector.getRefData().getPosition().asVec3()).length2() >= mSquaredDist) if ((ptr.getRefData().getPosition().asVec3() - mDetector.getRefData().getPosition().asVec3()).length2() >= mSquaredDist)
@ -3439,14 +3426,13 @@ namespace MWWorld
// but ignore containers without resolved content // but ignore containers without resolved content
if (isContainer && ptr.getRefData().getCustomData() == nullptr) if (isContainer && ptr.getRefData().getCustomData() == nullptr)
{ {
const auto& store = MWBase::Environment::get().getWorld()->getStore();
for(const auto& containerItem : ptr.get<ESM::Container>()->mBase->mInventory.mList) for(const auto& containerItem : ptr.get<ESM::Container>()->mBase->mInventory.mList)
{ {
if(containerItem.mCount) if(containerItem.mCount)
{ {
try try
{ {
ManualRef ref(store, containerItem.mItem, containerItem.mCount); ManualRef ref(mStore, containerItem.mItem, containerItem.mCount);
if(needToAdd(ref.getPtr(), mDetector)) if(needToAdd(ref.getPtr(), mDetector))
{ {
mOut.push_back(ptr); mOut.push_back(ptr);
@ -3521,7 +3507,7 @@ namespace MWWorld
dist = feetToGameUnits(dist); dist = feetToGameUnits(dist);
AddDetectedReferenceVisitor visitor (out, ptr, type, dist*dist); AddDetectedReferenceVisitor visitor {out, ptr, dist * dist, type, mStore};
for (CellStore* cellStore : mWorldScene->getActiveCells()) for (CellStore* cellStore : mWorldScene->getActiveCells())
{ {
@ -3701,10 +3687,9 @@ namespace MWWorld
static int iNumberCreatures = mStore.get<ESM::GameSetting>().find("iNumberCreatures")->mValue.getInteger(); static int iNumberCreatures = mStore.get<ESM::GameSetting>().find("iNumberCreatures")->mValue.getInteger();
int numCreatures = 1 + Misc::Rng::rollDice(iNumberCreatures); // [1, iNumberCreatures] int numCreatures = 1 + Misc::Rng::rollDice(iNumberCreatures); // [1, iNumberCreatures]
auto& prng = MWBase::Environment::get().getWorld()->getPrng();
for (int i=0; i<numCreatures; ++i) for (int i=0; i<numCreatures; ++i)
{ {
std::string selectedCreature = MWMechanics::getLevelledItem(list, true, prng); std::string selectedCreature = MWMechanics::getLevelledItem(list, true, mPrng);
if (selectedCreature.empty()) if (selectedCreature.empty())
continue; continue;
@ -3833,6 +3818,8 @@ namespace MWWorld
struct ResetActorsVisitor struct ResetActorsVisitor
{ {
World& mWorld;
bool operator() (const Ptr& ptr) bool operator() (const Ptr& ptr)
{ {
if (ptr.getClass().isActor() && ptr.getCellRef().hasContentFile()) if (ptr.getClass().isActor() && ptr.getCellRef().hasContentFile())
@ -3841,18 +3828,19 @@ namespace MWWorld
return true; return true;
const ESM::Position& origPos = ptr.getCellRef().getPosition(); const ESM::Position& origPos = ptr.getCellRef().getPosition();
MWBase::Environment::get().getWorld()->moveObject(ptr, origPos.asVec3()); mWorld.moveObject(ptr, origPos.asVec3());
MWBase::Environment::get().getWorld()->rotateObject(ptr, origPos.asRotationVec3()); mWorld.rotateObject(ptr, origPos.asRotationVec3());
ptr.getClass().adjustPosition(ptr, true); ptr.getClass().adjustPosition(ptr, true);
} }
return true; return true;
} }
}; };
void World::resetActors() void World::resetActors()
{ {
for (CellStore* cellstore : mWorldScene->getActiveCells()) for (CellStore* cellstore : mWorldScene->getActiveCells())
{ {
ResetActorsVisitor visitor; ResetActorsVisitor visitor {*this};
cellstore->forEach(visitor); cellstore->forEach(visitor);
} }
} }