From 83ededfd37961ef157b1dd63497b32a2a090cc7e Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 13 Aug 2018 14:51:13 -0700 Subject: [PATCH] Pass collision filter flags into AllContactsCallback for more efficient collision filtering --- libraries/physics/src/PhysicsEngine.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index ef8c28bdc6..efe1bddc97 100644 --- a/libraries/physics/src/PhysicsEngine.cpp +++ b/libraries/physics/src/PhysicsEngine.cpp @@ -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 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;