[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15623] trunk/blender/source/gameengine: BGE bug fix (good for 2.47): SetParent actuator did not work on dynamic objects.

Benoit Bolsee benoit.bolsee at online.be
Fri Jul 18 16:40:28 CEST 2008


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);





More information about the Bf-blender-cvs mailing list