Skip to content

Commit cf60402

Browse files
author
Julia Schwarz
committed
Bugfix: Slider position would jump if slider's origin was not on track.
Fix this by recording a slider thumb offset and applying it when updating the thumb position.
1 parent 6f8b05f commit cf60402

File tree

1 file changed

+21
-5
lines changed
  • Assets/MixedRealityToolkit.SDK/Features/UX/Scripts/Sliders

1 file changed

+21
-5
lines changed

Assets/MixedRealityToolkit.SDK/Features/UX/Scripts/Sliders/PinchSlider.cs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,14 @@ public Vector3 SliderEndPosition
7979
get { return transform.TransformPoint(sliderEndPosition); }
8080
set { sliderEndPosition = Vector3.Project(transform.InverseTransformPoint(value), GetSliderAxis()); }
8181
}
82+
83+
/// <summary>
84+
/// Returns the vector from the slider start to end positions
85+
/// </summary>
86+
public Vector3 SliderTrackDirection
87+
{
88+
get { return SliderEndPosition - SliderStartPosition; }
89+
}
8290
#endregion
8391

8492
#region Event Handlers
@@ -95,11 +103,21 @@ public Vector3 SliderEndPosition
95103
private Vector3 startPointerPosition;
96104
private Vector3 startSliderPosition;
97105
private IMixedRealityPointer activePointer;
106+
private Vector3 sliderThumbOffset = Vector3.zero;
98107
#endregion
99108

100109
#region Unity methods
101110
public void Start()
102111
{
112+
if (thumbRoot == null)
113+
{
114+
throw new Exception($"Slider thumb on gameObject {gameObject.name} is not specified. Did you forget to set it?");
115+
}
116+
117+
var startToThumb = thumbRoot.transform.position - SliderStartPosition;
118+
var thumbProjectedOnTrack = SliderStartPosition + Vector3.Project(startToThumb, SliderTrackDirection);
119+
sliderThumbOffset = thumbRoot.transform.position - thumbProjectedOnTrack;
120+
103121
UpdateUI();
104122
OnValueUpdated.Invoke(new SliderEventData(sliderValue, sliderValue, false));
105123
}
@@ -131,8 +149,7 @@ private Vector3 GetSliderAxis()
131149

132150
private void UpdateUI()
133151
{
134-
var p0ToP1 = SliderEndPosition - SliderStartPosition;
135-
var newSliderPos = SliderStartPosition + p0ToP1 * sliderValue;
152+
var newSliderPos = SliderStartPosition + sliderThumbOffset + SliderTrackDirection * sliderValue;
136153

137154
thumbRoot.transform.position = newSliderPos;
138155
}
@@ -190,10 +207,9 @@ public void OnPointerDragged(MixedRealityPointerEventData eventData)
190207
if (eventData.Pointer == activePointer)
191208
{
192209
var delta = activePointer.Position - startPointerPosition;
193-
var p0ToP1 = SliderEndPosition - SliderStartPosition;
194-
var handDelta = Vector3.Dot(p0ToP1.normalized, delta);
210+
var handDelta = Vector3.Dot(SliderTrackDirection.normalized, delta);
195211

196-
SliderValue = Mathf.Clamp(startSliderValue + handDelta / p0ToP1.magnitude, 0, 1);
212+
SliderValue = Mathf.Clamp(startSliderValue + handDelta / SliderTrackDirection.magnitude, 0, 1);
197213
}
198214
}
199215
public void OnPointerClicked(MixedRealityPointerEventData eventData) { }

0 commit comments

Comments
 (0)