< Summary

Class:DCL.ECSComponents.MaterialHandler
Assembly:DCL.ECSComponents.Material
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/Material/MaterialHandler.cs
Covered lines:42
Uncovered lines:2
Coverable lines:44
Total lines:140
Line coverage:95.4% (42 of 44)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
MaterialHandler(...)0%110100%
OnComponentCreated(...)0%110100%
OnComponentRemoved(...)0%220100%
OnComponentModelUpdated(...)0%15150100%
>c__DisplayClass7_1/<<OnComponentModelUpdated()0%330100%
ForgetPreviousPromises(...)0%440100%
CreatePBRMaterialPromiseModel(...)0%110100%
CreateBasicMaterialPromiseModel(...)0%110100%
CreateMaterialPromiseTextureModel(...)0%220100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/Material/MaterialHandler.cs

#LineLine coverage
 1using System.Collections.Generic;
 2using Cysharp.Threading.Tasks;
 3using DCL.Controllers;
 4using DCL.ECS7.InternalComponents;
 5using DCL.ECSRuntime;
 6using DCL.Models;
 7using Decentraland.Common;
 8using UnityEngine;
 9
 10namespace DCL.ECSComponents
 11{
 12    public class MaterialHandler : IECSComponentHandler<PBMaterial>
 13    {
 14        private PBMaterial lastModel = null;
 15        internal AssetPromise_Material promiseMaterial;
 16
 1217        private readonly Queue<AssetPromise_Material> activePromises = new Queue<AssetPromise_Material>();
 18        private readonly IInternalECSComponent<InternalMaterial> materialInternalComponent;
 19
 1220        public MaterialHandler(IInternalECSComponent<InternalMaterial> materialInternalComponent)
 21        {
 1222            this.materialInternalComponent = materialInternalComponent;
 1223        }
 24
 125        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity) { }
 26
 27        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 28        {
 329            materialInternalComponent.RemoveFor(scene, entity, new InternalMaterial() { material = null });
 30
 631            while (activePromises.Count > 0)
 32            {
 333                AssetPromiseKeeper_Material.i.Forget(activePromises.Dequeue());
 34            }
 335        }
 36
 37        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBMaterial model)
 38        {
 2239            if (lastModel != null && lastModel.Equals(model))
 240                return;
 41
 2042            lastModel = model;
 43
 2044            TextureUnion texture = model.Pbr != null ? model.Pbr.Texture : model.Unlit != null ? model.Unlit.Texture : n
 45
 46            AssetPromise_Material_Model promiseModel;
 2047            AssetPromise_Material_Model.Texture? albedoTexture = texture != null ? CreateMaterialPromiseTextureModel (
 48                texture.GetTextureUrl(scene),
 49                texture.GetWrapMode(),
 50                texture.GetFilterMode()
 51            ) : null;
 52
 2053            if (model.Pbr != null)
 54            {
 1955                AssetPromise_Material_Model.Texture? alphaTexture = model.Pbr.AlphaTexture != null ? CreateMaterialPromi
 56                    model.Pbr.AlphaTexture.GetTextureUrl(scene),
 57                    model.Pbr.AlphaTexture.GetWrapMode(),
 58                    model.Pbr.AlphaTexture.GetFilterMode()
 59                ) : null;
 60
 1961                AssetPromise_Material_Model.Texture? emissiveTexture = model.Pbr.EmissiveTexture != null ? CreateMateria
 62                    model.Pbr.EmissiveTexture.GetTextureUrl(scene),
 63                    model.Pbr.EmissiveTexture.GetWrapMode(),
 64                    model.Pbr.EmissiveTexture.GetFilterMode()
 65                ) : null;
 66
 1967                AssetPromise_Material_Model.Texture? bumpTexture = model.Pbr.BumpTexture != null ? CreateMaterialPromise
 68                    model.Pbr.BumpTexture.GetTextureUrl(scene),
 69                    model.Pbr.BumpTexture.GetWrapMode(),
 70                    model.Pbr.BumpTexture.GetFilterMode()
 71                ) : null;
 72
 1973                promiseModel = CreatePBRMaterialPromiseModel(model, albedoTexture, alphaTexture, emissiveTexture, bumpTe
 74            }
 75            else
 76            {
 177                promiseModel = CreateBasicMaterialPromiseModel(model, albedoTexture);
 78            }
 79
 2080            promiseMaterial = new AssetPromise_Material(promiseModel);
 2081            promiseMaterial.OnSuccessEvent += materialAsset =>
 82            {
 1983                materialInternalComponent.PutFor(scene, entity, new InternalMaterial()
 84                {
 85                    material = materialAsset.material
 86                });
 87
 88                // Run task to forget previous material after update to avoid forgetting a
 89                // material that has not be changed from the renderers yet, since material change
 90                // is done by a system during update
 1991                UniTask.RunOnThreadPool(async () =>
 92                {
 5793                    await UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate);
 1994                    ForgetPreviousPromises(activePromises, materialAsset);
 1995                });
 1996            };
 2097            promiseMaterial.OnFailEvent += (material, exception) =>
 98            {
 099                ForgetPreviousPromises(activePromises, material);
 0100            };
 20101            activePromises.Enqueue(promiseMaterial);
 20102            AssetPromiseKeeper_Material.i.Keep(promiseMaterial);
 20103        }
 104
 105        private static void ForgetPreviousPromises(Queue<AssetPromise_Material> promises, Asset_Material currentAppliedM
 106        {
 19107            if (promises.Count <= 1)
 7108                return;
 109
 20110            while (promises.Count > 1 && promises.Peek().asset != currentAppliedMaterial)
 111            {
 8112                AssetPromiseKeeper_Material.i.Forget(promises.Dequeue());
 113            }
 12114        }
 115
 116        private static AssetPromise_Material_Model CreatePBRMaterialPromiseModel(PBMaterial model,
 117            AssetPromise_Material_Model.Texture? albedoTexture, AssetPromise_Material_Model.Texture? alphaTexture,
 118            AssetPromise_Material_Model.Texture? emissiveTexture, AssetPromise_Material_Model.Texture? bumpTexture)
 119        {
 19120            return AssetPromise_Material_Model.CreatePBRMaterial(albedoTexture, alphaTexture, emissiveTexture, bumpTextu
 121                model.GetAlphaTest(), model.GetAlbedoColor().ToUnityColor(), model.GetEmissiveColor().ToUnityColor(),
 122                model.GetReflectiveColor().ToUnityColor(), (AssetPromise_Material_Model.TransparencyMode)model.GetTransp
 123                model.GetRoughness(), model.GetGlossiness(), model.GetSpecularIntensity(),
 124                model.GetEmissiveIntensity(), model.GetDirectIntensity());
 125        }
 126
 127        private static AssetPromise_Material_Model CreateBasicMaterialPromiseModel(PBMaterial model, AssetPromise_Materi
 128        {
 1129            return AssetPromise_Material_Model.CreateBasicMaterial(albedoTexture, model.GetAlphaTest());
 130        }
 131
 132        private static AssetPromise_Material_Model.Texture? CreateMaterialPromiseTextureModel(string textureUrl, UnityEn
 133        {
 11134            if (string.IsNullOrEmpty(textureUrl))
 2135                return null;
 136
 9137            return new AssetPromise_Material_Model.Texture(textureUrl, wrapMode, filterMode);
 138        }
 139    }
 140}