BsCCapsuleCollider.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Components/BsCCapsuleCollider.h"
  4. #include "Scene/BsSceneObject.h"
  5. #include "Components/BsCRigidbody.h"
  6. #include "Private/RTTI/BsCCapsuleColliderRTTI.h"
  7. namespace bs
  8. {
  9. CCapsuleCollider::CCapsuleCollider()
  10. {
  11. setName("CapsuleCollider");
  12. }
  13. CCapsuleCollider::CCapsuleCollider(const HSceneObject& parent, float radius, float halfHeight)
  14. : CCollider(parent), mRadius(radius), mHalfHeight(halfHeight)
  15. {
  16. setName("CapsuleCollider");
  17. }
  18. void CCapsuleCollider::setNormal(const Vector3& normal)
  19. {
  20. if (mNormal == normal)
  21. return;
  22. mNormal = normal;
  23. mNormal.normalize();
  24. mLocalRotation = Quaternion::getRotationFromTo(Vector3::UNIT_X, normal);
  25. if (mInternal != nullptr)
  26. updateTransform();
  27. }
  28. void CCapsuleCollider::setCenter(const Vector3& center)
  29. {
  30. if (mLocalPosition == center)
  31. return;
  32. mLocalPosition = center;
  33. if (mInternal != nullptr)
  34. updateTransform();
  35. }
  36. void CCapsuleCollider::setHalfHeight(float halfHeight)
  37. {
  38. float clampedHalfHeight = std::max(halfHeight, 0.01f);
  39. if (mHalfHeight == clampedHalfHeight)
  40. return;
  41. mHalfHeight = clampedHalfHeight;
  42. if (mInternal != nullptr)
  43. {
  44. _getInternal()->setHalfHeight(clampedHalfHeight);
  45. if (mParent != nullptr)
  46. mParent->_updateMassDistribution();
  47. }
  48. }
  49. void CCapsuleCollider::setRadius(float radius)
  50. {
  51. float clampedRadius = std::max(radius, 0.01f);
  52. if (mRadius == clampedRadius)
  53. return;
  54. mRadius = clampedRadius;
  55. if (mInternal != nullptr)
  56. {
  57. _getInternal()->setRadius(clampedRadius);
  58. if (mParent != nullptr)
  59. mParent->_updateMassDistribution();
  60. }
  61. }
  62. SPtr<Collider> CCapsuleCollider::createInternal()
  63. {
  64. const Transform& tfrm = SO()->getTransform();
  65. SPtr<Collider> collider = CapsuleCollider::create(mRadius, mHalfHeight, tfrm.getPosition(),
  66. tfrm.getRotation());
  67. collider->_setOwner(PhysicsOwnerType::Component, this);
  68. return collider;
  69. }
  70. RTTITypeBase* CCapsuleCollider::getRTTIStatic()
  71. {
  72. return CCapsuleColliderRTTI::instance();
  73. }
  74. RTTITypeBase* CCapsuleCollider::getRTTI() const
  75. {
  76. return CCapsuleCollider::getRTTIStatic();
  77. }
  78. }