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;