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.

This commit is contained in:
Benoit Bolsee 2008-07-18 14:40:24 +00:00
parent 6786c517af
commit a397b4b82f
9 changed files with 36 additions and 14 deletions

@ -306,7 +306,7 @@ const MT_Point3& SCA_IObject::ConvertPythonPylist(PyObject* pylist)
}
#endif
void SCA_IObject::Suspend(void)
void SCA_IObject::Suspend()
{
if ((!m_ignore_activity_culling)
&& (!m_suspended)) {

@ -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::setRigidBody(bool rigid)
{
}
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)

@ -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 @@ public:
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);

@ -238,6 +238,10 @@ void KX_GameObject::SetParent(KX_Scene *scene, KX_GameObject* obj)
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 @@ void KX_GameObject::RemoveParent(KX_Scene *scene)
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::Resume(void)
}
}
void KX_GameObject::Suspend(void)
void KX_GameObject::Suspend()
{
if ((!m_ignore_activity_culling)
&& (!m_suspended)) {

@ -78,7 +78,7 @@ public:
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;

@ -177,7 +177,7 @@ void KX_OdePhysicsController::setRigidBody(bool rigid)
}
void KX_OdePhysicsController::SuspendDynamics()
void KX_OdePhysicsController::SuspendDynamics(bool)
{
ODEPhysicsController::SuspendDynamics();
}

@ -74,7 +74,7 @@ public:
virtual MT_Vector3 getReactionForce();
virtual void setRigidBody(bool rigid);
virtual void SuspendDynamics();
virtual void SuspendDynamics(bool);
virtual void RestoreDynamics();

@ -101,7 +101,7 @@ void KX_SumoPhysicsController::SetSumoTransform(bool nondynaonly)
}
void KX_SumoPhysicsController::SuspendDynamics()
void KX_SumoPhysicsController::SuspendDynamics(bool)
{
SumoPhysicsController::SuspendDynamics();
}

@ -76,7 +76,7 @@ public:
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);