< Summary

Class:DCL.WorldState
Assembly:DCL.Runtime
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/WorldState.cs
Covered lines:107
Uncovered lines:13
Coverable lines:120
Total lines:269
Line coverage:89.1% (107 of 120)
Covered branches:0
Total branches:0
Covered methods:25
Total methods:28
Method coverage:89.2% (25 of 28)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
WorldState()0%110100%
GetCurrentSceneNumber()0%110100%
GetCurrentSceneHash()0%2100%
GetLoadedScenes()0%110100%
GetGlobalScenes()0%2100%
GetScenesSortedByDistance()0%110100%
GetScene(...)0%220100%
GetScene(...)0%110100%
GetPortableExperienceScene(...)0%12300%
ContainsScene(...)0%330100%
TryGetScene(...)0%330100%
TryGetScene[T](...)0%3.033085.71%
GetAllLoadedScenesCoords()0%330100%
GetLoaderForEntity(...)0%4.123050%
GetOrAddLoaderForEntity[T](...)0%220100%
RemoveLoaderForEntity(...)0%330100%
GetSceneNumberByCoords(...)0%2.152066.67%
SortScenesByDistance(...)0%550100%
ForceCurrentScene(...)0%110100%
AddScene(...)0%6.046089.47%
RemoveScene(...)0%550100%
Dispose()0%110100%
Initialize()0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/WorldState.cs

#LineLine coverage
 1using DCL.Controllers;
 2using System.Collections.Generic;
 3using DCL.Configuration;
 4using DCL.Models;
 5using UnityEngine;
 6
 7namespace DCL
 8{
 9    public class WorldState : IWorldState
 10    {
 1171211        private Dictionary<int, IParcelScene> loadedScenes { get; } = new Dictionary<int, IParcelScene>();
 109112        private Dictionary<string, IParcelScene> loadedPortableExperienceScenes { get; } = new Dictionary<string, IParce
 185513        private Dictionary<Vector2Int, int> loadedScenesByCoordinate { get; } = new Dictionary<Vector2Int, int>();
 358614        private List<IParcelScene> scenesSortedByDistance { get; } = new List<IParcelScene>();
 171615        private List<int> globalSceneNumbers { get; } = new List<int>();
 54216        private Vector2Int sortAuxiliaryVector = new Vector2Int(EnvironmentSettings.MORDOR_SCALAR, EnvironmentSettings.M
 54217        private readonly List<IParcelScene> globalScenes = new List<IParcelScene>();
 18        private int currentSceneNumber;
 19        private string currentSceneHash;
 20
 790121        public int GetCurrentSceneNumber() => currentSceneNumber;
 022        public string GetCurrentSceneHash() => currentSceneHash;
 23
 24
 45125        public IEnumerable<KeyValuePair<int, IParcelScene>> GetLoadedScenes() => loadedScenes;
 26
 027        public List<IParcelScene> GetGlobalScenes() => globalScenes;
 28
 91829        public List<IParcelScene> GetScenesSortedByDistance() => scenesSortedByDistance;
 30
 31        public IParcelScene GetScene(int sceneNumber)
 32        {
 34933            if (!ContainsScene(sceneNumber))
 6434                return null;
 35
 28536            return loadedScenes[sceneNumber];
 37        }
 38
 39        public IParcelScene GetScene(Vector2Int coords)
 40        {
 6441            return GetScene(GetSceneNumberByCoords(coords));
 42        }
 43
 44        public IParcelScene GetPortableExperienceScene(string sceneId)
 45        {
 046            if (string.IsNullOrEmpty(sceneId) || !loadedPortableExperienceScenes.ContainsKey(sceneId))
 047                return null;
 48
 049            return loadedPortableExperienceScenes[sceneId];
 50        }
 51
 52        public bool ContainsScene(int sceneNumber)
 53        {
 731854            if (sceneNumber <= 0 || !loadedScenes.ContainsKey(sceneNumber))
 50055                return false;
 56
 681857            return true;
 58        }
 59
 60        public bool TryGetScene(int sceneNumber, out IParcelScene scene)
 61        {
 40362            scene = null;
 63
 40364            if (sceneNumber <= 0 || !loadedScenes.ContainsKey(sceneNumber))
 4265                return false;
 66
 36167            scene = loadedScenes[sceneNumber];
 36168            return true;
 69        }
 70
 71        public bool TryGetScene<T>(int sceneNumber, out T scene)
 72            where T : class, IParcelScene
 73        {
 26774            scene = default(T);
 26775            bool result = TryGetScene(sceneNumber, out IParcelScene baseScene);
 76
 26777            if (result)
 26778                scene = baseScene as T;
 79
 26780            if (scene == null)
 081                result = false;
 82
 26783            return result;
 84        }
 85
 86        public HashSet<Vector2Int> GetAllLoadedScenesCoords()
 87        {
 49488            HashSet<Vector2Int> allLoadedParcelCoords = new HashSet<Vector2Int>();
 89
 90            // Create fast (hashset) collection of loaded parcels coords
 126091            foreach (var element in loadedScenes)
 92            {
 13693                ParcelScene scene = element.Value as ParcelScene;
 94
 13695                if (!scene.sceneLifecycleHandler.isReady)
 96                    continue;
 97
 898                allLoadedParcelCoords.UnionWith(scene.parcels);
 99            }
 100
 494101            return allLoadedParcelCoords;
 102        }
 103
 542104        private readonly Dictionary<GameObject, LoadWrapper>
 105            attachedLoaders = new Dictionary<GameObject, LoadWrapper>();
 106
 107        public LoadWrapper GetLoaderForEntity(IDCLEntity entity)
 108        {
 393109            if (entity == null)
 110            {
 0111                Debug.LogWarning("NULL entity at GetLoaderForEntity()");
 0112                return null;
 113            }
 393114            if (entity.meshRootGameObject == null)
 115            {
 0116                Debug.LogWarning("NULL meshRootGameObject at GetLoaderForEntity()");
 0117                return null;
 118            }
 119
 393120            attachedLoaders.TryGetValue(entity.meshRootGameObject, out LoadWrapper result);
 393121            return result;
 122        }
 123
 124        public T GetOrAddLoaderForEntity<T>(IDCLEntity entity)
 125            where T : LoadWrapper, new()
 126        {
 67127            if (!attachedLoaders.TryGetValue(entity.meshRootGameObject, out LoadWrapper result))
 128            {
 65129                result = new T();
 65130                attachedLoaders.Add(entity.meshRootGameObject, result);
 131            }
 132
 67133            return result as T;
 134        }
 135
 136        public void RemoveLoaderForEntity(IDCLEntity entity)
 137        {
 49138            if (entity == null || entity.meshRootGameObject == null)
 7139                return;
 140
 42141            attachedLoaders.Remove(entity.meshRootGameObject);
 42142        }
 143
 144        public int GetSceneNumberByCoords(Vector2Int coords)
 145        {
 65146            if (loadedScenesByCoordinate.ContainsKey(coords))
 0147                return loadedScenesByCoordinate[coords];
 148
 65149            return -1;
 150        }
 151
 152        public void SortScenesByDistance(Vector2Int position)
 153        {
 444154            currentSceneNumber = -1;
 444155            currentSceneHash = "";
 156
 444157            scenesSortedByDistance.Sort((sceneA, sceneB) =>
 158            {
 62159                sortAuxiliaryVector = sceneA.sceneData.basePosition - position;
 62160                int dist1 = sortAuxiliaryVector.sqrMagnitude;
 161
 62162                sortAuxiliaryVector = sceneB.sceneData.basePosition - position;
 62163                int dist2 = sortAuxiliaryVector.sqrMagnitude;
 164
 62165                return dist1 - dist2;
 166            });
 167
 444168            using var iterator = scenesSortedByDistance.GetEnumerator();
 169
 474170            while (iterator.MoveNext())
 171            {
 39172                IParcelScene scene = iterator.Current;
 173
 39174                if (scene == null)
 175                    continue;
 176
 39177                bool characterIsInsideScene = WorldStateUtils.IsCharacterInsideScene(scene);
 39178                bool isGlobalScene = globalSceneNumbers.Contains(scene.sceneData.sceneNumber);
 179
 39180                if (isGlobalScene || !characterIsInsideScene)
 181                    continue;
 182
 9183                currentSceneNumber = scene.sceneData.sceneNumber;
 9184                currentSceneHash = scene.sceneData.id;
 185
 9186                break;
 187            }
 188
 879189        }
 190
 191        public void ForceCurrentScene(int sceneNumber, string sceneHash)
 192        {
 334193            currentSceneNumber = sceneNumber;
 334194            currentSceneHash = sceneHash;
 334195        }
 196
 197        public void AddScene(IParcelScene newScene)
 198        {
 429199            int sceneNumber = newScene.sceneData.sceneNumber;
 200
 429201            if (loadedScenes.ContainsKey(sceneNumber))
 202            {
 0203                Debug.LogWarning($"The scene {newScene.sceneData.id} already exists! scene number: {sceneNumber}");
 0204                return;
 205            }
 206
 429207            if (newScene.isPersistent)
 208            {
 326209                globalSceneNumbers.Add(sceneNumber);
 326210                globalScenes.Add(newScene);
 211
 326212                if (newScene.isPortableExperience)
 2213                    loadedPortableExperienceScenes.Add(newScene.sceneData.id, newScene);
 214            }
 215
 429216            loadedScenes.Add(sceneNumber, newScene);
 217
 1726218            foreach (Vector2Int parcelPosition in newScene.GetParcels())
 219            {
 434220                loadedScenesByCoordinate[parcelPosition] = sceneNumber;
 221            }
 222
 429223            scenesSortedByDistance.Add(newScene);
 224
 429225            if (currentSceneNumber <= 0)
 226            {
 349227                currentSceneNumber = sceneNumber;
 349228                currentSceneHash = newScene.sceneData.id;
 229            }
 429230        }
 231
 232        public void RemoveScene(int sceneNumber)
 233        {
 267234            IParcelScene loadedScene = loadedScenes[sceneNumber];
 235
 1078236            foreach (Vector2Int sceneParcel in loadedScene.GetParcels())
 237            {
 272238                loadedScenesByCoordinate.Remove(sceneParcel);
 239            }
 240
 267241            scenesSortedByDistance.Remove(loadedScene);
 242
 267243            loadedScenes.Remove(sceneNumber);
 267244            globalSceneNumbers.Remove(sceneNumber);
 245
 267246            if (globalScenes.Contains(loadedScene))
 247            {
 233248                globalScenes.Remove(loadedScene);
 249
 233250                if (!string.IsNullOrEmpty(loadedScene.sceneData.id) && loadedPortableExperienceScenes.ContainsKey(loaded
 2251                    loadedPortableExperienceScenes.Remove(loadedScene.sceneData.id);
 252            }
 267253        }
 254
 255        public void Dispose()
 256        {
 542257            loadedScenes.Clear();
 542258            loadedScenesByCoordinate.Clear();
 542259            scenesSortedByDistance.Clear();
 542260            globalScenes.Clear();
 542261            globalSceneNumbers.Clear();
 542262            loadedPortableExperienceScenes.Clear();
 542263            currentSceneNumber = -1;
 542264            currentSceneHash = "";
 542265        }
 266
 542267        public void Initialize() { }
 268    }
 269}