< Summary

Class:DCL.Components.OnPointerEventColliders
Assembly:DCL.Components.Events
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/UUIDEventComponentsPlugin/UUIDComponent/OnPointerEventColliders.cs
Covered lines:66
Uncovered lines:6
Coverable lines:72
Total lines:167
Line coverage:91.6% (66 of 72)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
OnPointerEventColliders()0%110100%
GetMeshName(...)0%220100%
Initialize(...)0%13.0213095%
UpdateCollidersEnabledBasedOnRenderers(...)0%12.8911075%
UpdateCollidersWithRenderersMesh(...)0%330100%
CreateCollider(...)0%220100%
AreCollidersCreated(...)0%8.18088.24%
Dispose()0%110100%
DestroyColliders()0%440100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/UUIDEventComponentsPlugin/UUIDComponent/OnPointerEventColliders.cs

#LineLine coverage
 1using System;
 2using DCL.Configuration;
 3using DCL.Helpers;
 4using DCL.Models;
 5using System.Collections.Generic;
 6using UnityEngine;
 7
 8namespace DCL.Components
 9{
 10    public class OnPointerEventColliders : IDisposable
 11    {
 12        public const string COLLIDER_NAME = "OnPointerEventCollider";
 13
 14        internal MeshCollider[] colliders;
 7115        Dictionary<Collider, string> colliderNames = new Dictionary<Collider, string>();
 16
 17        public string GetMeshName(Collider collider)
 18        {
 619            if (colliderNames.ContainsKey(collider))
 320                return colliderNames[collider];
 21
 322            return null;
 23        }
 24
 25        private IDCLEntity ownerEntity;
 26
 27        public void Initialize(IDCLEntity entity)
 28        {
 11429            Renderer[] rendererList = entity?.meshesInfo?.renderers;
 30
 11431            if (rendererList == null || rendererList.Length == 0)
 32            {
 3533                if (colliders != null && colliders.Length > 0)
 834                    DestroyColliders();
 35
 3536                return;
 37            }
 38
 7939            if (AreCollidersCreated(rendererList))
 40            {
 2141                UpdateCollidersWithRenderersMesh(rendererList);
 2142                return;
 43            }
 44
 5845            IShape shape = entity.meshesInfo.currentShape;
 46
 5847            ownerEntity = entity;
 48
 5849            DestroyColliders();
 50
 5851            if (shape == null)
 052                return;
 53
 5854            colliders = new MeshCollider[rendererList.Length];
 55
 29656            for (int i = 0; i < colliders.Length; i++)
 57            {
 9058                if (rendererList[i] == null)
 59                    continue;
 9060                colliders[i] = CreateCollider(rendererList[i]);
 61            }
 5862        }
 63
 64        public void UpdateCollidersEnabledBasedOnRenderers(IDCLEntity entity)
 65        {
 166            if (colliders == null || colliders.Length == 0)
 067                return;
 68
 169            Renderer[] rendererList = entity?.meshesInfo?.renderers;
 70
 171            if (rendererList == null || rendererList.Length == 0)
 72            {
 073                DestroyColliders();
 074                return;
 75            }
 76
 477            for (int i = 0; i < colliders.Length; i++)
 78            {
 179                if (rendererList[i] == null)
 80                    continue;
 181                colliders[i].enabled = rendererList[i].enabled;
 82            }
 183        }
 84
 85        void UpdateCollidersWithRenderersMesh(Renderer[] rendererList)
 86        {
 9287            for (int i = 0; i < colliders.Length; i++)
 88            {
 2589                if (colliders[i].sharedMaterial == null)
 2590                    colliders[i].sharedMesh = rendererList[i].GetComponent<MeshFilter>().sharedMesh;
 91            }
 2192        }
 93
 94        MeshCollider CreateCollider(Renderer renderer)
 95        {
 9096            GameObject go = new GameObject(COLLIDER_NAME);
 97
 9098            go.name = COLLIDER_NAME;
 9099            go.layer = PhysicsLayers.onPointerEventLayer; // to avoid character collisions with onclick collider
 100
 90101            var meshCollider = go.AddComponent<MeshCollider>();
 90102            meshCollider.sharedMesh = renderer.GetComponent<MeshFilter>().sharedMesh;
 90103            meshCollider.enabled = renderer.enabled;
 104
 90105            if (renderer.transform.parent != null)
 90106                colliderNames.Add(meshCollider, renderer.transform.parent.name);
 107
 90108            CollidersManager.i.AddOrUpdateEntityCollider(ownerEntity, meshCollider);
 109
 110            // Reset objects position, rotation and scale once it's been parented
 90111            Transform t = go.transform;
 112
 90113            t.SetParent(renderer.transform);
 90114            t.ResetLocalTRS();
 115
 90116            return meshCollider;
 117        }
 118
 119        private bool AreCollidersCreated(Renderer[] rendererList)
 120        {
 79121            if (colliders == null || colliders.Length == 0)
 58122                return false;
 123
 21124            if (rendererList.Length != colliders.Length)
 0125                return false;
 126
 92127            for (int i = 0; i < rendererList.Length; i++)
 128            {
 25129                bool foundChildCollider = false;
 62130                for (int j = 0; j < colliders.Length; j++)
 131                {
 31132                    if (colliders[j].transform.parent == rendererList[i].transform)
 133                    {
 25134                        foundChildCollider = true;
 25135                        break;
 136                    }
 137                }
 138
 25139                if (!foundChildCollider)
 0140                    return false;
 141            }
 142
 21143            return true;
 144        }
 145
 146        public void Dispose()
 147        {
 63148            DestroyColliders();
 63149        }
 150
 151        void DestroyColliders()
 152        {
 129153            if (colliders == null)
 71154                return;
 155
 296156            for (int i = 0; i < colliders.Length; i++)
 157            {
 90158                Collider collider = colliders[i];
 159
 90160                if (collider != null)
 48161                    UnityEngine.Object.Destroy(collider.gameObject);
 162            }
 163
 58164            colliders = null;
 58165        }
 166    }
 167}