PhysicsCollisionObject.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #include "Base.h"
  2. #include "PhysicsCollisionObject.h"
  3. #include "PhysicsController.h"
  4. #include "Game.h"
  5. namespace gameplay
  6. {
  7. /**
  8. * Internal class used to implement the collidesWith(PhysicsCollisionObject*) function.
  9. */
  10. struct CollidesWithCallback : public btCollisionWorld::ContactResultCallback
  11. {
  12. /**
  13. * Called with each contact. Needed to implement collidesWith(PhysicsCollisionObject*).
  14. */
  15. btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObject* a, int partIdA, int indexA, const btCollisionObject* b, int partIdB, int indexB)
  16. {
  17. result = true;
  18. return 0.0f;
  19. }
  20. /**
  21. * The result of the callback.
  22. */
  23. bool result;
  24. };
  25. PhysicsCollisionObject::PhysicsCollisionObject(Node* node)
  26. : _node(node), _motionState(NULL), _collisionShape(NULL), _enabled(true)
  27. {
  28. }
  29. PhysicsCollisionObject::~PhysicsCollisionObject()
  30. {
  31. SAFE_DELETE(_motionState);
  32. GP_ASSERT(Game::getInstance()->getPhysicsController());
  33. Game::getInstance()->getPhysicsController()->destroyShape(_collisionShape);
  34. }
  35. PhysicsCollisionShape::Type PhysicsCollisionObject::getShapeType() const
  36. {
  37. GP_ASSERT(getCollisionShape());
  38. return getCollisionShape()->getType();
  39. }
  40. Node* PhysicsCollisionObject::getNode() const
  41. {
  42. return _node;
  43. }
  44. PhysicsCollisionShape* PhysicsCollisionObject::getCollisionShape() const
  45. {
  46. return _collisionShape;
  47. }
  48. PhysicsMotionState* PhysicsCollisionObject::getMotionState() const
  49. {
  50. return _motionState;
  51. }
  52. bool PhysicsCollisionObject::isKinematic() const
  53. {
  54. switch (getType())
  55. {
  56. case GHOST_OBJECT:
  57. case CHARACTER:
  58. return true;
  59. default:
  60. GP_ASSERT(getCollisionObject());
  61. return getCollisionObject()->isKinematicObject();
  62. }
  63. }
  64. bool PhysicsCollisionObject::isDynamic() const
  65. {
  66. GP_ASSERT(getCollisionObject());
  67. return !getCollisionObject()->isStaticOrKinematicObject();
  68. }
  69. bool PhysicsCollisionObject::isEnabled() const
  70. {
  71. GP_ASSERT(getCollisionObject());
  72. return _enabled;
  73. }
  74. void PhysicsCollisionObject::setEnabled(bool enable)
  75. {
  76. GP_ASSERT(getCollisionObject());
  77. if (enable)
  78. {
  79. if (!_enabled)
  80. {
  81. Game::getInstance()->getPhysicsController()->addCollisionObject(this);
  82. _enabled = true;
  83. }
  84. }
  85. else
  86. {
  87. if (_enabled)
  88. {
  89. Game::getInstance()->getPhysicsController()->removeCollisionObject(this);
  90. _enabled = false;
  91. }
  92. }
  93. }
  94. void PhysicsCollisionObject::addCollisionListener(CollisionListener* listener, PhysicsCollisionObject* object)
  95. {
  96. GP_ASSERT(Game::getInstance()->getPhysicsController());
  97. Game::getInstance()->getPhysicsController()->addCollisionListener(listener, this, object);
  98. }
  99. void PhysicsCollisionObject::removeCollisionListener(CollisionListener* listener, PhysicsCollisionObject* object)
  100. {
  101. GP_ASSERT(Game::getInstance()->getPhysicsController());
  102. Game::getInstance()->getPhysicsController()->removeCollisionListener(listener, this, object);
  103. }
  104. bool PhysicsCollisionObject::collidesWith(PhysicsCollisionObject* object) const
  105. {
  106. GP_ASSERT(Game::getInstance()->getPhysicsController() && Game::getInstance()->getPhysicsController()->_world);
  107. GP_ASSERT(object && object->getCollisionObject());
  108. GP_ASSERT(getCollisionObject());
  109. static CollidesWithCallback callback;
  110. callback.result = false;
  111. Game::getInstance()->getPhysicsController()->_world->contactPairTest(getCollisionObject(), object->getCollisionObject(), callback);
  112. return callback.result;
  113. }
  114. PhysicsCollisionObject::CollisionPair::CollisionPair(PhysicsCollisionObject* objectA, PhysicsCollisionObject* objectB)
  115. : objectA(objectA), objectB(objectB)
  116. {
  117. // unused
  118. }
  119. bool PhysicsCollisionObject::CollisionPair::operator < (const CollisionPair& collisionPair) const
  120. {
  121. // If the pairs are equal, then return false.
  122. if ((objectA == collisionPair.objectA && objectB == collisionPair.objectB) || (objectA == collisionPair.objectB && objectB == collisionPair.objectA))
  123. return false;
  124. // We choose to compare based on objectA arbitrarily.
  125. if (objectA < collisionPair.objectA)
  126. return true;
  127. if (objectA == collisionPair.objectA)
  128. return objectB < collisionPair.objectB;
  129. return false;
  130. }
  131. }