PhysicsCollisionObject.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "Base.h"
  2. #include "PhysicsCollisionObject.h"
  3. #include "PhysicsController.h"
  4. #include "Game.h"
  5. namespace gameplay
  6. {
  7. // Internal class used to implement the collidesWith(PhysicsCollisionObject*) function.
  8. struct CollidesWithCallback : public btCollisionWorld::ContactResultCallback
  9. {
  10. btScalar addSingleResult(btManifoldPoint& cp,
  11. const btCollisionObject* a, int partIdA, int indexA,
  12. const btCollisionObject* b, int partIdB, int indexB)
  13. {
  14. result = true;
  15. return 0.0f;
  16. }
  17. bool result;
  18. };
  19. PhysicsCollisionObject::PhysicsCollisionObject(Node* node)
  20. : _node(node), _motionState(NULL), _collisionShape(NULL)
  21. {
  22. }
  23. PhysicsCollisionObject::~PhysicsCollisionObject()
  24. {
  25. SAFE_DELETE(_motionState);
  26. Game::getInstance()->getPhysicsController()->destroyShape(_collisionShape);
  27. }
  28. PhysicsCollisionShape::Type PhysicsCollisionObject::getShapeType() const
  29. {
  30. return getCollisionShape()->getType();
  31. }
  32. Node* PhysicsCollisionObject::getNode() const
  33. {
  34. return _node;
  35. }
  36. PhysicsCollisionShape* PhysicsCollisionObject::getCollisionShape() const
  37. {
  38. return _collisionShape;
  39. }
  40. PhysicsMotionState* PhysicsCollisionObject::getMotionState() const
  41. {
  42. return _motionState;
  43. }
  44. bool PhysicsCollisionObject::isKinematic() const
  45. {
  46. switch (getType())
  47. {
  48. case GHOST_OBJECT:
  49. case CHARACTER:
  50. return true;
  51. default:
  52. return getCollisionObject()->isKinematicObject();
  53. }
  54. }
  55. bool PhysicsCollisionObject::isDynamic() const
  56. {
  57. return !getCollisionObject()->isStaticOrKinematicObject();
  58. }
  59. void PhysicsCollisionObject::addCollisionListener(CollisionListener* listener, PhysicsCollisionObject* object)
  60. {
  61. Game::getInstance()->getPhysicsController()->addCollisionListener(listener, this, object);
  62. }
  63. void PhysicsCollisionObject::removeCollisionListener(CollisionListener* listener, PhysicsCollisionObject* object)
  64. {
  65. Game::getInstance()->getPhysicsController()->removeCollisionListener(listener, this, object);
  66. }
  67. bool PhysicsCollisionObject::collidesWith(PhysicsCollisionObject* object) const
  68. {
  69. static CollidesWithCallback callback;
  70. callback.result = false;
  71. Game::getInstance()->getPhysicsController()->_world->contactPairTest(getCollisionObject(), object->getCollisionObject(), callback);
  72. return callback.result;
  73. }
  74. PhysicsCollisionObject::CollisionPair::CollisionPair(PhysicsCollisionObject* objectA, PhysicsCollisionObject* objectB)
  75. : objectA(objectA), objectB(objectB)
  76. {
  77. // unused
  78. }
  79. bool PhysicsCollisionObject::CollisionPair::operator < (const CollisionPair& collisionPair) const
  80. {
  81. // If the pairs are equal, then return false.
  82. if ((objectA == collisionPair.objectA && objectB == collisionPair.objectB) || (objectA == collisionPair.objectB && objectB == collisionPair.objectA))
  83. return false;
  84. // We choose to compare based on objectA arbitrarily.
  85. if (objectA < collisionPair.objectA)
  86. return true;
  87. if (objectA == collisionPair.objectA)
  88. return objectB < collisionPair.objectB;
  89. return false;
  90. }
  91. }