Skip to content

Commit baa683c

Browse files
fixed gaze target not set for unity ui / added tests
1 parent 5f1a205 commit baa683c

File tree

2 files changed

+59
-6
lines changed

2 files changed

+59
-6
lines changed

Assets/MixedRealityToolkit.Services/InputSystem/FocusProvider.cs

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,12 @@ public void Set(MixedRealityRaycastHit hit, RayStep ray, int rayStepIndex, float
255255
public void Set(RaycastResult result, Vector3 hitPointOnObject, Vector4 hitNormalOnObject, RayStep ray, int rayStepIndex, float rayDistance)
256256
{
257257
raycastHit = default(MixedRealityRaycastHit);
258+
raycastHit.point = hitPointOnObject;
259+
raycastHit.normal = hitNormalOnObject;
260+
raycastHit.distance = rayDistance;
261+
raycastHit.transform = result.gameObject.transform;
262+
raycastHit.raycastValid = false;
263+
258264
graphicsRaycastResult = result;
259265

260266
this.hitObject = result.gameObject;
@@ -264,6 +270,7 @@ public void Set(RaycastResult result, Vector3 hitPointOnObject, Vector4 hitNorma
264270
this.ray = ray;
265271
this.rayStepIndex = rayStepIndex;
266272
this.rayDistance = rayDistance;
273+
267274
}
268275
}
269276

@@ -557,10 +564,17 @@ private void UpdateGazeProvider()
557564
LayerMask[] prioritizedLayerMasks = (gazeProviderPointingData.Pointer.PrioritizedLayerMasksOverride ?? FocusLayerMasks);
558565
QueryScene(gazeProviderPointingData.Pointer, raycastProvider, prioritizedLayerMasks,
559566
hitResult3d, maxQuerySceneResults, focusIndividualCompoundCollider);
560-
gazeHitResult = hitResult3d;
567+
//gazeHitResult = hitResult3d;
568+
569+
hitResultUi.Clear();
570+
RaycastGraphics(gazeProviderPointingData.Pointer, gazeProviderPointingData.GraphicEventData, prioritizedLayerMasks, hitResultUi);
571+
572+
gazeHitResult = GetPrioritizedHitResult(hitResult3d, hitResultUi, prioritizedLayerMasks);
573+
TruncatePointerRayToHit(gazeProviderPointingData.Pointer, gazeHitResult);
561574
}
562575

563576
CoreServices.InputSystem.GazeProvider.UpdateGazeInfoFromHit(gazeHitResult.raycastHit);
577+
Debug.LogWarning((gazeHitResult.raycastHit.transform != null) ? gazeHitResult.raycastHit.transform.name : "nothing");
564578

565579
// Zero out value after every use to ensure the hit result is updated every frame.
566580
gazeHitResult = null;
@@ -957,11 +971,6 @@ private void UpdatePointer(PointerData pointerData)
957971
hitResult3d.Clear();
958972
QueryScene(pointerData.Pointer, raycastProvider, prioritizedLayerMasks, hitResult3d, maxQuerySceneResults, focusIndividualCompoundCollider);
959973

960-
if (pointerData.Pointer.PointerId == gazeProviderPointingData.Pointer.PointerId)
961-
{
962-
gazeHitResult = hitResult3d;
963-
}
964-
965974
int hitResult3dLayer = hitResult3d.hitObject != null ? hitResult3d.hitObject.layer : -1;
966975
if (hitResult3dLayer == 0)
967976
{
@@ -982,6 +991,8 @@ private void UpdatePointer(PointerData pointerData)
982991
hit = GetPrioritizedHitResult(hit, hitResultUi, prioritizedLayerMasks);
983992
}
984993

994+
995+
985996
if (hit != hitResult3d || hitResult3dLayer > 0)
986997
{
987998
// Truncate if we didn't already for this hit
@@ -997,6 +1008,12 @@ private void UpdatePointer(PointerData pointerData)
9971008
// Apply the hit result only now so changes in the current target are detected only once per frame.
9981009
pointerData.UpdateHit(hit);
9991010

1011+
// set gaze hit result - make sure to include unity ui hits
1012+
if (pointerData.Pointer.PointerId == gazeProviderPointingData.Pointer.PointerId)
1013+
{
1014+
gazeHitResult = hit;
1015+
}
1016+
10001017
// Set the pointer's result last
10011018
pointerData.Pointer.Result = pointerData;
10021019
}

Assets/MixedRealityToolkit.Tests/PlayModeTests/FocusProviderTests.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using Microsoft.MixedReality.Toolkit.Utilities;
1919
using System.Linq;
2020
using Microsoft.MixedReality.Toolkit.UI;
21+
using Microsoft.MixedReality.Toolkit.Input.Utilities;
2122

2223
namespace Microsoft.MixedReality.Toolkit.Tests
2324
{
@@ -92,6 +93,41 @@ public IEnumerator TestGazeProviderTargetNotNull()
9293
Assert.NotNull(CoreServices.InputSystem.GazeProvider.GazeTarget, "GazeProvider target is null when looking at an object with hand raised");
9394
}
9495

96+
[UnityTest]
97+
public IEnumerator TestGazeProviderTargetUnityUi()
98+
{
99+
TestUtilities.PlayspaceToOriginLookingForward();
100+
101+
// spawn 3d object
102+
var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
103+
cube.transform.position = Vector3.forward;
104+
cube.transform.localScale = Vector3.one * 0.5f;
105+
yield return null;
106+
yield return null;
107+
108+
// make sure we get the 3d object as a gaze target
109+
Assert.AreEqual(CoreServices.InputSystem.GazeProvider.GazeTarget, cube, "GazeProvider target is not set to 3d object (cube)");
110+
111+
// yield return PlayModeTestUtilities.WaitForEnterKey();
112+
113+
// spawn 2d unity ui
114+
var canvas = UnityUiUtilities.CreateCanvas(0.002f);
115+
var toggle = UnityUiUtilities.CreateToggle(Color.gray, Color.blue, Color.green);
116+
toggle.transform.SetParent(canvas.transform, false);
117+
canvas.transform.position = Vector3.forward * 0.5f;
118+
119+
yield return null;
120+
yield return null;
121+
122+
123+
//yield return PlayModeTestUtilities.WaitForEnterKey();
124+
125+
// check if gaze target has changed to unity ui
126+
Assert.AreEqual(CoreServices.InputSystem.GazeProvider.GazeTarget, toggle.gameObject, "GazeProvider target is not set to toggle unity ui");
127+
128+
yield return null;
129+
}
130+
95131
/// <summary>
96132
/// Ensure FocusProvider's FocusDetails can be overridden.
97133
/// </summary>

0 commit comments

Comments
 (0)