< 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:139
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 UnityEngine;
 8
 9namespace DCL.ECSComponents
 10{
 11    public class MaterialHandler : IECSComponentHandler<PBMaterial>
 12    {
 13        private PBMaterial lastModel = null;
 14        internal AssetPromise_Material promiseMaterial;
 15
 1216        private readonly Queue<AssetPromise_Material> activePromises = new Queue<AssetPromise_Material>();
 17        private readonly IInternalECSComponent<InternalMaterial> materialInternalComponent;
 18
 1219        public MaterialHandler(IInternalECSComponent<InternalMaterial> materialInternalComponent)
 20        {
 1221            this.materialInternalComponent = materialInternalComponent;
 1222        }
 23
 124        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity) { }
 25
 26        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 27        {
 328            materialInternalComponent.RemoveFor(scene, entity, new InternalMaterial() { material = null });
 29
 630            while (activePromises.Count > 0)
 31            {
 332                AssetPromiseKeeper_Material.i.Forget(activePromises.Dequeue());
 33            }
 334        }
 35
 36        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBMaterial model)
 37        {
 2238            if (lastModel != null && lastModel.Equals(model))
 239                return;
 40
 2041            lastModel = model;
 42
 2043            TextureUnion texture = model.Pbr != null ? model.Pbr.Texture : model.Unlit != null ? model.Unlit.Texture : n
 44
 45            AssetPromise_Material_Model promiseModel;
 2046            AssetPromise_Material_Model.Texture? albedoTexture = texture != null ? CreateMaterialPromiseTextureModel (
 47                texture.GetTextureUrl(scene),
 48                texture.GetWrapMode(),
 49                texture.GetFilterMode()
 50            ) : null;
 51
 2052            if (model.Pbr != null)
 53            {
 1954                AssetPromise_Material_Model.Texture? alphaTexture = model.Pbr.AlphaTexture != null ? CreateMaterialPromi
 55                    model.Pbr.AlphaTexture.GetTextureUrl(scene),
 56                    model.Pbr.AlphaTexture.GetWrapMode(),
 57                    model.Pbr.AlphaTexture.GetFilterMode()
 58                ) : null;
 59
 1960                AssetPromise_Material_Model.Texture? emissiveTexture = model.Pbr.EmissiveTexture != null ? CreateMateria
 61                    model.Pbr.EmissiveTexture.GetTextureUrl(scene),
 62                    model.Pbr.EmissiveTexture.GetWrapMode(),
 63                    model.Pbr.EmissiveTexture.GetFilterMode()
 64                ) : null;
 65
 1966                AssetPromise_Material_Model.Texture? bumpTexture = model.Pbr.BumpTexture != null ? CreateMaterialPromise
 67                    model.Pbr.BumpTexture.GetTextureUrl(scene),
 68                    model.Pbr.BumpTexture.GetWrapMode(),
 69                    model.Pbr.BumpTexture.GetFilterMode()
 70                ) : null;
 71
 1972                promiseModel = CreatePBRMaterialPromiseModel(model, albedoTexture, alphaTexture, emissiveTexture, bumpTe
 73            }
 74            else
 75            {
 176                promiseModel = CreateBasicMaterialPromiseModel(model, albedoTexture);
 77            }
 78
 2079            promiseMaterial = new AssetPromise_Material(promiseModel);
 2080            promiseMaterial.OnSuccessEvent += materialAsset =>
 81            {
 1982                materialInternalComponent.PutFor(scene, entity, new InternalMaterial()
 83                {
 84                    material = materialAsset.material
 85                });
 86
 87                // Run task to forget previous material after update to avoid forgetting a
 88                // material that has not be changed from the renderers yet, since material change
 89                // is done by a system during update
 1990                UniTask.RunOnThreadPool(async () =>
 91                {
 5792                    await UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate);
 1993                    ForgetPreviousPromises(activePromises, materialAsset);
 1994                });
 1995            };
 2096            promiseMaterial.OnFailEvent += (material, exception) =>
 97            {
 098                ForgetPreviousPromises(activePromises, material);
 099            };
 20100            activePromises.Enqueue(promiseMaterial);
 20101            AssetPromiseKeeper_Material.i.Keep(promiseMaterial);
 20102        }
 103
 104        private static void ForgetPreviousPromises(Queue<AssetPromise_Material> promises, Asset_Material currentAppliedM
 105        {
 19106            if (promises.Count <= 1)
 8107                return;
 108
 19109            while (promises.Count > 1 && promises.Peek().asset != currentAppliedMaterial)
 110            {
 8111                AssetPromiseKeeper_Material.i.Forget(promises.Dequeue());
 112            }
 11113        }
 114
 115        private static AssetPromise_Material_Model CreatePBRMaterialPromiseModel(PBMaterial model,
 116            AssetPromise_Material_Model.Texture? albedoTexture, AssetPromise_Material_Model.Texture? alphaTexture,
 117            AssetPromise_Material_Model.Texture? emissiveTexture, AssetPromise_Material_Model.Texture? bumpTexture)
 118        {
 19119            return AssetPromise_Material_Model.CreatePBRMaterial(albedoTexture, alphaTexture, emissiveTexture, bumpTextu
 120                model.GetAlphaTest(), model.GetAlbedoColor().ToUnityColor(), model.GetEmissiveColor().ToUnityColor(),
 121                model.GetReflectiveColor().ToUnityColor(), (AssetPromise_Material_Model.TransparencyMode)model.GetTransp
 122                model.GetRoughness(), model.GetGlossiness(), model.GetSpecularIntensity(),
 123                model.GetEmissiveIntensity(), model.GetDirectIntensity());
 124        }
 125
 126        private static AssetPromise_Material_Model CreateBasicMaterialPromiseModel(PBMaterial model, AssetPromise_Materi
 127        {
 1128            return AssetPromise_Material_Model.CreateBasicMaterial(albedoTexture, model.GetAlphaTest());
 129        }
 130
 131        private static AssetPromise_Material_Model.Texture? CreateMaterialPromiseTextureModel(string textureUrl, UnityEn
 132        {
 11133            if (string.IsNullOrEmpty(textureUrl))
 2134                return null;
 135
 9136            return new AssetPromise_Material_Model.Texture(textureUrl, wrapMode, filterMode);
 137        }
 138    }
 139}