BGE bug fix (good for 2.47): remove static-static collision messages on the console since previous SetParent fix. The physical object is set to static+ghost while the object is parented. This behavior will be made optional in a future release. The DisableDynamics actuator will also make the object static except that the ghost/non-ghost flag is preserved.

This commit is contained in:
Benoit Bolsee 2008-07-19 10:27:52 +00:00
parent 9ed079bf5c
commit 7e990de294
4 changed files with 26 additions and 3 deletions

@ -13,6 +13,7 @@
#include "KX_ClientObjectInfo.h"
#include "PHY_IPhysicsEnvironment.h"
#include "CcdPhysicsEnvironment.h"
KX_BulletPhysicsController::KX_BulletPhysicsController (const CcdConstructionInfo& ci, bool dyna)
@ -167,10 +168,15 @@ void KX_BulletPhysicsController::SuspendDynamics(bool ghost)
btRigidBody *body = GetRigidBody();
if (body->getActivationState() != DISABLE_SIMULATION)
{
btBroadphaseProxy* handle = body->getBroadphaseHandle();
m_savedCollisionFlags = body->getCollisionFlags();
m_savedCollisionFilterGroup = handle->m_collisionFilterGroup;
m_savedCollisionFilterMask = handle->m_collisionFilterMask;
body->setActivationState(DISABLE_SIMULATION);
body->setCollisionFlags((btCollisionObject::CF_STATIC_OBJECT)|
((ghost)?btCollisionObject::CF_NO_CONTACT_RESPONSE:0));
GetPhysicsEnvironment()->updateCcdPhysicsController(this,
btCollisionObject::CF_STATIC_OBJECT|((ghost)?btCollisionObject::CF_NO_CONTACT_RESPONSE:(m_savedCollisionFlags&btCollisionObject::CF_NO_CONTACT_RESPONSE)),
btBroadphaseProxy::StaticFilter,
btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter);
}
}
@ -180,7 +186,10 @@ void KX_BulletPhysicsController::RestoreDynamics()
if (body->getActivationState() == DISABLE_SIMULATION)
{
GetRigidBody()->forceActivationState(ACTIVE_TAG);
body->setCollisionFlags(m_savedCollisionFlags);
GetPhysicsEnvironment()->updateCcdPhysicsController(this,
m_savedCollisionFlags,
m_savedCollisionFilterGroup,
m_savedCollisionFilterMask);
}
}

@ -9,6 +9,8 @@ class KX_BulletPhysicsController : public KX_IPhysicsController ,public CcdPhysi
{
private:
int m_savedCollisionFlags;
short int m_savedCollisionFilterGroup;
short int m_savedCollisionFilterMask;
public:
KX_BulletPhysicsController (const CcdConstructionInfo& ci, bool dyna);

@ -466,6 +466,16 @@ void CcdPhysicsEnvironment::removeCcdPhysicsController(CcdPhysicsController* ctr
}
void CcdPhysicsEnvironment::updateCcdPhysicsController(CcdPhysicsController* ctrl, 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();
m_dynamicsWorld->removeCollisionObject(body);
body->setCollisionFlags(newCollisionFlags);
m_dynamicsWorld->addCollisionObject(body, newCollisionGroup, newCollisionMask);
}
void CcdPhysicsEnvironment::beginFrame()
{

@ -183,6 +183,8 @@ protected:
void removeCcdPhysicsController(CcdPhysicsController* ctrl);
void updateCcdPhysicsController(CcdPhysicsController* ctrl, int newCollisionFlags, short int newCollisionGroup, short int newCollisionMask);
btBroadphaseInterface* getBroadphase();