@@ -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