< 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    {
 2056011        private Dictionary<int, IParcelScene> loadedScenes { get; } = new Dictionary<int, IParcelScene>();
 122012        private Dictionary<string, IParcelScene> loadedPortableExperienceScenes { get; } = new Dictionary<string, IParce
 188213        private Dictionary<Vector2Int, int> loadedScenesByCoordinate { get; } = new Dictionary<Vector2Int, int>();
 396914        private List<IParcelScene> scenesSortedByDistance { get; } = new List<IParcelScene>();
 187215        private List<int> globalSceneNumbers { get; } = new List<int>();
 61016        private Vector2Int sortAuxiliaryVector = new Vector2Int(EnvironmentSettings.MORDOR_SCALAR, EnvironmentSettings.M
 61017        private readonly List<IParcelScene> globalScenes = new List<IParcelScene>();
 18        private int currentSceneNumber;
 19
 1685620        public int GetCurrentSceneNumber() => currentSceneNumber;
 21
 53022        public IEnumerable<KeyValuePair<int, IParcelScene>> GetLoadedScenes() => loadedScenes;
 23
 024        public List<IParcelScene> GetGlobalScenes() => globalScenes;
 25
 106126        public List<IParcelScene> GetScenesSortedByDistance() => scenesSortedByDistance;
 27
 28        public IParcelScene GetScene(int sceneNumber)
 29        {
 29830            if (!ContainsScene(sceneNumber))
 031                return null;
 32
 29833            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        {
 1594251            if (sceneNumber <= 0 || !loadedScenes.ContainsKey(sceneNumber))
 38052                return false;
 53
 1556254            return true;
 55        }
 56
 57        public bool TryGetScene(int sceneNumber, out IParcelScene scene)
 58        {
 37759            scene = null;
 60
 37761            if (sceneNumber <= 0 || !loadedScenes.ContainsKey(sceneNumber))
 1562                return false;
 63
 36264            scene = loadedScenes[sceneNumber];
 36265            return true;
 66        }
 67
 68        public bool TryGetScene<T>(int sceneNumber, out T scene)
 69            where T : class, IParcelScene
 70        {
 27671            scene = default(T);
 27672            bool result = TryGetScene(sceneNumber, out IParcelScene baseScene);
 73
 27674            if (result)
 27675                scene = baseScene as T;
 76
 27677            if (scene == null)
 078                result = false;
 79
 27680            return result;
 81        }
 82
 83        public HashSet<Vector2Int> GetAllLoadedScenesCoords()
 84        {
 51985            HashSet<Vector2Int> allLoadedParcelCoords = new HashSet<Vector2Int>();
 86
 87            // Create fast (hashset) collection of loaded parcels coords
 130688            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
 51998            return allLoadedParcelCoords;
 99        }
 100
 610101        private readonly Dictionary<GameObject, LoadWrapper>
 102            attachedLoaders = new Dictionary<GameObject, LoadWrapper>();
 103
 104        public LoadWrapper GetLoaderForEntity(IDCLEntity entity)
 105        {
 354106            if (entity.meshRootGameObject == null)
 107            {
 0108                Debug.LogWarning("NULL meshRootGameObject at GetLoaderForEntity()");
 0109                return null;
 110            }
 111
 354112            attachedLoaders.TryGetValue(entity.meshRootGameObject, out LoadWrapper result);
 354113            return result;
 114        }
 115
 116        public T GetOrAddLoaderForEntity<T>(IDCLEntity entity)
 117            where T : LoadWrapper, new()
 118        {
 75119            if (!attachedLoaders.TryGetValue(entity.meshRootGameObject, out LoadWrapper result))
 120            {
 73121                result = new T();
 73122                attachedLoaders.Add(entity.meshRootGameObject, result);
 123            }
 124
 75125            return result as T;
 126        }
 127
 128        public void RemoveLoaderForEntity(IDCLEntity entity)
 129        {
 54130            if (entity == null || entity.meshRootGameObject == null)
 7131                return;
 132
 47133            attachedLoaders.Remove(entity.meshRootGameObject);
 47134        }
 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        {
 517146            currentSceneNumber = -1;
 517147            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
 517158            using var iterator = scenesSortedByDistance.GetEnumerator();
 159
 545160            while (iterator.MoveNext())
 161            {
 35162                IParcelScene scene = iterator.Current;
 163
 35164                if (scene == null)
 165                    continue;
 166
 35167                bool characterIsInsideScene = WorldStateUtils.IsCharacterInsideScene(scene);
 35168                bool isGlobalScene = globalSceneNumbers.Contains(scene.sceneData.sceneNumber);
 169
 35170                if (isGlobalScene || !characterIsInsideScene)
 171                    continue;
 172
 7173                currentSceneNumber = scene.sceneData.sceneNumber;
 174
 7175                break;
 176            }
 177
 1027178        }
 179
 180        public void ForceCurrentScene(int sceneNumber)
 181        {
 363182            currentSceneNumber = sceneNumber;
 363183        }
 184
 185        public void AddScene(IParcelScene newScene)
 186        {
 385187            int sceneNumber = newScene.sceneData.sceneNumber;
 385188            if (loadedScenes.ContainsKey(sceneNumber))
 189            {
 0190                Debug.LogWarning($"The scene {newScene.sceneData.id} already exists! scene number: {sceneNumber}");
 0191                return;
 192            }
 193
 385194            if (newScene.isPersistent)
 195            {
 348196                globalSceneNumbers.Add(sceneNumber);
 348197                globalScenes.Add(newScene);
 198
 348199                if (newScene.isPortableExperience)
 2200                    loadedPortableExperienceScenes.Add(newScene.sceneData.id, newScene);
 201            }
 202
 385203            loadedScenes.Add(sceneNumber, newScene);
 204
 1540205            foreach (Vector2Int parcelPosition in newScene.GetParcels())
 206            {
 385207                loadedScenesByCoordinate[parcelPosition] = sceneNumber;
 208            }
 209
 385210            scenesSortedByDistance.Add(newScene);
 211
 385212            if (currentSceneNumber <= 0)
 352213                currentSceneNumber = sceneNumber;
 385214        }
 215
 216        public void RemoveScene(int sceneNumber)
 217        {
 276218            IParcelScene loadedScene = loadedScenes[sceneNumber];
 219
 1118220            foreach (Vector2Int sceneParcel in loadedScene.GetParcels())
 221            {
 283222                loadedScenesByCoordinate.Remove(sceneParcel);
 223            }
 224
 276225            scenesSortedByDistance.Remove(loadedScene);
 226
 276227            loadedScenes.Remove(sceneNumber);
 276228            globalSceneNumbers.Remove(sceneNumber);
 229
 276230            if (globalScenes.Contains(loadedScene))
 231            {
 246232                globalScenes.Remove(loadedScene);
 233
 246234                if (!string.IsNullOrEmpty(loadedScene.sceneData.id) && loadedPortableExperienceScenes.ContainsKey(loaded
 2235                    loadedPortableExperienceScenes.Remove(loadedScene.sceneData.id);
 236            }
 276237        }
 238
 239        public void Dispose()
 240        {
 603241            loadedScenes.Clear();
 603242            loadedScenesByCoordinate.Clear();
 603243            scenesSortedByDistance.Clear();
 603244            globalScenes.Clear();
 603245            globalSceneNumbers.Clear();
 603246            loadedPortableExperienceScenes.Clear();
 603247            currentSceneNumber = -1;
 603248        }
 249
 250        public void Initialize()
 251        {
 603252        }
 253    }
 254}