< Summary

Class:DCL.WorldState
Assembly:DCL.Runtime
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/WorldState.cs
Covered lines:99
Uncovered lines:12
Coverable lines:111
Total lines:254
Line coverage:89.1% (99 of 111)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
WorldState()0%110100%
GetCurrentSceneNumber()0%110100%
GetLoadedScenes()0%110100%
GetGlobalScenes()0%2100%
GetScenesSortedByDistance()0%110100%
GetScene(...)0%2.152066.67%
GetScene(...)0%2100%
GetPortableExperienceScene(...)0%12300%
ContainsScene(...)0%330100%
TryGetScene(...)0%330100%
TryGetScene[T](...)0%3.033085.71%
GetAllLoadedScenesCoords()0%330100%
GetLoaderForEntity(...)0%2.262060%
GetOrAddLoaderForEntity[T](...)0%220100%
RemoveLoaderForEntity(...)0%330100%
GetSceneNumberByCoords(...)0%2.152066.67%
SortScenesByDistance(...)0%550100%
ForceCurrentScene(...)0%110100%
AddScene(...)0%6.056088.89%
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    {
 2111211        private Dictionary<int, IParcelScene> loadedScenes { get; } = new Dictionary<int, IParcelScene>();
 133612        private Dictionary<string, IParcelScene> loadedPortableExperienceScenes { get; } = new Dictionary<string, IParce
 207013        private Dictionary<Vector2Int, int> loadedScenesByCoordinate { get; } = new Dictionary<Vector2Int, int>();
 442714        private List<IParcelScene> scenesSortedByDistance { get; } = new List<IParcelScene>();
 206115        private List<int> globalSceneNumbers { get; } = new List<int>();
 66816        private Vector2Int sortAuxiliaryVector = new Vector2Int(EnvironmentSettings.MORDOR_SCALAR, EnvironmentSettings.M
 66817        private readonly List<IParcelScene> globalScenes = new List<IParcelScene>();
 18        private int currentSceneNumber;
 19
 1707920        public int GetCurrentSceneNumber() => currentSceneNumber;
 21
 58822        public IEnumerable<KeyValuePair<int, IParcelScene>> GetLoadedScenes() => loadedScenes;
 23
 024        public List<IParcelScene> GetGlobalScenes() => globalScenes;
 25
 121326        public List<IParcelScene> GetScenesSortedByDistance() => scenesSortedByDistance;
 27
 28        public IParcelScene GetScene(int sceneNumber)
 29        {
 30230            if (!ContainsScene(sceneNumber))
 031                return null;
 32
 30233            return loadedScenes[sceneNumber];
 34        }
 35
 36        public IParcelScene GetScene(Vector2Int coords)
 37        {
 038            return GetScene(GetSceneNumberByCoords(coords));
 39        }
 40
 41        public IParcelScene GetPortableExperienceScene(string sceneId)
 42        {
 043            if (string.IsNullOrEmpty(sceneId) || !loadedPortableExperienceScenes.ContainsKey(sceneId))
 044                return null;
 45
 046            return loadedPortableExperienceScenes[sceneId];
 47        }
 48
 49        public bool ContainsScene(int sceneNumber)
 50        {
 1602651            if (sceneNumber <= 0 || !loadedScenes.ContainsKey(sceneNumber))
 41652                return false;
 53
 1561054            return true;
 55        }
 56
 57        public bool TryGetScene(int sceneNumber, out IParcelScene scene)
 58        {
 41459            scene = null;
 60
 41461            if (sceneNumber <= 0 || !loadedScenes.ContainsKey(sceneNumber))
 1562                return false;
 63
 39964            scene = loadedScenes[sceneNumber];
 39965            return true;
 66        }
 67
 68        public bool TryGetScene<T>(int sceneNumber, out T scene)
 69            where T : class, IParcelScene
 70        {
 31271            scene = default(T);
 31272            bool result = TryGetScene(sceneNumber, out IParcelScene baseScene);
 73
 31274            if (result)
 31275                scene = baseScene as T;
 76
 31277            if (scene == null)
 078                result = false;
 79
 31280            return result;
 81        }
 82
 83        public HashSet<Vector2Int> GetAllLoadedScenesCoords()
 84        {
 59185            HashSet<Vector2Int> allLoadedParcelCoords = new HashSet<Vector2Int>();
 86
 87            // Create fast (hashset) collection of loaded parcels coords
 145088            foreach (var element in loadedScenes)
 89            {
 13490                ParcelScene scene = element.Value as ParcelScene;
 91
 13492                if (!scene.sceneLifecycleHandler.isReady)
 93                    continue;
 94
 795                allLoadedParcelCoords.UnionWith(scene.parcels);
 96            }
 97
 59198            return allLoadedParcelCoords;
 99        }
 100
 668101        private readonly Dictionary<GameObject, LoadWrapper>
 102            attachedLoaders = new Dictionary<GameObject, LoadWrapper>();
 103
 104        public LoadWrapper GetLoaderForEntity(IDCLEntity entity)
 105        {
 366106            if (entity.meshRootGameObject == null)
 107            {
 0108                Debug.LogWarning("NULL meshRootGameObject at GetLoaderForEntity()");
 0109                return null;
 110            }
 111
 366112            attachedLoaders.TryGetValue(entity.meshRootGameObject, out LoadWrapper result);
 366113            return result;
 114        }
 115
 116        public T GetOrAddLoaderForEntity<T>(IDCLEntity entity)
 117            where T : LoadWrapper, new()
 118        {
 79119            if (!attachedLoaders.TryGetValue(entity.meshRootGameObject, out LoadWrapper result))
 120            {
 77121                result = new T();
 77122                attachedLoaders.Add(entity.meshRootGameObject, result);
 123            }
 124
 79125            return result as T;
 126        }
 127
 128        public void RemoveLoaderForEntity(IDCLEntity entity)
 129        {
 58130            if (entity == null || entity.meshRootGameObject == null)
 7131                return;
 132
 51133            attachedLoaders.Remove(entity.meshRootGameObject);
 51134        }
 135
 136        public int GetSceneNumberByCoords(Vector2Int coords)
 137        {
 1138            if (loadedScenesByCoordinate.ContainsKey(coords))
 0139                return loadedScenesByCoordinate[coords];
 140
 1141            return -1;
 142        }
 143
 144        public void SortScenesByDistance(Vector2Int position)
 145        {
 576146            currentSceneNumber = -1;
 576147            scenesSortedByDistance.Sort((sceneA, sceneB) =>
 148            {
 62149                sortAuxiliaryVector = sceneA.sceneData.basePosition - position;
 62150                int dist1 = sortAuxiliaryVector.sqrMagnitude;
 151
 62152                sortAuxiliaryVector = sceneB.sceneData.basePosition - position;
 62153                int dist2 = sortAuxiliaryVector.sqrMagnitude;
 154
 62155                return dist1 - dist2;
 156            });
 157
 576158            using var iterator = scenesSortedByDistance.GetEnumerator();
 159
 605160            while (iterator.MoveNext())
 161            {
 36162                IParcelScene scene = iterator.Current;
 163
 36164                if (scene == null)
 165                    continue;
 166
 36167                bool characterIsInsideScene = WorldStateUtils.IsCharacterInsideScene(scene);
 36168                bool isGlobalScene = globalSceneNumbers.Contains(scene.sceneData.sceneNumber);
 169
 36170                if (isGlobalScene || !characterIsInsideScene)
 171                    continue;
 172
 7173                currentSceneNumber = scene.sceneData.sceneNumber;
 174
 7175                break;
 176            }
 177
 1145178        }
 179
 180        public void ForceCurrentScene(int sceneNumber)
 181        {
 399182            currentSceneNumber = sceneNumber;
 399183        }
 184
 185        public void AddScene(IParcelScene newScene)
 186        {
 421187            int sceneNumber = newScene.sceneData.sceneNumber;
 421188            if (loadedScenes.ContainsKey(sceneNumber))
 189            {
 0190                Debug.LogWarning($"The scene {newScene.sceneData.id} already exists! scene number: {sceneNumber}");
 0191                return;
 192            }
 193
 421194            if (newScene.isPersistent)
 195            {
 384196                globalSceneNumbers.Add(sceneNumber);
 384197                globalScenes.Add(newScene);
 198
 384199                if (newScene.isPortableExperience)
 2200                    loadedPortableExperienceScenes.Add(newScene.sceneData.id, newScene);
 201            }
 202
 421203            loadedScenes.Add(sceneNumber, newScene);
 204
 1684205            foreach (Vector2Int parcelPosition in newScene.GetParcels())
 206            {
 421207                loadedScenesByCoordinate[parcelPosition] = sceneNumber;
 208            }
 209
 421210            scenesSortedByDistance.Add(newScene);
 211
 421212            if (currentSceneNumber <= 0)
 388213                currentSceneNumber = sceneNumber;
 421214        }
 215
 216        public void RemoveScene(int sceneNumber)
 217        {
 312218            IParcelScene loadedScene = loadedScenes[sceneNumber];
 219
 1262220            foreach (Vector2Int sceneParcel in loadedScene.GetParcels())
 221            {
 319222                loadedScenesByCoordinate.Remove(sceneParcel);
 223            }
 224
 312225            scenesSortedByDistance.Remove(loadedScene);
 226
 312227            loadedScenes.Remove(sceneNumber);
 312228            globalSceneNumbers.Remove(sceneNumber);
 229
 312230            if (globalScenes.Contains(loadedScene))
 231            {
 282232                globalScenes.Remove(loadedScene);
 233
 282234                if (!string.IsNullOrEmpty(loadedScene.sceneData.id) && loadedPortableExperienceScenes.ContainsKey(loaded
 2235                    loadedPortableExperienceScenes.Remove(loadedScene.sceneData.id);
 236            }
 312237        }
 238
 239        public void Dispose()
 240        {
 661241            loadedScenes.Clear();
 661242            loadedScenesByCoordinate.Clear();
 661243            scenesSortedByDistance.Clear();
 661244            globalScenes.Clear();
 661245            globalSceneNumbers.Clear();
 661246            loadedPortableExperienceScenes.Clear();
 661247            currentSceneNumber = -1;
 661248        }
 249
 250        public void Initialize()
 251        {
 661252        }
 253    }
 254}