From b3d5c2bd7ff3633685518dc98d34cad17a76acf9 Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 10 Feb 2017 01:58:27 +0100 Subject: [PATCH] Use the actor's collision shape in findGround() The cylinder base is no longer appropriate as of the change to capsules. This also works around a bug when tracing a small cylinder/box shape apparently introduced with bullet 2.86. --- apps/openmw/mwphysics/actor.cpp | 1 + apps/openmw/mwphysics/actor.hpp | 4 ++++ apps/openmw/mwphysics/physicssystem.cpp | 2 +- apps/openmw/mwphysics/trace.cpp | 8 +------- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwphysics/actor.cpp b/apps/openmw/mwphysics/actor.cpp index 5167f6ef0..e0edd515d 100644 --- a/apps/openmw/mwphysics/actor.cpp +++ b/apps/openmw/mwphysics/actor.cpp @@ -35,6 +35,7 @@ Actor::Actor(const MWWorld::Ptr& ptr, osg::ref_ptr } else mShape.reset(new btBoxShape(toBullet(mHalfExtents))); + mConvexShape = static_cast(mShape.get()); mCollisionObject.reset(new btCollisionObject); mCollisionObject->setCollisionFlags(btCollisionObject::CF_KINEMATIC_OBJECT); diff --git a/apps/openmw/mwphysics/actor.hpp b/apps/openmw/mwphysics/actor.hpp index 9c0144b9d..a640640e2 100644 --- a/apps/openmw/mwphysics/actor.hpp +++ b/apps/openmw/mwphysics/actor.hpp @@ -12,6 +12,7 @@ class btCollisionWorld; class btCollisionShape; class btCollisionObject; +class btConvexShape; namespace Resource { @@ -61,6 +62,8 @@ namespace MWPhysics return mInternalCollisionMode; } + btConvexShape* getConvexShape() const { return mConvexShape; } + /** * Enables or disables the *external* collision body. If disabled, other actors will not collide with this actor. */ @@ -153,6 +156,7 @@ namespace MWPhysics bool mWalkingOnWater; std::auto_ptr mShape; + btConvexShape* mConvexShape; std::auto_ptr mCollisionObject; diff --git a/apps/openmw/mwphysics/physicssystem.cpp b/apps/openmw/mwphysics/physicssystem.cpp index 6d7daa3b8..0884798df 100644 --- a/apps/openmw/mwphysics/physicssystem.cpp +++ b/apps/openmw/mwphysics/physicssystem.cpp @@ -239,7 +239,7 @@ namespace MWPhysics public: static osg::Vec3f traceDown(const MWWorld::Ptr &ptr, Actor* actor, btCollisionWorld* collisionWorld, float maxHeight) { - osg::Vec3f position(ptr.getRefData().getPosition().asVec3()); + osg::Vec3f position(actor->getCollisionObjectPosition()); ActorTracer tracer; tracer.findGround(actor, position, position-osg::Vec3f(0,0,maxHeight), collisionWorld); diff --git a/apps/openmw/mwphysics/trace.cpp b/apps/openmw/mwphysics/trace.cpp index feda68ca5..10d22ec7f 100644 --- a/apps/openmw/mwphysics/trace.cpp +++ b/apps/openmw/mwphysics/trace.cpp @@ -4,7 +4,6 @@ #include #include -#include #include "collisiontype.hpp" #include "actor.hpp" @@ -106,12 +105,7 @@ void ActorTracer::findGround(const Actor* actor, const osg::Vec3f& start, const newTraceCallback.m_collisionFilterMask = actor->getCollisionObject()->getBroadphaseHandle()->m_collisionFilterMask; newTraceCallback.m_collisionFilterMask &= ~CollisionType_Actor; - btVector3 halfExtents = toBullet(actor->getHalfExtents()); - - halfExtents[2] = 1.0f; - btCylinderShapeZ base(halfExtents); - - world->convexSweepTest(&base, from, to, newTraceCallback); + world->convexSweepTest(actor->getConvexShape(), from, to, newTraceCallback); if(newTraceCallback.hasHit()) { const btVector3& tracehitnormal = newTraceCallback.m_hitNormalWorld;