Skip to content

Commit 6b7fbaf

Browse files
authored
Merge pull request #7059 from thalbern/user/bethalha/gazetarget
Added support for Unity UI when setting a gaze target in FocusProvider
2 parents 769320a + 83f1a88 commit 6b7fbaf

File tree

2 files changed

+54
-6
lines changed

2 files changed

+54
-6
lines changed

Assets/MixedRealityToolkit.Services/InputSystem/FocusProvider.cs

Lines changed: 20 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 = true;
263+
258264
graphicsRaycastResult = result;
259265

260266
this.hitObject = result.gameObject;
@@ -552,12 +558,19 @@ private void UpdateGazeProvider()
552558
// another raycast if it's not populated
553559
if (gazeHitResult == null)
554560
{
561+
// get 3d hit
555562
hitResult3d.Clear();
556563
var raycastProvider = CoreServices.InputSystem.RaycastProvider;
557564
LayerMask[] prioritizedLayerMasks = (gazeProviderPointingData.Pointer.PrioritizedLayerMasksOverride ?? FocusLayerMasks);
558565
QueryScene(gazeProviderPointingData.Pointer, raycastProvider, prioritizedLayerMasks,
559566
hitResult3d, maxQuerySceneResults, focusIndividualCompoundCollider);
560-
gazeHitResult = hitResult3d;
567+
568+
// get ui hit
569+
hitResultUi.Clear();
570+
RaycastGraphics(gazeProviderPointingData.Pointer, gazeProviderPointingData.GraphicEventData, prioritizedLayerMasks, hitResultUi);
571+
572+
// set gaze hit according to distance and priorization layer mask
573+
gazeHitResult = GetPrioritizedHitResult(hitResult3d, hitResultUi, prioritizedLayerMasks);
561574
}
562575

563576
CoreServices.InputSystem.GazeProvider.UpdateGazeInfoFromHit(gazeHitResult.raycastHit);
@@ -957,11 +970,6 @@ private void UpdatePointer(PointerData pointerData)
957970
hitResult3d.Clear();
958971
QueryScene(pointerData.Pointer, raycastProvider, prioritizedLayerMasks, hitResult3d, maxQuerySceneResults, focusIndividualCompoundCollider);
959972

960-
if (pointerData.Pointer.PointerId == gazeProviderPointingData.Pointer.PointerId)
961-
{
962-
gazeHitResult = hitResult3d;
963-
}
964-
965973
int hitResult3dLayer = hitResult3d.hitObject != null ? hitResult3d.hitObject.layer : -1;
966974
if (hitResult3dLayer == 0)
967975
{
@@ -997,6 +1005,12 @@ private void UpdatePointer(PointerData pointerData)
9971005
// Apply the hit result only now so changes in the current target are detected only once per frame.
9981006
pointerData.UpdateHit(hit);
9991007

1008+
// set gaze hit result - make sure to include unity ui hits
1009+
if (pointerData.Pointer.PointerId == gazeProviderPointingData.Pointer.PointerId)
1010+
{
1011+
gazeHitResult = hit;
1012+
}
1013+
10001014
// Set the pointer's result last
10011015
pointerData.Pointer.Result = pointerData;
10021016
}

Assets/MixedRealityToolkit.Tests/PlayModeTests/FocusProviderTests.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,40 @@ public IEnumerator TestGazeProviderTargetNotNull()
9292
Assert.NotNull(CoreServices.InputSystem.GazeProvider.GazeTarget, "GazeProvider target is null when looking at an object with hand raised");
9393
}
9494

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

0 commit comments

Comments
 (0)