Просмотр исходного кода

Merge pull request #1053 from rgngl/physicsFilters

Add group bitmask filtering for PhysicsCollisionObject
Sean Paul Taylor 12 лет назад
Родитель
Сommit
0ee5a72411

+ 3 - 3
gameplay/src/Node.cpp

@@ -1105,7 +1105,7 @@ PhysicsCollisionObject* Node::getCollisionObject() const
     return _collisionObject;
 }
 
-PhysicsCollisionObject* Node::setCollisionObject(PhysicsCollisionObject::Type type, const PhysicsCollisionShape::Definition& shape, PhysicsRigidBody::Parameters* rigidBodyParameters)
+PhysicsCollisionObject* Node::setCollisionObject(PhysicsCollisionObject::Type type, const PhysicsCollisionShape::Definition& shape, PhysicsRigidBody::Parameters* rigidBodyParameters, int group, int mask)
 {
     SAFE_DELETE(_collisionObject);
 
@@ -1113,13 +1113,13 @@ PhysicsCollisionObject* Node::setCollisionObject(PhysicsCollisionObject::Type ty
     {
     case PhysicsCollisionObject::RIGID_BODY:
         {
-            _collisionObject = new PhysicsRigidBody(this, shape, rigidBodyParameters ? *rigidBodyParameters : PhysicsRigidBody::Parameters());
+            _collisionObject = new PhysicsRigidBody(this, shape, rigidBodyParameters ? *rigidBodyParameters : PhysicsRigidBody::Parameters(), group, mask);
         }
         break;
 
     case PhysicsCollisionObject::GHOST_OBJECT:
         {
-            _collisionObject = new PhysicsGhostObject(this, shape);
+            _collisionObject = new PhysicsGhostObject(this, shape, group, mask);
         }
         break;
 

+ 3 - 1
gameplay/src/Node.h

@@ -552,9 +552,11 @@ public:
      *        PhysicsCollisionObject::VEHICLE, this must point to a valid rigid body
      *        parameters object containing information about the rigid body;
      *        otherwise, this parameter may be NULL.
+     * @param group Group identifier of the object for collision filtering.
+     * @param mask Bitmask to filter groups of objects to collide with this one.
      */
     PhysicsCollisionObject* setCollisionObject(PhysicsCollisionObject::Type type, const PhysicsCollisionShape::Definition& shape = PhysicsCollisionShape::box(), 
-                                               PhysicsRigidBody::Parameters* rigidBodyParameters = NULL);
+                                               PhysicsRigidBody::Parameters* rigidBodyParameters = NULL, int group = PHYSICS_COLLISION_GROUP_DEFAULT, int mask = PHYSICS_COLLISION_MASK_DEFAULT);
 
     /**
      * Sets the physics collision object for this node using the data from the Properties object defined at the specified URL, 

+ 2 - 2
gameplay/src/PhysicsCharacter.cpp

@@ -49,8 +49,8 @@ protected:
     btScalar _minSlopeDot;
 };
 
-PhysicsCharacter::PhysicsCharacter(Node* node, const PhysicsCollisionShape::Definition& shape, float mass)
-    : PhysicsGhostObject(node, shape), _moveVelocity(0,0,0), _forwardVelocity(0.0f), _rightVelocity(0.0f),
+PhysicsCharacter::PhysicsCharacter(Node* node, const PhysicsCollisionShape::Definition& shape, float mass, int group, int mask)
+    : PhysicsGhostObject(node, shape, group, mask), _moveVelocity(0,0,0), _forwardVelocity(0.0f), _rightVelocity(0.0f),
     _verticalVelocity(0, 0, 0), _currentVelocity(0,0,0), _normalizedVelocity(0,0,0),
     _colliding(false), _collisionNormal(0,0,0), _currentPosition(0,0,0), _stepHeight(0.1f),
     _slopeAngle(0.0f), _cosSlopeAngle(0.0f), _physicsEnabled(true), _mass(mass), _actionInterface(NULL)

+ 3 - 1
gameplay/src/PhysicsCharacter.h

@@ -196,8 +196,10 @@ private:
      * @param node Scene node that represents the character.
      * @param shape Physics collision shape definition.
      * @param mass The mass of the character.
+     * @param group Group identifier
+     * @param mask Bitmask field for filtering collisions with this object.
      */
-    PhysicsCharacter(Node* node, const PhysicsCollisionShape::Definition& shape, float mass);
+    PhysicsCharacter(Node* node, const PhysicsCollisionShape::Definition& shape, float mass, int group = PHYSICS_COLLISION_GROUP_DEFAULT, int mask = PHYSICS_COLLISION_MASK_DEFAULT);
 
     /**
      * Destructor.

+ 2 - 2
gameplay/src/PhysicsCollisionObject.cpp

@@ -34,8 +34,8 @@ struct CollidesWithCallback : public btCollisionWorld::ContactResultCallback
     bool result;
 };
 
-PhysicsCollisionObject::PhysicsCollisionObject(Node* node)
-    : _node(node), _collisionShape(NULL), _enabled(true), _scriptListeners(NULL), _motionState(NULL)
+PhysicsCollisionObject::PhysicsCollisionObject(Node* node, int group, int mask)
+    : _node(node), _collisionShape(NULL), _enabled(true), _scriptListeners(NULL), _motionState(NULL), _group(group), _mask(mask)
 {
 }
 

+ 10 - 1
gameplay/src/PhysicsCollisionObject.h

@@ -14,6 +14,9 @@ class PhysicsGhostObject;
 class PhysicsVehicle;
 class PhysicsVehicleWheel;
 
+#define PHYSICS_COLLISION_GROUP_DEFAULT btBroadphaseProxy::DefaultFilter
+#define PHYSICS_COLLISION_MASK_DEFAULT btBroadphaseProxy::AllFilter
+
 /**
  * Base class for all gameplay physics objects that support collision events.
  */
@@ -327,7 +330,7 @@ protected:
     /**
      * Constructor.
      */
-    PhysicsCollisionObject(Node* node);
+    PhysicsCollisionObject(Node* node, int group = PHYSICS_COLLISION_GROUP_DEFAULT, int mask = PHYSICS_COLLISION_MASK_DEFAULT);
 
     /**
      * Returns the Bullet Physics collision object.
@@ -415,6 +418,12 @@ private:
      * The PhysicsCollisionObject's motion state.
      */
     PhysicsMotionState* _motionState;
+
+    /**
+     * Group identifier and the bitmask for collision filtering.
+     */
+    int _group;
+    int _mask;
 };
 
 }

+ 5 - 3
gameplay/src/PhysicsController.cpp

@@ -629,20 +629,22 @@ void PhysicsController::addCollisionObject(PhysicsCollisionObject* object)
     // Assign user pointer for the bullet collision object to allow efficient
     // lookups of bullet objects -> gameplay objects.
     object->getCollisionObject()->setUserPointer(object);
+    short group = (short)object->_group;
+    short mask = (short)object->_mask;
 
     // Add the object to the physics world.
     switch (object->getType())
     {
     case PhysicsCollisionObject::RIGID_BODY:
-        _world->addRigidBody(static_cast<btRigidBody*>(object->getCollisionObject()), btBroadphaseProxy::DefaultFilter, btBroadphaseProxy::DefaultFilter | btBroadphaseProxy::StaticFilter | btBroadphaseProxy::CharacterFilter | btBroadphaseProxy::AllFilter);
+        _world->addRigidBody(static_cast<btRigidBody*>(object->getCollisionObject()), group, mask);
         break;
 
     case PhysicsCollisionObject::CHARACTER:
-        _world->addCollisionObject(object->getCollisionObject(), btBroadphaseProxy::CharacterFilter, btBroadphaseProxy::DefaultFilter | btBroadphaseProxy::StaticFilter | btBroadphaseProxy::CharacterFilter | btBroadphaseProxy::AllFilter);
+        _world->addCollisionObject(object->getCollisionObject(), group, mask);
         break;
 
     case PhysicsCollisionObject::GHOST_OBJECT:
-        _world->addCollisionObject(object->getCollisionObject(), btBroadphaseProxy::DefaultFilter, btBroadphaseProxy::DefaultFilter | btBroadphaseProxy::StaticFilter | btBroadphaseProxy::CharacterFilter | btBroadphaseProxy::AllFilter);
+        _world->addCollisionObject(object->getCollisionObject(), group, mask);
         break;
 
     default:

+ 2 - 2
gameplay/src/PhysicsGhostObject.cpp

@@ -6,8 +6,8 @@
 namespace gameplay
 {
 
-PhysicsGhostObject::PhysicsGhostObject(Node* node, const PhysicsCollisionShape::Definition& shape)
-    : PhysicsCollisionObject(node), _ghostObject(NULL)
+PhysicsGhostObject::PhysicsGhostObject(Node* node, const PhysicsCollisionShape::Definition& shape, int group, int mask)
+    : PhysicsCollisionObject(node, group, mask), _ghostObject(NULL)
 {
     Vector3 centerOfMassOffset;
     PhysicsController* physicsController = Game::getInstance()->getPhysicsController();

+ 3 - 1
gameplay/src/PhysicsGhostObject.h

@@ -42,8 +42,10 @@ protected:
      * 
      * @param node The node to attach the ghost object to.
      * @param shape The collision shape definition for the ghost object.
+     * @param group Group identifier
+     * @param mask Bitmask field for filtering collisions with this object.
      */
-    PhysicsGhostObject(Node* node, const PhysicsCollisionShape::Definition& shape);
+    PhysicsGhostObject(Node* node, const PhysicsCollisionShape::Definition& shape, int group = PHYSICS_COLLISION_GROUP_DEFAULT, int mask = PHYSICS_COLLISION_MASK_DEFAULT);
 
     /**
      * Destructor.

+ 2 - 2
gameplay/src/PhysicsRigidBody.cpp

@@ -10,8 +10,8 @@
 namespace gameplay
 {
 
-PhysicsRigidBody::PhysicsRigidBody(Node* node, const PhysicsCollisionShape::Definition& shape, const Parameters& parameters)
-        : PhysicsCollisionObject(node), _body(NULL), _mass(parameters.mass), _constraints(NULL), _inDestructor(false)
+PhysicsRigidBody::PhysicsRigidBody(Node* node, const PhysicsCollisionShape::Definition& shape, const Parameters& parameters, int group, int mask)
+        : PhysicsCollisionObject(node, group, mask), _body(NULL), _mass(parameters.mass), _constraints(NULL), _inDestructor(false)
 {
     GP_ASSERT(Game::getInstance()->getPhysicsController());
     GP_ASSERT(_node);

+ 3 - 1
gameplay/src/PhysicsRigidBody.h

@@ -396,8 +396,10 @@ private:
      *      a model attached to it prior to creating a rigid body for it.
      * @param shape The rigid body shape construction information.
      * @param parameters The rigid body construction parameters.
+     * @param group Group identifier
+     * @param mask Bitmask field for filtering collisions with this object.
      */
-    PhysicsRigidBody(Node* node, const PhysicsCollisionShape::Definition& shape, const Parameters& parameters);
+    PhysicsRigidBody(Node* node, const PhysicsCollisionShape::Definition& shape, const Parameters& parameters, int group = PHYSICS_COLLISION_GROUP_DEFAULT, int mask = PHYSICS_COLLISION_MASK_DEFAULT);
 
     /**
      * Destructor.