BsRigidbody.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "BsRigidbody.h"
  2. #include "BsPhysics.h"
  3. #include "BsFCollider.h"
  4. #include "BsSceneObject.h"
  5. #include "BsUtility.h"
  6. namespace BansheeEngine
  7. {
  8. Rigidbody::Rigidbody(const HSceneObject& linkedSO)
  9. :mLinkedSO(linkedSO)
  10. {
  11. mPriority = Utility::getSceneObjectDepth(linkedSO);
  12. gPhysics().registerRigidbody(this, mPriority);
  13. }
  14. Rigidbody::~Rigidbody()
  15. {
  16. // It is assumed that child colliders will keep the parent Rigidbody alive, so we don't need to clear their parents
  17. gPhysics().unregisterRigidbody(mPhysicsId, mPriority);
  18. }
  19. void Rigidbody::addCollider(FCollider* collider)
  20. {
  21. mColliders.push_back(collider);
  22. }
  23. void Rigidbody::removeCollider(FCollider* collider)
  24. {
  25. auto iterFind = std::find(mColliders.begin(), mColliders.end(), collider);
  26. if (iterFind != mColliders.end())
  27. mColliders.erase(iterFind);
  28. }
  29. void Rigidbody::_detachColliders()
  30. {
  31. while (mColliders.size() > 0)
  32. mColliders[0]->setRigidbody(nullptr);
  33. }
  34. void Rigidbody::setFlags(Flag flags)
  35. {
  36. if (mFlags == flags)
  37. return;
  38. mFlags = flags;
  39. _updateMassDistribution();
  40. }
  41. void Rigidbody::_setPriority(UINT32 priority)
  42. {
  43. gPhysics().updatePriority(mPhysicsId, mPriority, priority);
  44. mPriority = priority;
  45. }
  46. void Rigidbody::_setTransform(const Vector3& position, const Quaternion& rotation)
  47. {
  48. mLinkedSO->setWorldPosition(position);
  49. mLinkedSO->setWorldRotation(rotation);
  50. }
  51. SPtr<Rigidbody> Rigidbody::create(const HSceneObject& linkedSO)
  52. {
  53. return gPhysics().createRigidbody(linkedSO);
  54. }
  55. }