BsCCharacterController.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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. return output;
  23. }
  24. Vector3 CCharacterController::getFootPosition() const
  25. {
  26. if (mInternal == nullptr)
  27. return Vector3::ZERO;
  28. return mInternal->getFootPosition();
  29. }
  30. void CCharacterController::setFootPosition(const Vector3& position)
  31. {
  32. if (mInternal == nullptr)
  33. return;
  34. mInternal->setFootPosition(position);
  35. updatePositionFromController();
  36. }
  37. void CCharacterController::setRadius(float radius)
  38. {
  39. mDesc.radius = radius;
  40. if (mInternal != nullptr)
  41. updateDimensions();
  42. }
  43. void CCharacterController::setHeight(float height)
  44. {
  45. mDesc.height = height;
  46. if (mInternal != nullptr)
  47. updateDimensions();
  48. }
  49. void CCharacterController::setUp(const Vector3& up)
  50. {
  51. mDesc.up = up;
  52. if (mInternal != nullptr)
  53. mInternal->setUp(up);
  54. }
  55. void CCharacterController::setClimbingMode(CharacterClimbingMode mode)
  56. {
  57. mDesc.climbingMode = mode;
  58. if (mInternal != nullptr)
  59. mInternal->setClimbingMode(mode);
  60. }
  61. void CCharacterController::setNonWalkableMode(CharacterNonWalkableMode mode)
  62. {
  63. mDesc.nonWalkableMode = mode;
  64. if (mInternal != nullptr)
  65. mInternal->setNonWalkableMode(mode);
  66. }
  67. void CCharacterController::setMinMoveDistance(float value)
  68. {
  69. mDesc.minMoveDistance = value;
  70. if (mInternal != nullptr)
  71. mInternal->setMinMoveDistance(value);
  72. }
  73. void CCharacterController::setContactOffset(float value)
  74. {
  75. mDesc.contactOffset = value;
  76. if (mInternal != nullptr)
  77. mInternal->setContactOffset(value);
  78. }
  79. void CCharacterController::setStepOffset(float value)
  80. {
  81. mDesc.stepOffset = value;
  82. if (mInternal != nullptr)
  83. mInternal->setStepOffset(value);
  84. }
  85. void CCharacterController::setSlopeLimit(Radian value)
  86. {
  87. mDesc.slopeLimit = value;
  88. if (mInternal != nullptr)
  89. mInternal->setSlopeLimit(value);
  90. }
  91. void CCharacterController::setLayer(UINT64 layer)
  92. {
  93. mLayer = layer;
  94. if (mInternal != nullptr)
  95. mInternal->setLayer(layer);
  96. }
  97. void CCharacterController::onInitialized()
  98. {
  99. }
  100. void CCharacterController::onDestroyed()
  101. {
  102. // This should release the last reference and destroy the internal controller
  103. mInternal = nullptr;
  104. }
  105. void CCharacterController::onDisabled()
  106. {
  107. // This should release the last reference and destroy the internal controller
  108. mInternal = nullptr;
  109. }
  110. void CCharacterController::onEnabled()
  111. {
  112. mDesc.position = SO()->getWorldPosition();
  113. mInternal = CharacterController::create(mDesc);
  114. mInternal->onColliderHit.connect(std::bind(&CCharacterController::triggerOnColliderHit, this, _1));
  115. mInternal->onControllerHit.connect(std::bind(&CCharacterController::triggerOnControllerHit, this, _1));
  116. mInternal->setLayer(mLayer);
  117. updateDimensions();
  118. }
  119. void CCharacterController::onTransformChanged(TransformChangedFlags flags)
  120. {
  121. if (!SO()->getActive() || mInternal == nullptr)
  122. return;
  123. mInternal->setPosition(SO()->getWorldPosition());
  124. }
  125. void CCharacterController::updatePositionFromController()
  126. {
  127. mNotifyFlags = (TransformChangedFlags)0;
  128. SO()->setWorldPosition(mInternal->getPosition());
  129. mNotifyFlags = TCF_Transform;
  130. }
  131. void CCharacterController::updateDimensions()
  132. {
  133. Vector3 scale = SO()->getWorldScale();
  134. float height = mDesc.height * Math::abs(scale.y);
  135. float radius = mDesc.radius * Math::abs(std::max(scale.x, scale.z));
  136. mInternal->setHeight(height);
  137. mInternal->setRadius(radius);
  138. }
  139. void CCharacterController::triggerOnColliderHit(const ControllerColliderCollision& value)
  140. {
  141. onColliderHit(value);
  142. }
  143. void CCharacterController::triggerOnControllerHit(const ControllerControllerCollision& value)
  144. {
  145. onControllerHit(value);
  146. }
  147. RTTITypeBase* CCharacterController::getRTTIStatic()
  148. {
  149. return CCharacterControllerRTTI::instance();
  150. }
  151. RTTITypeBase* CCharacterController::getRTTI() const
  152. {
  153. return CCharacterController::getRTTIStatic();
  154. }
  155. }