@@ -41,7 +41,26 @@ public GenericXRSDKSpatialMeshObserver(
4141 BaseMixedRealityProfile profile = null ) : base ( spatialAwarenessSystem , name , priority , profile )
4242 { }
4343
44- protected virtual bool ? IsActiveLoader => true ;
44+ private IReadOnlyList < GenericXRSDKSpatialMeshObserver > observersCache ;
45+
46+ protected virtual bool ? IsActiveLoader
47+ {
48+ get
49+ {
50+ #if XR_MANAGEMENT_ENABLED
51+ if ( XRGeneralSettings . Instance != null
52+ && XRGeneralSettings . Instance . Manager != null
53+ && XRGeneralSettings . Instance . Manager . activeLoader != null )
54+ {
55+ return true ;
56+ }
57+
58+ return null ;
59+ #else
60+ return false ;
61+ #endif
62+ }
63+ }
4564
4665 /// <inheritdoc />
4766 public override void Enable ( )
@@ -58,6 +77,7 @@ public override void Enable()
5877 return ;
5978 }
6079
80+ ConfigureObserverVolume ( ) ;
6181 base . Enable ( ) ;
6282 }
6383
@@ -73,30 +93,16 @@ private async void EnableIfLoaderBecomesActive()
7393 #region BaseSpatialObserver Implementation
7494
7595 private XRMeshSubsystem meshSubsystem ;
76-
77- /// <summary>
78- /// Creates the XRMeshSubsystem and handles the desired startup behavior.
79- /// </summary>
80- protected override void CreateObserver ( )
81- {
82- if ( Service == null
96+ private XRMeshSubsystem MeshSubsystem => meshSubsystem != null && meshSubsystem . running
97+ ? meshSubsystem :
8398#if XR_MANAGEMENT_ENABLED
84- || XRGeneralSettings . Instance == null || XRGeneralSettings . Instance . Manager == null || XRGeneralSettings . Instance . Manager . activeLoader == null
85- #endif // XR_MANAGEMENT_ENABLED
86- ) { return ; }
87-
88- #if XR_MANAGEMENT_ENABLED
89- meshSubsystem = XRGeneralSettings . Instance . Manager . activeLoader . GetLoadedSubsystem < XRMeshSubsystem > ( ) ;
99+ meshSubsystem = IsActiveLoader ?? false
100+ ? XRGeneralSettings . Instance . Manager . activeLoader . GetLoadedSubsystem < XRMeshSubsystem > ( )
101+ : null ;
90102#else
91103 meshSubsystem = XRSubsystemHelpers . MeshSubsystem ;
92104#endif // XR_MANAGEMENT_ENABLED
93105
94- if ( meshSubsystem != null )
95- {
96- ConfigureObserverVolume ( ) ;
97- }
98- }
99-
100106 /// <summary>
101107 /// Implements proper cleanup of the SurfaceObserver.
102108 /// </summary>
@@ -119,15 +125,15 @@ protected override int LookupTriangleDensity(SpatialAwarenessMeshLevelOfDetail l
119125 {
120126 // For non-custom levels, the enum value is the appropriate triangles per cubic meter.
121127 int level = ( int ) levelOfDetail ;
122- if ( meshSubsystem != null )
128+ if ( MeshSubsystem != null )
123129 {
124130 if ( levelOfDetail == SpatialAwarenessMeshLevelOfDetail . Unlimited )
125131 {
126- meshSubsystem . meshDensity = 1 ;
132+ MeshSubsystem . meshDensity = 1 ;
127133 }
128134 else
129135 {
130- meshSubsystem . meshDensity = level / ( float ) SpatialAwarenessMeshLevelOfDetail . Fine ; // For now, map Coarse to 0.0 and Fine to 1.0
136+ MeshSubsystem . meshDensity = level / ( float ) SpatialAwarenessMeshLevelOfDetail . Fine ; // For now, map Coarse to 0.0 and Fine to 1.0
131137 }
132138 }
133139 return level ;
@@ -215,9 +221,9 @@ public override void Resume()
215221
216222 using ( ResumePerfMarker . Auto ( ) )
217223 {
218- if ( meshSubsystem != null && ! meshSubsystem . running )
224+ if ( MeshSubsystem != null && ! MeshSubsystem . running )
219225 {
220- meshSubsystem . Start ( ) ;
226+ MeshSubsystem . Start ( ) ;
221227 }
222228
223229 // We want the first update immediately.
@@ -241,9 +247,9 @@ public override void Suspend()
241247
242248 using ( SuspendPerfMarker . Auto ( ) )
243249 {
244- if ( meshSubsystem != null && meshSubsystem . running )
250+ if ( MeshSubsystem != null && MeshSubsystem . running )
245251 {
246- meshSubsystem . Stop ( ) ;
252+ MeshSubsystem . Stop ( ) ;
247253 }
248254
249255 // UpdateObserver keys off of this value to stop observing.
@@ -293,7 +299,7 @@ public override void ClearObservations()
293299 /// </summary>
294300 private void UpdateObserver ( )
295301 {
296- if ( Service == null || meshSubsystem == null ) { return ; }
302+ if ( Service == null || MeshSubsystem == null ) { return ; }
297303
298304 using ( UpdateObserverPerfMarker . Auto ( ) )
299305 {
@@ -325,7 +331,7 @@ private void UpdateObserver()
325331 // The application can update the observer volume at any time, make sure we are using the latest.
326332 ConfigureObserverVolume ( ) ;
327333
328- if ( meshSubsystem . TryGetMeshInfos ( meshInfos ) )
334+ if ( MeshSubsystem . TryGetMeshInfos ( meshInfos ) )
329335 {
330336 UpdateMeshes ( meshInfos ) ;
331337 }
@@ -368,7 +374,7 @@ private void RequestMesh(MeshId meshId)
368374 newMesh . GameObject . SetActive ( true ) ;
369375 }
370376
371- meshSubsystem . GenerateMeshAsync ( meshId , newMesh . Filter . mesh , newMesh . Collider , MeshVertexAttributes . Normals , ( MeshGenerationResult meshGenerationResult ) => MeshGenerationAction ( meshGenerationResult ) ) ;
377+ MeshSubsystem . GenerateMeshAsync ( meshId , newMesh . Filter . mesh , newMesh . Collider , MeshVertexAttributes . Normals , ( MeshGenerationResult meshGenerationResult ) => MeshGenerationAction ( meshGenerationResult ) ) ;
372378 outstandingMeshObject = newMesh ;
373379 }
374380 }
@@ -439,7 +445,7 @@ protected void ReclaimMeshObject(SpatialAwarenessMeshObject availableMeshObject)
439445 /// </summary>
440446 protected virtual void ConfigureObserverVolume ( )
441447 {
442- if ( meshSubsystem == null
448+ if ( MeshSubsystem == null
443449 || ( oldObserverOrigin == ObserverOrigin
444450 && oldObservationExtents == ObservationExtents
445451 && oldObserverVolumeType == ObserverVolumeType ) )
@@ -453,7 +459,7 @@ protected virtual void ConfigureObserverVolume()
453459 switch ( ObserverVolumeType )
454460 {
455461 case VolumeType . AxisAlignedCube :
456- meshSubsystem . SetBoundingVolume ( ObserverOrigin , ObservationExtents ) ;
462+ MeshSubsystem . SetBoundingVolume ( ObserverOrigin , ObservationExtents ) ;
457463 break ;
458464
459465 default :
@@ -590,7 +596,7 @@ public override void Initialize()
590596 {
591597 base . Initialize ( ) ;
592598
593- if ( Service == null || meshSubsystem == null ) { return ; }
599+ if ( Service == null || MeshSubsystem == null ) { return ; }
594600
595601 if ( RuntimeSpatialMeshPrefab != null )
596602 {
0 commit comments