7 using System.Collections.Generic;
8 using System.Runtime.InteropServices;
11 namespace HoloToolkit.Examples.SpatialUnderstandingFeatureOverview
27 private struct QueryStatus
41 public int CountSuccess;
45 private struct PlacementQuery
47 public PlacementQuery(
49 List<SpatialUnderstandingDllObjectPlacement.ObjectPlacementRule> placementRules = null,
50 List<SpatialUnderstandingDllObjectPlacement.ObjectPlacementConstraint> placementConstraints = null)
52 PlacementDefinition = placementDefinition;
53 PlacementRules = placementRules;
54 PlacementConstraints = placementConstraints;
62 private class PlacementResult
66 Box =
new AnimatedBox(timeDelay, result.Position, Quaternion.LookRotation(result.Forward, result.Up), Color.blue, result.HalfDims);
75 public bool IsSolverInitialized {
get;
private set; }
78 private List<PlacementResult> placementResults =
new List<PlacementResult>();
79 private QueryStatus queryStatus =
new QueryStatus();
89 placementResults.Clear();
102 private bool Draw_PlacementResults()
104 bool needsUpdate =
false;
106 for (
int i = 0; i < placementResults.Count; ++i)
108 needsUpdate |= Draw_AnimatedBox(placementResults[i].Box);
114 private bool PlaceObjectAsync(
115 string placementName,
117 List<SpatialUnderstandingDllObjectPlacement.ObjectPlacementRule> placementRules = null,
118 List<SpatialUnderstandingDllObjectPlacement.ObjectPlacementConstraint> placementConstraints = null,
119 bool clearObjectsFirst =
true)
121 return PlaceObjectAsync(
123 new List<PlacementQuery>() {
new PlacementQuery(placementDefinition, placementRules, placementConstraints) },
127 private bool PlaceObjectAsync(
128 string placementName,
129 List<PlacementQuery> placementList,
130 bool clearObjectsFirst =
true)
139 if (clearObjectsFirst)
147 queryStatus.Name = placementName;
150 AppState.
Instance.ObjectPlacementDescription = placementName +
" (processing)";
153 #if UNITY_EDITOR || !UNITY_WSA 154 new System.Threading.Thread
156 System.Threading.Tasks.Task.Run
161 for (
int i = 0; i < placementList.Count; ++i)
164 bool success = PlaceObject(
166 placementList[i].PlacementDefinition,
167 placementList[i].PlacementRules,
168 placementList[i].PlacementConstraints,
173 queryStatus.CountSuccess = success ? (queryStatus.CountSuccess + 1) : queryStatus.CountSuccess;
174 queryStatus.CountFail = !success ? (queryStatus.CountFail + 1) : queryStatus.CountFail;
181 #
if UNITY_EDITOR || !UNITY_WSA
189 private bool PlaceObject(
190 string placementName,
192 List<SpatialUnderstandingDllObjectPlacement.ObjectPlacementRule> placementRules = null,
193 List<SpatialUnderstandingDllObjectPlacement.ObjectPlacementConstraint> placementConstraints = null,
194 bool clearObjectsFirst =
true,
195 bool isASync =
false)
198 if (!isASync && clearObjectsFirst)
211 (placementRules != null) ? placementRules.Count : 0,
212 ((placementRules != null) && (placementRules.Count > 0)) ?
SpatialUnderstanding.
Instance.UnderstandingDLL.PinObject(placementRules.ToArray()) : IntPtr.Zero,
213 (placementConstraints != null) ? placementConstraints.Count : 0,
214 ((placementConstraints != null) && (placementConstraints.Count > 0)) ?
SpatialUnderstanding.
Instance.UnderstandingDLL.PinObject(placementConstraints.ToArray()) : IntPtr.Zero,
238 private void ProcessPlacementResults()
258 for (
int i = 0; i < queryStatus.QueryResult.Count; ++i)
260 if ((queryStatus.QueryResult[i].Position.y < alignment.CeilingYValue) &&
261 (queryStatus.QueryResult[i].Position.y > alignment.FloorYValue))
269 AppState.
Instance.ObjectPlacementDescription = queryStatus.Name +
" (" + placementResults.Count +
"/" + (queryStatus.CountSuccess + queryStatus.CountFail) +
")";
277 List<PlacementQuery> placementQuery =
new List<PlacementQuery>();
278 for (
int i = 0; i < 4; ++i)
280 float halfDimSize =
UnityEngine.Random.Range(0.15f, 0.35f);
287 PlaceObjectAsync(
"OnFloor", placementQuery);
292 List<PlacementQuery> placementQuery =
new List<PlacementQuery>();
293 for (
int i = 0; i < 6; ++i)
295 float halfDimSize =
UnityEngine.Random.Range(0.3f, 0.6f);
302 PlaceObjectAsync(
"OnWall", placementQuery);
307 List<PlacementQuery> placementQuery =
new List<PlacementQuery>();
308 for (
int i = 0; i < 2; ++i)
310 float halfDimSize =
UnityEngine.Random.Range(0.3f, 0.4f);
317 PlaceObjectAsync(
"OnCeiling", placementQuery);
322 List<PlacementQuery> placementQuery =
new List<PlacementQuery>();
323 for (
int i = 0; i < 8; ++i)
325 float halfDimSize =
UnityEngine.Random.Range(0.05f, 0.1f);
328 new Vector3(halfDimSize, halfDimSize, halfDimSize)),
333 PlaceObjectAsync(
"OnEdge", placementQuery);
340 List<PlacementQuery> placementQuery =
new List<PlacementQuery>();
341 for (
int i = 0; i < 4; ++i)
343 float halfDimSize =
UnityEngine.Random.Range(0.1f, 0.2f);
346 new Vector3(halfDimSize, (alignment.CeilingYValue - alignment.FloorYValue) * 0.5f, halfDimSize)),
351 PlaceObjectAsync(
"OnFloorAndCeiling", placementQuery);
356 List<PlacementQuery> placementQuery =
new List<PlacementQuery>();
357 for (
int i = 0; i < 8; ++i)
359 float halfDimSize =
UnityEngine.Random.Range(0.1f, 0.2f);
367 PlaceObjectAsync(
"RandomInAir - AwayFromMe", placementQuery);
372 List<PlacementQuery> placementQuery =
new List<PlacementQuery>();
373 for (
int i = 0; i < 4; ++i)
375 float halfDimSize =
UnityEngine.Random.Range(0.05f, 0.1f);
385 PlaceObjectAsync(
"OnEdge - NearCenter", placementQuery);
391 List<PlacementQuery> placementQuery =
new List<PlacementQuery>();
392 for (
int i = 0; i < 4; ++i)
394 float halfDimSize =
UnityEngine.Random.Range(0.05f, 0.15f);
402 PlaceObjectAsync(
"OnFloor - AwayFromMe", placementQuery);
407 List<PlacementQuery> placementQuery =
new List<PlacementQuery>();
408 for (
int i = 0; i < 4; ++i)
410 float halfDimSize =
UnityEngine.Random.Range(0.05f, 0.2f);
420 PlaceObjectAsync(
"OnFloor - NearMe", placementQuery);
423 private void Update_Queries()
425 if (Input.GetKeyDown(KeyCode.R))
429 if (Input.GetKeyDown(KeyCode.T))
433 if (Input.GetKeyDown(KeyCode.Y))
437 if (Input.GetKeyDown(KeyCode.U))
441 if (Input.GetKeyDown(KeyCode.I))
443 Query_OnFloorAndCeiling();
445 if (Input.GetKeyDown(KeyCode.O))
447 Query_RandomInAir_AwayFromMe();
449 if (Input.GetKeyDown(KeyCode.P))
451 Query_OnEdge_NearCenter();
453 if (Input.GetKeyDown(KeyCode.LeftBracket))
455 Query_OnFloor_AwayFromMe();
457 if (Input.GetKeyDown(KeyCode.RightBracket))
459 Query_OnFloor_NearMe();
465 if (IsSolverInitialized ||
468 return IsSolverInitialized;
473 IsSolverInitialized =
true;
475 return IsSolverInitialized;
478 private void Update()
487 if (!IsSolverInitialized &&
500 ProcessPlacementResults();
506 bool needsUpdate =
false;
507 needsUpdate |= Draw_PlacementResults();
510 LineDraw_End(needsUpdate);