< 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        {
 1113            public Dictionary<Renderer, Material> originalMaterials = new Dictionary<Renderer, Material>();
 1114            public List<GameObject> wireframeObjects = new List<GameObject>();
 15            public MeshesInfo meshesInfo;
 16            public System.Action OnResetMaterials;
 17
 3318            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            {
 428                if (meshesInfo.meshRootGameObject == null)
 029                    return;
 30
 1631                for (int i = 0; i < meshesInfo.renderers.Length; i++)
 32                {
 433                    meshesInfo.renderers[i].sharedMaterial = originalMaterials[meshesInfo.renderers[i]];
 34                }
 35
 436                int wireframeObjectscount = wireframeObjects.Count;
 1637                for (int i = 0; i < wireframeObjectscount; i++)
 38                {
 439                    Utils.SafeDestroy(wireframeObjects[i]);
 40                }
 41
 442                OnResetMaterials?.Invoke();
 443            }
 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;
 2152        Dictionary<GameObject, InvalidMeshInfo> invalidMeshesInfo = new Dictionary<GameObject, InvalidMeshInfo>();
 2153        HashSet<Renderer> invalidSubmeshes = new HashSet<Renderer>();
 2154        private readonly List<MeshesInfo> currentMeshesInvalidated = new List<MeshesInfo>();
 55
 2156        public SceneBoundsFeedbackStyle_RedFlicker()
 57        {
 2158            invalidMeshesInfo = new Dictionary<GameObject, InvalidMeshInfo>();
 2159            invalidMeshMaterial = Resources.Load(INVALID_MESH_MATERIAL_NAME) as Material;
 2160            invalidSubMeshMaterial = Resources.Load(INVALID_SUBMESH_MATERIAL_NAME) as Material;
 2161        }
 62
 063        public int GetInvalidMeshesCount() { return invalidMeshesInfo.Count; }
 64
 65        public void ApplyFeedback(MeshesInfo meshesInfo, bool isInsideBoundaries)
 66        {
 2867            if (isInsideBoundaries)
 68            {
 1769                RemoveInvalidMeshEffect(meshesInfo);
 1770                return;
 71            }
 72
 1173            AddInvalidMeshEffect(meshesInfo);
 1174        }
 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        {
 1788            if (meshesInfo == null || WasGameObjectInAValidPosition(meshesInfo.innerGameObject))
 1389                return;
 90
 491            PoolableObject shapePoolableObjectBehaviour = PoolManager.i.GetPoolable(meshesInfo.meshRootGameObject);
 92
 493            if (shapePoolableObjectBehaviour != null)
 094                shapePoolableObjectBehaviour.OnRelease -= invalidMeshesInfo[meshesInfo.innerGameObject].ResetMaterials;
 95
 496            var renderers = meshesInfo.renderers;
 97
 498            if (renderers != null)
 99            {
 16100                for (int i = 0; i < renderers.Length; i++)
 101                {
 4102                    if (invalidSubmeshes.Contains(renderers[i]))
 4103                        invalidSubmeshes.Remove(renderers[i]);
 104                }
 105            }
 106
 4107            invalidMeshesInfo[meshesInfo.innerGameObject].ResetMaterials();
 4108            currentMeshesInvalidated.Remove(meshesInfo);
 4109        }
 110
 111        void AddInvalidMeshEffect(MeshesInfo meshesInfo)
 112        {
 11113            if (!WasGameObjectInAValidPosition(meshesInfo.innerGameObject))
 0114                return;
 115
 11116            if (currentMeshesInvalidated.Contains(meshesInfo))
 0117                return;
 118
 11119            InvalidMeshInfo invalidMeshInfo = new InvalidMeshInfo(meshesInfo);
 120
 19121            invalidMeshInfo.OnResetMaterials = () => { invalidMeshesInfo.Remove(meshesInfo.innerGameObject); };
 122
 11123            PoolableObject shapePoolableObjectBehaviour = PoolManager.i.GetPoolable(meshesInfo.meshRootGameObject);
 11124            if (shapePoolableObjectBehaviour != null)
 125            {
 0126                shapePoolableObjectBehaviour.OnRelease -= invalidMeshInfo.ResetMaterials;
 0127                shapePoolableObjectBehaviour.OnRelease += invalidMeshInfo.ResetMaterials;
 128            }
 129
 130            // Apply invalid material
 11131            Renderer[] entityRenderers = meshesInfo.renderers;
 44132            for (int i = 0; i < entityRenderers.Length; i++)
 133            {
 134                // Save original materials
 11135                invalidMeshInfo.originalMaterials.Add(entityRenderers[i], entityRenderers[i].sharedMaterial);
 136
 11137                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
 11141                    GameObject wireframeObject = GameObject.Instantiate(Resources.Load<GameObject>(WIREFRAME_PREFAB_NAME
 11142                    wireframeObject.transform.position = entityRenderers[i].bounds.center;
 11143                    wireframeObject.transform.localScale = entityRenderers[i].bounds.size * 1.01f;
 11144                    wireframeObject.transform.SetParent(meshesInfo.innerGameObject.transform);
 145
 11146                    entityRenderers[i].sharedMaterial = invalidSubMeshMaterial;
 147
 11148                    invalidMeshInfo.wireframeObjects.Add(wireframeObject);
 11149                    invalidSubmeshes.Add(entityRenderers[i]);
 11150                }
 151                else
 152                {
 0153                    entityRenderers[i].sharedMaterial = invalidMeshMaterial;
 154                }
 155            }
 156
 11157            currentMeshesInvalidated.Add(meshesInfo);
 11158            invalidMeshesInfo.Add(meshesInfo.innerGameObject, invalidMeshInfo);
 11159        }
 160
 28161        public bool WasGameObjectInAValidPosition(GameObject gameObject) { return !invalidMeshesInfo.ContainsKey(gameObj
 162
 163        public List<Material> GetOriginalMaterials(MeshesInfo meshesInfo)
 164        {
 44165            if (invalidMeshesInfo.ContainsKey(meshesInfo.innerGameObject))
 166            {
 0167                return invalidMeshesInfo[meshesInfo.innerGameObject].originalMaterials.Values.ToList();
 168            }
 169
 44170            List<Material> result = new List<Material>();
 171
 138172            for (int i = 0; i < meshesInfo.renderers.Length; i++)
 173            {
 25174                result.AddRange(meshesInfo.renderers[i].sharedMaterials);
 175            }
 176
 44177            return result;
 178        }
 179    }
 180}