< Summary

Class:DCL.ABDetectorTracker
Assembly:ABDetectorPlugin
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ABDetectorPlugin/ABDetectorTracker.cs
Covered lines:0
Uncovered lines:68
Coverable lines:68
Total lines:160
Line coverage:0% (0 of 68)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ABDetectorTracker(...)0%2100%
Dispose()0%2100%
FindSceneForPlayer()0%6200%
LoadMaterialsIfNeeded()0%6200%
OnGlobalABDetectionChanged(...)0%6200%
OnSceneABDetectionChanged(...)0%6200%
ApplyGlobalABDetectionPainting()0%12300%
RemoveGlobalABDetectionPainting()0%12300%
ApplyABDetectionPaintingForCurrentScene()0%2100%
RemoveABDetectionPaintingForCurrentScene()0%30500%
ApplyMaterials(...)0%72800%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ABDetectorPlugin/ABDetectorTracker.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using DCL.Controllers;
 4using UnityEngine;
 5
 6namespace DCL
 7{
 8    public class ABDetectorTracker : IDisposable
 9    {
 10        private const string FROM_ASSET_BUNDLE_TAG = "FromAssetBundle";
 11        private const string FROM_RAW_GLTF_TAG = "FromRawGLTF";
 12        private const string PARAMETRIZED_SHAPE_TAG = "FromParametrized";
 13        private const string AB_DETECTOR_MATERIALS_PREFAB_NAME = "AbDetectorMaterials";
 14
 15        private readonly DebugConfig debugConfig;
 16        private readonly DataStore_Player player;
 17
 018        private readonly Dictionary<Renderer, Material[]> rendererDict = new Dictionary<Renderer, Material[]>();
 019        private readonly Multimap<IParcelScene, Renderer> parcelToRendererMultimap = new Multimap<IParcelScene, Renderer
 20
 21        private ABDetectorMaterialsHolder abDetectorMaterialsHolder;
 22        private readonly IWorldState worldState;
 23
 24
 025        public ABDetectorTracker(DebugConfig debugConfig, DataStore_Player player, IWorldState worldState)
 26        {
 027            this.debugConfig = debugConfig;
 028            this.player = player;
 029            this.worldState = worldState;
 30
 031            debugConfig.showGlobalABDetectionLayer.OnChange += OnGlobalABDetectionChanged;
 032            debugConfig.showSceneABDetectionLayer.OnChange += OnSceneABDetectionChanged;
 033        }
 34
 35        public void Dispose()
 36        {
 037            debugConfig.showGlobalABDetectionLayer.OnChange -= OnGlobalABDetectionChanged;
 038            debugConfig.showSceneABDetectionLayer.OnChange -= OnSceneABDetectionChanged;
 039        }
 40
 41
 42        private IParcelScene FindSceneForPlayer()
 43        {
 044            Vector2Int currentPos = player.playerGridPosition.Get();
 045            return worldState.TryGetScene(worldState.GetSceneNumberByCoords(currentPos), out IParcelScene resultScene)
 46                ? resultScene
 47                : null;
 48        }
 49
 50        private void LoadMaterialsIfNeeded()
 51        {
 052            if (abDetectorMaterialsHolder == null)
 53            {
 054                abDetectorMaterialsHolder = Resources.Load<GameObject>(AB_DETECTOR_MATERIALS_PREFAB_NAME).
 55                    GetComponent<ABDetectorMaterialsHolder>();
 56            }
 057        }
 58
 59        private void OnGlobalABDetectionChanged(bool current, bool previous)
 60        {
 061            LoadMaterialsIfNeeded();
 62
 063            if (current)
 64            {
 065                RemoveGlobalABDetectionPainting();
 066                ApplyGlobalABDetectionPainting();
 67            }
 68            else
 069                RemoveGlobalABDetectionPainting();
 070        }
 71
 72        private void OnSceneABDetectionChanged(bool current, bool previous)
 73        {
 074            LoadMaterialsIfNeeded();
 75
 076            if (current)
 77            {
 078                RemoveGlobalABDetectionPainting();
 079                ApplyABDetectionPaintingForCurrentScene();
 80            }
 81            else
 082                RemoveABDetectionPaintingForCurrentScene();
 083        }
 84
 85        private void ApplyGlobalABDetectionPainting()
 86        {
 087            UnityEngine.Object[] gameObjects = UnityEngine.Object.FindObjectsOfType(typeof(GameObject));
 088            foreach (var gameObject in gameObjects)
 89            {
 090                var converted = (GameObject)gameObject;
 091                if (converted.transform.parent == null)
 092                    ApplyMaterials(converted.transform);
 93            }
 094        }
 95
 96        private void RemoveGlobalABDetectionPainting()
 97        {
 098            foreach (KeyValuePair<Renderer, Material[]> keyValuePair in rendererDict)
 99            {
 0100                if (keyValuePair.Key != null)
 0101                    keyValuePair.Key.materials = keyValuePair.Value;
 102            }
 103
 0104            rendererDict.Clear();
 0105            parcelToRendererMultimap.Clear();
 0106        }
 107
 108        private void ApplyABDetectionPaintingForCurrentScene()
 109        {
 0110            var currentScene = FindSceneForPlayer();
 0111            ApplyMaterials(currentScene.GetSceneTransform(), currentScene);
 0112        }
 113
 114        private void RemoveABDetectionPaintingForCurrentScene()
 115        {
 0116            var currentScene = FindSceneForPlayer();
 0117            if (parcelToRendererMultimap.ContainsKey(currentScene))
 118            {
 0119                foreach (var renderer in parcelToRendererMultimap.GetValues(currentScene))
 120                {
 0121                    if (rendererDict.TryGetValue(renderer, out var materials))
 0122                        renderer.materials = materials;
 123
 0124                    rendererDict.Remove(renderer);
 125                }
 126
 0127                parcelToRendererMultimap.Remove(currentScene);
 128            }
 0129        }
 130
 131        private void ApplyMaterials(Transform someTransform, IParcelScene optionalParcelScene = null)
 132        {
 0133            if (someTransform.childCount > 0)
 134            {
 0135                for (int i = 0; i < someTransform.childCount; i++)
 136                {
 0137                    Transform childTransform = someTransform.GetChild(i).transform;
 0138                    Renderer[] renderers = childTransform.GetComponents<Renderer>();
 139
 0140                    foreach (Renderer renderer in renderers)
 141                    {
 0142                        rendererDict[renderer] = renderer.materials;
 143
 0144                        if (optionalParcelScene != null)
 0145                            parcelToRendererMultimap.Add(optionalParcelScene, renderer);
 146
 0147                        if (renderer.CompareTag(FROM_ASSET_BUNDLE_TAG))
 0148                            renderer.material = abDetectorMaterialsHolder.ABMaterial;
 0149                        else if (renderer.CompareTag(FROM_RAW_GLTF_TAG))
 0150                            renderer.material = abDetectorMaterialsHolder.GLTFMaterial;
 0151                        else if (renderer.CompareTag(PARAMETRIZED_SHAPE_TAG))
 0152                            renderer.material = abDetectorMaterialsHolder.ParametrizedShapeMaterial;
 153                    }
 154
 0155                    ApplyMaterials(childTransform, optionalParcelScene);
 156                }
 157            }
 0158        }
 159    }
 160}