BsHandleSlider.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "BsHandleSlider.h"
  2. #include "BsCamera.h"
  3. namespace BansheeEngine
  4. {
  5. HandleSlider::HandleSlider(bool fixedScale, float snapValue)
  6. :mFixedScale(fixedScale), mSnapValue(snapValue), mScale(Vector3::ONE), mTransformDirty(true)
  7. {
  8. }
  9. void HandleSlider::setPosition(const Vector3& position)
  10. {
  11. mPosition = position;
  12. mTransformDirty = true;
  13. }
  14. void HandleSlider::setRotation(const Quaternion& rotation)
  15. {
  16. mRotation = rotation;
  17. mTransformDirty = true;
  18. }
  19. void HandleSlider::setScale(const Vector3& scale)
  20. {
  21. mScale = scale;
  22. mTransformDirty = true;
  23. }
  24. const Matrix4& HandleSlider::getTransform() const
  25. {
  26. if (mTransformDirty)
  27. updateCachedTransform();
  28. return mTransform;
  29. }
  30. const Matrix4& HandleSlider::getTransformInv() const
  31. {
  32. if (mTransformDirty)
  33. updateCachedTransform();
  34. return mTransformInv;
  35. }
  36. void HandleSlider::updateCachedTransform() const
  37. {
  38. mTransform.setTRS(mPosition, mRotation, mScale);
  39. mTransformInv = mTransform.inverseAffine();
  40. mTransformDirty = false;
  41. }
  42. float HandleSlider::calcDelta(const HCamera& camera, const Vector3& position, const Vector3& direction,
  43. const Vector2I& pointerStart, const Vector2I& pointerEnd)
  44. {
  45. Vector2I handleStart2D = camera->worldToScreenPoint(position);
  46. Vector2I handleEnd2D = camera->worldToScreenPoint(position + direction);
  47. Vector2I handleDir2D = handleEnd2D - handleStart2D;
  48. INT32 sqrdMag = handleDir2D.squaredLength();
  49. if (sqrdMag == 0)
  50. return 0.0f;
  51. Vector2I diffStart = pointerStart - handleStart2D;
  52. Vector2I diffEnd = pointerEnd - handleStart2D;
  53. float tStart = handleDir2D.dot(diffStart) / (float)sqrdMag;
  54. float tEnd = handleDir2D.dot(diffEnd) / (float)sqrdMag;
  55. return tEnd - tStart;
  56. }
  57. }