Merge pull request #2500 from elsid/horker_evade_stuck

Use 3d coordinates to detect stuck (bug #5127)
pull/541/head
Alexei Dobrohotov 5 years ago committed by GitHub
commit ee5b81470c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -2,8 +2,6 @@
#include <components/sceneutil/positionattitudetransform.hpp> #include <components/sceneutil/positionattitudetransform.hpp>
#include "../mwbase/world.hpp"
#include "../mwbase/environment.hpp"
#include "../mwworld/class.hpp" #include "../mwworld/class.hpp"
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"
@ -78,10 +76,8 @@ namespace MWMechanics
return MWWorld::Ptr(); // none found return MWWorld::Ptr(); // none found
} }
ObstacleCheck::ObstacleCheck(): ObstacleCheck::ObstacleCheck()
mPrevX(0) // to see if the moved since last time : mWalkState(State_Norm)
, mPrevY(0)
, mWalkState(State_Norm)
, mStuckDuration(0) , mStuckDuration(0)
, mEvadeDuration(0) , mEvadeDuration(0)
, mDistSameSpot(-1) // avoid calculating it each time , mDistSameSpot(-1) // avoid calculating it each time
@ -125,21 +121,15 @@ namespace MWMechanics
*/ */
void ObstacleCheck::update(const MWWorld::Ptr& actor, float duration) void ObstacleCheck::update(const MWWorld::Ptr& actor, float duration)
{ {
const ESM::Position pos = actor.getRefData().getPosition(); const osg::Vec3f pos = actor.getRefData().getPosition().asVec3();
if (mDistSameSpot == -1) if (mDistSameSpot == -1)
{ mDistSameSpot = DIST_SAME_SPOT * actor.getClass().getSpeed(actor);
const osg::Vec3f halfExtents = MWBase::Environment::get().getWorld()->getHalfExtents(actor);
mDistSameSpot = DIST_SAME_SPOT * actor.getClass().getSpeed(actor) + 1.2 * std::max(halfExtents.x(), halfExtents.y());
}
const float distSameSpot = mDistSameSpot * duration; const float distSameSpot = mDistSameSpot * duration;
const float squaredMovedDistance = (osg::Vec2f(pos.pos[0], pos.pos[1]) - osg::Vec2f(mPrevX, mPrevY)).length2(); const bool samePosition = (pos - mPrev).length2() < distSameSpot * distSameSpot;
const bool samePosition = squaredMovedDistance < distSameSpot * distSameSpot;
// update position mPrev = pos;
mPrevX = pos.pos[0];
mPrevY = pos.pos[1];
switch(mWalkState) switch(mWalkState)
{ {

@ -1,6 +1,8 @@
#ifndef OPENMW_MECHANICS_OBSTACLE_H #ifndef OPENMW_MECHANICS_OBSTACLE_H
#define OPENMW_MECHANICS_OBSTACLE_H #define OPENMW_MECHANICS_OBSTACLE_H
#include <osg/Vec3f>
namespace MWWorld namespace MWWorld
{ {
class Ptr; class Ptr;
@ -37,9 +39,8 @@ namespace MWMechanics
private: private:
// for checking if we're stuck (ignoring Z axis) // for checking if we're stuck
float mPrevX; osg::Vec3f mPrev;
float mPrevY;
// directions to try moving in when get stuck // directions to try moving in when get stuck
static const float evadeDirections[NUM_EVADE_DIRECTIONS][2]; static const float evadeDirections[NUM_EVADE_DIRECTIONS][2];

Loading…
Cancel
Save