Skip to content

Commit 48aa466

Browse files
jverralRogPodgekeveleigh
authored
Perf: Don't do raycasts for the GazeProvider if it's behavior is set … (#10340)
* Perf: Don't do raycasts for the GazeProvider if it's behavior is set to off. * Updating comments to indicate the desired way to disable the gaze provider, also included in-editor ways to more obviously do this * Update Assets/MRTK/Core/Interfaces/InputSystem/IPointerPreferences.cs Co-authored-by: Kurtis <[email protected]> * adjusting property docs * inspector optimization * caching input system and gaze providers as much as possible inside FocusProvider * additional optimizations * Fixing null checks to pass unit tests Co-authored-by: RogPodge <[email protected]> Co-authored-by: RogPodge <[email protected]> Co-authored-by: Kurtis <[email protected]>
1 parent 7bfc823 commit 48aa466

File tree

4 files changed

+53
-28
lines changed

4 files changed

+53
-28
lines changed

Assets/MRTK/Core/Inspectors/Profiles/MixedRealityPointerProfileInspector.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,13 @@ public override void OnInspectorGUI()
111111

112112
var gazeProvider = CameraCache.Main.GetComponent<IMixedRealityGazeProvider>();
113113
CreateCachedEditor((Object)gazeProvider, null, ref gazeProviderEditor);
114-
115114
showGazeProviderProperties = EditorGUILayout.Foldout(showGazeProviderProperties, "Gaze Provider Settings", true, boldFoldout);
116115
if (showGazeProviderProperties && !gazeProviderEditor.IsNull())
117116
{
117+
// Provide a convenient way to toggle the gaze provider as enabled/disabled via editor
118+
gazeProvider.Enabled = EditorGUILayout.Toggle("Enable Gaze Provider", gazeProvider.Enabled);
119+
120+
// Draw out the rest of the Gaze Provider's settings
118121
gazeProviderEditor.OnInspectorGUI();
119122
}
120123
}

Assets/MRTK/Core/Interfaces/InputSystem/IPointerPreferences.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ PointerBehavior GetPointerBehavior<T>(
4545
/// gaze pointer actually cannot be referenced from here
4646
/// since it's an internal class.
4747
/// </summary>
48+
/// <remarks>
49+
/// This does not control if the gaze provider is used for raycasting, just its use as an MRTK pointer. Set CoreServices.InputSystem.GazeProvider.Enabled
50+
/// to false if you do not wish to use Gaze data in your project
51+
/// </remarks>
4852
PointerBehavior GazePointerBehavior { get; set; }
4953
}
5054
}

Assets/MRTK/SDK/Experimental/Features/Utilities/StabilizationPlaneModifier.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ private Vector3 GazeOrigin
221221
get
222222
{
223223
var gazeProvider = CoreServices.InputSystem?.GazeProvider;
224-
if (gazeProvider != null && gazeProvider.Enabled)
224+
if (gazeProvider.IsNotNull() && gazeProvider.Enabled)
225225
{
226226
return gazeProvider.GazeOrigin;
227227
}
@@ -238,7 +238,7 @@ private Vector3 GazeNormal
238238
get
239239
{
240240
var gazeProvider = CoreServices.InputSystem?.GazeProvider;
241-
if (gazeProvider != null && gazeProvider.Enabled)
241+
if (gazeProvider.IsNotNull() && gazeProvider.Enabled)
242242
{
243243
return gazeProvider.GazeDirection;
244244
}
@@ -255,7 +255,7 @@ private Vector3 GazeNormal
255255
private bool TryGetGazeHitPosition(out Vector3 hitPosition)
256256
{
257257
var gazeProvider = CoreServices.InputSystem?.GazeProvider;
258-
if (gazeProvider != null && gazeProvider.Enabled &&
258+
if (gazeProvider.IsNotNull() && gazeProvider.Enabled &&
259259
gazeProvider.HitInfo.raycastValid)
260260
{
261261
hitPosition = gazeProvider.HitPosition;

Assets/MRTK/Services/InputSystem/FocusProvider.cs

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -512,14 +512,16 @@ public override void Initialize()
512512
FindOrCreateUiRaycastCamera();
513513
}
514514

515-
var primaryPointerSelectorType = CoreServices.InputSystem?.InputSystemProfile.PointerProfile.PrimaryPointerSelector.Type;
515+
var inputSystem = CoreServices.InputSystem;
516+
517+
var primaryPointerSelectorType = inputSystemProfile.PointerProfile.PrimaryPointerSelector.Type;
516518
if (primaryPointerSelectorType != null)
517519
{
518520
primaryPointerSelector = Activator.CreateInstance(primaryPointerSelectorType) as IMixedRealityPrimaryPointerSelector;
519521
primaryPointerSelector.Initialize();
520522
}
521523

522-
foreach (var inputSource in CoreServices.InputSystem.DetectedInputSources)
524+
foreach (var inputSource in inputSystem.DetectedInputSources)
523525
{
524526
RegisterPointers(inputSource);
525527
}
@@ -576,18 +578,22 @@ private void UpdateGazeProvider()
576578
{
577579
using (UpdateGazeProviderPerfMarker.Auto())
578580
{
581+
var inputSystem = CoreServices.InputSystem;
582+
IMixedRealityGazeProvider gazeProvider = inputSystem.GazeProvider;
583+
584+
bool gazeProviderEnabled = gazeProvider.IsNotNull() && gazeProvider.Enabled;
579585
// The gaze hit result may be populated from the UpdatePointers call. If it has not, then perform
580586
// another raycast if it's not populated
581-
if (gazeHitResult == null)
587+
if (gazeProviderEnabled && gazeHitResult == null)
582588
{
583-
IMixedRealityPointer gazePointer = CoreServices.InputSystem.GazeProvider?.GazePointer;
589+
IMixedRealityPointer gazePointer = gazeProvider?.GazePointer;
584590
// Check that the gazePointer isn't null and that it has been properly registered as a pointer.
585591
if (gazePointer != null && gazeProviderPointingData != null)
586592
{
587593
// get 3d hit
588594
// This is unneccessary since the gaze pointer has been registered normally along with the other pointers(?)
589595
hitResult3d.Clear();
590-
var raycastProvider = CoreServices.InputSystem.RaycastProvider;
596+
var raycastProvider = inputSystem.RaycastProvider;
591597
LayerMask[] prioritizedLayerMasks = (gazePointer.PrioritizedLayerMasksOverride ?? FocusLayerMasks);
592598
QueryScene(gazePointer, raycastProvider, prioritizedLayerMasks,
593599
hitResult3d, maxQuerySceneResults, focusIndividualCompoundCollider);
@@ -608,9 +614,9 @@ private void UpdateGazeProvider()
608614
}
609615
}
610616

611-
if (!CoreServices.InputSystem.GazeProvider.IsNull())
617+
if (gazeProvider.IsNotNull() && gazeHitResult.IsNotNull())
612618
{
613-
CoreServices.InputSystem.GazeProvider.UpdateGazeInfoFromHit(gazeHitResult.raycastHit);
619+
gazeProvider.UpdateGazeInfoFromHit(gazeHitResult.raycastHit);
614620
}
615621

616622
// Zero out value after every use to ensure the hit result is updated every frame.
@@ -705,7 +711,7 @@ public uint GenerateNewPointerId()
705711
/// <returns>The UIRaycastCamera</returns>
706712
private void FindOrCreateUiRaycastCamera()
707713
{
708-
GameObject cameraObject = null;
714+
GameObject cameraObject;
709715

710716
var existingUiRaycastCameraObject = GameObject.Find("UIRaycastCamera");
711717
if (existingUiRaycastCameraObject != null)
@@ -802,9 +808,12 @@ private void RegisterPointers(IMixedRealityInputSource inputSource)
802808
return;
803809
}
804810

811+
var inputSystem = CoreServices.InputSystem;
812+
IMixedRealityGazeProvider gazeProvider = inputSystem?.GazeProvider;
813+
805814
IMixedRealityPointerMediator mediator = null;
806815

807-
var mediatorType = CoreServices.InputSystem?.InputSystemProfile.PointerProfile.PointerMediator.Type;
816+
var mediatorType = inputSystemProfile.PointerProfile.PointerMediator.Type;
808817
if (mediatorType != null)
809818
{
810819
try
@@ -840,8 +849,8 @@ private void RegisterPointers(IMixedRealityInputSource inputSource)
840849

841850
// Special Registration for Gaze
842851
// Refreshes gazeProviderPointingData to a new reference to the current EventSystem
843-
if (!CoreServices.InputSystem.GazeProvider.IsNull()
844-
&& inputSource.SourceId == CoreServices.InputSystem.GazeProvider.GazeInputSource.SourceId
852+
if (!gazeProvider.IsNull()
853+
&& inputSource.SourceId == gazeProvider.GazeInputSource.SourceId
845854
&& gazeProviderPointingData == null)
846855
{
847856
gazeProviderPointingData = new PointerEventData(EventSystem.current);
@@ -879,15 +888,17 @@ public bool UnregisterPointer(IMixedRealityPointer pointer)
879888
}
880889
}
881890

882-
CoreServices.InputSystem?.RaisePreFocusChanged(pointer, unfocusedObject, null);
891+
var inputSystem = CoreServices.InputSystem;
892+
893+
inputSystem?.RaisePreFocusChanged(pointer, unfocusedObject, null);
883894

884895
if (!objectIsStillFocusedByOtherPointer)
885896
{
886897
// Policy: only raise focus exit if no other pointers are still focusing the object
887-
CoreServices.InputSystem?.RaiseFocusExit(pointer, unfocusedObject);
898+
inputSystem?.RaiseFocusExit(pointer, unfocusedObject);
888899
}
889900

890-
CoreServices.InputSystem?.RaiseFocusChanged(pointer, unfocusedObject, null);
901+
inputSystem?.RaiseFocusChanged(pointer, unfocusedObject, null);
891902
}
892903

893904
pointers.Remove(pointerData.Pointer.PointerId);
@@ -1014,6 +1025,7 @@ private void UpdatePointer(PointerData pointerData)
10141025
{
10151026
using (UpdatePointerPerfMarker.Auto())
10161027
{
1028+
10171029
// Call the pointer's OnPreSceneQuery function
10181030
// This will give it a chance to prepare itself for raycasts
10191031
// e.g., by building its Rays array
@@ -1027,6 +1039,8 @@ private void UpdatePointer(PointerData pointerData)
10271039
}
10281040
else
10291041
{
1042+
var inputSystem = CoreServices.InputSystem;
1043+
10301044
LayerMask[] prioritizedLayerMasks = (pointerData.Pointer.PrioritizedLayerMasksOverride ?? FocusLayerMasks);
10311045

10321046
if (pointerData.IsCurrentPointerTargetInvalid)
@@ -1052,7 +1066,7 @@ private void UpdatePointer(PointerData pointerData)
10521066
else
10531067
{
10541068
// Perform raycast to determine focused object
1055-
var raycastProvider = CoreServices.InputSystem.RaycastProvider;
1069+
var raycastProvider = inputSystem.RaycastProvider;
10561070
hitResult3d.Clear();
10571071
QueryScene(pointerData.Pointer, raycastProvider, prioritizedLayerMasks, hitResult3d, maxQuerySceneResults, focusIndividualCompoundCollider);
10581072

@@ -1092,7 +1106,7 @@ private void UpdatePointer(PointerData pointerData)
10921106
pointerData.UpdateHit(hit);
10931107

10941108
// set gaze hit result - make sure to include unity ui hits
1095-
var gazePointer = CoreServices.InputSystem.GazeProvider.GazePointer;
1109+
var gazePointer = inputSystem.GazeProvider.GazePointer;
10961110
if (gazePointer != null && pointerData.Pointer.PointerId == gazePointer.PointerId)
10971111
{
10981112
gazeHitResult = hit;
@@ -1170,7 +1184,9 @@ private void ReconcilePointers()
11701184
{
11711185
using (ReconcilePointersPerfMarker.Auto())
11721186
{
1173-
var gazePointer = CoreServices.InputSystem.GazeProvider?.GazePointer as GenericPointer;
1187+
var inputSystem = CoreServices.InputSystem;
1188+
1189+
var gazePointer = inputSystem.GazeProvider?.GazePointer as GenericPointer;
11741190
NumFarPointersActive = 0;
11751191
NumNearPointersActive = 0;
11761192
int numFarPointersWithoutCursorActive = 0;
@@ -1208,7 +1224,7 @@ private void ReconcilePointers()
12081224
NumNearPointersActive,
12091225
NumFarPointersActive,
12101226
numFarPointersWithoutCursorActive,
1211-
CoreServices.InputSystem.EyeGazeProvider.IsEyeTrackingEnabledAndValid);
1227+
inputSystem.EyeGazeProvider.IsEyeTrackingEnabledAndValid);
12121228

12131229
bool isGazePointerActive = gazePointerStateMachine.IsGazePointerActive;
12141230

@@ -1547,14 +1563,15 @@ private void UpdateFocusedObjects()
15471563
pendingOverallFocusEnterSet.Remove(pointer.PreviousPointerTarget);
15481564
}
15491565

1566+
var inputSystem = CoreServices.InputSystem;
15501567
// Now we raise the events:
15511568
for (int iChange = 0; iChange < pendingPointerSpecificFocusChange.Count; iChange++)
15521569
{
15531570
PointerData change = pendingPointerSpecificFocusChange[iChange];
15541571
GameObject pendingUnfocusObject = change.PreviousPointerTarget;
15551572
GameObject pendingFocusObject = change.CurrentPointerTarget;
15561573

1557-
CoreServices.InputSystem.RaisePreFocusChanged(change.Pointer, pendingUnfocusObject, pendingFocusObject);
1574+
inputSystem.RaisePreFocusChanged(change.Pointer, pendingUnfocusObject, pendingFocusObject);
15581575

15591576
int numExits;
15601577
if (pendingUnfocusObject != null && pendingOverallFocusExitSet.TryGetValue(pendingUnfocusObject, out numExits))
@@ -1565,18 +1582,18 @@ private void UpdateFocusedObjects()
15651582
}
15661583
else
15671584
{
1568-
CoreServices.InputSystem.RaiseFocusExit(change.Pointer, pendingUnfocusObject);
1585+
inputSystem.RaiseFocusExit(change.Pointer, pendingUnfocusObject);
15691586
pendingOverallFocusExitSet.Remove(pendingUnfocusObject);
15701587
}
15711588
}
15721589

15731590
if (pendingOverallFocusEnterSet.Contains(pendingFocusObject))
15741591
{
1575-
CoreServices.InputSystem.RaiseFocusEnter(change.Pointer, pendingFocusObject);
1592+
inputSystem.RaiseFocusEnter(change.Pointer, pendingFocusObject);
15761593
pendingOverallFocusEnterSet.Remove(pendingFocusObject);
15771594
}
15781595

1579-
CoreServices.InputSystem.RaiseFocusChanged(change.Pointer, pendingUnfocusObject, pendingFocusObject);
1596+
inputSystem.RaiseFocusChanged(change.Pointer, pendingUnfocusObject, pendingFocusObject);
15801597
}
15811598

15821599
Debug.Assert(pendingOverallFocusExitSet.Count == 0);
@@ -1619,15 +1636,16 @@ public void OnSourceLost(SourceStateEventData eventData)
16191636

16201637
pointerMediators.Remove(eventData.SourceId);
16211638

1639+
var gazePointer = CoreServices.InputSystem.GazeProvider?.GazePointer;
1640+
var gazeInputSourceId = CoreServices.InputSystem.GazeProvider?.GazeInputSource.SourceId;
16221641

16231642
for (var i = 0; i < eventData.InputSource.Pointers.Length; i++)
16241643
{
1625-
var gazePointer = CoreServices.InputSystem.GazeProvider?.GazePointer;
16261644
// Special unregistration for Gaze
16271645
if (gazePointer != null && eventData.InputSource.Pointers[i].PointerId == gazePointer.PointerId)
16281646
{
16291647
// If the source lost is the gaze input source, clear gazeProviderPointingData.
1630-
if (eventData.InputSource.SourceId == CoreServices.InputSystem.GazeProvider?.GazeInputSource.SourceId)
1648+
if (eventData.InputSource.SourceId == gazeInputSourceId)
16311649
{
16321650
gazeProviderPointingData = null;
16331651
}

0 commit comments

Comments
 (0)