< Summary

Class:DCL.CollidersManager
Assembly:CollidersManager
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/CollidersManager/CollidersManager.cs
Covered lines:70
Uncovered lines:16
Coverable lines:86
Total lines:195
Line coverage:81.3% (70 of 86)
Covered branches:0
Total branches:0
Covered methods:11
Total methods:13
Method coverage:84.6% (11 of 13)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
CollidersManager()0%110100%
Release()0%12300%
AddOrUpdateColliderInfo(...)0%2.062075%
RemoveColliderInfo(...)0%220100%
RemoveEntityCollider(...)0%20400%
AddOrUpdateEntityCollider(...)0%440100%
GetMeshName(...)0%3.143075%
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... :'(
 32634            if (colliderInfo.ContainsKey(collider))
 035                colliderInfo[collider] = info;
 36            else
 32637                colliderInfo.Add(collider, info);
 32638        }
 39
 40        void RemoveColliderInfo(Collider collider)
 41        {
 19442            if (colliderInfo.ContainsKey(collider))
 19443                colliderInfo.Remove(collider);
 19444        }
 45
 46        public void RemoveEntityCollider(IDCLEntity entity, Collider collider)
 47        {
 048            if (entity == null || collider == null || !collidersByEntity.ContainsKey(entity))
 049                return;
 50
 051            collidersByEntity[entity].Remove(collider);
 052            RemoveColliderInfo(collider);
 053        }
 54
 55        public void AddOrUpdateEntityCollider(IDCLEntity entity, Collider collider)
 56        {
 33357            if (!collidersByEntity.ContainsKey(entity))
 21058                collidersByEntity.Add(entity, new List<Collider>());
 59
 33360            List<Collider> collidersList = collidersByEntity[entity];
 61
 33362            if (!collidersList.Contains(collider))
 32663                collidersList.Add(collider);
 64
 33365            if (!colliderInfo.ContainsKey(collider))
 66            {
 32667                var info = new ColliderInfo();
 32668                info.entity = entity;
 32669                info.meshName = GetMeshName(collider);
 32670                info.scene = entity.scene;
 32671                AddOrUpdateColliderInfo(collider, info);
 72            }
 73
 74            // Note (Zak): avoid adding the event multiple times
 33375            entity.OnCleanupEvent -= OnEntityCleanUpEvent;
 33376            entity.OnCleanupEvent += OnEntityCleanUpEvent;
 33377        }
 78
 79        private static string GetMeshName(Collider collider)
 80        {
 32681            string originalName = collider.transform.name.ToLower();
 82
 83            // Old GLTF
 32684            if (originalName.Contains("primitive")) { return collider.transform.parent != null ? collider.transform.pare
 85
 32686            return collider.transform.name;
 87        }
 88
 89        void RemoveAllEntityColliders(IDCLEntity entity)
 90        {
 14991            if (collidersByEntity.ContainsKey(entity))
 92            {
 14993                List<Collider> collidersList = collidersByEntity[entity];
 14994                int count = collidersList.Count;
 95
 68696                for (int i = 0; i < count; i++)
 19497                    RemoveColliderInfo(collidersList[i]);
 98
 14999                collidersByEntity.Remove(entity);
 100            }
 149101        }
 102
 103        void OnEntityCleanUpEvent(ICleanableEventDispatcher dispatcher)
 104        {
 149105            dispatcher.OnCleanupEvent -= OnEntityCleanUpEvent;
 106
 149107            RemoveAllEntityColliders((IDCLEntity)dispatcher);
 149108        }
 109
 110        public bool GetColliderInfo(Collider collider, out ColliderInfo info)
 111        {
 6602112            if (collider != null && colliderInfo.ContainsKey(collider))
 113            {
 6602114                info = colliderInfo[collider];
 6602115                return true;
 116            }
 0117            else { info = new ColliderInfo(); }
 118
 0119            return false;
 120        }
 121
 122        public void ConfigureColliders(IDCLEntity entity, bool hasCollision = true, bool filterByColliderName = true)
 123        {
 1124            ConfigureColliders(entity.meshRootGameObject, hasCollision, filterByColliderName, entity);
 1125        }
 126
 127        public void ConfigureColliders(GameObject meshGameObject, bool hasCollision, bool filterByColliderName = false, 
 128        {
 279129            if (meshGameObject == null)
 0130                return;
 131
 279132            if (entity != null)
 279133                entity.meshesInfo.colliders.Clear();
 134
 279135            if (colliderLayer == -1)
 8136                colliderLayer = PhysicsLayers.defaultLayer;
 137
 138            Collider collider;
 279139            int onClickLayer = PhysicsLayers.onPointerEventLayer; // meshes can have an OnPointerEvent child collider th
 279140            MeshFilter[] meshFilters = meshGameObject.GetComponentsInChildren<MeshFilter>(true);
 141
 1300142            for (int i = 0; i < meshFilters.Length; i++)
 143            {
 371144                if (meshFilters[i].gameObject.layer == onClickLayer)
 145                    continue;
 146
 147                // NOTE(Kinerius): By design every collider shouldn't have a renderer, so if we detect it, we remove it,
 148                // but this step should not be done on this domain, we should be able to remove this check safely in the
 371149                if (filterByColliderName)
 150                {
 130151                    if (!IsCollider(meshFilters[i].transform))
 152                        continue;
 153
 154                    // NOTE(Kinerius): This is dangerous and might cause some null references since some objects like Me
 18155                    Object.Destroy(meshFilters[i].GetComponent<Renderer>());
 156                }
 157
 259158                collider = meshFilters[i].GetComponent<Collider>();
 159
 160                //HACK(Pravus): Hack to bring back compatibility with old builder scenes that have withCollision = false
 161                //              Remove when we fix this changing the property name or something similar.
 259162                bool shouldCreateCollider = hasCollision || filterByColliderName;
 163
 259164                if (shouldCreateCollider)
 165                {
 243166                    if (collider == null)
 228167                        collider = meshFilters[i].gameObject.AddComponent<MeshCollider>();
 168
 243169                    if (collider is MeshCollider)
 236170                        ((MeshCollider)collider).sharedMesh = meshFilters[i].sharedMesh;
 171
 243172                    if (entity != null)
 243173                        AddOrUpdateEntityCollider(entity, collider);
 174                }
 175
 259176                if (collider != null)
 177                {
 254178                    collider.gameObject.layer = colliderLayer;
 254179                    collider.enabled = shouldCreateCollider;
 180
 254181                    if (entity != null)
 254182                        entity.meshesInfo.colliders.Add(collider);
 183                }
 184            }
 279185        }
 186
 187        private static bool IsCollider(Transform transform)
 188        {
 130189            bool transformName = transform.name.ToLower().Contains("_collider");
 130190            bool parentName = transform.parent.name.ToLower().Contains("_collider");
 191
 130192            return parentName || transformName;
 193        }
 194    }
 195}