Revision: 15652
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15652
Author:   ben2610
Date:     2008-07-20 17:40:03 +0200 (Sun, 20 Jul 2008)

Log Message:
-----------
BGE bug fix (for 2.47): setParent() fix, third part: set mass to 0 when 
parenting. Allow loc/scale/orientation change on child object with physic 
controller.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
    trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h

Modified: trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp       
2008-07-20 10:09:19 UTC (rev 15651)
+++ trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp       
2008-07-20 15:40:03 UTC (rev 15652)
@@ -170,10 +170,12 @@
        {
                btBroadphaseProxy* handle = body->getBroadphaseHandle();
                m_savedCollisionFlags = body->getCollisionFlags();
+               m_savedMass = GetMass();
                m_savedCollisionFilterGroup = handle->m_collisionFilterGroup;
                m_savedCollisionFilterMask = handle->m_collisionFilterMask;
                body->setActivationState(DISABLE_SIMULATION);
                GetPhysicsEnvironment()->updateCcdPhysicsController(this, 
+                       0.0,
                        
btCollisionObject::CF_STATIC_OBJECT|((ghost)?btCollisionObject::CF_NO_CONTACT_RESPONSE:(m_savedCollisionFlags&btCollisionObject::CF_NO_CONTACT_RESPONSE)),
                        btBroadphaseProxy::StaticFilter, 
                        btBroadphaseProxy::AllFilter ^ 
btBroadphaseProxy::StaticFilter);
@@ -185,11 +187,12 @@
        btRigidBody *body = GetRigidBody();
        if (body->getActivationState() == DISABLE_SIMULATION)
        {
-               GetRigidBody()->forceActivationState(ACTIVE_TAG);
                GetPhysicsEnvironment()->updateCcdPhysicsController(this, 
+                       m_savedMass,
                        m_savedCollisionFlags,
                        m_savedCollisionFilterGroup,
                        m_savedCollisionFilterMask);
+               GetRigidBody()->forceActivationState(ACTIVE_TAG);
        }
 }
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h 
2008-07-20 10:09:19 UTC (rev 15651)
+++ trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h 
2008-07-20 15:40:03 UTC (rev 15652)
@@ -11,6 +11,8 @@
        int m_savedCollisionFlags;
        short int m_savedCollisionFilterGroup;
        short int m_savedCollisionFilterMask;
+       MT_Scalar m_savedMass;
+
 public:
 
        KX_BulletPhysicsController (const CcdConstructionInfo& ci, bool dyna);

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2008-07-20 
10:09:19 UTC (rev 15651)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2008-07-20 
15:40:03 UTC (rev 15652)
@@ -224,6 +224,10 @@
                RemoveParent(scene);
                obj->GetSGNode()->AddChild(GetSGNode());
 
+               if (m_pPhysicsController1) 
+               {
+                       m_pPhysicsController1->SuspendDynamics(true);
+               }
                // Set us to our new scale, position, and orientation
                scale1[0] = scale1[0]/scale2[0];
                scale1[1] = scale1[1]/scale2[1];
@@ -240,10 +244,6 @@
                if (rootlist->RemoveValue(this))
                        // the object was in parent list, decrement ref count 
as it's now removed
                        Release();
-               if (m_pPhysicsController1) 
-               {
-                       m_pPhysicsController1->SuspendDynamics(true);
-               }
        }
 }
 
@@ -724,8 +724,12 @@
 
 void KX_GameObject::NodeSetLocalPosition(const MT_Point3& trans)
 {
-       if (m_pPhysicsController1)
+       if (m_pPhysicsController1 && (!GetSGNode() || 
!GetSGNode()->GetSGParent()))
        {
+               // don't update physic controller if the object is a child:
+               // 1) the transformation will not be right
+               // 2) in this case, the physic controller is necessarily a 
static object
+               //    that is updated from the normal kinematic synchronization
                m_pPhysicsController1->setPosition(trans);
        }
 
@@ -737,25 +741,22 @@
 
 void KX_GameObject::NodeSetLocalOrientation(const MT_Matrix3x3& rot)
 {
-       if (m_pPhysicsController1)
+       if (m_pPhysicsController1 && (!GetSGNode() || 
!GetSGNode()->GetSGParent()))
        {
+               // see note above
                m_pPhysicsController1->setOrientation(rot.getRotation());
        }
        if (GetSGNode())
                GetSGNode()->SetLocalOrientation(rot);
-       else
-       {
-               int i;
-               i=0;
-       }
 }
 
 
 
 void KX_GameObject::NodeSetLocalScale(const MT_Vector3& scale)
 {
-       if (m_pPhysicsController1)
+       if (m_pPhysicsController1 && (!GetSGNode() || 
!GetSGNode()->GetSGParent()))
        {
+               // see note above
                m_pPhysicsController1->setScaling(scale);
        }
        

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h       
2008-07-20 10:09:19 UTC (rev 15651)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h       
2008-07-20 15:40:03 UTC (rev 15652)
@@ -106,6 +106,7 @@
        btRigidBody* m_body;
        class PHY_IMotionState*         m_MotionState;
        btMotionState*  m_bulletMotionState;
+       friend class CcdPhysicsEnvironment;     // needed when updating the 
controller
 
 
        void*           m_newClientInfo;
@@ -194,7 +195,6 @@
                        return m_cci.m_collisionFilterMask;
                }
 
-
                virtual void    calcXform() {} ;
                virtual void SetMargin(float margin) {};
                virtual float GetMargin() const {return 0.f;};

Modified: 
trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp    
2008-07-20 10:09:19 UTC (rev 15651)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp    
2008-07-20 15:40:03 UTC (rev 15652)
@@ -466,17 +466,39 @@
 
 }
 
-void   CcdPhysicsEnvironment::updateCcdPhysicsController(CcdPhysicsController* 
ctrl, int newCollisionFlags, short int newCollisionGroup, short int 
newCollisionMask)
+void   CcdPhysicsEnvironment::updateCcdPhysicsController(CcdPhysicsController* 
ctrl, btScalar newMass, int newCollisionFlags, short int newCollisionGroup, 
short int newCollisionMask)
 {
        // this function is used when the collisionning group of a controller 
is changed
        // remove and add the collistioning object
        btRigidBody* body = ctrl->GetRigidBody();
+       btVector3 inertia;
 
        m_dynamicsWorld->removeCollisionObject(body);
        body->setCollisionFlags(newCollisionFlags);
+       body->getCollisionShape()->calculateLocalInertia(newMass, inertia);
+       body->setMassProps(newMass, inertia);
        m_dynamicsWorld->addCollisionObject(body, newCollisionGroup, 
newCollisionMask);
+       // to avoid nasty interaction, we must update the property of the 
controller as well
+       ctrl->m_cci.m_mass = newMass;
+       ctrl->m_cci.m_collisionFilterGroup = newCollisionGroup;
+       ctrl->m_cci.m_collisionFilterMask = newCollisionMask;
+       ctrl->m_cci.m_collisionFlags = newCollisionFlags;
 }
 
+void CcdPhysicsEnvironment::enableCcdPhysicsController(CcdPhysicsController* 
ctrl)
+{
+       std::vector<CcdPhysicsController*>::iterator i =
+               std::find(m_controllers.begin(), m_controllers.end(), ctrl);
+       if (i == m_controllers.end())
+       {
+               btRigidBody* body = ctrl->GetRigidBody();
+               m_dynamicsWorld->addCollisionObject(body, 
+                       ctrl->GetCollisionFilterGroup(), 
ctrl->GetCollisionFilterMask());
+       }
+}
+
+
+
 void   CcdPhysicsEnvironment::beginFrame()
 {
 

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h      
2008-07-20 10:09:19 UTC (rev 15651)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h      
2008-07-20 15:40:03 UTC (rev 15652)
@@ -183,8 +183,15 @@
 
                void    removeCcdPhysicsController(CcdPhysicsController* ctrl);
 
-               void    updateCcdPhysicsController(CcdPhysicsController* ctrl, 
int newCollisionFlags, short int newCollisionGroup, short int newCollisionMask);
+               void    updateCcdPhysicsController(CcdPhysicsController* ctrl, 
btScalar newMass, int newCollisionFlags, short int newCollisionGroup, short int 
newCollisionMask);
 
+               void    disableCcdPhysicsController(CcdPhysicsController* ctrl)
+               { 
+                       removeCcdPhysicsController(ctrl); 
+               }
+
+               void    enableCcdPhysicsController(CcdPhysicsController* ctrl);
+
                btBroadphaseInterface*  getBroadphase();
 
                


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to