< Summary

Class:DCL.Controllers.WorldBlockersController
Assembly:WorldBlockersController
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BlockerController/WorldBlockersController.cs
Covered lines:70
Uncovered lines:5
Coverable lines:75
Total lines:189
Line coverage:93.3% (70 of 75)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
WorldBlockersController()0%110100%
WorldBlockersController()0%110100%
Initialize(...)0%110100%
OnRendererStateChange(...)0%3.333066.67%
CreateWithDefaultDependencies(...)0%2100%
InitializeWithDefaultDependencies(...)0%110100%
SetupWorldBlockers()0%330100%
SetEnabled(...)0%220100%
OnWorldReposition(...)0%110100%
Dispose()0%220100%
SetupWorldBlockers(...)0%1313097.62%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BlockerController/WorldBlockersController.cs

#LineLine coverage
 1using System.Collections.Generic;
 2using DCL.Helpers;
 3using DCL.Rendering;
 4using UnityEngine;
 5
 6namespace DCL.Controllers
 7{
 8    /// <summary>
 9    /// This class is the domain-specific glue for BlockerInstanceHandler.
 10    /// <br/><br/>
 11    /// Responsibilities:<br/>
 12    /// - Spawning blockers depending on scene state<br/>
 13    /// - Moving blockers when the world is repositioned<br/>
 14    /// - Handling lifecycle of BlockerInstanceHandler<br/>
 15    /// </summary>
 16    public class WorldBlockersController : IWorldBlockersController
 17    {
 66918        public bool enabled = true;
 19
 20        Transform blockersParent;
 21
 22        ISceneHandler sceneHandler;
 23        IBlockerInstanceHandler blockerInstanceHandler;
 24
 66925        HashSet<Vector2Int> blockersToRemove = new HashSet<Vector2Int>();
 66926        HashSet<Vector2Int> blockersToAdd = new HashSet<Vector2Int>();
 27
 128        static Vector2Int[] aroundOffsets =
 29        {
 30            new Vector2Int(1, 0),
 31            new Vector2Int(-1, 0),
 32            new Vector2Int(0, 1),
 33            new Vector2Int(0, -1),
 34            new Vector2Int(1, 1),
 35            new Vector2Int(-1, -1),
 36            new Vector2Int(1, -1),
 37            new Vector2Int(-1, 1)
 38        };
 39
 40        public void Initialize(ISceneHandler sceneHandler, IBlockerInstanceHandler blockerInstanceHandler)
 41        {
 67042            this.blockerInstanceHandler = blockerInstanceHandler;
 67043            this.sceneHandler = sceneHandler;
 44
 67045            blockerInstanceHandler.SetParent(blockersParent);
 46
 67047            CommonScriptableObjects.worldOffset.OnChange -= OnWorldReposition;
 67048            CommonScriptableObjects.worldOffset.OnChange += OnWorldReposition;
 49
 67050            CommonScriptableObjects.rendererState.OnChange -= OnRendererStateChange;
 67051            CommonScriptableObjects.rendererState.OnChange += OnRendererStateChange;
 67052        }
 53
 54        void OnRendererStateChange(bool newValue, bool oldValue)
 55        {
 8995256            if (newValue && DataStore.i.debugConfig.isDebugMode.Get())
 057                SetEnabled(false);
 8995258        }
 59
 66960        public WorldBlockersController()
 61        {
 66962            blockersParent = new GameObject("WorldBlockers").transform;
 66963            blockersParent.position = Vector3.zero;
 66964        }
 65
 66        public static WorldBlockersController CreateWithDefaultDependencies(ISceneHandler sceneHandler, ICullingControll
 67        {
 068            var worldBlockersController = new WorldBlockersController();
 069            worldBlockersController.InitializeWithDefaultDependencies(sceneHandler, cullingController);
 070            return worldBlockersController;
 71        }
 72
 73        public void InitializeWithDefaultDependencies(ISceneHandler sceneHandler, ICullingController cullingController)
 74        {
 66675            var blockerAnimationHandler = new BlockerAnimationHandler();
 66676            var blockerInstanceHandler = new BlockerInstanceHandler();
 77
 66678            blockerInstanceHandler.Initialize(
 79                blockerAnimationHandler,
 80                cullingController
 81            );
 82
 66683            Initialize(
 84                sceneHandler,
 85                blockerInstanceHandler);
 66686        }
 87
 88        public void SetupWorldBlockers()
 89        {
 137690            if (!enabled || sceneHandler == null)
 5591                return;
 92
 132193            SetupWorldBlockers(sceneHandler.GetAllLoadedScenesCoords());
 132194        }
 95
 96        public void SetEnabled(bool targetValue)
 97        {
 2898            enabled = targetValue;
 99
 28100            if (!enabled)
 23101                blockerInstanceHandler.DestroyAllBlockers();
 28102        }
 103
 104        void OnWorldReposition(Vector3 current, Vector3 previous)
 105        {
 5106            var newPosition = PositionUtils.WorldToUnityPosition(Vector3.zero); // Blockers parent original position
 5107            blockersParent.position = newPosition;
 5108        }
 109
 110        public void Dispose()
 111        {
 692112            CommonScriptableObjects.worldOffset.OnChange -= OnWorldReposition;
 692113            blockerInstanceHandler.DestroyAllBlockers();
 114
 692115            if (blockersParent != null)
 671116                Object.Destroy(blockersParent.gameObject);
 692117        }
 118
 119        internal void SetupWorldBlockers(HashSet<Vector2Int> allLoadedParcelCoords)
 120        {
 1321121            if (allLoadedParcelCoords.Count == 0)
 1313122                return;
 123
 8124            blockersToRemove.Clear();
 8125            blockersToAdd.Clear();
 126
 8127            var blockers = blockerInstanceHandler.GetBlockers();
 128
 129            // Detect blockers to be removed
 40130            foreach (var item in blockers)
 131            {
 12132                if (allLoadedParcelCoords.Contains(item.Key))
 133                {
 2134                    blockersToRemove.Add(item.Key);
 2135                }
 136                else
 137                {
 10138                    bool foundAroundLoadedScenes = false;
 70139                    for (int i = 0; i < aroundOffsets.Length; i++)
 140                    {
 35141                        Vector2Int offset = aroundOffsets[i];
 35142                        Vector2Int checkedPosition = new Vector2Int(item.Key.x + offset.x, item.Key.y + offset.y);
 143
 35144                        if (allLoadedParcelCoords.Contains(checkedPosition))
 145                        {
 10146                            foundAroundLoadedScenes = true;
 10147                            break;
 148                        }
 149                    }
 150
 10151                    if (!foundAroundLoadedScenes)
 0152                        blockersToRemove.Add(item.Key);
 153                }
 154            }
 155
 156            // Detect missing blockers to be added
 8157            using (var it = allLoadedParcelCoords.GetEnumerator())
 158            {
 29159                while (it.MoveNext())
 160                {
 21161                    Vector2Int pos = it.Current;
 162
 378163                    for (int i = 0; i < aroundOffsets.Length; i++)
 164                    {
 168165                        Vector2Int offset = aroundOffsets[i];
 168166                        Vector2Int checkedPosition = new Vector2Int(pos.x + offset.x, pos.y + offset.y);
 167
 168168                        if (!allLoadedParcelCoords.Contains(checkedPosition) && !blockers.ContainsKey(checkedPosition))
 169                        {
 104170                            blockersToAdd.Add(checkedPosition);
 171                        }
 172                    }
 173                }
 8174            }
 175
 176            // Remove extra blockers
 20177            foreach (var coords in blockersToRemove)
 178            {
 2179                blockerInstanceHandler.HideBlocker(coords, false);
 180            }
 181
 182            // Add missing blockers
 172183            foreach (var coords in blockersToAdd)
 184            {
 78185                blockerInstanceHandler.ShowBlocker(coords);
 186            }
 8187        }
 188    }
 189}