< 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:64
Uncovered lines:1
Coverable lines:65
Total lines:157
Line coverage:98.4% (64 of 65)
Covered branches:0
Total branches:0

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%660100%
SetColliderLayer(...)0%660100%
SetInternalColliderComponents(...)0%330100%

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.ECS7.InternalComponents;
 4using DCL.ECSRuntime;
 5using DCL.Helpers;
 6using DCL.Models;
 7using UnityEngine;
 8
 9namespace DCL.ECSComponents
 10{
 11    public class MeshColliderHandler : IECSComponentHandler<PBMeshCollider>
 12    {
 13        internal GameObject colliderGameObject;
 14        private Collider collider;
 15        private AssetPromise_PrimitiveMesh primitiveMeshPromise;
 16        private PBMeshCollider prevModel;
 17
 18        private readonly IInternalECSComponent<InternalColliders> pointerColliderComponent;
 19        private readonly IInternalECSComponent<InternalColliders> physicColliderComponent;
 20
 821        public MeshColliderHandler(IInternalECSComponent<InternalColliders> pointerColliderComponent,
 22            IInternalECSComponent<InternalColliders> physicColliderComponent)
 23        {
 824            this.pointerColliderComponent = pointerColliderComponent;
 825            this.physicColliderComponent = physicColliderComponent;
 826        }
 27
 28        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity)
 29        {
 830            colliderGameObject = new GameObject("MeshCollider");
 831            colliderGameObject.transform.SetParent(entity.gameObject.transform);
 832            colliderGameObject.transform.ResetLocalTRS();
 833        }
 34
 35        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 36        {
 737            pointerColliderComponent.RemoveCollider(scene, entity, collider);
 738            physicColliderComponent.RemoveCollider(scene, entity, collider);
 739            AssetPromiseKeeper_PrimitiveMesh.i.Forget(primitiveMeshPromise);
 740            Object.Destroy(colliderGameObject);
 741        }
 42
 43        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBMeshCollider model)
 44        {
 1445            if (prevModel != null && prevModel.Equals(model))
 046                return;
 47
 1448            bool shouldUpdateMesh = (prevModel?.MeshCase != model.MeshCase)
 49                                    || (model.MeshCase == PBMeshCollider.MeshOneofCase.Cylinder && !prevModel.Cylinder.E
 1450            prevModel = model;
 51
 1452            if (shouldUpdateMesh)
 53            {
 854                pointerColliderComponent.RemoveCollider(scene, entity, collider);
 855                physicColliderComponent.RemoveCollider(scene, entity, collider);
 856                Object.Destroy(collider);
 857                collider = null;
 58
 859                CreateCollider(model);
 60            }
 61
 1462            SetColliderLayer(model);
 1463            SetInternalColliderComponents(scene, entity, model);
 1464        }
 65
 66        private void CreateCollider(PBMeshCollider model)
 67        {
 868            AssetPromise_PrimitiveMesh prevMeshPromise = primitiveMeshPromise;
 69
 70            switch (model.MeshCase)
 71            {
 72                case PBMeshCollider.MeshOneofCase.Box:
 273                    collider = colliderGameObject.AddComponent<BoxCollider>();
 274                    break;
 75                case PBMeshCollider.MeshOneofCase.Plane:
 276                    BoxCollider box = colliderGameObject.AddComponent<BoxCollider>();
 277                    collider = box;
 278                    box.size = new UnityEngine.Vector3(1, 1, 0.01f);
 279                    break;
 80                case PBMeshCollider.MeshOneofCase.Sphere:
 181                    SphereCollider sphere = colliderGameObject.AddComponent<SphereCollider>();
 182                    collider = sphere;
 183                    sphere.radius = 1;
 184                    break;
 85                case PBMeshCollider.MeshOneofCase.Cylinder:
 386                    MeshCollider meshCollider = colliderGameObject.AddComponent<MeshCollider>();
 387                    collider = meshCollider;
 388                    primitiveMeshPromise = new AssetPromise_PrimitiveMesh(
 89                        AssetPromise_PrimitiveMesh_Model.CreateCylinder(
 90                            model.Cylinder.GetTopRadius(),
 91                            model.Cylinder.GetBottomRadius()));
 92
 693                    primitiveMeshPromise.OnSuccessEvent += asset => meshCollider.sharedMesh = asset.mesh;
 394                    primitiveMeshPromise.OnFailEvent += (mesh, exception) => Debug.LogException(exception);
 395                    AssetPromiseKeeper_PrimitiveMesh.i.Keep(primitiveMeshPromise);
 96                    break;
 97            }
 898            AssetPromiseKeeper_PrimitiveMesh.i.Forget(prevMeshPromise);
 899        }
 100
 101        private void SetColliderLayer(PBMeshCollider model)
 102        {
 14103            if (collider)
 104            {
 14105                colliderGameObject.SetActive(true);
 106            }
 107
 108            const int physicsLayer = (int)ColliderLayer.ClPhysics;
 109            const int pointerLayer = (int)ColliderLayer.ClPointer;
 110            const int pointerAndPhysicsMask = physicsLayer | pointerLayer;
 111
 14112            int colliderLayer = model.GetColliderLayer();
 113
 14114            if ((colliderLayer & pointerAndPhysicsMask) == pointerAndPhysicsMask)
 115            {
 9116                colliderGameObject.layer = PhysicsLayers.defaultLayer;
 117            }
 5118            else if ((colliderLayer & physicsLayer) == physicsLayer)
 119            {
 2120                colliderGameObject.layer = PhysicsLayers.characterOnlyLayer;
 121            }
 3122            else if ((colliderLayer & pointerLayer) == pointerLayer)
 123            {
 2124                colliderGameObject.layer = PhysicsLayers.onPointerEventLayer;
 125            }
 1126            else if (collider != null)
 127            {
 1128                colliderGameObject.SetActive(false);
 129            }
 1130        }
 131
 132        private void SetInternalColliderComponents(IParcelScene scene, IDCLEntity entity, PBMeshCollider model)
 133        {
 134            const int physicsLayer = (int)ColliderLayer.ClPhysics;
 135            const int pointerLayer = (int)ColliderLayer.ClPointer;
 14136            int colliderLayer = model.GetColliderLayer();
 137
 14138            if ((colliderLayer & pointerLayer) == pointerLayer)
 139            {
 11140                pointerColliderComponent.AddCollider(scene, entity, collider);
 141            }
 142            else
 143            {
 3144                pointerColliderComponent.RemoveCollider(scene, entity, collider);
 145            }
 146
 14147            if ((colliderLayer & physicsLayer) == physicsLayer)
 148            {
 11149                physicColliderComponent.AddCollider(scene, entity, collider);
 150            }
 151            else
 152            {
 3153                physicColliderComponent.RemoveCollider(scene, entity, collider);
 154            }
 3155        }
 156    }
 157}