BsCRigidbody.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsCorePrerequisites.h"
  5. #include "Physics/BsRigidbody.h"
  6. #include "Scene/BsComponent.h"
  7. #include "Math/BsVector3.h"
  8. #include "Math/BsQuaternion.h"
  9. namespace bs
  10. {
  11. /** @addtogroup Components-Core
  12. * @{
  13. */
  14. /**
  15. * @copydoc Rigidbody
  16. *
  17. * Colliders that are on the same scene object as the rigidbody, or on child scene objects are automatically considered
  18. * as part of the rigidbody.
  19. *
  20. * @note Wraps Rigidbody as a Component.
  21. */
  22. class BS_CORE_EXPORT BS_SCRIPT_EXPORT(m:Physics,n:Rigidbody) CRigidbody : public Component
  23. {
  24. public:
  25. CRigidbody(const HSceneObject& parent);
  26. /** @copydoc Rigidbody::move */
  27. BS_SCRIPT_EXPORT(n:Move)
  28. void move(const Vector3& position);
  29. /** @copydoc Rigidbody::rotate */
  30. BS_SCRIPT_EXPORT(n:Rotate)
  31. void rotate(const Quaternion& rotation);
  32. /** @copydoc Rigidbody::setMass */
  33. BS_SCRIPT_EXPORT(n:Mass,pr:setter)
  34. void setMass(float mass);
  35. /** @copydoc Rigidbody::getMass */
  36. BS_SCRIPT_EXPORT(n:Mass,pr:getter)
  37. float getMass() const { return mMass; };
  38. /** @copydoc Rigidbody::setIsKinematic */
  39. BS_SCRIPT_EXPORT(n:IsKinematic,pr:setter)
  40. void setIsKinematic(bool kinematic);
  41. /** @copydoc Rigidbody::getIsKinematic */
  42. BS_SCRIPT_EXPORT(n:IsKinematic,pr:getter)
  43. bool getIsKinematic() const { return mIsKinematic; }
  44. /** @copydoc Rigidbody::isSleeping */
  45. BS_SCRIPT_EXPORT(n:IsSleeping,pr:getter)
  46. bool isSleeping() const;
  47. /** @copydoc Rigidbody::sleep */
  48. BS_SCRIPT_EXPORT(n:Sleep)
  49. void sleep();
  50. /** @copydoc Rigidbody::wakeUp */
  51. BS_SCRIPT_EXPORT(n:WakeUp)
  52. void wakeUp();
  53. /** @copydoc Rigidbody::setSleepThreshold */
  54. BS_SCRIPT_EXPORT(n:SleepThreshold,pr:setter)
  55. void setSleepThreshold(float threshold);
  56. /** @copydoc Rigidbody::getSleepThreshold */
  57. BS_SCRIPT_EXPORT(n:SleepThreshold,pr:getter)
  58. float getSleepThreshold() const { return mSleepThreshold; }
  59. /** @copydoc Rigidbody::setUseGravity */
  60. BS_SCRIPT_EXPORT(n:UseGravity,pr:setter)
  61. void setUseGravity(bool gravity);
  62. /** @copydoc Rigidbody::getUseGravity */
  63. BS_SCRIPT_EXPORT(n:UseGravity,pr:getter)
  64. bool getUseGravity() const { return mUseGravity; }
  65. /** @copydoc Rigidbody::setVelocity */
  66. BS_SCRIPT_EXPORT(n:Velocity,pr:setter)
  67. void setVelocity(const Vector3& velocity);
  68. /** @copydoc Rigidbody::getVelocity */
  69. BS_SCRIPT_EXPORT(n:Velocity,pr:getter)
  70. Vector3 getVelocity() const;
  71. /** @copydoc Rigidbody::setAngularVelocity */
  72. BS_SCRIPT_EXPORT(n:AngularVelocity,pr:setter)
  73. void setAngularVelocity(const Vector3& velocity);
  74. /** @copydoc Rigidbody::getAngularVelocity */
  75. BS_SCRIPT_EXPORT(n:AngularVelocity,pr:getter)
  76. Vector3 getAngularVelocity() const;
  77. /** @copydoc Rigidbody::setDrag */
  78. BS_SCRIPT_EXPORT(n:Drag,pr:setter)
  79. void setDrag(float drag);
  80. /** @copydoc Rigidbody::getDrag */
  81. BS_SCRIPT_EXPORT(n:Drag,pr:getter)
  82. float getDrag() const { return mLinearDrag; }
  83. /** @copydoc Rigidbody::setAngularDrag */
  84. BS_SCRIPT_EXPORT(n:AngularDrag,pr:setter)
  85. void setAngularDrag(float drag);
  86. /** @copydoc Rigidbody::getAngularDrag */
  87. BS_SCRIPT_EXPORT(n:AngularDrag,pr:getter)
  88. float getAngularDrag() const { return mAngularDrag; }
  89. /** @copydoc Rigidbody::setInertiaTensor */
  90. BS_SCRIPT_EXPORT(n:InertiaTensor,pr:setter)
  91. void setInertiaTensor(const Vector3& tensor);
  92. /** @copydoc Rigidbody::getInertiaTensor */
  93. BS_SCRIPT_EXPORT(n:InertiaTensor,pr:getter)
  94. Vector3 getInertiaTensor() const;
  95. /** @copydoc Rigidbody::setMaxAngularVelocity */
  96. BS_SCRIPT_EXPORT(n:MaxAngularVelocity,pr:setter)
  97. void setMaxAngularVelocity(float maxVelocity);
  98. /** @copydoc Rigidbody::getMaxAngularVelocity */
  99. BS_SCRIPT_EXPORT(n:MaxAngularVelocity,pr:getter)
  100. float getMaxAngularVelocity() const { return mMaxAngularVelocity; }
  101. /** Determines the rigidbody's center of mass position. Only relevant if RigibodyFlag::AutoTensors is turned off. */
  102. BS_SCRIPT_EXPORT(n:CenterOfMassPosition,pr:setter)
  103. void setCenterOfMassPosition(const Vector3& position);
  104. /** @copydoc setCenterOfMassPosition() */
  105. BS_SCRIPT_EXPORT(n:CenterOfMassPosition,pr:getter)
  106. Vector3 getCenterOfMassPosition() const;
  107. /** Determines the rigidbody's center of mass rotation. Only relevant if RigibodyFlag::AutoTensors is turned off. */
  108. BS_SCRIPT_EXPORT(n:CenterOfMassRotation,pr:setter)
  109. void setCenterOfMassRotation(const Quaternion& rotation);
  110. /** @copydoc setCenterOfMassRotation() */
  111. BS_SCRIPT_EXPORT(n:CenterOfMassRotation,pr:getter)
  112. Quaternion getCenterOfMassRotation() const;
  113. /** @copydoc Rigidbody::setPositionSolverCount */
  114. BS_SCRIPT_EXPORT(n:PositionSolverCount,pr:setter)
  115. void setPositionSolverCount(UINT32 count);
  116. /** @copydoc Rigidbody::getPositionSolverCount */
  117. BS_SCRIPT_EXPORT(n:PositionSolverCount,pr:getter)
  118. UINT32 getPositionSolverCount() const { return mPositionSolverCount; }
  119. /** @copydoc Rigidbody::setVelocitySolverCount */
  120. BS_SCRIPT_EXPORT(n:VelocitySolverCount,pr:setter)
  121. void setVelocitySolverCount(UINT32 count);
  122. /** @copydoc Rigidbody::getVelocitySolverCount */
  123. BS_SCRIPT_EXPORT(n:VelocitySolverCount,pr:getter)
  124. UINT32 getVelocitySolverCount() const { return mVelocitySolverCount; }
  125. /** Sets a value that determines which (if any) collision events are reported. */
  126. BS_SCRIPT_EXPORT(n:CollisionReportMode,pr:setter)
  127. void setCollisionReportMode(CollisionReportMode mode);
  128. /** Gets a value that determines which (if any) collision events are reported. */
  129. BS_SCRIPT_EXPORT(n:CollisionReportMode,pr:getter)
  130. CollisionReportMode getCollisionReportMode() const { return mCollisionReportMode; }
  131. /** @copydoc Rigidbody::setFlags */
  132. BS_SCRIPT_EXPORT(n:Flags,pr:setter)
  133. void setFlags(RigidbodyFlag flags);
  134. /** @copydoc Rigidbody::getFlags */
  135. BS_SCRIPT_EXPORT(n:Flags,pr:getter)
  136. RigidbodyFlag getFlags() const { return mFlags; }
  137. /** @copydoc Rigidbody::addForce */
  138. BS_SCRIPT_EXPORT(n:AddForce)
  139. void addForce(const Vector3& force, ForceMode mode = ForceMode::Force);
  140. /** @copydoc Rigidbody::addTorque */
  141. BS_SCRIPT_EXPORT(n:AddTorque)
  142. void addTorque(const Vector3& torque, ForceMode mode = ForceMode::Force);
  143. /** @copydoc Rigidbody::addForceAtPoint */
  144. BS_SCRIPT_EXPORT(n:AddForceAtPoint)
  145. void addForceAtPoint(const Vector3& force, const Vector3& position,
  146. PointForceMode mode = PointForceMode::Force);
  147. /** @copydoc Rigidbody::getVelocityAtPoint */
  148. BS_SCRIPT_EXPORT(n:GetVelocityAtPoint)
  149. Vector3 getVelocityAtPoint(const Vector3& point) const;
  150. /** @copydoc Rigidbody::onCollisionBegin */
  151. BS_SCRIPT_EXPORT(n:OnCollisionBegin)
  152. Event<void(const CollisionData&)> onCollisionBegin;
  153. /** @copydoc Rigidbody::onCollisionStay */
  154. BS_SCRIPT_EXPORT(n:OnCollisionStay)
  155. Event<void(const CollisionData&)> onCollisionStay;
  156. /** @copydoc Rigidbody::onCollisionEnd */
  157. BS_SCRIPT_EXPORT(n:OnCollisionEnd)
  158. Event<void(const CollisionData&)> onCollisionEnd;
  159. /** @name Internal
  160. * @{
  161. */
  162. /** Returns the Rigidbody implementation wrapped by this component. */
  163. Rigidbody* _getInternal() const { return mInternal.get(); }
  164. /** Sets that joint that this rigidbody is attached to. Allows the rigidbody to notify the joint when it moves. */
  165. void _setJoint(const HJoint& joint) { mParentJoint = joint; }
  166. /** @copydoc Rigidbody::updateMassDistribution */
  167. void _updateMassDistribution();
  168. /** @} */
  169. protected:
  170. friend class CCollider;
  171. using Component::destroyInternal;
  172. /**
  173. * Searches child scene objects for Collider components and attaches them to the rigidbody. Make sure to call
  174. * clearColliders() if you need to clear old colliders first.
  175. */
  176. void updateColliders();
  177. /** Unregisters all child colliders from the Rigidbody. */
  178. void clearColliders();
  179. /**
  180. * Registers a new collider with the Rigidbody. This collider will then be used to calculate Rigidbody's geometry
  181. * used for collisions, and optionally (depending on set flags) total mass, inertia tensors and center of mass.
  182. */
  183. void addCollider(const HCollider& collider);
  184. /** Unregisters the collider from the Rigidbody. */
  185. void removeCollider(const HCollider& collider);
  186. /** Checks if the rigidbody is nested under another rigidbody, and throws out a warning if so. */
  187. void checkForNestedRigibody();
  188. /** Appends Component referenes for the colliders to the collision data. */
  189. void processCollisionData(const CollisionDataRaw& raw, CollisionData& output);
  190. /** Destroys the internal rigidbody representation. */
  191. void destroyInternal();
  192. /** Triggered when the internal rigidbody begins touching another object. */
  193. void triggerOnCollisionBegin(const CollisionDataRaw& data);
  194. /** Triggered when the internal rigidbody continues touching another object. */
  195. void triggerOnCollisionStay(const CollisionDataRaw& data);
  196. /** Triggered when the internal rigidbody ends touching another object. */
  197. void triggerOnCollisionEnd(const CollisionDataRaw& data);
  198. /************************************************************************/
  199. /* COMPONENT OVERRIDES */
  200. /************************************************************************/
  201. protected:
  202. friend class SceneObject;
  203. /** @copydoc Component::onInitialized() */
  204. void onInitialized() override;
  205. /** @copydoc Component::onDestroyed() */
  206. void onDestroyed() override;
  207. /** @copydoc Component::onDisabled() */
  208. void onDisabled() override;
  209. /** @copydoc Component::onEnabled() */
  210. void onEnabled() override;
  211. /** @copydoc Component::onTransformChanged() */
  212. void onTransformChanged(TransformChangedFlags flags) override;
  213. SPtr<Rigidbody> mInternal;
  214. Vector<HCollider> mChildren;
  215. HJoint mParentJoint;
  216. UINT32 mPositionSolverCount = 4;
  217. UINT32 mVelocitySolverCount = 1;
  218. RigidbodyFlag mFlags = (RigidbodyFlag)((UINT32)RigidbodyFlag::AutoTensors | (UINT32)RigidbodyFlag::AutoMass);
  219. CollisionReportMode mCollisionReportMode = CollisionReportMode::None;
  220. Vector3 mCMassPosition = Vector3::ZERO;
  221. Quaternion mCMassRotation = Quaternion::IDENTITY;
  222. Vector3 mInertiaTensor = Vector3::ZERO;
  223. float mMass = 0.0f;
  224. float mMaxAngularVelocity = 1.0f;
  225. float mLinearDrag = 0.0f;
  226. float mAngularDrag = 0.0f;
  227. float mSleepThreshold = 0.0f;
  228. bool mUseGravity = true;
  229. bool mIsKinematic = false;
  230. /************************************************************************/
  231. /* RTTI */
  232. /************************************************************************/
  233. public:
  234. friend class CRigidbodyRTTI;
  235. static RTTITypeBase* getRTTIStatic();
  236. RTTITypeBase* getRTTI() const override;
  237. protected:
  238. CRigidbody() {} // Serialization only
  239. };
  240. /** @} */
  241. }