Skip to content

Commit 8201d76

Browse files
committed
Fix issues associated with the new SU package
1 parent c08cd63 commit 8201d76

File tree

3 files changed

+43
-21
lines changed

3 files changed

+43
-21
lines changed

Assets/MRTK/Providers/Experimental/WindowsSceneUnderstanding/Editor/WindowsSceneUnderstandingConfigChecker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace Microsoft.MixedReality.Toolkit.WindowsSceneUnderstanding.Experimental
1212
/// </summary>
1313
static class WindowsSceneUnderstandingConfigurationChecker
1414
{
15-
private const string FileName = "Microsoft.MixedReality.SceneUnderstanding.DotNet.dll";
15+
private const string FileName = "Microsoft.MixedReality.SceneUnderstanding.dll";
1616
private static readonly string[] definitions = { "SCENE_UNDERSTANDING_PRESENT" };
1717

1818
/// <summary>

Assets/MRTK/Providers/Experimental/WindowsSceneUnderstanding/MRTK.WSU.asmdef

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
"references": [
44
"Microsoft.MixedReality.Toolkit",
55
"Microsoft.MixedReality.Toolkit.Async",
6-
"Microsoft.MixedReality.Toolkit.Providers.WindowsMixedReality.Shared"
6+
"Microsoft.MixedReality.Toolkit.Providers.WindowsMixedReality.Shared",
7+
"Microsoft.MixedReality.SceneUnderstanding.Projections.Editor",
8+
"Microsoft.MixedReality.SceneUnderstanding.Projections.WSA"
79
],
810
"optionalUnityReferences": [],
911
"includePlatforms": [
@@ -15,5 +17,13 @@
1517
"overrideReferences": false,
1618
"precompiledReferences": [],
1719
"autoReferenced": true,
18-
"defineConstraints": []
20+
"defineConstraints": [],
21+
"versionDefines": [
22+
{
23+
"name": "com.microsoft.mixedreality.sceneunderstanding",
24+
"expression": "",
25+
"define": "SCENE_UNDERSTANDING_PRESENT"
26+
}
27+
],
28+
"noEngineReferences": false
1929
}

Assets/MRTK/Providers/Experimental/WindowsSceneUnderstanding/WindowsSceneUnderstandingObserver.cs

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -97,25 +97,33 @@ private void ReadProfile()
9797
OrientScene = profile.OrientScene;
9898
}
9999

100-
#if SCENE_UNDERSTANDING_PRESENT
101-
102100
#region IMixedRealityService
103101

102+
#if SCENE_UNDERSTANDING_PRESENT
103+
104104
/// <inheritdoc />
105105
public override void Reset()
106106
{
107107
CleanupObserver();
108108
Initialize();
109109
}
110110

111+
#endif // SCENE_UNDERSTANDING_PRESENT
112+
111113
/// <inheritdoc />
112114
public override void Initialize()
113115
{
114116
base.Initialize();
117+
#if !SCENE_UNDERSTANDING_PRESENT
118+
if (Application.isPlaying)
119+
{
120+
Debug.LogWarning("The required package Microsoft.MixedReality.SceneUnderstanding is not installed or properly configured. Please visit https://docs.microsoft.com/windows/mixed-reality/mrtk-unity/features/spatial-awareness/scene-understanding for more information.");
121+
}
122+
#else
115123
sceneEventData = new MixedRealitySpatialAwarenessEventData<SpatialAwarenessSceneObject>(EventSystem.current);
116124
CreateQuadFromExtents(normalizedQuadMesh, 1, 1);
117125

118-
var accessStatus = SceneObserver.RequestAccessAsync().GetAwaiter().GetResult();
126+
SceneObserverAccessStatus accessStatus = Task.Run(RequestAccess).GetAwaiter().GetResult();
119127
if (accessStatus == SceneObserverAccessStatus.Allowed)
120128
{
121129
IsRunning = true;
@@ -131,18 +139,18 @@ public override void Initialize()
131139
{
132140
observerState = ObserverState.GetScene;
133141
}
142+
#endif // SCENE_UNDERSTANDING_PRESENT
134143
}
135144

145+
#if SCENE_UNDERSTANDING_PRESENT
146+
136147
/// <inheritdoc />
137148
public override void Enable()
138149
{
139150
// Terminate the background thread when we stop in editor.
140151
cancelToken = cancelTokenSource.Token;
141152

142-
// there is odd behavior with WaitForBackgroundTask
143-
// it will sometimes run on the main thread unless we start it this way
144-
task = RunObserverAsync(cancelToken);
145-
task.ConfigureAwait(true);
153+
task = Task.Run(() => RunObserverAsync(cancelToken));
146154
}
147155

148156
/// <inheritdoc />
@@ -171,8 +179,12 @@ public override void Destroy()
171179
CleanupObserver();
172180
}
173181

182+
#endif // SCENE_UNDERSTANDING_PRESENT
183+
174184
#endregion IMixedRealityService
175185

186+
#if SCENE_UNDERSTANDING_PRESENT
187+
176188
#region BaseService
177189

178190
/// <inheritdoc />
@@ -280,7 +292,7 @@ public IReadOnlyDictionary<int, SpatialAwarenessSceneObject> SceneObjects
280292
public void SaveScene(string filenamePrefix)
281293
{
282294
#if WINDOWS_UWP && SCENE_UNDERSTANDING_PRESENT
283-
SaveToFile(filenamePrefix);
295+
Task.Run(() => SaveToFile(filenamePrefix));
284296
#else // WINDOWS_UWP
285297
Debug.LogWarning("SaveScene() only supported at runtime! Ignoring request.");
286298
#endif // WINDOWS_UWP
@@ -523,6 +535,11 @@ protected virtual void SendSceneObjectRemoved(int id)
523535
SpatialAwarenessSystem?.HandleEvent(sceneEventData, OnSceneObjectRemoved);
524536
}
525537

538+
private async Task<SceneObserverAccessStatus> RequestAccess()
539+
{
540+
return await SceneObserver.RequestAccessAsync();
541+
}
542+
526543
/// <summary>
527544
/// Sets up and starts update timers
528545
/// </summary>
@@ -630,7 +647,7 @@ private async Task RunObserverAsync(CancellationToken cancellationToken)
630647
}
631648
await new WaitForBackgroundThread();
632649
{
633-
scene = GetSceneAsync(previousScene);
650+
scene = await GetSceneAsync(previousScene);
634651
previousScene = scene;
635652
sceneOriginId = scene.OriginSpatialGraphNodeId;
636653
}
@@ -761,7 +778,7 @@ private System.Numerics.Matrix4x4 GetSceneToWorldTransform()
761778
/// </summary>
762779
/// <param name="previousScene">The previous scene</param>
763780
/// <returns>The retrieved scene</returns>
764-
private Scene GetSceneAsync(Scene previousScene)
781+
private async Task<Scene> GetSceneAsync(Scene previousScene)
765782
{
766783
Scene scene = null;
767784

@@ -795,18 +812,13 @@ private Scene GetSceneAsync(Scene previousScene)
795812
RequestedMeshLevelOfDetail = LevelOfDetailToMeshLOD(WorldMeshLevelOfDetail)
796813
};
797814

798-
// Ideally you'd call SceneObserver.ComputeAsync() like this:
799-
// scene = await SceneObserver.ComputeAsync(...);
800-
// however this has been problematic (buggy?)
801-
// For the time being we force it to be synchronous with the ...GetAwaiter().GetResult() pattern
802-
803815
if (UsePersistentObjects && previousScene != null)
804816
{
805-
scene = SceneObserver.ComputeAsync(sceneQuerySettings, QueryRadius, previousScene).GetAwaiter().GetResult();
817+
scene = await SceneObserver.ComputeAsync(sceneQuerySettings, QueryRadius, previousScene);
806818
}
807819
else
808820
{
809-
scene = SceneObserver.ComputeAsync(sceneQuerySettings, QueryRadius).GetAwaiter().GetResult();
821+
scene = await SceneObserver.ComputeAsync(sceneQuerySettings, QueryRadius);
810822
}
811823
}
812824

@@ -1301,7 +1313,7 @@ private async void SaveToFile(string prefix)
13011313
RequestedMeshLevelOfDetail = LevelOfDetailToMeshLOD(WorldMeshLevelOfDetail)
13021314
};
13031315

1304-
var serializedScene = SceneObserver.ComputeSerializedAsync(sceneQuerySettings, QueryRadius).GetAwaiter().GetResult();
1316+
var serializedScene = await SceneObserver.ComputeSerializedAsync(sceneQuerySettings, QueryRadius);
13051317
var bytes = new byte[serializedScene.Size];
13061318
serializedScene.GetData(bytes);
13071319
var timestamp = DateTime.Now.ToString("yyyyMMdd_hhmmss");

0 commit comments

Comments
 (0)