#include "steering.hpp" #include "../mwworld/class.hpp" #include "../mwworld/ptr.hpp" #include "../mwbase/environment.hpp" #include "movement.hpp" namespace MWMechanics { bool smoothTurn(const MWWorld::Ptr& actor, Ogre::Radian targetAngle, int axis, Ogre::Degree epsilon) { Ogre::Radian currentAngle (actor.getRefData().getPosition().rot[axis]); Ogre::Radian diff (targetAngle - currentAngle); if (diff >= Ogre::Degree(180)) { // Turning the other way would be a better idea diff = diff-Ogre::Degree(360); } else if (diff <= Ogre::Degree(-180)) { diff = Ogre::Degree(360)-diff; } Ogre::Radian absDiff = Ogre::Math::Abs(diff); // The turning animation actually moves you slightly, so the angle will be wrong again. // Use epsilon to prevent jerkiness. if (absDiff < epsilon) return true; Ogre::Radian limit = MAX_VEL_ANGULAR * MWBase::Environment::get().getFrameDuration(); if (absDiff > limit) diff = Ogre::Math::Sign(diff) * limit; actor.getClass().getMovementSettings(actor).mRotation[axis] = diff.valueRadians(); return false; } bool zTurn(const MWWorld::Ptr& actor, Ogre::Radian targetAngle, Ogre::Degree epsilon) { return smoothTurn(actor, targetAngle, 2, epsilon); } }