< Summary

Class:DCL.CollidersManager
Assembly:CollidersManager
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/CollidersManager/CollidersManager.cs
Covered lines:75
Uncovered lines:10
Coverable lines:85
Total lines:192
Line coverage:88.2% (75 of 85)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
CollidersManager()0%110100%
Release()0%12300%
AddOrUpdateColliderInfo(...)0%220100%
RemoveColliderInfo(...)0%220100%
RemoveEntityCollider(...)0%440100%
AddOrUpdateEntityCollider(...)0%330100%
GetMeshName(...)0%330100%
RemoveAllEntityColliders(...)0%330100%
OnEntityCleanUpEvent(...)0%110100%
GetColliderInfo(...)0%3.583060%
ConfigureColliders(...)0%110100%
ConfigureColliders(...)0%14.0114096.67%
IsCollider(...)0%110100%

File(s)

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

#LineLine coverage
 1using DCL.Components;
 2using DCL.Configuration;
 3using DCL.Models;
 4using System.Collections.Generic;
 5using UnityEngine;
 6
 7namespace DCL
 8{
 9    public class CollidersManager : Singleton<CollidersManager>
 10    {
 111        private Dictionary<Collider, ColliderInfo> colliderInfo = new ();
 112        private Dictionary<IDCLEntity, List<Collider>> collidersByEntity = new ();
 13        private static CollidersManager instance = null;
 14
 15        public static void Release()
 16        {
 017            if (instance != null)
 18            {
 019                using (var iterator = instance.collidersByEntity.Keys.GetEnumerator())
 20                {
 021                    while (iterator.MoveNext())
 022                        iterator.Current.OnCleanupEvent -= instance.OnEntityCleanUpEvent;
 023                }
 24
 025                instance = null;
 26            }
 027        }
 28
 29        void AddOrUpdateColliderInfo(Collider collider, ColliderInfo info)
 30        {
 31            // Note (Zak): This could be achieved in one line
 32            // just by doing colliderInfo[collider] = info;
 33            // but nobody likes it that way... :'(
 33934            if (colliderInfo.ContainsKey(collider))
 735                colliderInfo[collider] = info;
 36            else
 33237                colliderInfo.Add(collider, info);
 33238        }
 39
 40        void RemoveColliderInfo(Collider collider)
 41        {
 20042            if (colliderInfo.ContainsKey(collider))
 20043                colliderInfo.Remove(collider);
 20044        }
 45
 46        public void RemoveEntityCollider(IDCLEntity entity, Collider collider)
 47        {
 33248            if (entity == null || collider == null || !collidersByEntity.ContainsKey(entity))
 32849                return;
 50
 451            collidersByEntity[entity].Remove(collider);
 452            RemoveColliderInfo(collider);
 453        }
 54
 55        public void AddOrUpdateEntityCollider(IDCLEntity entity, Collider collider)
 56        {
 33957            if (!collidersByEntity.ContainsKey(entity))
 21658                collidersByEntity.Add(entity, new List<Collider>());
 59
 33960            List<Collider> collidersList = collidersByEntity[entity];
 61
 33962            if (!collidersList.Contains(collider))
 33263                collidersList.Add(collider);
 64
 33965            ColliderInfo info = new ColliderInfo();
 33966            info.entity = entity;
 33967            info.meshName = GetMeshName(collider);
 33968            info.scene = entity.scene;
 33969            AddOrUpdateColliderInfo(collider, info);
 70
 71            // Note (Zak): avoid adding the event multiple times
 33972            entity.OnCleanupEvent -= OnEntityCleanUpEvent;
 33973            entity.OnCleanupEvent += OnEntityCleanUpEvent;
 33974        }
 75
 76        private static string GetMeshName(Collider collider)
 77        {
 33978            string originalName = collider.transform.name.ToLower();
 79
 80            // Old GLTF
 35781            if (originalName.Contains("primitive")) { return collider.transform.parent != null ? collider.transform.pare
 82
 32183            return collider.transform.name;
 84        }
 85
 86        void RemoveAllEntityColliders(IDCLEntity entity)
 87        {
 15188            if (collidersByEntity.ContainsKey(entity))
 89            {
 15190                List<Collider> collidersList = collidersByEntity[entity];
 15191                int count = collidersList.Count;
 92
 69493                for (int i = 0; i < count; i++)
 19694                    RemoveColliderInfo(collidersList[i]);
 95
 15196                collidersByEntity.Remove(entity);
 97            }
 15198        }
 99
 100        void OnEntityCleanUpEvent(ICleanableEventDispatcher dispatcher)
 101        {
 151102            dispatcher.OnCleanupEvent -= OnEntityCleanUpEvent;
 103
 151104            RemoveAllEntityColliders((IDCLEntity)dispatcher);
 151105        }
 106
 107        public bool GetColliderInfo(Collider collider, out ColliderInfo info)
 108        {
 14835109            if (collider != null && colliderInfo.ContainsKey(collider))
 110            {
 14835111                info = colliderInfo[collider];
 14835112                return true;
 113            }
 0114            else { info = new ColliderInfo(); }
 115
 0116            return false;
 117        }
 118
 119        public void ConfigureColliders(IDCLEntity entity, bool hasCollision = true, bool filterByColliderName = true)
 120        {
 1121            ConfigureColliders(entity.meshRootGameObject, hasCollision, filterByColliderName, entity);
 1122        }
 123
 124        public void ConfigureColliders(GameObject meshGameObject, bool hasCollision, bool filterByColliderName = false, 
 125        {
 286126            if (meshGameObject == null)
 0127                return;
 128
 286129            if (entity != null)
 286130                entity.meshesInfo.colliders.Clear();
 131
 286132            if (colliderLayer == -1)
 8133                colliderLayer = DCL.Configuration.PhysicsLayers.defaultLayer;
 134
 135            Collider collider;
 286136            int onClickLayer = PhysicsLayers.onPointerEventLayer; // meshes can have an OnPointerEvent child collider th
 286137            MeshFilter[] meshFilters = meshGameObject.GetComponentsInChildren<MeshFilter>(true);
 138
 1388139            for (int i = 0; i < meshFilters.Length; i++)
 140            {
 408141                if (meshFilters[i].gameObject.layer == onClickLayer)
 142                    continue;
 143
 144                // NOTE(Kinerius): By design every collider shouldn't have a renderer, so if we detect it, we remove it,
 145                // but this step should not be done on this domain, we should be able to remove this check safely in the
 408146                if (filterByColliderName)
 147                {
 165148                    if (!IsCollider(meshFilters[i].transform))
 149                        continue;
 150
 151                    // NOTE(Kinerius): This is dangerous and might cause some null references since some objects like Me
 18152                    Object.Destroy(meshFilters[i].GetComponent<Renderer>());
 153                }
 154
 261155                collider = meshFilters[i].GetComponent<Collider>();
 156
 157                //HACK(Pravus): Hack to bring back compatibility with old builder scenes that have withCollision = false
 158                //              Remove when we fix this changing the property name or something similar.
 261159                bool shouldCreateCollider = hasCollision || filterByColliderName;
 160
 261161                if (shouldCreateCollider)
 162                {
 245163                    if (collider == null)
 230164                        collider = meshFilters[i].gameObject.AddComponent<MeshCollider>();
 165
 245166                    if (collider is MeshCollider)
 238167                        ((MeshCollider)collider).sharedMesh = meshFilters[i].sharedMesh;
 168
 245169                    if (entity != null)
 245170                        AddOrUpdateEntityCollider(entity, collider);
 171                }
 172
 261173                if (collider != null)
 174                {
 256175                    collider.gameObject.layer = colliderLayer;
 256176                    collider.enabled = shouldCreateCollider;
 177
 256178                    if (entity != null)
 256179                        entity.meshesInfo.colliders.Add(collider);
 180                }
 181            }
 286182        }
 183
 184        private static bool IsCollider(Transform transform)
 185        {
 165186            bool transformName = transform.name.ToLower().Contains("_collider");
 165187            bool parentName = transform.parent.name.ToLower().Contains("_collider");
 188
 165189            return parentName || transformName;
 190        }
 191    }
 192}