BsHandleSlider.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "BsHandleSlider.h"
  2. #include "BsCamera.h"
  3. #include "BsHandleManager.h"
  4. namespace BansheeEngine
  5. {
  6. HandleSlider::HandleSlider(bool fixedScale)
  7. :mFixedScale(fixedScale), mScale(Vector3::ONE), mTransformDirty(true),
  8. mDistanceScale(1.0f)
  9. {
  10. }
  11. void HandleSlider::update(const CameraHandlerPtr& camera)
  12. {
  13. if (mFixedScale)
  14. mDistanceScale = HandleManager::instance().getHandleSize(camera, mPosition);
  15. }
  16. void HandleSlider::setPosition(const Vector3& position)
  17. {
  18. mPosition = position;
  19. mTransformDirty = true;
  20. }
  21. void HandleSlider::setRotation(const Quaternion& rotation)
  22. {
  23. mRotation = rotation;
  24. mTransformDirty = true;
  25. }
  26. void HandleSlider::setScale(const Vector3& scale)
  27. {
  28. mScale = scale;
  29. mTransformDirty = true;
  30. }
  31. const Matrix4& HandleSlider::getTransform() const
  32. {
  33. if (mTransformDirty)
  34. updateCachedTransform();
  35. return mTransform;
  36. }
  37. const Matrix4& HandleSlider::getTransformInv() const
  38. {
  39. if (mTransformDirty)
  40. updateCachedTransform();
  41. return mTransformInv;
  42. }
  43. void HandleSlider::updateCachedTransform() const
  44. {
  45. if (mFixedScale)
  46. mTransform.setTRS(mPosition, mRotation, mScale * mDistanceScale);
  47. else
  48. mTransform.setTRS(mPosition, mRotation, mScale);
  49. mTransformInv = mTransform.inverseAffine();
  50. mTransformDirty = false;
  51. }
  52. void HandleSlider::setInactive()
  53. {
  54. mState = State::Inactive;
  55. reset();
  56. }
  57. void HandleSlider::setActive(const CameraHandlerPtr& camera, const Vector2I& pointerPos)
  58. {
  59. mState = State::Active;
  60. mStartPointerPos = pointerPos;
  61. mCurrentPointerPos = pointerPos;
  62. activate(camera, pointerPos);
  63. }
  64. void HandleSlider::setHover()
  65. {
  66. mState = State::Hover;
  67. reset();
  68. }
  69. float HandleSlider::calcDelta(const CameraHandlerPtr& camera, const Vector3& position, const Vector3& direction,
  70. const Vector2I& pointerStart, const Vector2I& pointerEnd)
  71. {
  72. Vector2I handleStart2D = camera->worldToScreenPoint(position);
  73. Vector2I handleEnd2D = camera->worldToScreenPoint(position + direction);
  74. Vector2I handleDir2D = handleEnd2D - handleStart2D;
  75. INT32 sqrdMag = handleDir2D.squaredLength();
  76. if (sqrdMag == 0)
  77. return 0.0f;
  78. Vector2I diffStart = pointerStart - handleStart2D;
  79. Vector2I diffEnd = pointerEnd - handleStart2D;
  80. float tStart = handleDir2D.dot(diffStart) / (float)sqrdMag;
  81. float tEnd = handleDir2D.dot(diffEnd) / (float)sqrdMag;
  82. return tEnd - tStart;
  83. }
  84. }