private void Update() { UnityEditorUpdate(); if (m_state == State.FinalizeScan) { if (!m_spatialUnderstanding.ScanStatsReportStillWorking) { Debug.Log("Finalizing scan..."); m_state = State.WaitingForScanCompletion; m_spatialUnderstanding.RequestFinishScan(); } //TODO: timeout and error handling? } else if (m_state == State.WaitingForMeshImport) { if (m_spatialUnderstanding.UnderstandingCustomMesh.IsImportActive == false) { Debug.Log("Found " + m_spatialUnderstanding.UnderstandingCustomMesh.GetMeshFilters().Count + " meshes (import active=" + m_spatialUnderstanding.UnderstandingCustomMesh.IsImportActive + ")"); HideSpatialMesh(); SetSpatialUnderstandingMaterial(spatialUnderstandingOcclusionMaterial); SurfacePlaneDeformationManager.Instance.SetSpatialMeshFilters(m_spatialUnderstanding.UnderstandingCustomMesh.GetMeshFilters()); //QueryFloorPositions(); m_state = State.Playing; } //TODO: timeout? } else if (m_state == State.Playing) { } }
private void Update() { if (m_scanningComplete) { return; } switch (m_spatialUnderstandingState) { case SpatialUnderstandingState.FinalizeScan: //TODO: timeout? if (!m_spatialUnderstanding.ScanStatsReportStillWorking) { Debug.Log("Finalizing scan..."); m_spatialUnderstanding.RequestFinishScan(); m_spatialUnderstandingState = SpatialUnderstandingState.WaitingForScanCompletion; } break; case SpatialUnderstandingState.WaitingForMeshImport: //TODO: timeout? if (m_spatialUnderstanding.UnderstandingCustomMesh.IsImportActive == false) { Debug.Log("Found " + m_spatialUnderstanding.UnderstandingCustomMesh.GetMeshFilters().Count + " meshes (import active=" + m_spatialUnderstanding.UnderstandingCustomMesh.IsImportActive + ")"); if (!visualizeSpatialMeshes) { HideSpatialMappingMeshes(); } if (!visualizeSpatialUnderstandingMeshes) { SetSpatialUnderstandingMaterial(occlusionMaterial); } SurfacePlaneDeformationManager.Instance.SetSpatialMeshFilters(m_spatialUnderstanding.UnderstandingCustomMesh.GetMeshFilters()); m_spatialUnderstandingState = SpatialUnderstandingState.WaitingForPlacementSolverInit; } break; case SpatialUnderstandingState.WaitingForPlacementSolverInit: //TODO: error checking and timeout? if (!m_placementSolverInitialized) { m_placementSolverInitialized = (SpatialUnderstandingDllObjectPlacement.Solver_Init() == 1); Debug.Log("Placement Solver initialization " + (m_placementSolverInitialized ? "succeeded" : "FAILED")); if (m_placementSolverInitialized) { if (OnScanComplete != null) { OnScanComplete(); } m_scanningComplete = true; m_spatialUnderstandingState = SpatialUnderstandingState.Finished; } } break; default: break; } }
void OnTapped() { if (finished) { return; } Debug.Log("scan finish"); finished = true; mappingManager.StopObserver(); spatialUnderstanding.RequestFinishScan(); recognizer.StopCapturingGestures(); customMesh.DrawProcessedMesh = false; }
private void Update() { if (m_scanningComplete) { return; } SpatialUnderstandingDll.Imports.PlayspaceStats stats; switch (m_spatialUnderstandingState) { case State.StartScanning: // Start spatial mapping (SpatialUnderstanding requires this, too) if (!m_spatialMappingManager.IsObserverRunning()) { m_spatialMappingManager.StartObserver(); } m_spatialMappingManager.DrawVisualMeshes = visualizeSpatialMeshes; m_spatialUnderstanding.ScanStateChanged += OnScanStateChanged; m_spatialUnderstanding.RequestBeginScanning(); m_spatialMappingManager.SetSurfaceMaterial(renderingMaterial); m_spatialUnderstandingState = State.Scanning; break; case State.Scanning: if (GetStats(out stats)) { Debug.Log("NumFloor=" + stats.NumFloor + ", NumWallX-=" + stats.NumWall_XNeg + ", NumWallX+=" + stats.NumWall_XPos + ", NumWallZ-=" + stats.NumWall_ZNeg + ", NumWallZ+=" + stats.NumWall_ZPos); } break; case State.FinalizeScan: //TODO: timeout? // Note: this is pretty subtle -- ScanStatsReportStillWorking is *not* // automatically updated. It reuses a cached object. GetStats() will // fetch the latest object by calling the appropriate query function. GetStats(out stats); if (!m_spatialUnderstanding.ScanStatsReportStillWorking) { Debug.Log("Finalizing scan..."); m_spatialUnderstanding.RequestFinishScan(); m_spatialUnderstandingState = State.WaitingForScanCompletion; } break; case State.WaitingForMeshImport: //TODO: timeout? if (m_spatialUnderstanding.UnderstandingCustomMesh.IsImportActive == false) { List <MeshFilter> meshFilters = m_spatialUnderstanding.UnderstandingCustomMesh.GetMeshFilters(); Debug.Log("Found " + meshFilters.Count + " meshes (import active=" + m_spatialUnderstanding.UnderstandingCustomMesh.IsImportActive + ")"); if (!visualizeSpatialMeshes) { DisableSpatialMappingMeshes(); } ApplyVisualizationSettings(); //SurfacePlaneDeformationManager.Instance.SetSpatialMeshFilters(meshFilters); if (buildNavMesh) { m_navMeshBuilder.AddSourceMeshes(meshFilters, m_spatialUnderstanding.transform); } m_spatialUnderstandingState = State.WaitingForPlacementSolverInit; } break; case State.WaitingForPlacementSolverInit: //TODO: error checking and timeout? bool navMeshFinished = !buildNavMesh || (buildNavMesh && m_navMeshBuilder.isFinished); if (!m_solverInitCalled) { m_solverInitCalled = true; StartCoroutine(InitSolverCoroutine()); if (buildNavMesh) { m_navMeshBuilder.BuildAsync(); } } else if (m_solverInitialized && navMeshFinished) { ApplyStaticBatching(); m_scanningComplete = true; m_spatialUnderstandingState = State.Finished; if (OnScanComplete != null) { OnScanComplete(); } } break; default: break; } }
private void Update() { if (m_scanningComplete) { return; } switch (m_spatialUnderstandingState) { case SpatialUnderstandingState.StartScanning: // Start spatial mapping (SpatialUnderstanding requires this, too) if (!m_spatialMappingManager.IsObserverRunning()) { m_spatialMappingManager.StartObserver(); } m_spatialMappingManager.DrawVisualMeshes = visualizeSpatialMeshes; m_spatialUnderstanding.ScanStateChanged += OnScanStateChanged; m_spatialUnderstanding.RequestBeginScanning(); m_spatialMappingManager.SetSurfaceMaterial(renderingMaterial); m_spatialUnderstandingState = SpatialUnderstandingState.Scanning; break; case SpatialUnderstandingState.FinalizeScan: //TODO: timeout? if (!m_spatialUnderstanding.ScanStatsReportStillWorking) { Debug.Log("Finalizing scan..."); m_spatialUnderstanding.RequestFinishScan(); m_spatialUnderstandingState = SpatialUnderstandingState.WaitingForScanCompletion; } break; case SpatialUnderstandingState.WaitingForMeshImport: //TODO: timeout? if (m_spatialUnderstanding.UnderstandingCustomMesh.IsImportActive == false) { Debug.Log("Found " + m_spatialUnderstanding.UnderstandingCustomMesh.GetMeshFilters().Count + " meshes (import active=" + m_spatialUnderstanding.UnderstandingCustomMesh.IsImportActive + ")"); if (!visualizeSpatialMeshes) { DisableSpatialMappingMeshes(); } ApplyVisualizationSettings(); //SurfacePlaneDeformationManager.Instance.SetSpatialMeshFilters(m_spatialUnderstanding.UnderstandingCustomMesh.GetMeshFilters()); m_spatialUnderstandingState = SpatialUnderstandingState.WaitingForPlacementSolverInit; } break; case SpatialUnderstandingState.WaitingForPlacementSolverInit: //TODO: error checking and timeout? if (!m_placementSolverInitialized) { m_placementSolverInitialized = (SpatialUnderstandingDllObjectPlacement.Solver_Init() == 1); Debug.Log("Placement Solver initialization " + (m_placementSolverInitialized ? "succeeded" : "FAILED")); if (m_placementSolverInitialized) { if (OnScanComplete != null) { OnScanComplete(); } m_scanningComplete = true; m_spatialUnderstandingState = SpatialUnderstandingState.Finished; } } break; default: break; } }
static IEnumerator DoMapping() { if (SpatialInfoReady) { WorldErrors.Print("Spatial Info Already There"); yield break; } //turn off rendering if we're not scanning, store old mode UnityEngine.XR.WSA.SpatialMappingRenderer smRend = FindObjectOfType <UnityEngine.XR.WSA.SpatialMappingRenderer>(); UnityEngine.XR.WSA.SpatialMappingRenderer.RenderState oldState = UnityEngine.XR.WSA.SpatialMappingRenderer.RenderState.Occlusion; if (smRend != null) { oldState = smRend.renderState; smRend.renderState = UnityEngine.XR.WSA.SpatialMappingRenderer.RenderState.None; } running = true; //is there an instance present? SpatialUnderstanding puInst = SpatialUnderstanding.Instance; if (puInst == null || !puInst.AllowSpatialUnderstanding) { Debug.LogError("No Spatial Understanding Instance, or not supported in build."); WorldErrors.Print("No Instance"); yield break; } //can it scan? while (!SpatialUnderstanding.IsInitialized) { WorldErrors.Print("Not initialized"); yield return(null); } puInst.UnderstandingCustomMesh.DrawProcessedMesh = true; bool requestedFinish = false; WorldErrors.Print("" + puInst.AutoBeginScanning + ", " + puInst.ScanState); if (!puInst.AutoBeginScanning && (puInst.ScanState == SpatialUnderstanding.ScanStates.ReadyToScan || puInst.ScanState == SpatialUnderstanding.ScanStates.None || puInst.ScanState == SpatialUnderstanding.ScanStates.Done)) { WorldErrors.Print("Request Begin Scan"); puInst.RequestBeginScanning(); } //yield until scan automatically finishes, or it is stopped, or time runs out while (puInst.ScanState != SpatialUnderstanding.ScanStates.Done) { timer += Time.deltaTime; if (!requestedFinish && timer > targetTime) { puInst.RequestFinishScan(); requestedFinish = true; puInst.UnderstandingCustomMesh.DrawProcessedMesh = false; } yield return(null); } //signal we're ready to share data SpatialInfoReady = true; if (ready != null) { ready(); } //reset rendering again if we have a mapping renderer if (smRend != null) { smRend.renderState = oldState; } running = false; }