forked from bartvdbraak/blender
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:
parent
9ed079bf5c
commit
7e990de294
@ -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();
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user