PhysicsBody.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma once
  6. #include <AnKi/Physics/PhysicsObject.h>
  7. #include <AnKi/Util/ClassWrapper.h>
  8. namespace anki {
  9. /// @addtogroup physics
  10. /// @{
  11. /// Init info for PhysicsBody.
  12. class PhysicsBodyInitInfo
  13. {
  14. public:
  15. PhysicsCollisionShapePtr m_shape;
  16. F32 m_mass = 0.0f;
  17. Transform m_transform = Transform::getIdentity();
  18. F32 m_friction = 0.5f;
  19. };
  20. /// Rigid body.
  21. class PhysicsBody : public PhysicsFilteredObject
  22. {
  23. ANKI_PHYSICS_OBJECT(PhysicsObjectType::BODY)
  24. public:
  25. const Transform& getTransform() const
  26. {
  27. return m_trf;
  28. }
  29. void setTransform(const Transform& trf)
  30. {
  31. m_trf = trf;
  32. m_body->setWorldTransform(toBt(trf));
  33. }
  34. void applyForce(const Vec3& force, const Vec3& relPos)
  35. {
  36. m_body->applyForce(toBt(force), toBt(relPos));
  37. }
  38. void setMass(F32 mass);
  39. F32 getMass() const
  40. {
  41. return m_mass;
  42. }
  43. void activate(Bool activate)
  44. {
  45. m_body->forceActivationState((activate) ? ACTIVE_TAG : DISABLE_SIMULATION);
  46. if(activate)
  47. {
  48. m_body->activate(true);
  49. }
  50. }
  51. void clearForces()
  52. {
  53. m_body->clearForces();
  54. }
  55. void setLinearVelocity(const Vec3& velocity)
  56. {
  57. m_body->setLinearVelocity(toBt(velocity));
  58. }
  59. void setAngularVelocity(const Vec3& velocity)
  60. {
  61. m_body->setAngularVelocity(toBt(velocity));
  62. }
  63. void setGravity(const Vec3& gravity)
  64. {
  65. m_body->setGravity(toBt(gravity));
  66. }
  67. void setAngularFactor(const Vec3& factor)
  68. {
  69. m_body->setAngularFactor(toBt(factor));
  70. }
  71. ANKI_INTERNAL const btRigidBody* getBtBody() const
  72. {
  73. return m_body.get();
  74. }
  75. ANKI_INTERNAL btRigidBody* getBtBody()
  76. {
  77. return m_body.get();
  78. }
  79. private:
  80. class MotionState : public btMotionState
  81. {
  82. public:
  83. PhysicsBody* m_body = nullptr;
  84. void getWorldTransform(btTransform& worldTrans) const override
  85. {
  86. worldTrans = toBt(m_body->m_trf);
  87. }
  88. void setWorldTransform(const btTransform& worldTrans) override
  89. {
  90. m_body->m_trf = toAnki(worldTrans);
  91. }
  92. };
  93. /// Store the data of the btRigidBody in place to avoid additional allocations.
  94. ClassWrapper<btRigidBody> m_body;
  95. Transform m_trf = Transform::getIdentity();
  96. MotionState m_motionState;
  97. PhysicsCollisionShapePtr m_shape;
  98. F32 m_mass = 1.0f;
  99. PhysicsBody(PhysicsWorld* world, const PhysicsBodyInitInfo& init);
  100. ~PhysicsBody();
  101. void registerToWorld() override;
  102. void unregisterFromWorld() override;
  103. };
  104. /// @}
  105. } // end namespace anki