Revision: 15623
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15623
Author:   ben2610
Date:     2008-07-18 16:40:24 +0200 (Fri, 18 Jul 2008)

Log Message:
-----------
BGE bug fix (good for 2.47): SetParent actuator did not work on dynamic 
objects.  Dynamics will now be disabled automatically and the object will be 
set ghost for the duration of the parenting; this is to avoid static 
interaction with the parent object. The dynamic state is restored when the 
parenting is removed with RemoveParent actuator. This fix also applies to 
setParent() and removeParent() python functions.

Modified Paths:
--------------
    trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp
    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/Ketsji/KX_IPhysicsController.h
    trunk/blender/source/gameengine/Ketsji/KX_OdePhysicsController.cpp
    trunk/blender/source/gameengine/Ketsji/KX_OdePhysicsController.h
    trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.h

Modified: trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp   2008-07-18 
13:06:49 UTC (rev 15622)
+++ trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp   2008-07-18 
14:40:24 UTC (rev 15623)
@@ -306,7 +306,7 @@
 }
 #endif
 
-void SCA_IObject::Suspend(void)
+void SCA_IObject::Suspend()
 {
        if ((!m_ignore_activity_culling) 
                && (!m_suspended))  {

Modified: trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp       
2008-07-18 13:06:49 UTC (rev 15622)
+++ trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp       
2008-07-18 14:40:24 UTC (rev 15623)
@@ -17,7 +17,8 @@
 
 KX_BulletPhysicsController::KX_BulletPhysicsController (const 
CcdConstructionInfo& ci, bool dyna)
 : KX_IPhysicsController(dyna,(PHY_IPhysicsController*)this),
-CcdPhysicsController(ci)
+CcdPhysicsController(ci),
+m_savedCollisionFlags(0)
 {
 
 }
@@ -161,14 +162,26 @@
 {
 }
 
-void   KX_BulletPhysicsController::SuspendDynamics()
+void   KX_BulletPhysicsController::SuspendDynamics(bool ghost)
 {
-       GetRigidBody()->setActivationState(DISABLE_SIMULATION);
+       btRigidBody *body = GetRigidBody();
+       if (body->getActivationState() != DISABLE_SIMULATION)
+       {
+               m_savedCollisionFlags = body->getCollisionFlags();
+               body->setActivationState(DISABLE_SIMULATION);
+               body->setCollisionFlags((btCollisionObject::CF_STATIC_OBJECT)|
+                       ((ghost)?btCollisionObject::CF_NO_CONTACT_RESPONSE:0));
+       }
+}
 
-}
 void   KX_BulletPhysicsController::RestoreDynamics()
 {
-       GetRigidBody()->forceActivationState(ACTIVE_TAG);
+       btRigidBody *body = GetRigidBody();
+       if (body->getActivationState() == DISABLE_SIMULATION)
+       {
+               GetRigidBody()->forceActivationState(ACTIVE_TAG);
+               body->setCollisionFlags(m_savedCollisionFlags);
+       }
 }
 
 SG_Controller* KX_BulletPhysicsController::GetReplica(class SG_Node* destnode)

Modified: trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h 
2008-07-18 13:06:49 UTC (rev 15622)
+++ trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h 
2008-07-18 14:40:24 UTC (rev 15623)
@@ -7,7 +7,8 @@
 
 class KX_BulletPhysicsController : public KX_IPhysicsController ,public 
CcdPhysicsController
 {
-
+private:
+       int m_savedCollisionFlags;
 public:
 
        KX_BulletPhysicsController (const CcdConstructionInfo& ci, bool dyna);
@@ -39,7 +40,7 @@
 
        virtual void    resolveCombinedVelocities(float linvelX,float 
linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ);
 
-       virtual void    SuspendDynamics();
+       virtual void    SuspendDynamics(bool ghost);
        virtual void    RestoreDynamics();
 
        virtual SG_Controller*  GetReplica(class SG_Node* destnode);

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2008-07-18 
13:06:49 UTC (rev 15622)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2008-07-18 
14:40:24 UTC (rev 15623)
@@ -238,6 +238,10 @@
                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);
+               }
        }
 }
 
@@ -258,6 +262,10 @@
                if (!rootlist->SearchValue(this))
                        // object was not in root list, add it now and 
increment ref count
                        rootlist->Add(AddRef());
+               if (m_pPhysicsController1) 
+               {
+                       m_pPhysicsController1->RestoreDynamics();
+               }
        }
 }
 
@@ -832,7 +840,7 @@
        }
 }
 
-void KX_GameObject::Suspend(void)
+void KX_GameObject::Suspend()
 {
        if ((!m_ignore_activity_culling) 
                && (!m_suspended))  {

Modified: trunk/blender/source/gameengine/Ketsji/KX_IPhysicsController.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_IPhysicsController.h      
2008-07-18 13:06:49 UTC (rev 15622)
+++ trunk/blender/source/gameengine/Ketsji/KX_IPhysicsController.h      
2008-07-18 14:40:24 UTC (rev 15623)
@@ -78,7 +78,7 @@
        virtual MT_Vector3      getReactionForce()=0;
        virtual void    setRigidBody(bool rigid)=0;
 
-       virtual void    SuspendDynamics()=0;
+       virtual void    SuspendDynamics(bool ghost=false)=0;
        virtual void    RestoreDynamics()=0;
 
        virtual SG_Controller*  GetReplica(class SG_Node* destnode)=0;

Modified: trunk/blender/source/gameengine/Ketsji/KX_OdePhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_OdePhysicsController.cpp  
2008-07-18 13:06:49 UTC (rev 15622)
+++ trunk/blender/source/gameengine/Ketsji/KX_OdePhysicsController.cpp  
2008-07-18 14:40:24 UTC (rev 15623)
@@ -177,7 +177,7 @@
 
 }
 
-void   KX_OdePhysicsController::SuspendDynamics()
+void   KX_OdePhysicsController::SuspendDynamics(bool)
 {
        ODEPhysicsController::SuspendDynamics();
 }

Modified: trunk/blender/source/gameengine/Ketsji/KX_OdePhysicsController.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_OdePhysicsController.h    
2008-07-18 13:06:49 UTC (rev 15622)
+++ trunk/blender/source/gameengine/Ketsji/KX_OdePhysicsController.h    
2008-07-18 14:40:24 UTC (rev 15623)
@@ -74,7 +74,7 @@
        virtual MT_Vector3      getReactionForce();
        virtual void    setRigidBody(bool rigid);
 
-       virtual void    SuspendDynamics();
+       virtual void    SuspendDynamics(bool);
        virtual void    RestoreDynamics();
        
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp 
2008-07-18 13:06:49 UTC (rev 15622)
+++ trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp 
2008-07-18 14:40:24 UTC (rev 15623)
@@ -101,7 +101,7 @@
 
 }
 
-void   KX_SumoPhysicsController::SuspendDynamics()
+void   KX_SumoPhysicsController::SuspendDynamics(bool)
 {
        SumoPhysicsController::SuspendDynamics();
 }

Modified: trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.h   
2008-07-18 13:06:49 UTC (rev 15622)
+++ trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.h   
2008-07-18 14:40:24 UTC (rev 15623)
@@ -76,7 +76,7 @@
        void    resolveCombinedVelocities(float linvelX,float linvelY,float 
linvelZ,float angVelX,float angVelY,float angVelZ);
 
 
-       void    SuspendDynamics();
+       void    SuspendDynamics(bool);
        void    RestoreDynamics();
        virtual void    getOrientation(MT_Quaternion& orn);
        virtual void setOrientation(const MT_Quaternion& orn);


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

Reply via email to