< 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... :'(
 33834            if (colliderInfo.ContainsKey(collider))
 735                colliderInfo[collider] = info;
 36            else
 33137                colliderInfo.Add(collider, info);
 33138        }
 39
 40        void RemoveColliderInfo(Collider collider)
 41        {
 19942            if (colliderInfo.ContainsKey(collider))
 19943                colliderInfo.Remove(collider);
 19944        }
 45
 46        public void RemoveEntityCollider(IDCLEntity entity, Collider collider)
 47        {
 33348            if (entity == null || collider == null || !collidersByEntity.ContainsKey(entity))
 32949                return;
 50
 451            collidersByEntity[entity].Remove(collider);
 452            RemoveColliderInfo(collider);
 453        }
 54
 55        public void AddOrUpdateEntityCollider(IDCLEntity entity, Collider collider)
 56        {
 33857            if (!collidersByEntity.ContainsKey(entity))
 21558                collidersByEntity.Add(entity, new List<Collider>());
 59
 33860            List<Collider> collidersList = collidersByEntity[entity];
 61
 33862            if (!collidersList.Contains(collider))
 33163                collidersList.Add(collider);
 64
 33865            ColliderInfo info = new ColliderInfo();
 33866            info.entity = entity;
 33867            info.meshName = GetMeshName(collider);
 33868            info.scene = entity.scene;
 33869            AddOrUpdateColliderInfo(collider, info);
 70
 71            // Note (Zak): avoid adding the event multiple times
 33872            entity.OnCleanupEvent -= OnEntityCleanUpEvent;
 33873            entity.OnCleanupEvent += OnEntityCleanUpEvent;
 33874        }
 75
 76        private static string GetMeshName(Collider collider)
 77        {
 33878            string originalName = collider.transform.name.ToLower();
 79
 80            // Old GLTF
 35681            if (originalName.Contains("primitive")) { return collider.transform.parent != null ? collider.transform.pare
 82
 32083            return collider.transform.name;
 84        }
 85
 86        void RemoveAllEntityColliders(IDCLEntity entity)
 87        {
 15088            if (collidersByEntity.ContainsKey(entity))
 89            {
 15090                List<Collider> collidersList = collidersByEntity[entity];
 15091                int count = collidersList.Count;
 92
 69093                for (int i = 0; i < count; i++)
 19594                    RemoveColliderInfo(collidersList[i]);
 95
 15096                collidersByEntity.Remove(entity);
 97            }
 15098        }
 99
 100        void OnEntityCleanUpEvent(ICleanableEventDispatcher dispatcher)
 101        {
 150102            dispatcher.OnCleanupEvent -= OnEntityCleanUpEvent;
 103
 150104            RemoveAllEntityColliders((IDCLEntity)dispatcher);
 150105        }
 106
 107        public bool GetColliderInfo(Collider collider, out ColliderInfo info)
 108        {
 16317109            if (collider != null && colliderInfo.ContainsKey(collider))
 110            {
 16317111                info = colliderInfo[collider];
 16317112                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        {
 285126            if (meshGameObject == null)
 0127                return;
 128
 285129            if (entity != null)
 285130                entity.meshesInfo.colliders.Clear();
 131
 285132            if (colliderLayer == -1)
 8133                colliderLayer = DCL.Configuration.PhysicsLayers.defaultLayer;
 134
 135            Collider collider;
 285136            int onClickLayer = PhysicsLayers.onPointerEventLayer; // meshes can have an OnPointerEvent child collider th
 285137            MeshFilter[] meshFilters = meshGameObject.GetComponentsInChildren<MeshFilter>(true);
 138
 1384139            for (int i = 0; i < meshFilters.Length; i++)
 140            {
 407141                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
 407146                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
 260155                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.
 260159                bool shouldCreateCollider = hasCollision || filterByColliderName;
 160
 260161                if (shouldCreateCollider)
 162                {
 244163                    if (collider == null)
 229164                        collider = meshFilters[i].gameObject.AddComponent<MeshCollider>();
 165
 244166                    if (collider is MeshCollider)
 237167                        ((MeshCollider)collider).sharedMesh = meshFilters[i].sharedMesh;
 168
 244169                    if (entity != null)
 244170                        AddOrUpdateEntityCollider(entity, collider);
 171                }
 172
 260173                if (collider != null)
 174                {
 255175                    collider.gameObject.layer = colliderLayer;
 255176                    collider.enabled = shouldCreateCollider;
 177
 255178                    if (entity != null)
 255179                        entity.meshesInfo.colliders.Add(collider);
 180                }
 181            }
 285182        }
 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}