< Summary

Class:DCL.ECSComponents.GltfContainerHandler
Assembly:DCL.ECSComponents.GltfContainer
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/GltfContainer/GltfContainerHandler.cs
Covered lines:83
Uncovered lines:7
Coverable lines:90
Total lines:208
Line coverage:92.2% (83 of 90)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
GltfContainerHandler(...)0%110100%
OnComponentCreated(...)0%110100%
OnComponentRemoved(...)0%110100%
OnComponentModelUpdated(...)0%3.013088.89%
OnLoadSuccess(...)0%440100%
OnLoadFail(...)0%6200%
CleanUp(...)0%11110100%
SetUpPhysicColliders(...)0%440100%
SetUpPointerCollidersAndRenderers(...)0%55096%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/GltfContainer/GltfContainerHandler.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using DCL.Components;
 4using DCL.Configuration;
 5using DCL.Controllers;
 6using DCL.ECS7.InternalComponents;
 7using DCL.ECSRuntime;
 8using DCL.Helpers;
 9using DCL.Models;
 10using UnityEngine;
 11using Object = UnityEngine.Object;
 12
 13namespace DCL.ECSComponents
 14{
 15    public class GltfContainerHandler : IECSComponentHandler<PBGltfContainer>
 16    {
 17        private const string POINTER_COLLIDER_NAME = "OnPointerEventCollider";
 18        private const string FEATURE_GLTFAST = "gltfast";
 19
 20        internal RendereableAssetLoadHelper gltfLoader;
 21        internal GameObject gameObject;
 22        private IList<Collider> physicColliders;
 23        private IList<Collider> pointerColliders;
 24        private IList<Renderer> renderers;
 25        private string prevLoadedGltf = null;
 26
 27        private readonly IInternalECSComponent<InternalColliders> pointerColliderComponent;
 28        private readonly IInternalECSComponent<InternalColliders> physicColliderComponent;
 29        private readonly IInternalECSComponent<InternalRenderers> renderersComponent;
 30        private readonly DataStore_ECS7 dataStoreEcs7;
 31        private DataStore_FeatureFlag featureFlags;
 32
 633        public GltfContainerHandler(IInternalECSComponent<InternalColliders> pointerColliderComponent,
 34            IInternalECSComponent<InternalColliders> physicColliderComponent,
 35            IInternalECSComponent<InternalRenderers> renderersComponent,
 36            DataStore_ECS7 dataStoreEcs7, DataStore_FeatureFlag featureFlags)
 37        {
 638            this.featureFlags = featureFlags;
 639            this.pointerColliderComponent = pointerColliderComponent;
 640            this.physicColliderComponent = physicColliderComponent;
 641            this.renderersComponent = renderersComponent;
 642            this.dataStoreEcs7 = dataStoreEcs7;
 643        }
 44
 45        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity)
 46        {
 647            gameObject = new GameObject("GLTF mesh");
 48
 649            Transform transform = gameObject.transform;
 650            transform.SetParent(entity.gameObject.transform);
 651            transform.ResetLocalTRS();
 52
 1853            gltfLoader = new RendereableAssetLoadHelper(scene.contentProvider, scene.sceneData.baseUrlBundles, () => fea
 654            gltfLoader.settings.forceGPUOnlyMesh = true;
 655            gltfLoader.settings.parent = transform;
 656            gltfLoader.settings.visibleFlags = AssetPromiseSettings_Rendering.VisibleFlags.VISIBLE_WITH_TRANSITION;
 657        }
 58
 59        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 60        {
 861            CleanUp(scene, entity);
 862            Object.Destroy(gameObject);
 863        }
 64
 65        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBGltfContainer model)
 66        {
 1267            if (string.IsNullOrEmpty(model.Src) || prevLoadedGltf == model.Src)
 068                return;
 69
 1270            prevLoadedGltf = model.Src;
 71
 1272            CleanUp(scene, entity);
 73
 2374            gltfLoader.OnSuccessEvent += rendereable => OnLoadSuccess(scene, entity, rendereable);
 1275            gltfLoader.OnFailEvent += exception => OnLoadFail(scene, exception);
 76
 1277            dataStoreEcs7.AddPendingResource(scene.sceneData.sceneNumber, prevLoadedGltf);
 1278            gltfLoader.Load(model.Src);
 1279        }
 80
 81        private void OnLoadSuccess(IParcelScene scene, IDCLEntity entity, Rendereable rendereable)
 82        {
 83            // create physic colliders
 1184            MeshFilter[] meshFilters = gameObject.GetComponentsInChildren<MeshFilter>();
 1185            physicColliders = SetUpPhysicColliders(meshFilters);
 86
 87            // create pointer colliders and renderers
 1188            (pointerColliders, renderers) = SetUpPointerCollidersAndRenderers(rendereable.renderers);
 89
 90            // set colliders and renderers
 10091            for (int i = 0; i < pointerColliders.Count; i++) { pointerColliderComponent.AddCollider(scene, entity, point
 92
 4093            for (int i = 0; i < physicColliders.Count; i++) { physicColliderComponent.AddCollider(scene, entity, physicC
 94
 10095            for (int i = 0; i < renderers.Count; i++) { renderersComponent.AddRenderer(scene, entity, renderers[i]); }
 96
 97            // TODO: modify Animator component to remove `AddShapeReady` usage
 1198            dataStoreEcs7.AddShapeReady(entity.entityId, gameObject);
 1199            dataStoreEcs7.RemovePendingResource(scene.sceneData.sceneNumber, prevLoadedGltf);
 11100        }
 101
 102        private void OnLoadFail(IParcelScene scene, Exception exception)
 103        {
 0104            MaterialTransitionController[] transitionController =
 105                gameObject.GetComponentsInChildren<MaterialTransitionController>(true);
 106
 0107            for (int i = 0; i < transitionController.Length; i++)
 108            {
 0109                MaterialTransitionController material = transitionController[i];
 0110                Object.Destroy(material);
 111            }
 112
 0113            dataStoreEcs7.RemovePendingResource(scene.sceneData.sceneNumber, prevLoadedGltf);
 0114        }
 115
 116        private void CleanUp(IParcelScene scene, IDCLEntity entity)
 117        {
 20118            int count = pointerColliders?.Count ?? 0;
 119
 118120            for (int i = 0; i < count; i++) { pointerColliderComponent.RemoveCollider(scene, entity, pointerColliders[i]
 121
 20122            count = physicColliders?.Count ?? 0;
 123
 58124            for (int i = 0; i < count; i++) { physicColliderComponent.RemoveCollider(scene, entity, physicColliders[i]);
 125
 20126            count = renderers?.Count ?? 0;
 127
 118128            for (int i = 0; i < count; i++) { renderersComponent.RemoveRenderer(scene, entity, renderers[i]); }
 129
 20130            physicColliders = null;
 20131            pointerColliders = null;
 20132            renderers = null;
 133
 40134            if (!string.IsNullOrEmpty(prevLoadedGltf)) { dataStoreEcs7.RemovePendingResource(scene.sceneData.sceneNumber
 135
 136            // TODO: modify Animator component to remove `RemoveShapeReady` usage
 20137            dataStoreEcs7.RemoveShapeReady(entity.entityId);
 138
 20139            gltfLoader.ClearEvents();
 20140            gltfLoader.Unload();
 20141        }
 142
 143        private static List<Collider> SetUpPhysicColliders(MeshFilter[] meshFilters)
 144        {
 11145            List<Collider> physicColliders = new List<Collider>(meshFilters.Length);
 146
 86147            for (int i = 0; i < meshFilters.Length; i++)
 148            {
 32149                if (meshFilters[i].gameObject.layer == PhysicsLayers.characterOnlyLayer)
 150                {
 1151                    physicColliders.Add(meshFilters[i].gameObject.GetComponent<Collider>());
 1152                    continue;
 153                }
 154
 31155                if (!meshFilters[i].transform.parent.name.ToLower().Contains("_collider"))
 156                    continue;
 157
 5158                MeshCollider collider = meshFilters[i].gameObject.AddComponent<MeshCollider>();
 5159                collider.sharedMesh = meshFilters[i].sharedMesh;
 5160                meshFilters[i].gameObject.layer = PhysicsLayers.characterOnlyLayer;
 5161                physicColliders.Add(collider);
 162
 5163                Object.Destroy(meshFilters[i].GetComponent<Renderer>());
 164            }
 165
 11166            return physicColliders;
 167        }
 168
 169        private static (List<Collider>, List<Renderer>) SetUpPointerCollidersAndRenderers(HashSet<Renderer> renderers)
 170        {
 11171            List<Collider> pointerColliders = new List<Collider>(renderers.Count);
 11172            List<Renderer> rendererList = new List<Renderer>(renderers.Count);
 173
 174            // (sadly we are stuck with a hashset here)
 74175            foreach (var renderer in renderers)
 176            {
 26177                rendererList.Add(renderer);
 26178                Transform rendererT = renderer.transform;
 26179                bool alreadyHasCollider = false;
 180
 52181                for (int i = 0; i < rendererT.childCount; i++)
 182                {
 5183                    Transform child = rendererT.GetChild(i);
 184
 5185                    if (child.gameObject.layer != PhysicsLayers.onPointerEventLayer)
 186                        continue;
 187
 5188                    alreadyHasCollider = true;
 5189                    pointerColliders.Add(child.GetComponent<Collider>());
 5190                    break;
 191                }
 192
 26193                if (alreadyHasCollider)
 194                    continue;
 195
 21196                GameObject colliderGo = new GameObject(POINTER_COLLIDER_NAME);
 21197                colliderGo.layer = PhysicsLayers.onPointerEventLayer;
 21198                MeshCollider collider = colliderGo.AddComponent<MeshCollider>();
 21199                collider.sharedMesh = renderer.GetComponent<MeshFilter>().sharedMesh;
 21200                colliderGo.transform.SetParent(renderer.transform);
 21201                colliderGo.transform.ResetLocalTRS();
 21202                pointerColliders.Add(collider);
 203            }
 204
 11205            return (pointerColliders, rendererList);
 206        }
 207    }
 208}