< 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:47
Uncovered lines:1
Coverable lines:48
Total lines:116
Line coverage:97.9% (47 of 48)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
OnComponentCreated(...)0%110100%
OnComponentRemoved(...)0%110100%
OnComponentModelUpdated(...)0%9.089090%
CreateCollider(...)0%660100%
SetColliderLayer(...)0%660100%

File(s)

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

#LineLine coverage
 1using DCL.Configuration;
 2using DCL.Controllers;
 3using DCL.ECSRuntime;
 4using DCL.Helpers;
 5using DCL.Models;
 6using UnityEngine;
 7
 8namespace DCL.ECSComponents
 9{
 10    public class MeshColliderHandler : IECSComponentHandler<PBMeshCollider>
 11    {
 12        internal GameObject colliderGameObject;
 13        private Collider collider;
 14        private AssetPromise_PrimitiveMesh primitiveMeshPromise;
 15        private PBMeshCollider prevModel;
 16
 17        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity)
 18        {
 719            colliderGameObject = new GameObject("MeshCollider");
 720            colliderGameObject.transform.SetParent(entity.gameObject.transform);
 721            colliderGameObject.transform.ResetLocalTRS();
 722        }
 23
 24        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 25        {
 626            AssetPromiseKeeper_PrimitiveMesh.i.Forget(primitiveMeshPromise);
 627            Object.Destroy(colliderGameObject);
 628        }
 29
 30        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBMeshCollider model)
 31        {
 1132            if (prevModel != null && prevModel.Equals(model))
 033                return;
 34
 1135            bool shouldUpdateMesh = (prevModel?.MeshCase != model.MeshCase)
 36                                    || (model.MeshCase == PBMeshCollider.MeshOneofCase.Cylinder && !prevModel.Cylinder.E
 1137            prevModel = model;
 38
 1139            if (shouldUpdateMesh)
 40            {
 741                Object.Destroy(collider);
 742                collider = null;
 43
 744                CreateCollider(model);
 45            }
 46
 1147            SetColliderLayer(model);
 1148        }
 49
 50        private void CreateCollider(PBMeshCollider model)
 51        {
 752            AssetPromise_PrimitiveMesh prevMeshPromise = primitiveMeshPromise;
 53
 54            switch (model.MeshCase)
 55            {
 56                case PBMeshCollider.MeshOneofCase.Box:
 257                    collider = colliderGameObject.AddComponent<BoxCollider>();
 258                    break;
 59                case PBMeshCollider.MeshOneofCase.Plane:
 160                    BoxCollider box = colliderGameObject.AddComponent<BoxCollider>();
 161                    collider = box;
 162                    box.size = new UnityEngine.Vector3(1, 1, 0.01f);
 163                    break;
 64                case PBMeshCollider.MeshOneofCase.Sphere:
 165                    SphereCollider sphere = colliderGameObject.AddComponent<SphereCollider>();
 166                    collider = sphere;
 167                    sphere.radius = 1;
 168                    break;
 69                case PBMeshCollider.MeshOneofCase.Cylinder:
 370                    MeshCollider meshCollider = colliderGameObject.AddComponent<MeshCollider>();
 371                    collider = meshCollider;
 372                    primitiveMeshPromise = new AssetPromise_PrimitiveMesh(
 73                        AssetPromise_PrimitiveMesh_Model.CreateCylinder(
 74                            model.Cylinder.GetTopRadius(),
 75                            model.Cylinder.GetBottomRadius()));
 76
 677                    primitiveMeshPromise.OnSuccessEvent += asset => meshCollider.sharedMesh = asset.mesh;
 378                    primitiveMeshPromise.OnFailEvent += (mesh, exception) => Debug.LogException(exception);
 379                    AssetPromiseKeeper_PrimitiveMesh.i.Keep(primitiveMeshPromise);
 80                    break;
 81            }
 782            AssetPromiseKeeper_PrimitiveMesh.i.Forget(prevMeshPromise);
 783        }
 84
 85        private void SetColliderLayer(PBMeshCollider model)
 86        {
 1187            if (collider)
 88            {
 1189                colliderGameObject.SetActive(true);
 90            }
 91
 92            const int physicsLayer = (int)ColliderLayer.Physics;
 93            const int pointerLayer = (int)ColliderLayer.Pointer;
 94            const int pointerAndPhysicsMask = physicsLayer | pointerLayer;
 95
 1196            int colliderLayer = model.GetColliderLayer();
 97
 1198            if ((colliderLayer & pointerAndPhysicsMask) == pointerAndPhysicsMask)
 99            {
 8100                colliderGameObject.layer = PhysicsLayers.defaultLayer;
 101            }
 3102            else if ((colliderLayer & physicsLayer) == physicsLayer)
 103            {
 1104                colliderGameObject.layer = PhysicsLayers.characterOnlyLayer;
 105            }
 2106            else if ((colliderLayer & pointerLayer) == pointerLayer)
 107            {
 1108                colliderGameObject.layer = PhysicsLayers.onPointerEventLayer;
 109            }
 1110            else if (collider != null)
 111            {
 1112                colliderGameObject.SetActive(false);
 113            }
 1114        }
 115    }
 116}