/// <summary> /// Reclaims the <see cref="SpatialAwarenessMeshObject"/> to allow for later reuse. /// </summary> protected void ReclaimMeshObject(SpatialAwarenessMeshObject availableMeshObject) { using (ReclaimMeshObjectPerfMarker.Auto()) { if (spareMeshObject == null) { // Cleanup the mesh object. // Do not destroy the game object, destroy the meshes. SpatialAwarenessMeshObject.Cleanup(availableMeshObject, false); if (availableMeshObject.GameObject != null) { availableMeshObject.GameObject.name = "Unused Spatial Mesh"; availableMeshObject.GameObject.SetActive(false); } spareMeshObject = availableMeshObject; } else { // Cleanup the mesh object. // Destroy the game object, destroy the meshes. SpatialAwarenessMeshObject.Cleanup(availableMeshObject); } } }
/// <summary> /// Removes an observation. /// </summary> private void RemoveMeshObject(int meshId) { if (meshes.TryGetValue(meshId, out SpatialAwarenessMeshObject meshObject)) { // Remove the mesh object from the collection. meshes.Remove(meshId); if (meshObject != null) { SpatialAwarenessMeshObject.Cleanup(meshObject); } // Send the mesh removed event meshEventData.Initialize(this, meshId, null); SpatialAwarenessSystem?.HandleEvent(meshEventData, OnMeshRemoved); } }
/// <inheritdoc /> public override void ClearObservations() { using (ClearObservationsPerfMarker.Auto()) { bool wasRunning = false; if (IsRunning) { wasRunning = true; Debug.Log("Cannot clear observations while the observer is running. Suspending this observer."); Suspend(); } IReadOnlyList <int> observations = new List <int>(Meshes.Keys); foreach (int meshId in observations) { RemoveMeshObject(meshId); } // Cleanup the outstanding mesh object. if (outstandingMeshObject != null) { // Destroy the game object, destroy the meshes. SpatialAwarenessMeshObject.Cleanup(outstandingMeshObject); outstandingMeshObject = null; } // Cleanup the spare mesh object if (spareMeshObject != null) { // Destroy the game object, destroy the meshes. SpatialAwarenessMeshObject.Cleanup(spareMeshObject); spareMeshObject = null; } if (wasRunning) { Resume(); } } }
/// <summary> /// Cleans up the objects created during observation. /// </summary> private void CleanupObservedObjects() { if (Application.isPlaying) { // Cleanup the scene objects are managing if (observedObjectParent != null) { observedObjectParent.transform.DetachChildren(); } foreach (SpatialAwarenessMeshObject meshObject in meshes.Values) { if (meshObject != null) { // Destroy the game object, destroy the meshes. SpatialAwarenessMeshObject.Cleanup(meshObject); } } meshes.Clear(); // Cleanup the outstanding mesh object. if (outstandingMeshObject != null) { // Destroy the game object, destroy the meshes. SpatialAwarenessMeshObject.Cleanup(outstandingMeshObject); outstandingMeshObject = null; } // Cleanup the spare mesh object if (spareMeshObject != null) { // Destroy the game object, destroy the meshes. SpatialAwarenessMeshObject.Cleanup(spareMeshObject); spareMeshObject = null; } } }