< Summary

Class:DCL.ECSComponents.GltfContainerCollidersHandler
Assembly:DCL.ECSComponents.GltfContainer
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/GltfContainer/GltfContainerCollidersHandler.cs
Covered lines:50
Uncovered lines:7
Coverable lines:57
Total lines:154
Line coverage:87.7% (50 of 57)
Covered branches:0
Total branches:0
Covered methods:8
Total methods:8
Method coverage:100% (8 of 8)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
GltfContainerCollidersHandler()0%110100%
CleanUp()0%440100%
InitInvisibleMeshesColliders(...)0%4.134080%
InitVisibleMeshesColliders(...)0%2.092071.43%
GetVisibleMeshesColliders()0%2.152066.67%
GetInvisibleMeshesColliders()0%110100%
SetVisibleMeshesColliders(...)0%8.018094.74%
IsCollider(...)0%220100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/GltfContainer/GltfContainerCollidersHandler.cs

#LineLine coverage
 1using DCL.Configuration;
 2using DCL.Helpers;
 3using System;
 4using System.Collections.Generic;
 5using UnityEngine;
 6using Object = UnityEngine.Object;
 7
 8namespace DCL.ECSComponents
 9{
 10    public class GltfContainerCollidersHandler
 11    {
 3312        private readonly List<Collider> invisibleMeshesColliders = new List<Collider>(10); // colliders from `_collider`
 3313        private readonly List<Collider> visibleMeshesColliders = new List<Collider>(10); // colliders from renderers
 14        private IReadOnlyCollection<Renderer> cachedRenderers;
 15
 16        // We restore all modifications on colliders to avoid issues with sdk6 GLTFShape
 17        public void CleanUp()
 18        {
 5619            for (int i = 0; i < invisibleMeshesColliders.Count; i++)
 20            {
 821                Collider collider = invisibleMeshesColliders[i];
 822                collider.enabled = false;
 823                collider.gameObject.layer = PhysicsLayers.characterOnlyLayer;
 24            }
 25
 4626            for (int i = 0; i < visibleMeshesColliders.Count; i++)
 27            {
 328                Collider collider = visibleMeshesColliders[i];
 29
 330                if (collider)
 331                    Object.Destroy(collider);
 32            }
 33
 2034            invisibleMeshesColliders.Clear();
 2035            visibleMeshesColliders.Clear();
 2036        }
 37
 38        // Since gltf are modified when creating colliders and stored in cache library with those modifications
 39        // we check if colliders already exists and disable them
 40        // otherwise we create them (disabled)
 41        public IReadOnlyList<Collider> InitInvisibleMeshesColliders(IReadOnlyList<MeshFilter> meshFilters)
 42        {
 3143            invisibleMeshesColliders.Clear();
 44
 15245            for (int i = 0; i < meshFilters.Count; i++)
 46            {
 4547                if (!IsCollider(meshFilters[i]))
 48                    continue;
 49
 2150                Collider collider = meshFilters[i].gameObject.GetComponent<Collider>();
 51
 2152                if (collider != null)
 53                {
 054                    collider.enabled = false;
 055                    invisibleMeshesColliders.Add(collider);
 056                    continue;
 57                }
 58
 2159                MeshCollider newCollider = meshFilters[i].gameObject.AddComponent<MeshCollider>();
 2160                newCollider.sharedMesh = meshFilters[i].sharedMesh;
 2161                newCollider.enabled = false;
 2162                invisibleMeshesColliders.Add(newCollider);
 63            }
 64
 3165            return invisibleMeshesColliders;
 66        }
 67
 68        // Since gltf are modified when creating colliders and stored in cache library with those modifications
 69        // we check if colliders already exists and disable them
 70        // if `createColliders` we create them (disabled)
 71        public IReadOnlyList<Collider> InitVisibleMeshesColliders(IReadOnlyCollection<Renderer> renderers, bool createCo
 72        {
 3173            cachedRenderers = renderers;
 74
 75            try
 76            {
 3177                if (createColliders)
 78                {
 1179                    SetVisibleMeshesColliders(renderers);
 80                }
 3181            }
 82            catch (Exception e)
 83            {
 084                Debug.LogException(e);
 085            }
 86
 3187            return visibleMeshesColliders;
 88        }
 89
 90        // Create visible meshes colliders if there are none created yet
 91        // otherwise return the already created colliders
 92        public IReadOnlyList<Collider> GetVisibleMeshesColliders()
 93        {
 94            try
 95            {
 1796                if (visibleMeshesColliders.Count == 0)
 197                    SetVisibleMeshesColliders(cachedRenderers);
 1798            }
 099            catch (Exception e) { Debug.LogException(e); }
 100
 17101            return visibleMeshesColliders;
 102        }
 103
 104        public IReadOnlyList<Collider> GetInvisibleMeshesColliders()
 105        {
 38106            return invisibleMeshesColliders;
 107        }
 108
 109        private void SetVisibleMeshesColliders(IReadOnlyCollection<Renderer> renderers)
 110        {
 111            const string POINTER_COLLIDER_NAME = "OnPointerEventCollider";
 112
 12113            if (visibleMeshesColliders.Count > 0)
 0114                return;
 115
 52116            foreach (Renderer renderer in renderers)
 117            {
 14118                Mesh colliderMesh = null;
 119
 14120                if (renderer is SkinnedMeshRenderer skinnedMeshRenderer)
 121                {
 1122                    colliderMesh = skinnedMeshRenderer.sharedMesh;
 123                }
 124                else
 125                {
 13126                    MeshFilter meshFilter = renderer.GetComponent<MeshFilter>();
 13127                    colliderMesh = meshFilter ? meshFilter.sharedMesh : null;
 128                }
 129
 14130                if (!colliderMesh)
 131                    continue;
 132
 14133                GameObject colliderGo = new GameObject(POINTER_COLLIDER_NAME);
 14134                MeshCollider newCollider = colliderGo.AddComponent<MeshCollider>();
 135
 14136                newCollider.sharedMesh = colliderMesh;
 14137                newCollider.enabled = false;
 14138                colliderGo.transform.SetParent(renderer.transform);
 14139                colliderGo.transform.ResetLocalTRS();
 14140                visibleMeshesColliders.Add(newCollider);
 141            }
 12142        }
 143
 144        // Compatibility layer for old GLTF importer and GLTFast
 145        private static bool IsCollider(MeshFilter meshFilter)
 146        {
 147            const StringComparison IGNORE_CASE = StringComparison.OrdinalIgnoreCase;
 148            const string COLLIDER_SUFFIX = "_collider";
 149
 45150            return meshFilter.name.Contains(COLLIDER_SUFFIX, IGNORE_CASE)
 151                   || meshFilter.transform.parent.name.Contains(COLLIDER_SUFFIX, IGNORE_CASE);
 152        }
 153    }
 154}