< Summary

Class:DCL.AssetPromise_Material
Assembly:AssetPromiseKeeper
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/AssetManager/Material/AssetPromise_Material.cs
Covered lines:64
Uncovered lines:41
Coverable lines:105
Total lines:201
Line coverage:60.9% (64 of 105)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
AssetPromise_Material(...)0%2100%
OnAfterLoadOrReuse()0%110100%
OnBeforeLoadOrReuse()0%110100%
OnCancelLoading()0%110100%
Cleanup()0%110100%
CleanPromises()0%5.515072.73%
OnLoad(...)0%110100%
GetId()0%110100%
CreateMaterial()0%20.0317078.12%
SetupTransparencyMode(...)0%32.878027.03%
AssignTextureToMaterial(...)0%2.012087.5%
SetMaterialTexture(...)0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/AssetManager/Material/AssetPromise_Material.cs

#LineLine coverage
 1using System;
 2using System.Collections;
 3using Cysharp.Threading.Tasks;
 4using DCL.Helpers;
 5using UnityEngine;
 6
 7namespace DCL
 8{
 9    public class AssetPromise_Material : AssetPromise<Asset_Material>
 10    {
 11        private const string MATERIAL_RESOURCES_PATH = "Materials/";
 12        private const string PBR_MATERIAL_NAME = "ShapeMaterial";
 13
 14        private MaterialModel model;
 15
 16        private AssetPromise_TextureResource emissionAssetPromiseTextureResource = null;
 17        private AssetPromise_TextureResource alphaAssetPromiseTextureResource = null;
 18        private AssetPromise_TextureResource baseAssetPromiseTextureResource = null;
 19        private AssetPromise_TextureResource bumpPromiseTextureResource = null;
 20
 21        private Coroutine loadCoroutine;
 22
 023        public AssetPromise_Material(MaterialModel model) { this.model = model; }
 24
 1325        protected override void OnAfterLoadOrReuse() {  }
 26
 1827        protected override void OnBeforeLoadOrReuse() {  }
 28
 29        protected override void OnCancelLoading()
 30        {
 531            CleanPromises();
 532        }
 33
 34        public override void Cleanup()
 35        {
 1236            base.Cleanup();
 1237            CleanPromises();
 1238        }
 39
 40        private void CleanPromises()
 41        {
 1742            if (emissionAssetPromiseTextureResource != null)
 043                AssetPromiseKeeper_TextureResource.i.Forget(emissionAssetPromiseTextureResource);
 1744            if (alphaAssetPromiseTextureResource != null)
 045                AssetPromiseKeeper_TextureResource.i.Forget(alphaAssetPromiseTextureResource);
 1746            if (baseAssetPromiseTextureResource != null)
 1647                AssetPromiseKeeper_TextureResource.i.Forget(baseAssetPromiseTextureResource);
 1748            if (bumpPromiseTextureResource != null)
 049                AssetPromiseKeeper_TextureResource.i.Forget(bumpPromiseTextureResource);
 50
 1751            CoroutineStarter.Stop(loadCoroutine);
 1752            loadCoroutine = null;
 1753        }
 54
 55        protected override void OnLoad(Action OnSuccess, Action<Exception> OnFail)
 56        {
 1357            CoroutineStarter.Stop(loadCoroutine);
 1358            loadCoroutine = CoroutineStarter.Start(CreateMaterial(model, OnSuccess, OnFail));
 1359        }
 60
 8561        public override object GetId() { return model; }
 62
 63        private IEnumerator CreateMaterial(MaterialModel model, Action OnSuccess, Action<Exception> OnFail)
 64        {
 1365            Material material = new Material(Utils.EnsureResourcesMaterial(MATERIAL_RESOURCES_PATH + PBR_MATERIAL_NAME))
 66#if UNITY_EDITOR
 1367            material.name = "PBRMaterial_" + model.GetHashCode();
 68#endif
 1369            material.SetColor(ShaderUtils.BaseColor, model.albedoColor);
 70
 1371            if (model.emissiveColor != Color.clear && model.emissiveColor != Color.black)
 72            {
 073                material.EnableKeyword("_EMISSION");
 74            }
 75
 76            // METALLIC/SPECULAR CONFIGURATIONS
 1377            material.SetColor(ShaderUtils.EmissionColor, model.emissiveColor * model.emissiveIntensity);
 1378            material.SetColor(ShaderUtils.SpecColor, model.reflectivityColor);
 79
 1380            material.SetFloat(ShaderUtils.Metallic, model.metallic);
 1381            material.SetFloat(ShaderUtils.Smoothness, 1 - model.roughness);
 1382            material.SetFloat(ShaderUtils.EnvironmentReflections, model.microSurface);
 1383            material.SetFloat(ShaderUtils.SpecularHighlights, model.specularIntensity * model.directIntensity);
 84
 85
 1386            if (model.emissiveTexture != null)
 087                emissionAssetPromiseTextureResource = AssignTextureToMaterial(material, ShaderUtils.EmissionMap, model.e
 88
 1389            SetupTransparencyMode(material, model);
 90
 1391            if (model.alphaTexture != null)
 092                alphaAssetPromiseTextureResource = AssignTextureToMaterial(material, ShaderUtils.AlphaTexture, model.alp
 93
 1394            if (model.albedoTexture != null)
 1395                baseAssetPromiseTextureResource = AssignTextureToMaterial(material, ShaderUtils.BaseMap, model.albedoTex
 96
 1397            if (model.bumpTexture != null)
 098                bumpPromiseTextureResource = AssignTextureToMaterial(material, ShaderUtils.BumpMap, model.bumpTexture, O
 99
 100            // Checked two times so they can be loaded at the same time
 13101            if (model.alphaTexture != null)
 0102                yield return  alphaAssetPromiseTextureResource;
 13103            if (model.albedoTexture != null)
 13104                yield return  baseAssetPromiseTextureResource;
 8105            if (model.bumpTexture != null)
 0106                yield return  bumpPromiseTextureResource;
 8107            if (model.emissiveTexture != null)
 0108                yield return  emissionAssetPromiseTextureResource;
 109
 8110            SRPBatchingHelper.OptimizeMaterial(material);
 8111            asset.material = material;
 8112            OnSuccess?.Invoke();
 8113        }
 114
 115        private void SetupTransparencyMode(Material material, MaterialModel model)
 116        {
 117            // Reset shader keywords
 13118            material.DisableKeyword("_ALPHATEST_ON"); // Cut Out Transparency
 13119            material.DisableKeyword("_ALPHABLEND_ON"); // Fade Transparency
 13120            material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); // Transparent
 121
 13122            MaterialModel.TransparencyMode transparencyMode = (MaterialModel.TransparencyMode) model.transparencyMode;
 123
 13124            if (transparencyMode == MaterialModel.TransparencyMode.AUTO)
 125            {
 13126                if (model.alphaTexture != null || model.albedoColor.a < 1f) //AlphaBlend
 127                {
 0128                    transparencyMode = MaterialModel.TransparencyMode.ALPHA_BLEND;
 0129                }
 130                else // Opaque
 131                {
 13132                    transparencyMode = MaterialModel.TransparencyMode.OPAQUE;
 133                }
 134            }
 135
 136            switch (transparencyMode)
 137            {
 138                case MaterialModel.TransparencyMode.OPAQUE:
 13139                    material.renderQueue = (int) UnityEngine.Rendering.RenderQueue.Geometry;
 13140                    material.SetFloat(ShaderUtils.AlphaClip, 0);
 13141                    break;
 142                case MaterialModel.TransparencyMode.ALPHA_TEST: // ALPHATEST
 0143                    material.EnableKeyword("_ALPHATEST_ON");
 144
 0145                    material.SetInt(ShaderUtils.SrcBlend, (int) UnityEngine.Rendering.BlendMode.One);
 0146                    material.SetInt(ShaderUtils.DstBlend, (int) UnityEngine.Rendering.BlendMode.Zero);
 0147                    material.SetInt(ShaderUtils.ZWrite, 1);
 0148                    material.SetFloat(ShaderUtils.AlphaClip, 1);
 0149                    material.SetFloat(ShaderUtils.Cutoff, model.alphaTest);
 0150                    material.SetInt("_Surface", 0);
 0151                    material.renderQueue = (int) UnityEngine.Rendering.RenderQueue.AlphaTest;
 0152                    break;
 153                case MaterialModel.TransparencyMode.ALPHA_BLEND: // ALPHABLEND
 0154                    material.EnableKeyword("_ALPHABLEND_ON");
 155
 0156                    material.SetInt(ShaderUtils.SrcBlend, (int) UnityEngine.Rendering.BlendMode.SrcAlpha);
 0157                    material.SetInt(ShaderUtils.DstBlend, (int) UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
 0158                    material.SetInt(ShaderUtils.ZWrite, 0);
 0159                    material.SetFloat(ShaderUtils.AlphaClip, 0);
 0160                    material.renderQueue = (int) UnityEngine.Rendering.RenderQueue.Transparent;
 0161                    material.SetInt("_Surface", 1);
 0162                    break;
 163                case MaterialModel.TransparencyMode.ALPHA_TEST_AND_BLEND:
 0164                    material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
 165
 0166                    material.SetInt(ShaderUtils.SrcBlend, (int) UnityEngine.Rendering.BlendMode.One);
 0167                    material.SetInt(ShaderUtils.DstBlend, (int) UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
 0168                    material.SetInt(ShaderUtils.ZWrite, 0);
 0169                    material.SetFloat(ShaderUtils.AlphaClip, 1);
 0170                    material.renderQueue = (int) UnityEngine.Rendering.RenderQueue.Transparent;
 0171                    material.SetInt("_Surface", 1);
 172                    break;
 173            }
 0174        }
 175
 176        private AssetPromise_TextureResource AssignTextureToMaterial(Material material, int materialProperty, TextureMod
 177        {
 13178            AssetPromise_TextureResource promiseTextureResource = new AssetPromise_TextureResource(model);
 13179            if (model != null)
 180            {
 13181                promiseTextureResource.OnSuccessEvent += (x) =>
 182                {
 8183                    SetMaterialTexture(material, materialProperty, x.texture2D);
 8184                };
 13185                promiseTextureResource.OnFailEvent += (x, error) =>
 186                {
 0187                    onFail?.Invoke(error);
 0188                };
 189
 13190                AssetPromiseKeeper_TextureResource.i.Keep(promiseTextureResource);
 13191            }
 192            else
 193            {
 0194                SetMaterialTexture(material, materialProperty, null);
 195            }
 13196            return promiseTextureResource;
 197        }
 198
 16199        private void SetMaterialTexture(Material material, int materialPropertyId, Texture2D texture2D) { material.SetTe
 200    }
 201}