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