< Summary

Class:DCL.ECSComponents.MeshColliderHandler
Assembly:DCL.ECSComponents.MeshCollider
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/MeshCollider/MeshColliderHandler.cs
Covered lines:67
Uncovered lines:2
Coverable lines:69
Total lines:166
Line coverage:97.1% (67 of 69)
Covered branches:0
Total branches:0
Covered methods:7
Total methods:7
Method coverage:100% (7 of 7)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
MeshColliderHandler(...)0%110100%
OnComponentCreated(...)0%110100%
OnComponentRemoved(...)0%110100%
OnComponentModelUpdated(...)0%9.049092.31%
CreateCollider(...)0%770100%
SetColliderLayer(...)0%330100%
SetInternalColliderComponents(...)0%4.014090.91%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/MeshCollider/MeshColliderHandler.cs

#LineLine coverage
 1using DCL.Controllers;
 2using DCL.ECS7.InternalComponents;
 3using DCL.ECSComponents.Utils;
 4using DCL.ECSRuntime;
 5using DCL.Helpers;
 6using DCL.Models;
 7using UnityEngine;
 8
 9namespace DCL.ECSComponents
 10{
 11    public class MeshColliderHandler : IECSComponentHandler<PBMeshCollider>
 12    {
 13        private const int LAYER_PHYSICS = (int)ColliderLayer.ClPhysics;
 14        private const int LAYER_POINTER = (int)ColliderLayer.ClPointer;
 15
 16        private const int SPHERE_COLLIDER_LONGITUDE = 12;
 17        private const int SPHERE_COLLIDER_LATITUDE = 6;
 18
 19        internal GameObject colliderGameObject;
 20        private Collider collider;
 21        private AssetPromise_PrimitiveMesh primitiveMeshPromise;
 22        private PBMeshCollider prevModel;
 23
 24        private readonly IInternalECSComponent<InternalColliders> pointerColliderComponent;
 25        private readonly IInternalECSComponent<InternalColliders> physicColliderComponent;
 26        private readonly IInternalECSComponent<InternalColliders> customLayerColliderComponent;
 27
 828        public MeshColliderHandler(
 29            IInternalECSComponent<InternalColliders> pointerColliderComponent,
 30            IInternalECSComponent<InternalColliders> physicColliderComponent,
 31            IInternalECSComponent<InternalColliders> customLayerColliderComponent)
 32        {
 833            this.pointerColliderComponent = pointerColliderComponent;
 834            this.physicColliderComponent = physicColliderComponent;
 835            this.customLayerColliderComponent = customLayerColliderComponent;
 836        }
 37
 38        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity)
 39        {
 840            colliderGameObject = new GameObject("MeshCollider");
 841            colliderGameObject.transform.SetParent(entity.gameObject.transform);
 842            colliderGameObject.transform.ResetLocalTRS();
 843        }
 44
 45        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 46        {
 747            pointerColliderComponent.RemoveCollider(scene, entity, collider);
 748            physicColliderComponent.RemoveCollider(scene, entity, collider);
 749            AssetPromiseKeeper_PrimitiveMesh.i.Forget(primitiveMeshPromise);
 750            Object.Destroy(colliderGameObject);
 751        }
 52
 53        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBMeshCollider model)
 54        {
 1455            if (prevModel != null && prevModel.Equals(model))
 056                return;
 57
 1458            bool shouldUpdateMesh = (prevModel?.MeshCase != model.MeshCase)
 59                                    || (model.MeshCase == PBMeshCollider.MeshOneofCase.Cylinder && !prevModel.Cylinder.E
 60
 1461            prevModel = model;
 62
 1463            if (shouldUpdateMesh)
 64            {
 865                pointerColliderComponent.RemoveCollider(scene, entity, collider);
 866                physicColliderComponent.RemoveCollider(scene, entity, collider);
 867                Object.Destroy(collider);
 868                collider = null;
 69
 870                CreateCollider(model);
 71            }
 72
 1473            SetColliderLayer(model);
 1474            SetInternalColliderComponents(scene, entity, model);
 1475        }
 76
 77        private void CreateCollider(PBMeshCollider model)
 78        {
 879            AssetPromise_PrimitiveMesh prevMeshPromise = primitiveMeshPromise;
 80
 881            switch (model.MeshCase)
 82            {
 83                case PBMeshCollider.MeshOneofCase.Box:
 284                    collider = colliderGameObject.AddComponent<BoxCollider>();
 285                    break;
 86                case PBMeshCollider.MeshOneofCase.Plane:
 287                    BoxCollider box = colliderGameObject.AddComponent<BoxCollider>();
 288                    collider = box;
 289                    box.size = new Vector3(1, 1, 0.01f);
 290                    break;
 91                case PBMeshCollider.MeshOneofCase.Sphere:
 92                {
 93                    // since unity's `SphereCollider` can't be deformed using it parent transform scaling
 94                    // we a sphere mesh to set as collider
 195                    MeshCollider meshCollider = colliderGameObject.AddComponent<MeshCollider>();
 196                    collider = meshCollider;
 97
 198                    primitiveMeshPromise = new AssetPromise_PrimitiveMesh(
 99                        AssetPromise_PrimitiveMesh_Model.CreateSphere(0.5f, SPHERE_COLLIDER_LONGITUDE, SPHERE_COLLIDER_L
 100
 2101                    primitiveMeshPromise.OnSuccessEvent += asset => meshCollider.sharedMesh = asset.mesh;
 1102                    primitiveMeshPromise.OnFailEvent += (mesh, exception) => Debug.LogException(exception);
 1103                    AssetPromiseKeeper_PrimitiveMesh.i.Keep(primitiveMeshPromise);
 1104                    break;
 105                }
 106                case PBMeshCollider.MeshOneofCase.Cylinder:
 107                {
 3108                    MeshCollider meshCollider = colliderGameObject.AddComponent<MeshCollider>();
 3109                    collider = meshCollider;
 110
 3111                    primitiveMeshPromise = new AssetPromise_PrimitiveMesh(
 112                        AssetPromise_PrimitiveMesh_Model.CreateCylinder(
 113                            model.Cylinder.GetTopRadius(),
 114                            model.Cylinder.GetBottomRadius()));
 115
 6116                    primitiveMeshPromise.OnSuccessEvent += asset => meshCollider.sharedMesh = asset.mesh;
 3117                    primitiveMeshPromise.OnFailEvent += (mesh, exception) => Debug.LogException(exception);
 3118                    AssetPromiseKeeper_PrimitiveMesh.i.Keep(primitiveMeshPromise);
 119                    break;
 120                }
 121            }
 122
 8123            AssetPromiseKeeper_PrimitiveMesh.i.Forget(prevMeshPromise);
 8124        }
 125
 126        private void SetColliderLayer(PBMeshCollider model)
 127        {
 14128            if (collider)
 129            {
 14130                colliderGameObject.SetActive(true);
 131            }
 132
 14133            uint colliderLayer = model.GetColliderLayer();
 14134            int? layer = LayerMaskUtils.SdkLayerMaskToUnityLayer(colliderLayer);
 135
 14136            if (layer.HasValue)
 137            {
 13138                colliderGameObject.layer = layer.Value;
 139            }
 140            else
 141            {
 1142                colliderGameObject.SetActive(false);
 143            }
 1144        }
 145
 146        private void SetInternalColliderComponents(IParcelScene scene, IDCLEntity entity, PBMeshCollider model)
 147        {
 14148            uint colliderLayer = model.GetColliderLayer();
 149
 14150            if ((colliderLayer & LAYER_POINTER) != 0)
 11151                pointerColliderComponent.AddCollider(scene, entity, collider, colliderLayer);
 152            else
 3153                pointerColliderComponent.RemoveCollider(scene, entity, collider);
 154
 14155            if ((colliderLayer & LAYER_PHYSICS) != 0)
 11156                physicColliderComponent.AddCollider(scene, entity, collider, colliderLayer);
 157            else
 3158                physicColliderComponent.RemoveCollider(scene, entity, collider);
 159
 14160            if (LayerMaskUtils.LayerMaskHasAnySDKCustomLayer((uint)colliderLayer))
 0161                customLayerColliderComponent.AddCollider(scene, entity, collider, colliderLayer);
 162            else
 14163                customLayerColliderComponent.RemoveCollider(scene, entity, collider);
 14164        }
 165    }
 166}