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:
parent
14c93b3df0
commit
1218e4e15d
8 changed files with 43 additions and 21 deletions
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue