| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- #include "Base.h"
- #include "PhysicsCollisionObject.h"
- #include "PhysicsController.h"
- #include "Game.h"
- namespace gameplay
- {
- // Internal class used to implement the collidesWith(PhysicsCollisionObject*) function.
- struct CollidesWithCallback : public btCollisionWorld::ContactResultCallback
- {
- btScalar addSingleResult(btManifoldPoint& cp,
- const btCollisionObject* a, int partIdA, int indexA,
- const btCollisionObject* b, int partIdB, int indexB)
- {
- result = true;
- return 0.0f;
- }
- bool result;
- };
- PhysicsCollisionObject::PhysicsCollisionObject(Node* node)
- : _node(node), _motionState(NULL), _collisionShape(NULL)
- {
- }
- PhysicsCollisionObject::~PhysicsCollisionObject()
- {
- SAFE_DELETE(_motionState);
- Game::getInstance()->getPhysicsController()->destroyShape(_collisionShape);
- }
- PhysicsCollisionShape::Type PhysicsCollisionObject::getShapeType() const
- {
- return getCollisionShape()->getType();
- }
- Node* PhysicsCollisionObject::getNode() const
- {
- return _node;
- }
- PhysicsCollisionShape* PhysicsCollisionObject::getCollisionShape() const
- {
- return _collisionShape;
- }
- PhysicsMotionState* PhysicsCollisionObject::getMotionState() const
- {
- return _motionState;
- }
- bool PhysicsCollisionObject::isKinematic() const
- {
- switch (getType())
- {
- case GHOST_OBJECT:
- case CHARACTER:
- return true;
- default:
- return getCollisionObject()->isKinematicObject();
- }
- }
- bool PhysicsCollisionObject::isDynamic() const
- {
- return !getCollisionObject()->isStaticOrKinematicObject();
- }
- void PhysicsCollisionObject::addCollisionListener(CollisionListener* listener, PhysicsCollisionObject* object)
- {
- Game::getInstance()->getPhysicsController()->addCollisionListener(listener, this, object);
- }
- void PhysicsCollisionObject::removeCollisionListener(CollisionListener* listener, PhysicsCollisionObject* object)
- {
- Game::getInstance()->getPhysicsController()->removeCollisionListener(listener, this, object);
- }
- bool PhysicsCollisionObject::collidesWith(PhysicsCollisionObject* object) const
- {
- static CollidesWithCallback callback;
- callback.result = false;
- Game::getInstance()->getPhysicsController()->_world->contactPairTest(getCollisionObject(), object->getCollisionObject(), callback);
- return callback.result;
- }
- PhysicsCollisionObject::CollisionPair::CollisionPair(PhysicsCollisionObject* objectA, PhysicsCollisionObject* objectB)
- : objectA(objectA), objectB(objectB)
- {
- // unused
- }
- bool PhysicsCollisionObject::CollisionPair::operator < (const CollisionPair& collisionPair) const
- {
- // If the pairs are equal, then return false.
- if ((objectA == collisionPair.objectA && objectB == collisionPair.objectB) || (objectA == collisionPair.objectB && objectB == collisionPair.objectA))
- return false;
- // We choose to compare based on objectA arbitrarily.
- if (objectA < collisionPair.objectA)
- return true;
- if (objectA == collisionPair.objectA)
- return objectB < collisionPair.objectB;
- return false;
- }
- }
|