Skip to content

Commit 45b6b47

Browse files
author
Julia Schwarz
authored
Merge pull request #4735 from johnppella/prerelease/2.0.0.rc2_stabilization_Bug4702
Fix: Slate scroll with hand not working with GGV on Hololens 1 and Motion Controllers in VR #4702
2 parents 32a4c3f + 42ba782 commit 45b6b47

File tree

1 file changed

+50
-19
lines changed

1 file changed

+50
-19
lines changed

Assets/MixedRealityToolkit.SDK/Features/UX/Scripts/Slate/HandInteractionPanZoom.cs

Lines changed: 50 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
namespace 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

Comments
 (0)