BsPhysics.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "BsPhysics.h"
  2. #include "BsRigidbody.h"
  3. namespace BansheeEngine
  4. {
  5. Physics::Physics()
  6. {
  7. memset(mCollisionMap, 1, CollisionMapSize * CollisionMapSize * sizeof(bool));
  8. }
  9. void Physics::toggleCollision(UINT64 groupA, UINT64 groupB, bool enabled)
  10. {
  11. assert(groupA < CollisionMapSize && groupB < CollisionMapSize);
  12. mMutex.lock();
  13. mCollisionMap[groupA][groupB] = enabled;
  14. }
  15. bool Physics::isCollisionEnabled(UINT64 groupA, UINT64 groupB) const
  16. {
  17. assert(groupA < CollisionMapSize && groupB < CollisionMapSize);
  18. mMutex.lock();
  19. return mCollisionMap[groupA][groupB];
  20. }
  21. void Physics::registerRigidbody(Rigidbody* body, UINT32 priority)
  22. {
  23. assert(priority <= MAX_PRIORITY && "Priority value too high");
  24. if (mRigidbodies.size() <= priority)
  25. mRigidbodies.resize(priority + 1);
  26. UINT32 nextId = (UINT32)mRigidbodies[priority].size();
  27. mRigidbodies[priority].push_back(body);
  28. body->_setPhysicsId(nextId);
  29. }
  30. void Physics::unregisterRigidbody(UINT32 id, UINT32 priority)
  31. {
  32. assert(mRigidbodies.size() >= priority);
  33. auto& rigidbodies = mRigidbodies[priority];
  34. UINT32 lastId = (UINT32)rigidbodies.size();
  35. if (id != lastId)
  36. {
  37. rigidbodies[id] = rigidbodies[lastId];
  38. rigidbodies[id]->_setPhysicsId(id);
  39. }
  40. rigidbodies.erase(rigidbodies.begin() + lastId);
  41. }
  42. void Physics::updatePriority(UINT32 id, UINT32 oldPriority, UINT32 newPriority)
  43. {
  44. assert(newPriority <= MAX_PRIORITY && "Priority value too high");
  45. if (oldPriority == newPriority)
  46. return;
  47. assert(mRigidbodies.size() >= oldPriority);
  48. auto& rigidbodies = mRigidbodies[oldPriority];
  49. Rigidbody* rigidbody = rigidbodies[id];
  50. unregisterRigidbody(id, oldPriority);
  51. registerRigidbody(rigidbody, newPriority);
  52. }
  53. Physics& gPhysics()
  54. {
  55. return Physics::instance();
  56. }
  57. }