added basic collision filtering, in broadphase. more advanced collision filtering should happen in CollisionDispatch::NeedsCollision

fixed CcdPhysicsDemo: don't pick static objects, it create a point 2 point constraint, which assert in jacobian generation
This commit is contained in:
ejcoumans
2006-06-25 19:36:50 +00:00
parent 8376da46a6
commit c8a0c95195
12 changed files with 106 additions and 26 deletions

View File

@@ -39,6 +39,18 @@ extern bool gDisableDeactivation;
class CcdPhysicsEnvironment;
///CollisionFilterGroups provides some optional usage of basic collision filtering
///this is done during broadphase, so very early in the pipeline
///more advanced collision filtering should be done in CollisionDispatcher::NeedsCollision
enum CollisionFilterGroups
{
Default = 1,
Static = 2,
Kinematic = 4,
Debris = 8,
All = Default | Static | Kinematic | Debris,
};
struct CcdConstructionInfo
{
CcdConstructionInfo()
@@ -50,6 +62,8 @@ struct CcdConstructionInfo
m_linearDamping(0.1f),
m_angularDamping(0.1f),
m_collisionFlags(0),
m_collisionFilterGroup(CollisionFilterGroups::Default),
m_collisionFilterMask(CollisionFilterGroups::All),
m_MotionState(0),
m_physicsEnv(0),
m_inertiaFactor(1.f)
@@ -66,6 +80,15 @@ struct CcdConstructionInfo
SimdScalar m_angularDamping;
int m_collisionFlags;
///optional use of collision group/mask:
///only collision with object goups that match the collision mask.
///this is very basic early out. advanced collision filtering should be
///done in the CollisionDispatcher::NeedsCollision and NeedsResponse
///both values default to 1
short int m_collisionFilterGroup;
short int m_collisionFilterMask;
CollisionShape* m_collisionShape;
class PHY_IMotionState* m_MotionState;
@@ -158,6 +181,17 @@ class CcdPhysicsController : public PHY_IPhysicsController
virtual void setNewClientInfo(void* clientinfo);
virtual PHY_IPhysicsController* GetReplica();
///There should be no 'SetCollisionFilterGroup' method, as changing this during run-time is will result in errors
short int GetCollisionFilterGroup() const
{
return m_cci.m_collisionFilterGroup;
}
///There should be no 'SetCollisionFilterGroup' method, as changing this during run-time is will result in errors
short int GetCollisionFilterMask() const
{
return m_cci.m_collisionFilterMask;
}
virtual void calcXform() {} ;
virtual void SetMargin(float margin) {};

View File

@@ -374,7 +374,7 @@ void CcdPhysicsEnvironment::addCcdPhysicsController(CcdPhysicsController* ctrl)
body->setGravity( m_gravity );
m_controllers.push_back(ctrl);
m_collisionWorld->AddCollisionObject(body);
m_collisionWorld->AddCollisionObject(body,ctrl->GetCollisionFilterGroup(),ctrl->GetCollisionFilterMask());
assert(body->m_broadphaseHandle);