< Summary

Class:DCL.WorldSceneObjectsTrackingHelper
Assembly:DataStore_Rendering_Extensions
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/DataStore_Rendering_Extensions/WorldSceneObjectsTrackingHelper.cs
Covered lines:42
Uncovered lines:5
Coverable lines:47
Total lines:112
Line coverage:89.3% (42 of 47)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
WorldSceneObjectsTrackingHelper()0%330100%
WorldSceneObjectsTrackingHelper(...)0%2.012088.89%
OnSceneRemoved(...)0%2.032080%
OnSceneAdded(...)0%2.032080%
SetSceneData(...)0%3.013090.91%
OnRenderedObjectsRemoved(...)0%220100%
OnRenderedObjectsAdded(...)0%220100%
Dispose()0%220100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/DataStore_Rendering_Extensions/WorldSceneObjectsTrackingHelper.cs

#LineLine coverage
 1using System;
 2using UnityEngine;
 3using UnityEngine.Assertions;
 4
 5namespace DCL
 6{
 7    /// <summary>
 8    /// This class wraps around the DataStore's DataStore_WorldObjects instance.
 9    ///
 10    /// The DataStore_WorldObjects scene data objects must be removed aggressively when the
 11    /// DataStore_WorldObjects.SceneData is empty, right after the last object is removed.
 12    ///
 13    /// The DataStore_WorldObjects.SceneData objects can't be removed just when the scene is
 14    /// unloaded because the underlying assets are removed lazily (i.e. by ParcelScenesCleaner).
 15    ///
 16    /// This helper ensures that any events persist even in the case of the scene being removed and then
 17    /// added due to the last object being removed and then added again.
 18    /// </summary>
 19    public class WorldSceneObjectsTrackingHelper : IDisposable
 20    {
 121        private static bool VERBOSE = false;
 122        private static ILogger logger = new Logger(Debug.unityLogger.logHandler) { filterLogType = VERBOSE ? LogType.Log
 23
 024        public DataStore.DataStore_WorldObjects.SceneData sceneData { get; private set; }
 25        public event Action<Rendereable> OnWillAddRendereable;
 26        public event Action<Rendereable> OnWillRemoveRendereable;
 27
 28        private string sceneId;
 29        private DataStore dataStore;
 30
 70431        public WorldSceneObjectsTrackingHelper (DataStore dataStore, string sceneId)
 32        {
 70433            logger.Log("A wild WorldSceneObjectsTrackingHelper appears!");
 70434            this.dataStore = dataStore;
 70435            this.sceneId = sceneId;
 36
 70437            if (dataStore.sceneWorldObjects.sceneData.ContainsKey(sceneId))
 038                SetSceneData(dataStore.sceneWorldObjects.sceneData[sceneId]);
 39
 70440            dataStore.sceneWorldObjects.sceneData.OnAdded += OnSceneAdded;
 70441            dataStore.sceneWorldObjects.sceneData.OnRemoved += OnSceneRemoved;
 70442        }
 43
 44        private void OnSceneRemoved(string sceneId, DataStore.DataStore_WorldObjects.SceneData arg2)
 45        {
 20546            if ( sceneId != this.sceneId )
 047                return;
 48
 49            // Set dummy scene data so null reference exceptions are avoided.
 20550            logger.Log($"Scene {sceneId} was removed! Using dummy scene data.");
 20551            SetSceneData( new DataStore.DataStore_WorldObjects.SceneData() );
 20552        }
 53
 54        private void OnSceneAdded(string sceneId, DataStore.DataStore_WorldObjects.SceneData sceneData)
 55        {
 21356            if ( sceneId != this.sceneId )
 057                return;
 58
 21359            logger.Log($"Scene {sceneId} was added!");
 21360            SetSceneData( sceneData );
 21361        }
 62
 63        private void SetSceneData(DataStore.DataStore_WorldObjects.SceneData sceneData)
 64        {
 41865            Assert.IsNotNull(sceneData, "sceneData should never be null!");
 66
 41867            if ( sceneData == this.sceneData )
 068                return;
 69
 41870            if ( this.sceneData != null )
 71            {
 72                // This should never happen because of how the flow works.
 73                //
 74                // Scenes with the same sceneId shouldn't ever be added twice, and if this happens
 75                // we have an early exit.
 26176                this.sceneData.renderedObjects.OnAdded -= OnRenderedObjectsAdded;
 26177                this.sceneData.renderedObjects.OnRemoved -= OnRenderedObjectsRemoved;
 78            }
 79
 41880            logger.Log($"Subscribing events for {sceneId}.");
 41881            sceneData.renderedObjects.OnAdded += OnRenderedObjectsAdded;
 41882            sceneData.renderedObjects.OnRemoved += OnRenderedObjectsRemoved;
 83
 41884            this.sceneData = sceneData;
 41885        }
 86
 87        private void OnRenderedObjectsRemoved(Rendereable rendereable)
 88        {
 27389            logger.Log($"Removing rendereable.");
 27390            OnWillRemoveRendereable?.Invoke(rendereable);
 10191        }
 92
 93        private void OnRenderedObjectsAdded(Rendereable rendereable)
 94        {
 28095            logger.Log($"Adding rendereable.");
 28096            OnWillAddRendereable?.Invoke(rendereable);
 28097        }
 98
 99        public void Dispose()
 100        {
 704101            if ( sceneData == null )
 547102                return;
 103
 157104            sceneData.renderedObjects.OnAdded -= OnRenderedObjectsAdded;
 157105            sceneData.renderedObjects.OnRemoved -= OnRenderedObjectsRemoved;
 106
 157107            dataStore.sceneWorldObjects.sceneData.OnAdded -= OnSceneAdded;
 157108            dataStore.sceneWorldObjects.sceneData.OnRemoved -= OnSceneRemoved;
 157109            logger.Log($"Disposing.");
 157110        }
 111    }
 112}