< 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:50
Uncovered lines:7
Coverable lines:57
Total lines:182
Line coverage:87.7% (50 of 57)
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%24.9223084.62%
>c__DisplayClass8_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 DCL.Shaders;
 8using Decentraland.Common;
 9using UnityEngine;
 10
 11namespace DCL.ECSComponents
 12{
 13    public class MaterialHandler : IECSComponentHandler<PBMaterial>
 14    {
 15        private PBMaterial lastModel = null;
 16        internal AssetPromise_Material promiseMaterial;
 17
 1218        private readonly Queue<AssetPromise_Material> activePromises = new Queue<AssetPromise_Material>();
 19        private readonly IInternalECSComponent<InternalMaterial> materialInternalComponent;
 20        private readonly IInternalECSComponent<InternalVideoMaterial> videoMaterialInternalComponent;
 21
 1222        public MaterialHandler(IInternalECSComponent<InternalMaterial> materialInternalComponent, IInternalECSComponent<
 23        {
 1224            this.materialInternalComponent = materialInternalComponent;
 1225            this.videoMaterialInternalComponent = videoMaterialInternalComponent;
 1226        }
 27
 128        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity) { }
 29
 30        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 31        {
 332            videoMaterialInternalComponent.RemoveFor(scene, entity);
 333            materialInternalComponent.RemoveFor(scene, entity, new InternalMaterial() { material = null });
 34
 635            while (activePromises.Count > 0)
 36            {
 337                AssetPromiseKeeper_Material.i.Forget(activePromises.Dequeue());
 38            }
 339        }
 40
 41        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBMaterial model)
 42        {
 2243            if (lastModel != null && lastModel.Equals(model))
 244                return;
 45
 2046            lastModel = model;
 47
 2048            TextureUnion texture = model.Pbr != null ? model.Pbr.Texture : model.Unlit != null ? model.Unlit.Texture : n
 49
 2050            List<InternalVideoMaterial.VideoTextureData> videoTextureDatas = new List<InternalVideoMaterial.VideoTexture
 51
 52            AssetPromise_Material_Model promiseModel;
 2053            AssetPromise_Material_Model.Texture? albedoTexture = texture != null ? CreateMaterialPromiseTextureModel (
 54                texture.GetTextureUrl(scene),
 55                texture.GetWrapMode(),
 56                texture.GetFilterMode(),
 57                texture.IsVideoTexture()
 58            ) : null;
 59
 2060            if (texture != null && texture.IsVideoTexture())
 61            {
 062                videoTextureDatas.Add(
 63                    new InternalVideoMaterial.VideoTextureData(texture.GetVideoTextureId(), ShaderUtils.BaseMap));
 64            }
 65
 2066            if (model.Pbr != null)
 67            {
 1968                AssetPromise_Material_Model.Texture? alphaTexture = model.Pbr.AlphaTexture != null ? CreateMaterialPromi
 69                    model.Pbr.AlphaTexture.GetTextureUrl(scene),
 70                    model.Pbr.AlphaTexture.GetWrapMode(),
 71                    model.Pbr.AlphaTexture.GetFilterMode(),
 72                    model.Pbr.AlphaTexture.IsVideoTexture()
 73                ) : null;
 74
 1975                AssetPromise_Material_Model.Texture? emissiveTexture = model.Pbr.EmissiveTexture != null ? CreateMateria
 76                    model.Pbr.EmissiveTexture.GetTextureUrl(scene),
 77                    model.Pbr.EmissiveTexture.GetWrapMode(),
 78                    model.Pbr.EmissiveTexture.GetFilterMode()
 79                ) : null;
 80
 1981                AssetPromise_Material_Model.Texture? bumpTexture = model.Pbr.BumpTexture != null ? CreateMaterialPromise
 82                    model.Pbr.BumpTexture.GetTextureUrl(scene),
 83                    model.Pbr.BumpTexture.GetWrapMode(),
 84                    model.Pbr.BumpTexture.GetFilterMode()
 85                ) : null;
 86
 1987                if (model.Pbr.AlphaTexture != null && model.Pbr.AlphaTexture.IsVideoTexture())
 88                {
 089                    videoTextureDatas.Add(
 90                        new InternalVideoMaterial.VideoTextureData(model.Pbr.AlphaTexture.GetVideoTextureId(), ShaderUti
 91                }
 92
 1993                if (model.Pbr.EmissiveTexture != null && model.Pbr.EmissiveTexture.IsVideoTexture())
 94                {
 095                    videoTextureDatas.Add(
 96                        new InternalVideoMaterial.VideoTextureData(model.Pbr.EmissiveTexture.GetVideoTextureId(), Shader
 97                }
 98
 1999                if (model.Pbr.BumpTexture != null && model.Pbr.BumpTexture.IsVideoTexture())
 100                {
 0101                    videoTextureDatas.Add(
 102                        new InternalVideoMaterial.VideoTextureData(model.Pbr.BumpTexture.GetVideoTextureId(), ShaderUtil
 103                }
 104
 19105                promiseModel = CreatePBRMaterialPromiseModel(model, albedoTexture, alphaTexture, emissiveTexture, bumpTe
 106            }
 107            else
 108            {
 1109                promiseModel = CreateBasicMaterialPromiseModel(model, albedoTexture);
 110            }
 111
 20112            promiseMaterial = new AssetPromise_Material(promiseModel);
 20113            promiseMaterial.OnSuccessEvent += materialAsset =>
 114            {
 19115                if (videoTextureDatas.Count > 0)
 116                {
 0117                    videoMaterialInternalComponent.PutFor(scene, entity, new InternalVideoMaterial()
 118                    {
 119                        material = materialAsset.material,
 120                        videoTextureDatas = videoTextureDatas,
 121                    });
 122                }
 123
 19124                materialInternalComponent.PutFor(scene, entity, new InternalMaterial()
 125                {
 126                    material = materialAsset.material,
 127                    castShadows = promiseModel.castShadows // FD:: added castShadow set
 128                });
 129
 130                // Run task to forget previous material after update to avoid forgetting a
 131                // material that has not be changed from the renderers yet, since material change
 132                // is done by a system during update
 19133                UniTask.RunOnThreadPool(async () =>
 134                {
 57135                    await UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate);
 19136                    ForgetPreviousPromises(activePromises, materialAsset);
 19137                });
 19138            };
 20139            promiseMaterial.OnFailEvent += (material, exception) =>
 140            {
 0141                ForgetPreviousPromises(activePromises, material);
 0142            };
 20143            activePromises.Enqueue(promiseMaterial);
 20144            AssetPromiseKeeper_Material.i.Keep(promiseMaterial);
 20145        }
 146
 147        private static void ForgetPreviousPromises(Queue<AssetPromise_Material> promises, Asset_Material currentAppliedM
 148        {
 19149            if (promises.Count <= 1)
 7150                return;
 151
 20152            while (promises.Count > 1 && promises.Peek().asset != currentAppliedMaterial)
 153            {
 8154                AssetPromiseKeeper_Material.i.Forget(promises.Dequeue());
 155            }
 12156        }
 157
 158        private static AssetPromise_Material_Model CreatePBRMaterialPromiseModel(PBMaterial model,
 159            AssetPromise_Material_Model.Texture? albedoTexture, AssetPromise_Material_Model.Texture? alphaTexture,
 160            AssetPromise_Material_Model.Texture? emissiveTexture, AssetPromise_Material_Model.Texture? bumpTexture)
 161        {
 19162            return AssetPromise_Material_Model.CreatePBRMaterial(albedoTexture, alphaTexture, emissiveTexture, bumpTextu
 163                model.GetAlphaTest(), model.GetCastShadows(), model.GetAlbedoColor().ToUnityColor(), model.GetEmissiveCo
 164                model.GetReflectiveColor().ToUnityColor(), (AssetPromise_Material_Model.TransparencyMode)model.GetTransp
 165                model.GetRoughness(), model.GetGlossiness(), model.GetSpecularIntensity(),
 166                model.GetEmissiveIntensity(), model.GetDirectIntensity());
 167        }
 168
 169        private static AssetPromise_Material_Model CreateBasicMaterialPromiseModel(PBMaterial model, AssetPromise_Materi
 170        {
 1171            return AssetPromise_Material_Model.CreateBasicMaterial(albedoTexture, model.GetAlphaTest());
 172        }
 173
 174        private static AssetPromise_Material_Model.Texture? CreateMaterialPromiseTextureModel(string textureUrl, UnityEn
 175        {
 11176            if (string.IsNullOrEmpty(textureUrl))
 2177                return null;
 178
 9179            return new AssetPromise_Material_Model.Texture(textureUrl, wrapMode, filterMode, videoTexture);
 180        }
 181    }
 182}