diff options
author | Sybren A. Stüvel <sybren@stuvel.eu> | 2015-01-15 20:27:47 +0300 |
---|---|---|
committer | Sybren A. Stüvel <sybren@stuvel.eu> | 2015-01-15 20:37:22 +0300 |
commit | ed8dc78691063f37eb411d1b2e095183a0a94dd5 (patch) | |
tree | cbfb817125eb8c97fd1c0a8442af6f73e2b691ee /source/gameengine/Physics | |
parent | b675418d0143ada5638b8074f86939224d1f23d2 (diff) |
BGE physics: get/set linear and angular damping
This patch adds the following R/W properties and method to `KX_GameObject`:
- `linearDamping` -- get/set linear damping
- `angluarDamping` -- get/set angular damping
- `setDamping(linear, angular)` -- set both simultaneously
These allow runtime changes to the same properties that are accessible at design time in Blender's UI via `game.damping` and `game.rotation_damping`. The names of the properties were chosen to mirror the internal names of the BGE physics engine, as these are (AFAIK) also the commonly used names in physics literature.
Reviewers: campbellbarton
Projects: #game_physics
Differential Revision: https://developer.blender.org/D936
Diffstat (limited to 'source/gameengine/Physics')
3 files changed, 54 insertions, 0 deletions
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index 6b73f330c61..ff68021f09e 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -207,6 +207,11 @@ btRigidBody* CcdPhysicsController::GetRigidBody() { return btRigidBody::upcast(m_object); } +const btRigidBody* CcdPhysicsController::GetRigidBody() const +{ + return btRigidBody::upcast(m_object); +} + btCollisionObject* CcdPhysicsController::GetCollisionObject() { return m_object; @@ -1354,6 +1359,42 @@ void CcdPhysicsController::Jump() void CcdPhysicsController::SetActive(bool active) { } + +float CcdPhysicsController::GetLinearDamping() const +{ + const btRigidBody* body = GetRigidBody(); + if (body) + return body->getLinearDamping(); + return 0; +} + +float CcdPhysicsController::GetAngularDamping() const +{ + const btRigidBody* body = GetRigidBody(); + if (body) + return body->getAngularDamping(); + return 0; +} + +void CcdPhysicsController::SetLinearDamping(float damping) +{ + SetDamping(damping, GetAngularDamping()); +} + +void CcdPhysicsController::SetAngularDamping(float damping) +{ + SetDamping(GetLinearDamping(), damping); +} + +void CcdPhysicsController::SetDamping(float linear, float angular) +{ + btRigidBody* body = GetRigidBody(); + if (!body) return; + + body->setDamping(linear, angular); +} + + // reading out information from physics MT_Vector3 CcdPhysicsController::GetLinearVelocity() { diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h index 4d0d96e07c6..557a5fe603a 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h @@ -522,6 +522,7 @@ protected: btRigidBody* GetRigidBody(); + const btRigidBody* GetRigidBody() const; btCollisionObject* GetCollisionObject(); btSoftBody* GetSoftBody(); btKinematicCharacterController* GetCharacterController(); @@ -573,6 +574,12 @@ protected: virtual void Jump(); virtual void SetActive(bool active); + virtual float GetLinearDamping() const; + virtual float GetAngularDamping() const; + virtual void SetLinearDamping(float damping); + virtual void SetAngularDamping(float damping); + virtual void SetDamping(float linear, float angular); + // reading out information from physics virtual MT_Vector3 GetLinearVelocity(); virtual MT_Vector3 GetAngularVelocity(); diff --git a/source/gameengine/Physics/common/PHY_IPhysicsController.h b/source/gameengine/Physics/common/PHY_IPhysicsController.h index f9975484fa7..1717f8d90cb 100644 --- a/source/gameengine/Physics/common/PHY_IPhysicsController.h +++ b/source/gameengine/Physics/common/PHY_IPhysicsController.h @@ -89,6 +89,12 @@ class PHY_IPhysicsController : public PHY_IController virtual void SetLinearVelocity(const MT_Vector3& lin_vel,bool local)=0; virtual void ResolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ) = 0; + virtual float GetLinearDamping() const=0; + virtual float GetAngularDamping() const=0; + virtual void SetLinearDamping(float damping)=0; + virtual void SetAngularDamping(float damping)=0; + virtual void SetDamping(float linear, float angular)=0; + virtual void SuspendDynamics(bool ghost=false)=0; virtual void RestoreDynamics()=0; |