diff options
Diffstat (limited to 'source/gameengine/Physics')
4 files changed, 69 insertions, 4 deletions
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index 6c1e2998bdb..92a9b405b7c 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -22,6 +22,7 @@ subject to the following restrictions: #include "CcdPhysicsController.h" #include "btBulletDynamicsCommon.h" +#include "BulletCollision/CollisionDispatch/btGhostObject.h" #include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h" #include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h" @@ -88,7 +89,7 @@ CcdPhysicsController::CcdPhysicsController (const CcdConstructionInfo& ci) m_shapeInfo->AddRef(); m_bulletMotionState = 0; - + m_characterController = 0; CreateRigidbody(); @@ -151,6 +152,24 @@ public: }; +class BlenderBulletCharacterController : public btKinematicCharacterController +{ +private: + btMotionState* m_motionState; + +public: + BlenderBulletCharacterController(btMotionState *motionState, btPairCachingGhostObject *ghost, btConvexShape* shape, float stepHeight) + : btKinematicCharacterController(ghost,shape,stepHeight,2), + m_motionState(motionState) + { + } + + virtual void updateAction(btCollisionWorld *collisionWorld, btScalar dt) + { + btKinematicCharacterController::updateAction(collisionWorld,dt); + m_motionState->setWorldTransform(getGhostObject()->getWorldTransform()); + } +}; btRigidBody* CcdPhysicsController::GetRigidBody() { @@ -164,6 +183,10 @@ btSoftBody* CcdPhysicsController::GetSoftBody() { return btSoftBody::upcast(m_object); } +btKinematicCharacterController* CcdPhysicsController::GetCharacterController() +{ + return m_characterController; +} #include "BulletSoftBody/btSoftBodyHelpers.h" @@ -425,6 +448,29 @@ bool CcdPhysicsController::CreateSoftbody() return true; } +bool CcdPhysicsController::CreateCharacterController() +{ + if (!m_cci.m_bCharacter) + return false; + + m_object = new btPairCachingGhostObject(); + m_object->setCollisionShape(m_collisionShape); + m_object->setCollisionFlags(btCollisionObject::CF_CHARACTER_OBJECT); + + btTransform trans; + m_bulletMotionState->getWorldTransform(trans); + m_object->setWorldTransform(trans); + + m_characterController = new BlenderBulletCharacterController(m_bulletMotionState,(btPairCachingGhostObject*)m_object,(btConvexShape*)m_collisionShape,m_cci.m_stepHeight); + + PHY__Vector3 gravity; + m_cci.m_physicsEnv->getGravity(gravity); + m_characterController->setGravity(-gravity.m_vec[2]); // need positive gravity + m_characterController->setJumpSpeed(m_cci.m_jumpSpeed); + m_characterController->setFallSpeed(m_cci.m_fallSpeed); + + return true; +} void CcdPhysicsController::CreateRigidbody() { @@ -433,7 +479,7 @@ void CcdPhysicsController::CreateRigidbody() m_bulletMotionState = new BlenderBulletMotionState(m_MotionState); ///either create a btCollisionObject, btRigidBody or btSoftBody - if (CreateSoftbody()) + if (CreateSoftbody() || CreateCharacterController()) // soft body created, done return; diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h index 2228b6511ce..63c267443aa 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h @@ -29,6 +29,7 @@ subject to the following restrictions: /// PHY_IPhysicsController is the abstract simplified Interface to a physical object. /// It contains the IMotionState and IDeformableMesh Interfaces. #include "btBulletDynamicsCommon.h" +#include "BulletDynamics/Character/btKinematicCharacterController.h" #include "LinearMath/btTransform.h" #include "PHY_IMotionState.h" @@ -221,7 +222,8 @@ struct CcdConstructionInfo KinematicFilter = 4, DebrisFilter = 8, SensorFilter = 16, - AllFilter = DefaultFilter | StaticFilter | KinematicFilter | DebrisFilter | SensorFilter, + CharacterFilter = 32, + AllFilter = DefaultFilter | StaticFilter | KinematicFilter | DebrisFilter | SensorFilter | CharacterFilter, }; @@ -301,6 +303,10 @@ struct CcdConstructionInfo btScalar m_margin; //////////////////// + float m_stepHeight; + float m_jumpSpeed; + float m_fallSpeed; + int m_gamesoftFlag; float m_soft_linStiff; /* linear stiffness 0..1 */ float m_soft_angStiff; /* angular stiffness 0..1 */ @@ -343,6 +349,7 @@ struct CcdConstructionInfo bool m_bRigid; bool m_bSoft; bool m_bSensor; + bool m_bCharacter; bool m_bGimpact; // use Gimpact for mesh body ///optional use of collision group/mask: @@ -391,6 +398,7 @@ class CcdPhysicsController : public PHY_IPhysicsController { protected: btCollisionObject* m_object; + btKinematicCharacterController* m_characterController; class PHY_IMotionState* m_MotionState; @@ -417,6 +425,7 @@ protected: void CreateRigidbody(); bool CreateSoftbody(); + bool CreateCharacterController(); bool Register() { return (m_registerCount++ == 0) ? true : false; @@ -453,6 +462,7 @@ protected: btRigidBody* GetRigidBody(); btCollisionObject* GetCollisionObject(); btSoftBody* GetSoftBody(); + btKinematicCharacterController* GetCharacterController(); CcdShapeConstructionInfo* GetShapeInfo() { return m_shapeInfo; } diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp index ba0d3f18b1d..767d99583b8 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp @@ -26,6 +26,7 @@ subject to the following restrictions: #include <algorithm> #include "btBulletDynamicsCommon.h" #include "LinearMath/btIDebugDraw.h" +#include "BulletCollision/CollisionDispatch/btGhostObject.h" #include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h" #include "BulletSoftBody/btSoftRigidDynamicsWorld.h" #include "BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h" @@ -369,6 +370,7 @@ m_scalingPropagated(false) m_filterCallback = new CcdOverlapFilterCallBack(this); m_broadphase->getOverlappingPairCache()->setOverlapFilterCallback(m_filterCallback); + m_broadphase->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback()); setSolverType(1);//issues with quickstep and memory allocations // m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,m_broadphase,m_solver,m_collisionConfiguration); @@ -406,7 +408,11 @@ void CcdPhysicsEnvironment::addCcdPhysicsController(CcdPhysicsController* ctrl) { if (obj->getCollisionShape()) { - m_dynamicsWorld->addCollisionObject(obj,ctrl->GetCollisionFilterGroup(), ctrl->GetCollisionFilterMask()); + m_dynamicsWorld->addCollisionObject(obj, ctrl->GetCollisionFilterGroup(), ctrl->GetCollisionFilterMask()); + } + if (ctrl->GetCharacterController()) + { + m_dynamicsWorld->addAction(ctrl->GetCharacterController()); } } } diff --git a/source/gameengine/Physics/common/PHY_Pro.h b/source/gameengine/Physics/common/PHY_Pro.h index 110d4731cdc..b930177d3a8 100644 --- a/source/gameengine/Physics/common/PHY_Pro.h +++ b/source/gameengine/Physics/common/PHY_Pro.h @@ -46,6 +46,9 @@ struct PHY_ShapeProps { bool m_do_anisotropic; // Should I do anisotropic friction? bool m_do_fh; // Should the object have a linear Fh spring? bool m_do_rot_fh; // Should the object have an angular Fh spring? + MT_Scalar m_step_height; // Max height of climbable steps (Character) + MT_Scalar m_jump_speed; // Velocity of jumps (Character) + MT_Scalar m_fall_speed; // Max velocity of falling (Character) }; |