BsCCharacterController.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsCCharacterController.h"
  4. #include "BsSceneObject.h"
  5. #include "BsCCharacterControllerRTTI.h"
  6. using namespace std::placeholders;
  7. namespace BansheeEngine
  8. {
  9. CCharacterController::CCharacterController(const HSceneObject& parent)
  10. : Component(parent)
  11. {
  12. setName("CharacterController");
  13. mNotifyFlags = TCF_Transform;
  14. }
  15. CharacterCollisionFlags CCharacterController::move(const Vector3& displacement)
  16. {
  17. CharacterCollisionFlags output;
  18. if (mInternal == nullptr)
  19. return output;
  20. output = mInternal->move(displacement);
  21. updatePositionFromController();
  22. }
  23. Vector3 CCharacterController::getFootPosition() const
  24. {
  25. if (mInternal == nullptr)
  26. return Vector3::ZERO;
  27. return mInternal->getFootPosition();
  28. }
  29. void CCharacterController::setFootPosition(const Vector3& position)
  30. {
  31. if (mInternal == nullptr)
  32. return;
  33. mInternal->setFootPosition(position);
  34. updatePositionFromController();
  35. }
  36. void CCharacterController::setRadius(float radius)
  37. {
  38. mDesc.radius = radius;
  39. if (mInternal != nullptr)
  40. updateDimensions();
  41. }
  42. void CCharacterController::setHeight(float height)
  43. {
  44. mDesc.height = height;
  45. if (mInternal != nullptr)
  46. updateDimensions();
  47. }
  48. void CCharacterController::setUp(const Vector3& up)
  49. {
  50. mDesc.up = up;
  51. if (mInternal != nullptr)
  52. mInternal->setUp(up);
  53. }
  54. void CCharacterController::setClimbingMode(CharacterClimbingMode mode)
  55. {
  56. mDesc.climbingMode = mode;
  57. if (mInternal != nullptr)
  58. mInternal->setClimbingMode(mode);
  59. }
  60. void CCharacterController::setNonWalkableMode(CharacterNonWalkableMode mode)
  61. {
  62. mDesc.nonWalkableMode = mode;
  63. if (mInternal != nullptr)
  64. mInternal->setNonWalkableMode(mode);
  65. }
  66. void CCharacterController::setMinMoveDistance(float value)
  67. {
  68. mDesc.minMoveDistance = value;
  69. if (mInternal != nullptr)
  70. mInternal->setMinMoveDistance(value);
  71. }
  72. void CCharacterController::setContactOffset(float value)
  73. {
  74. mDesc.contactOffset = value;
  75. if (mInternal != nullptr)
  76. mInternal->setContactOffset(value);
  77. }
  78. void CCharacterController::setStepOffset(float value)
  79. {
  80. mDesc.stepOffset = value;
  81. if (mInternal != nullptr)
  82. mInternal->setStepOffset(value);
  83. }
  84. void CCharacterController::setSlopeLimit(Radian value)
  85. {
  86. mDesc.slopeLimit = value;
  87. if (mInternal != nullptr)
  88. mInternal->setSlopeLimit(value);
  89. }
  90. void CCharacterController::setLayer(UINT64 layer)
  91. {
  92. mLayer = layer;
  93. if (mInternal != nullptr)
  94. mInternal->setLayer(layer);
  95. }
  96. void CCharacterController::onInitialized()
  97. {
  98. }
  99. void CCharacterController::onDestroyed()
  100. {
  101. // This should release the last reference and destroy the internal controller
  102. mInternal = nullptr;
  103. }
  104. void CCharacterController::onDisabled()
  105. {
  106. // This should release the last reference and destroy the internal controller
  107. mInternal = nullptr;
  108. }
  109. void CCharacterController::onEnabled()
  110. {
  111. mDesc.position = SO()->getWorldPosition();
  112. mInternal = CharacterController::create(mDesc);
  113. mInternal->onColliderHit.connect(std::bind(&CCharacterController::triggerOnColliderHit, this, _1));
  114. mInternal->onControllerHit.connect(std::bind(&CCharacterController::triggerOnControllerHit, this, _1));
  115. mInternal->setLayer(mLayer);
  116. updateDimensions();
  117. }
  118. void CCharacterController::onTransformChanged(TransformChangedFlags flags)
  119. {
  120. if (!SO()->getActive() || mInternal == nullptr)
  121. return;
  122. mInternal->setPosition(SO()->getWorldPosition());
  123. }
  124. void CCharacterController::updatePositionFromController()
  125. {
  126. mNotifyFlags = (TransformChangedFlags)0;
  127. SO()->setWorldPosition(mInternal->getPosition());
  128. mNotifyFlags = TCF_Transform;
  129. }
  130. void CCharacterController::updateDimensions()
  131. {
  132. Vector3 scale = SO()->getWorldScale();
  133. float height = mDesc.height * Math::abs(scale.y);
  134. float radius = mDesc.radius * Math::abs(std::max(scale.x, scale.z));
  135. mInternal->setHeight(height);
  136. mInternal->setRadius(radius);
  137. }
  138. void CCharacterController::triggerOnColliderHit(const ControllerColliderCollision& value)
  139. {
  140. onColliderHit(value);
  141. }
  142. void CCharacterController::triggerOnControllerHit(const ControllerControllerCollision& value)
  143. {
  144. onControllerHit(value);
  145. }
  146. RTTITypeBase* CCharacterController::getRTTIStatic()
  147. {
  148. return CCharacterControllerRTTI::instance();
  149. }
  150. RTTITypeBase* CCharacterController::getRTTI() const
  151. {
  152. return CCharacterController::getRTTIStatic();
  153. }
  154. }