From 9d73cbf2c4104282eef7b022a3381da64d3077f1 Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Mon, 9 Jul 2012 04:57:21 +0000 Subject: As a response to issue [#28483] "Enable/Disable Rigid Body actuator do nothing" reported by Jean-Francois Gallant (pyroevil), I'm adding preliminary support to enable and disable rigid body physics on dynamic objects. This is can be done via the Edit Object Actuator or through KX_GameObject.enableRigidBody() and KX_GameObject.disableRigidBody(). Thanks to Sergej Reich for his help with the patch. --- .../gameengine/Physics/Bullet/CcdPhysicsController.cpp | 17 ++++++++--------- source/gameengine/Physics/Bullet/CcdPhysicsController.h | 4 ++++ 2 files changed, 12 insertions(+), 9 deletions(-) (limited to 'source/gameengine/Physics/Bullet') diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index c7ba17e7f97..e63724fffc6 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -1294,17 +1294,16 @@ void CcdPhysicsController::getReactionForce(float& forceX,float& forceY,float& // dyna's that are rigidbody are free in orientation, dyna's with non-rigidbody are restricted void CcdPhysicsController::setRigidBody(bool rigid) { - if (!rigid) + btRigidBody* body = GetRigidBody(); + if (body) { - btRigidBody* body = GetRigidBody(); - if (body) - { - //fake it for now - btVector3 inertia = body->getInvInertiaDiagLocal(); - inertia[1] = 0.f; - body->setInvInertiaDiagLocal(inertia); - body->updateInertiaTensor(); + m_cci.m_bRigid = rigid; + if (!rigid) { + body->setAngularFactor(0.f); + body->setAngularVelocity(btVector3(0.f, 0.f, 0.f)); } + else + body->setAngularFactor(m_cci.m_angularFactor); } } diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h index 869211ffd31..94dc796df23 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h @@ -229,6 +229,8 @@ struct CcdConstructionInfo :m_localInertiaTensor(1.f, 1.f, 1.f), m_gravity(0,0,0), m_scaling(1.f,1.f,1.f), + m_linearFactor(0.f, 0.f, 0.f), + m_angularFactor(0.f, 0.f, 0.f), m_mass(0.f), m_clamp_vel_min(-1.f), m_clamp_vel_max(-1.f), @@ -292,6 +294,8 @@ struct CcdConstructionInfo btVector3 m_localInertiaTensor; btVector3 m_gravity; btVector3 m_scaling; + btVector3 m_linearFactor; + btVector3 m_angularFactor; btScalar m_mass; btScalar m_clamp_vel_min; btScalar m_clamp_vel_max; -- cgit v1.2.3