BsRigidbody.cpp 1.5 KB

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