< 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:67
Uncovered lines:9
Coverable lines:76
Total lines:181
Line coverage:88.1% (67 of 76)
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%330100%
TryGetSharedMesh(...)0%4.683042.86%
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;
 6315        private readonly Dictionary<Collider, string> colliderNames = new ();
 16
 17        public string GetMeshName(Collider collider) =>
 618            colliderNames.ContainsKey(collider) ? colliderNames[collider] : null;
 19
 20        private IDCLEntity ownerEntity;
 21
 22        public void Initialize(IDCLEntity entity)
 23        {
 11424            Renderer[] rendererList = entity?.meshesInfo?.renderers;
 25
 11426            if (rendererList == null || rendererList.Length == 0)
 27            {
 3528                if (colliders != null && colliders.Length > 0)
 829                    DestroyColliders();
 30
 3531                return;
 32            }
 33
 7934            if (AreCollidersCreated(rendererList))
 35            {
 2136                UpdateCollidersWithRenderersMesh(rendererList);
 2137                return;
 38            }
 39
 5840            IShape shape = entity.meshesInfo.currentShape;
 41
 5842            ownerEntity = entity;
 43
 5844            DestroyColliders();
 45
 5846            if (shape == null)
 047                return;
 48
 5849            colliders = new MeshCollider[rendererList.Length];
 50
 29651            for (int i = 0; i < colliders.Length; i++)
 52            {
 9053                if (rendererList[i] == null)
 54                    continue;
 55
 9056                colliders[i] = CreateCollider(rendererList[i]);
 57            }
 5858        }
 59
 60        public void UpdateCollidersEnabledBasedOnRenderers(IDCLEntity entity)
 61        {
 162            if (colliders == null || colliders.Length == 0)
 063                return;
 64
 165            Renderer[] rendererList = entity?.meshesInfo?.renderers;
 66
 167            if (rendererList == null || rendererList.Length == 0)
 68            {
 069                DestroyColliders();
 070                return;
 71            }
 72
 473            for (int i = 0; i < colliders.Length; i++)
 74            {
 175                if (rendererList[i] == null)
 76                    continue;
 77
 178                colliders[i].enabled = rendererList[i].enabled;
 79            }
 180        }
 81
 82        private void UpdateCollidersWithRenderersMesh(Renderer[] rendererList)
 83        {
 9284            for (int i = 0; i < colliders.Length; i++)
 85            {
 2586                if (colliders[i].sharedMaterial == null)
 2587                    colliders[i].sharedMesh = TryGetSharedMesh(rendererList[i]);
 88            }
 2189        }
 90
 91        private MeshCollider CreateCollider(Renderer renderer)
 92        {
 9093            GameObject go = new GameObject(COLLIDER_NAME);
 94
 9095            go.name = COLLIDER_NAME;
 9096            go.layer = PhysicsLayers.onPointerEventLayer; // to avoid character collisions with onclick collider
 97
 9098            var meshCollider = go.AddComponent<MeshCollider>();
 9099            meshCollider.sharedMesh = TryGetSharedMesh(renderer);
 90100            meshCollider.enabled = renderer.enabled;
 101
 102            // Old GLTF Importer support, new one does not create Primitive sub-objects
 90103            if (renderer.name == "Primitive" && renderer.transform.parent != null)
 48104                colliderNames.Add(meshCollider, renderer.transform.parent.name);
 105            else
 42106                colliderNames.Add(meshCollider, renderer.transform.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 static Mesh TryGetSharedMesh(Renderer renderer)
 120        {
 115121            MeshFilter meshFilter = renderer.GetComponent<MeshFilter>();
 122
 230123            if (meshFilter != null) return meshFilter.sharedMesh;
 124
 0125            SkinnedMeshRenderer skinnedMeshRenderer = renderer.GetComponent<SkinnedMeshRenderer>();
 126
 0127            if (skinnedMeshRenderer != null) { return skinnedMeshRenderer.sharedMesh; }
 128
 0129            return meshFilter.sharedMesh;
 130        }
 131
 132        private bool AreCollidersCreated(Renderer[] rendererList)
 133        {
 79134            if (colliders == null || colliders.Length == 0)
 58135                return false;
 136
 21137            if (rendererList.Length != colliders.Length)
 0138                return false;
 139
 92140            for (int i = 0; i < rendererList.Length; i++)
 141            {
 25142                bool foundChildCollider = false;
 143
 62144                for (int j = 0; j < colliders.Length; j++)
 145                {
 31146                    if (colliders[j].transform.parent == rendererList[i].transform)
 147                    {
 25148                        foundChildCollider = true;
 25149                        break;
 150                    }
 151                }
 152
 25153                if (!foundChildCollider)
 0154                    return false;
 155            }
 156
 21157            return true;
 158        }
 159
 160        public void Dispose()
 161        {
 63162            DestroyColliders();
 63163        }
 164
 165        private void DestroyColliders()
 166        {
 129167            if (colliders == null)
 71168                return;
 169
 296170            for (int i = 0; i < colliders.Length; i++)
 171            {
 90172                Collider collider = colliders[i];
 173
 90174                if (collider != null)
 48175                    UnityEngine.Object.Destroy(collider.gameObject);
 176            }
 177
 58178            colliders = null;
 58179        }
 180    }
 181}