1212
1313namespace Microsoft . MixedReality . Toolkit . Input
1414{
15- public class HandInteractionPanZoom : BaseFocusHandler , IMixedRealityTouchHandler , IMixedRealityInputHandler , IMixedRealitySourceStateHandler
15+ public class HandInteractionPanZoom : BaseFocusHandler , IMixedRealityTouchHandler , IMixedRealityPointerHandler , IMixedRealitySourceStateHandler
1616 {
1717 /// <summary>
1818 /// Internal data stored for each hand or pointer.
@@ -31,8 +31,10 @@ protected class HandPanData
3131 public Vector2 touchingInitialUV = Vector2 . zero ;
3232 public Vector2 touchingUVOffset = Vector2 . zero ;
3333 public Vector2 touchingUVTotalOffset = Vector2 . zero ;
34+ public Vector3 initialProjectedOffset = Vector3 . zero ;
3435 public IMixedRealityInputSource touchingSource = null ;
3536 public IMixedRealityController currentController = null ;
37+ public IMixedRealityPointer currentPointer = null ;
3638 }
3739
3840 #region Serialized Fields
@@ -162,11 +164,6 @@ private void Update()
162164 {
163165 if ( touchActive )
164166 {
165- if ( affordancesVisible == false )
166- {
167- SetAffordancesActive ( true ) ;
168- }
169-
170167 foreach ( uint key in handDataMap . Keys )
171168 {
172169 if ( true == UpdateHandTouchingPoint ( key ) )
@@ -207,13 +204,27 @@ private void Update()
207204
208205
209206 #region Private Methods
207+ private bool TryGetMRControllerRayPoint ( HandPanData data , out Vector3 rayPoint )
208+ {
209+
210+ if ( data . currentPointer != null && data . currentController != null && data . currentController . IsPositionAvailable )
211+ {
212+ rayPoint = data . touchingInitialPt + ( SnapFingerToQuad ( data . currentPointer . Position ) - data . initialProjectedOffset ) ;
213+ return true ;
214+ }
215+
216+ rayPoint = Vector3 . zero ;
217+ return false ;
218+ }
219+
210220 private bool UpdateHandTouchingPoint ( uint sourceId )
211221 {
212222 Vector3 tryHandPoint = Vector3 . zero ;
213223 bool tryGetSucceeded = false ;
214224 if ( handDataMap . ContainsKey ( sourceId ) == true )
215225 {
216226 HandPanData data = handDataMap [ sourceId ] ;
227+
217228 if ( data . IsActive == true )
218229 {
219230 if ( data . IsSourceNear == true )
@@ -224,6 +235,11 @@ private bool UpdateHandTouchingPoint(uint sourceId)
224235 {
225236 tryGetSucceeded = TryGetHandPositionFromController ( data . currentController , TrackedHandJoint . Palm , out tryHandPoint ) ;
226237 }
238+ if ( ! tryGetSucceeded )
239+ {
240+ tryGetSucceeded = TryGetMRControllerRayPoint ( data , out tryHandPoint ) ;
241+ }
242+
227243 if ( tryGetSucceeded == true )
228244 {
229245 tryHandPoint = SnapFingerToQuad ( tryHandPoint ) ;
@@ -240,7 +256,7 @@ private bool UpdateHandTouchingPoint(uint sourceId)
240256 }
241257 private bool TryGetHandRayPoint ( IMixedRealityController controller , out Vector3 handRayPoint )
242258 {
243- if ( controller != null &&
259+ if ( controller != null &&
244260 controller . InputSource != null &&
245261 controller . InputSource . Pointers != null &&
246262 controller . InputSource . Pointers . Length > 0 &&
@@ -444,7 +460,6 @@ private void SetAffordancesActive(bool active)
444460 {
445461 rightPoint . SetActive ( affordancesVisible ) ;
446462 }
447-
448463 }
449464 private Vector3 GetContactForHand ( Handedness hand )
450465 {
@@ -593,13 +608,17 @@ private Vector3 SnapFingerToQuad(Vector3 pointToSnap)
593608
594609 return Vector3 . ProjectOnPlane ( pointToSnap - planePoint , planeNormal ) + planePoint ;
595610 }
596- private void SetHandDataFromController ( IMixedRealityController controller , bool isNear )
611+
612+
613+ private void SetHandDataFromController ( IMixedRealityController controller , IMixedRealityPointer pointer , bool isNear )
597614 {
598615 HandPanData data = new HandPanData ( ) ;
599616 data . IsSourceNear = isNear ;
600617 data . IsActive = true ;
601618 data . touchingSource = controller . InputSource ;
602619 data . currentController = controller ;
620+ data . currentPointer = pointer ;
621+
603622 if ( isNear == true )
604623 {
605624 if ( TryGetHandPositionFromController ( data . currentController , TrackedHandJoint . IndexTip , out Vector3 touchPosition ) == true )
@@ -609,7 +628,7 @@ private void SetHandDataFromController(IMixedRealityController controller, bool
609628 data . touchingPoint = data . touchingInitialPt ;
610629 }
611630 }
612- else
631+ else //is far
613632 {
614633 if ( TryGetHandRayPoint ( controller , out Vector3 handRayPt ) == true )
615634 {
@@ -623,6 +642,13 @@ private void SetHandDataFromController(IMixedRealityController controller, bool
623642 }
624643 }
625644
645+ //store value in case of MRController
646+ if ( data . currentPointer != null )
647+ {
648+ Vector3 pt = data . currentPointer . Position ;
649+ data . initialProjectedOffset = SnapFingerToQuad ( pt ) ;
650+ }
651+
626652 data . touchingQuadCoord = GetUVFromPoint ( data . touchingPoint ) ;
627653 data . touchingInitialUV = data . touchingQuadCoord ;
628654 data . touchingUVTotalOffset = totalUVOffset ;
@@ -646,6 +672,8 @@ private void SetHandDataFromController(IMixedRealityController controller, bool
646672 previousContactRatio = 1.0f ;
647673 }
648674
675+ SetAffordancesActive ( isNear ) ;
676+
649677 StartTouch ( data . touchingSource . SourceId ) ;
650678 }
651679 private bool TryGetHandPositionFromController ( IMixedRealityController controller , TrackedHandJoint joint , out Vector3 position )
@@ -772,7 +800,7 @@ public override void OnFocusExit(FocusEventData eventData)
772800 public void OnTouchStarted ( HandTrackingInputEventData eventData )
773801 {
774802 EndTouch ( eventData . SourceId ) ;
775- SetHandDataFromController ( eventData . Controller , true ) ;
803+ SetHandDataFromController ( eventData . Controller , null , true ) ;
776804 eventData . Use ( ) ;
777805 }
778806 public void OnTouchCompleted ( HandTrackingInputEventData eventData )
@@ -788,29 +816,32 @@ public void OnTouchUpdated(HandTrackingInputEventData eventData) { }
788816 /// <summary>
789817 /// The Input Event handlers receive Hand Ray events.
790818 /// </summary>
791- public void OnInputDown ( InputEventData eventData )
819+ public void OnPointerDown ( MixedRealityPointerEventData eventData )
792820 {
821+ SetAffordancesActive ( false ) ;
793822 EndTouch ( eventData . SourceId ) ;
794- SetHandDataFromController ( eventData . InputSource . Pointers [ 0 ] . Controller , false ) ;
823+ SetHandDataFromController ( eventData . Pointer . Controller , eventData . Pointer , false ) ;
795824 eventData . Use ( ) ;
796825 }
797- public void OnInputUp ( InputEventData eventData )
826+ public void OnPointerUp ( MixedRealityPointerEventData eventData )
798827 {
799828 EndTouch ( eventData . SourceId ) ;
800829 eventData . Use ( ) ;
801- }
802- public void OnPositionInputChanged ( InputEventData < Vector2 > eventData ) { }
803- public void OnInputPressed ( InputEventData < float > eventData ) { }
830+ }
804831 #endregion IMixedRealityInputHandler Methods
805832
806-
807833 #region IMixedRealitySourceStateHandler Methods
808- public void OnSourceDetected ( SourceStateEventData eventData ) { }
809834 public void OnSourceLost ( SourceStateEventData eventData )
810835 {
811836 EndTouch ( eventData . SourceId ) ;
812837 eventData . Use ( ) ;
813838 }
814839 #endregion IMixedRealitySourceStateHandler Methods
840+
841+ #region Unused Methods
842+ public void OnSourceDetected ( SourceStateEventData eventData ) { }
843+ public void OnPointerDragged ( MixedRealityPointerEventData eventData ) { }
844+ public void OnPointerClicked ( MixedRealityPointerEventData eventData ) { }
845+ #endregion Unused Methods
815846 }
816847}
0 commit comments