bugfix: adding static objects will 'replace' previously added static object in game...
[blender-staging.git] / source / gameengine / Physics / Bullet / CcdPhysicsController.cpp
index 3ddac72618db2d88911968826ae907e5ab7ac8f8..5a45ce020cce3cc8e940f416abba587d966b594f 100644 (file)
@@ -104,12 +104,13 @@ public:
 
 };
 
+
 void CcdPhysicsController::CreateRigidbody()
 {
 
-       btTransform trans = GetTransformFromMotionState(m_cci.m_MotionState);
+       btTransform trans = GetTransformFromMotionState(m_MotionState);
 
-       m_bulletMotionState = new BlenderBulletMotionState(m_cci.m_MotionState);
+       m_bulletMotionState = new BlenderBulletMotionState(m_MotionState);
 
        m_body = new btRigidBody(m_cci.m_mass,
                m_bulletMotionState,
@@ -329,6 +330,7 @@ void                CcdPhysicsController::setOrientation(float quatImag0,float quatImag1,float
        btTransform xform  = m_body->getCenterOfMassTransform();
        xform.setRotation(btQuaternion(quatImag0,quatImag1,quatImag2,quatReal));
        m_body->setCenterOfMassTransform(xform);
+       m_bulletMotionState->setWorldTransform(xform);
 
 }
 
@@ -339,10 +341,13 @@ void              CcdPhysicsController::setPosition(float posX,float posY,float posZ)
        {
                m_body->setCollisionFlags(m_body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
        }
+       
        m_MotionState->setWorldPosition(posX,posY,posZ);
        btTransform xform  = m_body->getCenterOfMassTransform();
        xform.setOrigin(btVector3(posX,posY,posZ));
        m_body->setCenterOfMassTransform(xform);
+       m_bulletMotionState->setWorldTransform(xform);
+
 
 }
 void           CcdPhysicsController::resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ)
@@ -368,8 +373,14 @@ void               CcdPhysicsController::setScaling(float scaleX,float scaleY,float scaleZ)
                if (m_body && m_body->getCollisionShape())
                {
                        m_body->getCollisionShape()->setLocalScaling(m_cci.m_scaling);
-                       m_body->getCollisionShape()->calculateLocalInertia(m_cci.m_mass, m_cci.m_localInertiaTensor);
-                       m_body->setMassProps(m_cci.m_mass, m_cci.m_localInertiaTensor * m_cci.m_inertiaFactor);
+                       
+                       //printf("no inertia recalc for fixed objects with mass=0\n");
+                       if (m_cci.m_mass)
+                       {
+                               m_body->getCollisionShape()->calculateLocalInertia(m_cci.m_mass, m_cci.m_localInertiaTensor);
+                               m_body->setMassProps(m_cci.m_mass, m_cci.m_localInertiaTensor * m_cci.m_inertiaFactor);
+                       } 
+                       
                }
        }
 }
@@ -379,6 +390,10 @@ void               CcdPhysicsController::ApplyTorque(float torqueX,float torqueY,float torque
 {
        btVector3 torque(torqueX,torqueY,torqueZ);
        btTransform xform = m_body->getCenterOfMassTransform();
+       if (torque.length2() > (SIMD_EPSILON*SIMD_EPSILON))
+       {
+               m_body->activate();
+       }
        if (local)
        {
                torque  = xform.getBasis()*torque;
@@ -389,6 +404,13 @@ void               CcdPhysicsController::ApplyTorque(float torqueX,float torqueY,float torque
 void           CcdPhysicsController::ApplyForce(float forceX,float forceY,float forceZ,bool local)
 {
        btVector3 force(forceX,forceY,forceZ);
+       
+       if (force.length2() > (SIMD_EPSILON*SIMD_EPSILON))
+       {
+               m_body->activate();
+       }
+
+
        btTransform xform = m_body->getCenterOfMassTransform();
        if (local)
        {