private void Start() { // Start scanning with the SpatialUnderstanding module m_state = State.Scanning; m_spatialMappingManager = SpatialMappingManager.Instance; if (!m_spatialMappingManager.IsObserverRunning()) { m_spatialMappingManager.StartObserver(); } if (visualizeSpatialMesh && spatialMeshVisibleMaterial != null) { m_spatialMappingManager.SetSurfaceMaterial(spatialMeshVisibleMaterial); m_spatialMappingManager.DrawVisualMeshes = true; } m_spatialUnderstanding = SpatialUnderstanding.Instance; m_spatialUnderstanding.ScanStateChanged += OnScanStateChanged; m_spatialUnderstanding.RequestBeginScanning(); // Subscribe to tap gesture m_gestureRecognizer = new GestureRecognizer(); m_gestureRecognizer.SetRecognizableGestures(GestureSettings.Tap); m_gestureRecognizer.TappedEvent += OnTapEvent; m_gestureRecognizer.StartCapturingGestures(); // Pin the query results memory and get a native pointer m_queryResultsPtr = SpatialUnderstanding.Instance.UnderstandingDLL.PinObject(m_queryResults); }
public void 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_spatialUnderstandingState = SpatialUnderstandingState.Scanning; m_spatialMappingManager.SetSurfaceMaterial(renderingMaterial); }
// Update is called once per frame void Update() { if (finished) { return; } if (spatialUnderstanding.ScanState == SpatialUnderstanding.ScanStates.None) { mappingManager.StartObserver(); spatialUnderstanding.RequestBeginScanning(); } }
//TODO: if time limited, take an optional callback public void StartScanning() { // Start spatial mapping (SpatialUnderstanding requires this, too) if (!m_spatialMappingManager.IsObserverRunning()) { m_spatialMappingManager.StartObserver(); } // If we are only using spatial mapping, visualize the meshes during the scanning // phase if (useSpatialUnderstanding) { m_spatialMappingManager.DrawVisualMeshes = visualizeSpatialMeshes; m_spatialUnderstanding.ScanStateChanged += OnScanStateChanged; m_spatialUnderstanding.RequestBeginScanning(); m_spatialUnderstandingState = SpatialUnderstandingState.Scanning; } else { m_spatialMappingManager.DrawVisualMeshes = true; } m_spatialMappingManager.SetSurfaceMaterial(renderingMaterial); }
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; }