1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-03 18:45:34 +00:00

Use player half extents only to find path in exterior cells

This commit is contained in:
elsid 2019-03-03 14:58:03 +03:00
parent 14c93b3df0
commit 1218e4e15d
No known key found for this signature in database
GPG key ID: B845CB9FEE18AB40
8 changed files with 43 additions and 21 deletions

View file

@ -134,6 +134,7 @@ namespace MWBase
virtual MWWorld::Player& getPlayer() = 0;
virtual MWWorld::Ptr getPlayerPtr() = 0;
virtual MWWorld::ConstPtr getPlayerConstPtr() const = 0;
virtual const MWWorld::ESMStore& getStore() const = 0;
@ -615,6 +616,9 @@ namespace MWBase
virtual void removeActorPath(const MWWorld::ConstPtr& actor) const = 0;
virtual void setNavMeshNumberToRender(const std::size_t value) = 0;
/// Return physical half extents of the given actor to be used in pathfinding
virtual osg::Vec3f getPathfindingHalfExtents(const MWWorld::ConstPtr& actor) const = 0;
};
}

View file

@ -135,9 +135,9 @@ bool MWMechanics::AiPackage::pathTo(const MWWorld::Ptr& actor, const osg::Vec3f&
{
if (wasShortcutting || doesPathNeedRecalc(dest, actor.getCell())) // if need to rebuild path
{
const osg::Vec3f playerHalfExtents = world->getHalfExtents(getPlayer()); // Using player half extents for better performance
const auto halfExtents = world->getPathfindingHalfExtents(actor);
mPathFinder.buildPath(actor, position, dest, actor.getCell(), getPathGridGraph(actor.getCell()),
playerHalfExtents, getNavigatorFlags(actor));
halfExtents, getNavigatorFlags(actor));
mRotateOnTheRunChecks = 3;
// give priority to go directly on target if there is minimal opportunity

View file

@ -155,9 +155,9 @@ namespace MWMechanics
}
else
{
const osg::Vec3f playerHalfExtents = MWBase::Environment::get().getWorld()->getHalfExtents(getPlayer()); // Using player half extents for better performance
const osg::Vec3f halfExtents = MWBase::Environment::get().getWorld()->getPathfindingHalfExtents(actor);
mPathFinder.buildPath(actor, pos.asVec3(), mDestination, actor.getCell(),
getPathGridGraph(actor.getCell()), playerHalfExtents, getNavigatorFlags(actor));
getPathGridGraph(actor.getCell()), halfExtents, getNavigatorFlags(actor));
}
if (mPathFinder.isPathConstructed())
@ -312,10 +312,9 @@ namespace MWMechanics
if ((!isWaterCreature && !destinationIsAtWater(actor, mDestination)) ||
(isWaterCreature && !destinationThroughGround(currentPosition, mDestination)))
{
// Using player half extents for better performance
const osg::Vec3f playerHalfExtents = MWBase::Environment::get().getWorld()->getHalfExtents(getPlayer());
const osg::Vec3f halfExtents = MWBase::Environment::get().getWorld()->getPathfindingHalfExtents(actor);
mPathFinder.buildPath(actor, currentPosition, mDestination, actor.getCell(),
getPathGridGraph(actor.getCell()), playerHalfExtents, getNavigatorFlags(actor));
getPathGridGraph(actor.getCell()), halfExtents, getNavigatorFlags(actor));
mPathFinder.addPointToPath(mDestination);
if (mPathFinder.isPathConstructed())

View file

@ -122,6 +122,12 @@ namespace MWWorld
return ptr;
}
MWWorld::ConstPtr Player::getConstPlayer() const
{
MWWorld::ConstPtr ptr (&mPlayer, mCellStore);
return ptr;
}
void Player::setBirthSign (const std::string &sign)
{
mSign = sign;

View file

@ -27,6 +27,7 @@ namespace Loading
namespace MWWorld
{
class CellStore;
class ConstPtr;
/// \brief NPC object representing the player and additional player data
class Player
@ -81,6 +82,7 @@ namespace MWWorld
void setCell (MWWorld::CellStore *cellStore);
MWWorld::Ptr getPlayer();
MWWorld::ConstPtr getConstPlayer() const;
void setBirthSign(const std::string &sign);
const std::string &getBirthSign() const;

View file

@ -172,12 +172,9 @@ namespace
);
}
}
else if (const auto actor = physics.getActor(ptr))
else if (physics.getActor(ptr))
{
const auto halfExtents = ptr.getCell()->isExterior()
? physics.getHalfExtents(MWBase::Environment::get().getWorld()->getPlayerPtr())
: actor->getHalfExtents();
navigator.addAgent(halfExtents);
navigator.addAgent(MWBase::Environment::get().getWorld()->getPathfindingHalfExtents(ptr));
}
}
@ -337,15 +334,14 @@ namespace MWWorld
ListAndResetObjectsVisitor visitor;
(*iter)->forEach<ListAndResetObjectsVisitor>(visitor);
const auto player = MWBase::Environment::get().getWorld()->getPlayerPtr();
const auto playerHalfExtents = mPhysics->getHalfExtents(player);
const auto world = MWBase::Environment::get().getWorld();
for (const auto& ptr : visitor.mObjects)
{
if (const auto object = mPhysics->getObject(ptr))
navigator->removeObject(DetourNavigator::ObjectId(object));
else if (const auto actor = mPhysics->getActor(ptr))
{
navigator->removeAgent(ptr.getCell()->isExterior() ? playerHalfExtents : actor->getHalfExtents());
navigator->removeAgent(world->getPathfindingHalfExtents(ptr));
mRendering.removeActorPath(ptr);
}
mPhysics->remove(ptr);
@ -372,6 +368,7 @@ namespace MWWorld
if ((*iter)->getCell()->hasWater())
navigator->removeWater(osg::Vec2i(cellX, cellY));
const auto player = world->getPlayerPtr();
navigator->update(player.getRefData().getPosition().asVec3());
MWBase::Environment::get().getMechanicsManager()->drop (*iter);
@ -815,10 +812,7 @@ namespace MWWorld
}
else if (const auto actor = mPhysics->getActor(ptr))
{
const auto& halfExtents = ptr.getCell()->isExterior()
? mPhysics->getHalfExtents(MWBase::Environment::get().getWorld()->getPlayerPtr())
: actor->getHalfExtents();
navigator->removeAgent(halfExtents);
navigator->removeAgent(MWBase::Environment::get().getWorld()->getPathfindingHalfExtents(ptr));
}
mPhysics->remove(ptr);
mRendering.removeObject (ptr);

View file

@ -2408,7 +2408,7 @@ namespace MWWorld
{
// Remove the old CharacterController
MWBase::Environment::get().getMechanicsManager()->remove(getPlayerPtr());
mNavigator->removeAgent(mPhysics->getHalfExtents(getPlayerPtr()));
mNavigator->removeAgent(getPathfindingHalfExtents(getPlayerConstPtr()));
mPhysics->remove(getPlayerPtr());
mRendering->removePlayer(getPlayerPtr());
@ -2443,7 +2443,7 @@ namespace MWWorld
applyLoopingParticles(player);
mNavigator->addAgent(mPhysics->getHalfExtents(getPlayerPtr()));
mNavigator->addAgent(getPathfindingHalfExtents(getPlayerConstPtr()));
}
World::RestPermitted World::canRest () const
@ -3418,6 +3418,11 @@ namespace MWWorld
return mPlayer->getPlayer();
}
MWWorld::ConstPtr World::getPlayerConstPtr() const
{
return mPlayer->getConstPlayer();
}
void World::updateDialogueGlobals()
{
MWWorld::Ptr player = getPlayerPtr();
@ -3787,4 +3792,12 @@ namespace MWWorld
mRendering->setNavMeshNumber(value);
}
osg::Vec3f World::getPathfindingHalfExtents(const MWWorld::ConstPtr& actor) const
{
if (actor.isInCell() && actor.getCell()->isExterior())
return getHalfExtents(getPlayerConstPtr()); // Using player half extents for better performance
else
return getHalfExtents(actor);
}
}

View file

@ -238,6 +238,7 @@ namespace MWWorld
Player& getPlayer() override;
MWWorld::Ptr getPlayerPtr() override;
MWWorld::ConstPtr getPlayerConstPtr() const override;
const MWWorld::ESMStore& getStore() const override;
@ -717,6 +718,9 @@ namespace MWWorld
void removeActorPath(const MWWorld::ConstPtr& actor) const override;
void setNavMeshNumberToRender(const std::size_t value) override;
/// Return physical half extents of the given actor to be used in pathfinding
osg::Vec3f getPathfindingHalfExtents(const MWWorld::ConstPtr& actor) const override;
};
}