From bb5213670c41634c666dd705e196832c74b8aa52 Mon Sep 17 00:00:00 2001 From: Frederic Chardon Date: Mon, 16 Nov 2020 11:09:08 +0100 Subject: [PATCH] Use bigger hammer to set Actor's position after teleporting. Otherwise traceDown() would use old collision object transform and gives incorrect results, making the Actor "fall" in the new position. --- apps/openmw/mwphysics/actor.cpp | 24 ++++++++++++------------ apps/openmw/mwphysics/actor.hpp | 3 ++- apps/openmw/mwphysics/mtphysics.cpp | 2 +- apps/openmw/mwphysics/physicssystem.cpp | 4 ++-- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/apps/openmw/mwphysics/actor.cpp b/apps/openmw/mwphysics/actor.cpp index 0f3d69d21..430bd4dee 100644 --- a/apps/openmw/mwphysics/actor.cpp +++ b/apps/openmw/mwphysics/actor.cpp @@ -74,11 +74,8 @@ Actor::Actor(const MWWorld::Ptr& ptr, const Resource::BulletShape* shape, Physic updateRotation(); updateScale(); - updatePosition(); - setPosition(mWorldPosition, true); - + resetPosition(); addCollisionMask(getCollisionMask()); - updateCollisionObjectPosition(); } Actor::~Actor() @@ -160,15 +157,9 @@ osg::Vec3f Actor::getCollisionObjectPosition() const return Misc::Convert::toOsg(mLocalTransform.getOrigin()); } -void Actor::setPosition(const osg::Vec3f& position, bool reset) +void Actor::setPosition(const osg::Vec3f& position) { - if (reset) - { - mPreviousPosition = position; - mNextPosition = position; - } - else - mPreviousPosition = mPosition; + mPreviousPosition = mPosition; mPosition = position; } @@ -178,6 +169,15 @@ void Actor::adjustPosition(const osg::Vec3f& offset) mPreviousPosition += offset; } +void Actor::resetPosition() +{ + updatePosition(); + mPreviousPosition = mWorldPosition; + mPosition = mWorldPosition; + mNextPosition = mWorldPosition; + updateCollisionObjectPosition(); +} + osg::Vec3f Actor::getPosition() const { return mPosition; diff --git a/apps/openmw/mwphysics/actor.hpp b/apps/openmw/mwphysics/actor.hpp index 6b23b31d3..3d6f93ae0 100644 --- a/apps/openmw/mwphysics/actor.hpp +++ b/apps/openmw/mwphysics/actor.hpp @@ -91,7 +91,8 @@ namespace MWPhysics /** * Store the current position into mPreviousPosition, then move to this position. */ - void setPosition(const osg::Vec3f& position, bool reset=false); + void setPosition(const osg::Vec3f& position); + void resetPosition(); void adjustPosition(const osg::Vec3f& offset); osg::Vec3f getPosition() const; diff --git a/apps/openmw/mwphysics/mtphysics.cpp b/apps/openmw/mwphysics/mtphysics.cpp index ff676413b..dbb714fac 100644 --- a/apps/openmw/mwphysics/mtphysics.cpp +++ b/apps/openmw/mwphysics/mtphysics.cpp @@ -253,7 +253,7 @@ namespace MWPhysics for (const auto& m : mActorsFrameData) { m.mActorRaw->setStandingOnPtr(nullptr); - m.mActorRaw->setPosition(m.mActorRaw->getWorldPosition(), true); + m.mActorRaw->resetPosition(); mMovementResults[m.mPtr] = m.mActorRaw->getWorldPosition(); } return mMovementResults; diff --git a/apps/openmw/mwphysics/physicssystem.cpp b/apps/openmw/mwphysics/physicssystem.cpp index 5de26fdfc..42ead3606 100644 --- a/apps/openmw/mwphysics/physicssystem.cpp +++ b/apps/openmw/mwphysics/physicssystem.cpp @@ -433,8 +433,8 @@ namespace MWPhysics ActorMap::iterator found = mActors.find(ptr); if (found == mActors.end()) return ptr.getRefData().getPosition().asVec3(); - else - return MovementSolver::traceDown(ptr, position, found->second.get(), mCollisionWorld.get(), maxHeight); + found->second->resetPosition(); + return MovementSolver::traceDown(ptr, position, found->second.get(), mCollisionWorld.get(), maxHeight); } void PhysicsSystem::addHeightField (const float* heights, int x, int y, float triSize, float sqrtVerts, float minH, float maxH, const osg::Object* holdObject)