< Summary

Class:DCL.Helpers.MaterialCachingHelper
Assembly:MaterialCachingHelper
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/MaterialHelpers/MaterialCachingHelper/MaterialCachingHelper.cs
Covered lines:46
Uncovered lines:10
Coverable lines:56
Total lines:138
Line coverage:82.1% (46 of 56)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
MaterialCachingHelper()0%110100%
ComputeHash(...)0%2100%
EnsureMainShader()0%6200%
Process()0%16.3916088.46%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/MaterialHelpers/MaterialCachingHelper/MaterialCachingHelper.cs

#LineLine coverage
 1using System.Collections;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Text;
 5using UnityEngine;
 6using UnityGLTF.Cache;
 7
 8namespace DCL.Helpers
 9{
 10    public static class MaterialCachingHelper
 11    {
 12        [System.Flags]
 13        public enum Mode
 14        {
 15            NONE = 0,
 16            CACHE_MATERIALS = 1,
 17            CACHE_SHADERS = 2,
 18            CACHE_EVERYTHING = CACHE_MATERIALS | CACHE_SHADERS,
 19        }
 20
 1121        public static bool timeBudgetEnabled => CommonScriptableObjects.rendererState.Get();
 122        public static float timeBudgetMax = 0.003f;
 123        public static float timeBudget = 0;
 24
 125        public static Dictionary<string, Shader> shaderByHash = new Dictionary<string, Shader>();
 26
 27        private static Shader mainShader;
 28
 029        public static string ComputeHash(Material mat) { return mat.ComputeCRC().ToString(); }
 30
 31        static Shader EnsureMainShader()
 32        {
 033            if (mainShader == null)
 34            {
 035                mainShader = Shader.Find("DCL/Universal Render Pipeline/Lit");
 36            }
 37
 038            return mainShader;
 39        }
 40
 41        public static IEnumerator Process(List<Renderer> renderers, bool enableRenderers = true, Mode cachingFlags = Mod
 42        {
 1143            if (renderers == null)
 044                yield break;
 45
 1146            int renderersCount = renderers.Count;
 47
 1148            if (renderersCount == 0)
 049                yield break;
 50
 1151            var matList = new List<Material>(1);
 52
 4453            for (int i = 0; i < renderersCount; i++)
 54            {
 1155                Renderer r = renderers[i];
 56
 1157                if (!enableRenderers)
 1158                    r.enabled = false;
 59
 1160                matList.Clear();
 61
 1162                var sharedMats = r.sharedMaterials;
 63
 4464                for (int i1 = 0; i1 < sharedMats.Length; i1++)
 65                {
 1166                    Material mat = sharedMats[i1];
 67
 1168                    float elapsedTime = Time.realtimeSinceStartup;
 69
 1170                    if ((cachingFlags & Mode.CACHE_SHADERS) != 0)
 71                    {
 1172                        string shaderHash = mat.shader.name;
 73
 1174                        if (!shaderByHash.ContainsKey(shaderHash))
 75                        {
 176                            if (!mat.shader.name.Contains("Error"))
 77                            {
 178                                shaderByHash.Add(shaderHash, Shader.Find(mat.shader.name));
 179                            }
 80                            else
 81                            {
 082                                shaderByHash.Add(shaderHash, EnsureMainShader());
 83                            }
 84                        }
 85
 1186                        mat.shader = shaderByHash[shaderHash];
 87                    }
 88
 1189                    if ((cachingFlags & Mode.CACHE_MATERIALS) != 0)
 90                    {
 1191                        int crc = mat.ComputeCRC();
 1192                        string hash = crc.ToString();
 93
 94                        RefCountedMaterialData refCountedMat;
 95
 1196                        if (!PersistentAssetCache.MaterialCacheByCRC.ContainsKey(hash))
 97                        {
 98                            //NOTE(Brian): Have to copy material because will be unloaded later.
 299                            var materialCopy = new Material(mat);
 100
 101#if UNITY_EDITOR
 2102                            materialCopy.name += $" (crc: {materialCopy.ComputeCRC()})";
 103#endif
 104
 2105                            SRPBatchingHelper.OptimizeMaterial(materialCopy);
 2106                            PersistentAssetCache.MaterialCacheByCRC.Add(hash, new RefCountedMaterialData(hash, materialC
 107                        }
 108
 11109                        refCountedMat = PersistentAssetCache.MaterialCacheByCRC[hash];
 11110                        refCountedMat.IncreaseRefCount();
 11111                        matList.Add(refCountedMat.material);
 11112                    }
 113                    else
 114                    {
 0115                        var materialCopy = new Material(mat);
 0116                        SRPBatchingHelper.OptimizeMaterial(materialCopy);
 0117                        matList.Add(materialCopy);
 118                    }
 119
 11120                    if (timeBudgetEnabled)
 121                    {
 11122                        elapsedTime = Time.realtimeSinceStartup - elapsedTime;
 11123                        timeBudget -= elapsedTime;
 124
 11125                        if (timeBudget < 0)
 126                        {
 1127                            yield return null;
 1128                            timeBudget += timeBudgetMax;
 129                        }
 130                    }
 131                }
 132
 11133                if (r != null)
 11134                    r.sharedMaterials = matList.ToArray();
 11135            }
 11136        }
 137    }
 138}