BsPhysics.cpp 2.1 KB

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