Pass collision filter flags into AllContactsCallback for more efficient collision filtering

This commit is contained in:
sabrina-shanman 2018-08-13 14:51:13 -07:00
parent d1a80e57be
commit 83ededfd37

View file

@ -863,6 +863,9 @@ void PhysicsEngine::setShowBulletConstraintLimits(bool value) {
}
}
const int32_t CONTACT_CALLBACK_FLAG_ENTITY = BULLET_COLLISION_GROUP_STATIC | BULLET_COLLISION_GROUP_KINEMATIC | BULLET_COLLISION_GROUP_DYNAMIC;
const int32_t CONTACT_CALLBACK_FLAG_AVATAR = USER_COLLISION_GROUP_MY_AVATAR | USER_COLLISION_GROUP_OTHER_AVATAR;
struct AllContactsCallback : public btCollisionWorld::ContactResultCallback {
AllContactsCallback(MotionStateType desiredObjectType, const ShapeInfo& shapeInfo, const Transform& transform, btCollisionObject* myAvatarCollisionObject) :
btCollisionWorld::ContactResultCallback(),
@ -879,6 +882,14 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback {
bulletTransform.setRotation(glmToBullet(transform.getRotation()));
collisionObject.setWorldTransform(bulletTransform);
m_collisionFilterGroup = ~0; // Everything collidable should collide with our test object unless we set the filter mask otherwise
if (desiredObjectType == MOTIONSTATE_TYPE_AVATAR) {
m_collisionFilterMask = CONTACT_CALLBACK_FLAG_AVATAR;
}
else {
m_collisionFilterMask = CONTACT_CALLBACK_FLAG_ENTITY;
}
}
~AllContactsCallback() {
@ -890,10 +901,6 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback {
std::vector<ContactTestResult> contacts;
btCollisionObject* myAvatarCollisionObject;
bool needsCollision(btBroadphaseProxy* proxy) const override {
return true;
}
btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0, int partId0, int index0, const btCollisionObjectWrapper* colObj1, int partId1, int index1) override {
const btCollisionObject* otherBody;
btVector3 penetrationPoint;