< 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:59
Uncovered lines:10
Coverable lines:69
Total lines:198
Line coverage:85.5% (59 of 69)
Covered branches:0
Total branches:0
Covered methods:9
Total methods:9
Method coverage:100% (9 of 9)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
MaterialHandler(...)0%110100%
OnComponentCreated(...)0%110100%
OnComponentRemoved(...)0%3.023087.5%
OnComponentModelUpdated(...)0%24.9223084.62%
>c__DisplayClass12_1/<<OnComponentModelUpdated()0%330100%
ForgetPreviousPromises(...)0%5.055087.5%
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 IDCLEntity entity;
 16        private IParcelScene scene;
 17        private PBMaterial lastModel = null;
 18        internal AssetPromise_Material promiseMaterial;
 19
 1220        private readonly Queue<AssetPromise_Material> activePromises = new Queue<AssetPromise_Material>();
 21        private readonly IInternalECSComponent<InternalMaterial> materialInternalComponent;
 22        private readonly IInternalECSComponent<InternalVideoMaterial> videoMaterialInternalComponent;
 23        private readonly DataStore_WorldObjects dataStoreWorldObjects;
 24        private readonly bool isDebugMode = false;
 25
 1226        public MaterialHandler(
 27            IInternalECSComponent<InternalMaterial> materialInternalComponent,
 28            IInternalECSComponent<InternalVideoMaterial> videoMaterialInternalComponent,
 29            DataStore_WorldObjects dataStoreWorldObjects,
 30            DebugConfig debugConfig)
 31        {
 1232            this.materialInternalComponent = materialInternalComponent;
 1233            this.videoMaterialInternalComponent = videoMaterialInternalComponent;
 1234            this.dataStoreWorldObjects = dataStoreWorldObjects;
 1235            this.isDebugMode = debugConfig.isDebugMode.Get();
 1236        }
 37
 38        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity)
 39        {
 140            this.entity = entity;
 141            this.scene = scene;
 142        }
 43
 44        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 45        {
 446            videoMaterialInternalComponent.RemoveFor(scene, entity);
 447            materialInternalComponent.RemoveFor(scene, entity, new InternalMaterial(null, true));
 48
 849            while (activePromises.Count > 0)
 50            {
 451                var promise = activePromises.Dequeue();
 52
 453                if (isDebugMode)
 054                    dataStoreWorldObjects.RemoveMaterial(scene.sceneData.sceneNumber, entity.entityId, promise.asset.mat
 55
 456                AssetPromiseKeeper_Material.i.Forget(promise);
 57            }
 458        }
 59
 60        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBMaterial model)
 61        {
 2262            if (lastModel != null && lastModel.Equals(model))
 263                return;
 64
 2065            lastModel = model;
 66
 2067            TextureUnion texture = model.Pbr != null ? model.Pbr.Texture : model.Unlit != null ? model.Unlit.Texture : n
 68
 2069            List<InternalVideoMaterial.VideoTextureData> videoTextureDatas = new List<InternalVideoMaterial.VideoTexture
 70
 71            AssetPromise_Material_Model promiseModel;
 2072            AssetPromise_Material_Model.Texture? albedoTexture = texture != null ? CreateMaterialPromiseTextureModel (
 73                texture.GetTextureUrl(scene),
 74                texture.GetWrapMode(),
 75                texture.GetFilterMode(),
 76                texture.IsVideoTexture()
 77            ) : null;
 78
 2079            if (texture != null && texture.IsVideoTexture())
 80            {
 081                videoTextureDatas.Add(
 82                    new InternalVideoMaterial.VideoTextureData(texture.GetVideoTextureId(), ShaderUtils.BaseMap));
 83            }
 84
 2085            if (model.Pbr != null)
 86            {
 1987                AssetPromise_Material_Model.Texture? alphaTexture = model.Pbr.AlphaTexture != null ? CreateMaterialPromi
 88                    model.Pbr.AlphaTexture.GetTextureUrl(scene),
 89                    model.Pbr.AlphaTexture.GetWrapMode(),
 90                    model.Pbr.AlphaTexture.GetFilterMode(),
 91                    model.Pbr.AlphaTexture.IsVideoTexture()
 92                ) : null;
 93
 1994                AssetPromise_Material_Model.Texture? emissiveTexture = model.Pbr.EmissiveTexture != null ? CreateMateria
 95                    model.Pbr.EmissiveTexture.GetTextureUrl(scene),
 96                    model.Pbr.EmissiveTexture.GetWrapMode(),
 97                    model.Pbr.EmissiveTexture.GetFilterMode()
 98                ) : null;
 99
 19100                AssetPromise_Material_Model.Texture? bumpTexture = model.Pbr.BumpTexture != null ? CreateMaterialPromise
 101                    model.Pbr.BumpTexture.GetTextureUrl(scene),
 102                    model.Pbr.BumpTexture.GetWrapMode(),
 103                    model.Pbr.BumpTexture.GetFilterMode()
 104                ) : null;
 105
 19106                if (model.Pbr.AlphaTexture != null && model.Pbr.AlphaTexture.IsVideoTexture())
 107                {
 0108                    videoTextureDatas.Add(
 109                        new InternalVideoMaterial.VideoTextureData(model.Pbr.AlphaTexture.GetVideoTextureId(), ShaderUti
 110                }
 111
 19112                if (model.Pbr.EmissiveTexture != null && model.Pbr.EmissiveTexture.IsVideoTexture())
 113                {
 0114                    videoTextureDatas.Add(
 115                        new InternalVideoMaterial.VideoTextureData(model.Pbr.EmissiveTexture.GetVideoTextureId(), Shader
 116                }
 117
 19118                if (model.Pbr.BumpTexture != null && model.Pbr.BumpTexture.IsVideoTexture())
 119                {
 0120                    videoTextureDatas.Add(
 121                        new InternalVideoMaterial.VideoTextureData(model.Pbr.BumpTexture.GetVideoTextureId(), ShaderUtil
 122                }
 123
 19124                promiseModel = CreatePBRMaterialPromiseModel(model, albedoTexture, alphaTexture, emissiveTexture, bumpTe
 125            }
 126            else
 127            {
 1128                promiseModel = CreateBasicMaterialPromiseModel(model, albedoTexture);
 129            }
 130
 20131            promiseMaterial = new AssetPromise_Material(promiseModel);
 20132            promiseMaterial.OnSuccessEvent += materialAsset =>
 133            {
 19134                if (videoTextureDatas.Count > 0)
 0135                    videoMaterialInternalComponent.PutFor(scene, entity, new InternalVideoMaterial(materialAsset.materia
 19136                materialInternalComponent.PutFor(scene, entity, new InternalMaterial(materialAsset.material, promiseMode
 137
 138                // Run task to forget previous material after update to avoid forgetting a
 139                // material that has not be changed from the renderers yet, since material change
 140                // is done by a system during update
 19141                UniTask.RunOnThreadPool(async () =>
 142                {
 57143                    await UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate);
 19144                    ForgetPreviousPromises(activePromises, materialAsset);
 19145                });
 146
 19147                if (isDebugMode)
 0148                    dataStoreWorldObjects.AddMaterial(scene.sceneData.sceneNumber, entity.entityId, materialAsset.materi
 19149            };
 20150            promiseMaterial.OnFailEvent += (material, exception) =>
 151            {
 0152                ForgetPreviousPromises(activePromises, material);
 0153            };
 20154            activePromises.Enqueue(promiseMaterial);
 20155            AssetPromiseKeeper_Material.i.Keep(promiseMaterial);
 20156        }
 157
 158        private void ForgetPreviousPromises(Queue<AssetPromise_Material> promises, Asset_Material currentAppliedMaterial
 159        {
 19160            if (promises.Count <= 1)
 7161                return;
 162
 20163            while (promises.Count > 1 && promises.Peek().asset != currentAppliedMaterial)
 164            {
 8165                var promise = promises.Dequeue();
 166
 8167                if (isDebugMode)
 0168                    dataStoreWorldObjects.RemoveMaterial(scene.sceneData.sceneNumber, entity.entityId, promise.asset.mat
 169
 8170                AssetPromiseKeeper_Material.i.Forget(promise);
 171            }
 12172        }
 173
 174        private static AssetPromise_Material_Model CreatePBRMaterialPromiseModel(PBMaterial model,
 175            AssetPromise_Material_Model.Texture? albedoTexture, AssetPromise_Material_Model.Texture? alphaTexture,
 176            AssetPromise_Material_Model.Texture? emissiveTexture, AssetPromise_Material_Model.Texture? bumpTexture)
 177        {
 19178            return AssetPromise_Material_Model.CreatePBRMaterial(albedoTexture, alphaTexture, emissiveTexture, bumpTextu
 179                model.GetAlphaTest(), model.GetCastShadows(), model.GetAlbedoColor().ToUnityColor(), model.GetEmissiveCo
 180                model.GetReflectiveColor().ToUnityColor(), (AssetPromise_Material_Model.TransparencyMode)model.GetTransp
 181                model.GetRoughness(), model.GetSpecularIntensity(),
 182                model.GetEmissiveIntensity(), model.GetDirectIntensity());
 183        }
 184
 185        private static AssetPromise_Material_Model CreateBasicMaterialPromiseModel(PBMaterial model, AssetPromise_Materi
 186        {
 1187            return AssetPromise_Material_Model.CreateBasicMaterial(albedoTexture, model.GetAlphaTest(), model.GetDiffuse
 188        }
 189
 190        private static AssetPromise_Material_Model.Texture? CreateMaterialPromiseTextureModel(string textureUrl, UnityEn
 191        {
 11192            if (string.IsNullOrEmpty(textureUrl))
 2193                return null;
 194
 9195            return new AssetPromise_Material_Model.Texture(textureUrl, wrapMode, filterMode, videoTexture);
 196        }
 197    }
 198}