< Summary

Class:DCL.Controllers.SceneBoundsFeedbackStyle_RedFlicker
Assembly:MainScripts
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/SceneBoundariesController/SceneBoundsFeedbackStyle_RedFlicker.cs
Covered lines:63
Uncovered lines:16
Coverable lines:79
Total lines:180
Line coverage:79.7% (63 of 79)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
InvalidMeshInfo(...)0%110100%
ResetMaterials(...)0%2100%
ResetMaterials()0%5.015092.31%
SceneBoundsFeedbackStyle_RedFlicker()0%110100%
GetInvalidMeshesCount()0%2100%
ApplyFeedback(...)0%220100%
CleanFeedback()0%6200%
RemoveInvalidMeshEffect(...)0%7.017093.33%
AddInvalidMeshEffect(...)0%6.216082.14%
WasGameObjectInAValidPosition(...)0%110100%
GetOriginalMaterials(...)0%3.023087.5%

File(s)

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

#LineLine coverage
 1using System.Collections.Generic;
 2using System.Linq;
 3using DCL.Helpers;
 4using DCL.Models;
 5using UnityEngine;
 6
 7namespace DCL.Controllers
 8{
 9    public class SceneBoundsFeedbackStyle_RedFlicker : ISceneBoundsFeedbackStyle
 10    {
 11        class InvalidMeshInfo
 12        {
 1413            public Dictionary<Renderer, Material> originalMaterials = new Dictionary<Renderer, Material>();
 1414            public List<GameObject> wireframeObjects = new List<GameObject>();
 15            public MeshesInfo meshesInfo;
 16            public System.Action OnResetMaterials;
 17
 4218            public InvalidMeshInfo(MeshesInfo meshesInfo) { this.meshesInfo = meshesInfo; }
 19
 20            public void ResetMaterials(MeshesInfo meshesInfo)
 21            {
 022                this.meshesInfo = meshesInfo;
 023                ResetMaterials();
 024            }
 25
 26            public void ResetMaterials()
 27            {
 528                if (meshesInfo.meshRootGameObject == null)
 029                    return;
 30
 2631                for (int i = 0; i < meshesInfo.renderers.Length; i++)
 32                {
 833                    meshesInfo.renderers[i].sharedMaterial = originalMaterials[meshesInfo.renderers[i]];
 34                }
 35
 536                int wireframeObjectscount = wireframeObjects.Count;
 2637                for (int i = 0; i < wireframeObjectscount; i++)
 38                {
 839                    Utils.SafeDestroy(wireframeObjects[i]);
 40                }
 41
 542                OnResetMaterials?.Invoke();
 543            }
 44        }
 45
 46        const string WIREFRAME_PREFAB_NAME = "Prefabs/WireframeCubeMesh";
 47        const string INVALID_MESH_MATERIAL_NAME = "Materials/InvalidMesh";
 48        const string INVALID_SUBMESH_MATERIAL_NAME = "Materials/InvalidSubMesh";
 49
 50        Material invalidMeshMaterial;
 51        Material invalidSubMeshMaterial;
 2352        Dictionary<GameObject, InvalidMeshInfo> invalidMeshesInfo = new Dictionary<GameObject, InvalidMeshInfo>();
 2353        HashSet<Renderer> invalidSubmeshes = new HashSet<Renderer>();
 2354        private readonly List<MeshesInfo> currentMeshesInvalidated = new List<MeshesInfo>();
 55
 2356        public SceneBoundsFeedbackStyle_RedFlicker()
 57        {
 2358            invalidMeshesInfo = new Dictionary<GameObject, InvalidMeshInfo>();
 2359            invalidMeshMaterial = Resources.Load(INVALID_MESH_MATERIAL_NAME) as Material;
 2360            invalidSubMeshMaterial = Resources.Load(INVALID_SUBMESH_MATERIAL_NAME) as Material;
 2361        }
 62
 063        public int GetInvalidMeshesCount() { return invalidMeshesInfo.Count; }
 64
 65        public void ApplyFeedback(MeshesInfo meshesInfo, bool isInsideBoundaries)
 66        {
 2867            if (isInsideBoundaries)
 68            {
 1469                RemoveInvalidMeshEffect(meshesInfo);
 1470                return;
 71            }
 72
 1473            AddInvalidMeshEffect(meshesInfo);
 1474        }
 75
 76        public void CleanFeedback()
 77        {
 078            for ( int x = 0; x < currentMeshesInvalidated.Count; x++)
 79            {
 080                RemoveInvalidMeshEffect(currentMeshesInvalidated[x]);
 81            }
 82
 083            currentMeshesInvalidated.Clear();
 084        }
 85
 86        void RemoveInvalidMeshEffect(MeshesInfo meshesInfo)
 87        {
 1488            if (meshesInfo == null || WasGameObjectInAValidPosition(meshesInfo.innerGameObject))
 989                return;
 90
 591            PoolableObject shapePoolableObjectBehaviour = PoolManager.i.GetPoolable(meshesInfo.meshRootGameObject);
 92
 593            if (shapePoolableObjectBehaviour != null)
 094                shapePoolableObjectBehaviour.OnRelease -= invalidMeshesInfo[meshesInfo.innerGameObject].ResetMaterials;
 95
 596            var renderers = meshesInfo.renderers;
 97
 598            if (renderers != null)
 99            {
 26100                for (int i = 0; i < renderers.Length; i++)
 101                {
 8102                    if (invalidSubmeshes.Contains(renderers[i]))
 8103                        invalidSubmeshes.Remove(renderers[i]);
 104                }
 105            }
 106
 5107            invalidMeshesInfo[meshesInfo.innerGameObject].ResetMaterials();
 5108            currentMeshesInvalidated.Remove(meshesInfo);
 5109        }
 110
 111        void AddInvalidMeshEffect(MeshesInfo meshesInfo)
 112        {
 14113            if (!WasGameObjectInAValidPosition(meshesInfo.innerGameObject))
 0114                return;
 115
 14116            if (currentMeshesInvalidated.Contains(meshesInfo))
 0117                return;
 118
 14119            InvalidMeshInfo invalidMeshInfo = new InvalidMeshInfo(meshesInfo);
 120
 24121            invalidMeshInfo.OnResetMaterials = () => { invalidMeshesInfo.Remove(meshesInfo.innerGameObject); };
 122
 14123            PoolableObject shapePoolableObjectBehaviour = PoolManager.i.GetPoolable(meshesInfo.meshRootGameObject);
 14124            if (shapePoolableObjectBehaviour != null)
 125            {
 0126                shapePoolableObjectBehaviour.OnRelease -= invalidMeshInfo.ResetMaterials;
 0127                shapePoolableObjectBehaviour.OnRelease += invalidMeshInfo.ResetMaterials;
 128            }
 129
 130            // Apply invalid material
 14131            Renderer[] entityRenderers = meshesInfo.renderers;
 74132            for (int i = 0; i < entityRenderers.Length; i++)
 133            {
 134                // Save original materials
 23135                invalidMeshInfo.originalMaterials.Add(entityRenderers[i], entityRenderers[i].sharedMaterial);
 136
 23137                if (!invalidSubmeshes.Contains(entityRenderers[i]))
 138                {
 139                    // Wireframe that shows the boundaries to the dev (We don't use the GameObject.Instantiate(prefab, p
 140                    // overload because we need to set the position and scale before parenting, to deal with scaled obje
 23141                    GameObject wireframeObject = GameObject.Instantiate(Resources.Load<GameObject>(WIREFRAME_PREFAB_NAME
 23142                    wireframeObject.transform.position = entityRenderers[i].bounds.center;
 23143                    wireframeObject.transform.localScale = entityRenderers[i].bounds.size * 1.01f;
 23144                    wireframeObject.transform.SetParent(meshesInfo.innerGameObject.transform);
 145
 23146                    entityRenderers[i].sharedMaterial = invalidSubMeshMaterial;
 147
 23148                    invalidMeshInfo.wireframeObjects.Add(wireframeObject);
 23149                    invalidSubmeshes.Add(entityRenderers[i]);
 23150                }
 151                else
 152                {
 0153                    entityRenderers[i].sharedMaterial = invalidMeshMaterial;
 154                }
 155            }
 156
 14157            currentMeshesInvalidated.Add(meshesInfo);
 14158            invalidMeshesInfo.Add(meshesInfo.innerGameObject, invalidMeshInfo);
 14159        }
 160
 28161        public bool WasGameObjectInAValidPosition(GameObject gameObject) { return !invalidMeshesInfo.ContainsKey(gameObj
 162
 163        public List<Material> GetOriginalMaterials(MeshesInfo meshesInfo)
 164        {
 39165            if (invalidMeshesInfo.ContainsKey(meshesInfo.innerGameObject))
 166            {
 0167                return invalidMeshesInfo[meshesInfo.innerGameObject].originalMaterials.Values.ToList();
 168            }
 169
 39170            List<Material> result = new List<Material>();
 171
 180172            for (int i = 0; i < meshesInfo.renderers.Length; i++)
 173            {
 51174                result.AddRange(meshesInfo.renderers[i].sharedMaterials);
 175            }
 176
 39177            return result;
 178        }
 179    }
 180}