BsCCollider.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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/BsCollider.h"
  6. #include "Scene/BsComponent.h"
  7. namespace bs
  8. {
  9. /** @addtogroup Components-Core
  10. * @{
  11. */
  12. /**
  13. * @copydoc Collider
  14. *
  15. * Wraps Collider as a Component.
  16. */
  17. class BS_CORE_EXPORT BS_SCRIPT_EXPORT(m:Physics,n:Collider) CCollider : public Component
  18. {
  19. public:
  20. CCollider(const HSceneObject& parent);
  21. virtual ~CCollider() {}
  22. /** @copydoc Collider::setIsTrigger */
  23. BS_SCRIPT_EXPORT(n:Trigger,pr:setter)
  24. void setIsTrigger(bool value);
  25. /** @copydoc Collider::getIsTrigger */
  26. BS_SCRIPT_EXPORT(n:Trigger,pr:getter)
  27. bool getIsTrigger() const { return mIsTrigger; }
  28. /** @copydoc Collider::setMass */
  29. BS_SCRIPT_EXPORT(n:Mass,pr:setter)
  30. void setMass(float mass);
  31. /** @copydoc Collider::getMass */
  32. BS_SCRIPT_EXPORT(n:Mass,pr:getter)
  33. float getMass() const { return mMass; }
  34. /** @copydoc Collider::setMaterial */
  35. BS_SCRIPT_EXPORT(n:Material,pr:setter)
  36. void setMaterial(const HPhysicsMaterial& material);
  37. /** @copydoc Collider::getMaterial */
  38. BS_SCRIPT_EXPORT(n:Material,pr:getter)
  39. HPhysicsMaterial getMaterial() const { return mMaterial; }
  40. /** @copydoc Collider::setContactOffset */
  41. BS_SCRIPT_EXPORT(n:ContactOffset,pr:setter)
  42. void setContactOffset(float value);
  43. /** @copydoc Collider::getContactOffset */
  44. BS_SCRIPT_EXPORT(n:ContactOffset,pr:getter)
  45. float getContactOffset() const { return mContactOffset; }
  46. /** @copydoc Collider::setRestOffset */
  47. BS_SCRIPT_EXPORT(n:RestOffset,pr:setter)
  48. void setRestOffset(float value);
  49. /** @copydoc Collider::getRestOffset */
  50. BS_SCRIPT_EXPORT(n:RestOffset,pr:getter)
  51. float getRestOffset() const { return mRestOffset; }
  52. /** @copydoc Collider::setLayer */
  53. BS_SCRIPT_EXPORT(n:Layer,pr:setter)
  54. void setLayer(UINT64 layer);
  55. /** @copydoc Collider::getLayer */
  56. BS_SCRIPT_EXPORT(n:Layer,pr:getter)
  57. UINT64 getLayer() const { return mLayer; }
  58. /** @copydoc Collider::setCollisionReportMode */
  59. BS_SCRIPT_EXPORT(n:CollisionReportMode,pr:setter)
  60. void setCollisionReportMode(CollisionReportMode mode);
  61. /** @copydoc Collider::getCollisionReportMode */
  62. BS_SCRIPT_EXPORT(n:CollisionReportMode,pr:getter)
  63. CollisionReportMode getCollisionReportMode() const { return mCollisionReportMode; }
  64. /** @copydoc Collider::getRigidbody */
  65. HRigidbody getRigidbody() const { return mParent; }
  66. /** @copydoc Collider::rayCast(const Ray&, PhysicsQueryHit&, float) const */
  67. bool rayCast(const Ray& ray, PhysicsQueryHit& hit, float maxDist = FLT_MAX) const;
  68. /** @copydoc Collider::rayCast(const Vector3&, const Vector3&, PhysicsQueryHit&, float) const */
  69. bool rayCast(const Vector3& origin, const Vector3& unitDir, PhysicsQueryHit& hit,
  70. float maxDist = FLT_MAX) const;
  71. /** @copydoc Collider::onCollisionBegin */
  72. BS_SCRIPT_EXPORT(n:OnCollisionBegin)
  73. Event<void(const CollisionData&)> onCollisionBegin;
  74. /** @copydoc Collider::onCollisionStay */
  75. BS_SCRIPT_EXPORT(n:OnCollisionStay)
  76. Event<void(const CollisionData&)> onCollisionStay;
  77. /** @copydoc Collider::onCollisionEnd */
  78. BS_SCRIPT_EXPORT(n:OnCollisionEnd)
  79. Event<void(const CollisionData&)> onCollisionEnd;
  80. /** @name Internal
  81. * @{
  82. */
  83. /** Returns the Collider implementation wrapped by this component. */
  84. Collider* _getInternal() const { return mInternal.get(); }
  85. /** @} */
  86. /************************************************************************/
  87. /* COMPONENT OVERRIDES */
  88. /************************************************************************/
  89. protected:
  90. friend class SceneObject;
  91. friend class CRigidbody;
  92. /** @copydoc Component::onInitialized() */
  93. void onInitialized() override;
  94. /** @copydoc Component::onDestroyed() */
  95. void onDestroyed() override;
  96. /** @copydoc Component::onDisabled() */
  97. void onDisabled() override;
  98. /** @copydoc Component::onEnabled() */
  99. void onEnabled() override;
  100. /** @copydoc Component::onTransformChanged() */
  101. void onTransformChanged(TransformChangedFlags flags) override;
  102. protected:
  103. using Component::destroyInternal;
  104. /** Creates the internal representation of the Collider for use by the component. */
  105. virtual SPtr<Collider> createInternal() = 0;
  106. /** Creates the internal representation of the Collider and restores the values saved by the Component. */
  107. virtual void restoreInternal();
  108. /** Destroys the internal collider representation. */
  109. void destroyInternal();
  110. /**
  111. * Checks is the provided rigidbody a valid parent for this collider.
  112. *
  113. * @note This is required because certain colliders are limited in how they can be used. */
  114. virtual bool isValidParent(const HRigidbody& parent) const { return true; }
  115. /**
  116. * Changes the rigidbody parent of the collider. Meant to be called from the Rigidbody itself.
  117. *
  118. * @param[in] rigidbody New rigidbody to assign as the parent to the collider.
  119. * @param[in] internal If true the rigidbody will just be changed internally, but parent rigidbody will not be
  120. * notified.
  121. */
  122. void setRigidbody(const HRigidbody& rigidbody, bool internal = false);
  123. /**
  124. * Updates the transform of the internal Collider representation from the transform of the component's scene object.
  125. */
  126. void updateTransform();
  127. /** Applies the collision report mode to the internal collider depending on the current state. */
  128. void updateCollisionReportMode();
  129. /** Searches the parent scene object hierarchy to find a parent Rigidbody component. */
  130. void updateParentRigidbody();
  131. /** Triggered when the internal collider begins touching another object. */
  132. void triggerOnCollisionBegin(const CollisionDataRaw& data);
  133. /** Triggered when the internal collider continues touching another object. */
  134. void triggerOnCollisionStay(const CollisionDataRaw& data);
  135. /** Triggered when the internal collider ends touching another object. */
  136. void triggerOnCollisionEnd(const CollisionDataRaw& data);
  137. SPtr<Collider> mInternal;
  138. UINT64 mLayer = 1;
  139. CollisionReportMode mCollisionReportMode = CollisionReportMode::None;
  140. float mRestOffset = 0.0f;
  141. float mContactOffset = 0.02f;
  142. HPhysicsMaterial mMaterial;
  143. float mMass = 1.0f;
  144. bool mIsTrigger = false;
  145. Vector3 mLocalPosition = Vector3::ZERO;
  146. Quaternion mLocalRotation = Quaternion::IDENTITY;
  147. HRigidbody mParent;
  148. /************************************************************************/
  149. /* RTTI */
  150. /************************************************************************/
  151. public:
  152. friend class CColliderRTTI;
  153. static RTTITypeBase* getRTTIStatic();
  154. RTTITypeBase* getRTTI() const override;
  155. protected:
  156. CCollider() {} // Serialization only
  157. };
  158. /** @} */
  159. }