BsHandleSlider.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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), mDelta(0.0f), mHasLastPos(false)
  9. {
  10. }
  11. void HandleSlider::update(const HCamera& 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::reset()
  53. {
  54. mDelta = 0.0f;
  55. mHasLastPos = false;
  56. }
  57. float HandleSlider::getDelta() const
  58. {
  59. return mDelta;
  60. }
  61. float HandleSlider::calcDelta(const HCamera& camera, const Vector3& position, const Vector3& direction,
  62. const Vector2I& pointerStart, const Vector2I& pointerEnd)
  63. {
  64. Vector2I handleStart2D = camera->worldToScreenPoint(position);
  65. Vector2I handleEnd2D = camera->worldToScreenPoint(position + direction);
  66. Vector2I handleDir2D = handleEnd2D - handleStart2D;
  67. INT32 sqrdMag = handleDir2D.squaredLength();
  68. if (sqrdMag == 0)
  69. return 0.0f;
  70. Vector2I diffStart = pointerStart - handleStart2D;
  71. Vector2I diffEnd = pointerEnd - handleStart2D;
  72. float tStart = handleDir2D.dot(diffStart) / (float)sqrdMag;
  73. float tEnd = handleDir2D.dot(diffEnd) / (float)sqrdMag;
  74. return tEnd - tStart;
  75. }
  76. }