< 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:41
Uncovered lines:12
Coverable lines:53
Total lines:136
Line coverage:77.3% (41 of 53)
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%
ProcessSingleMaterial(...)0%6.046089.47%
Process()0%14.7713078.12%

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 UnityEngine;
 4using UnityGLTF.Cache;
 5
 6namespace DCL.Helpers
 7{
 8    public static class MaterialCachingHelper
 9    {
 10        [System.Flags]
 11        public enum Mode
 12        {
 13            NONE = 0,
 14            CACHE_MATERIALS = 1,
 15            CACHE_SHADERS = 2,
 16            CACHE_EVERYTHING = CACHE_MATERIALS | CACHE_SHADERS,
 17        }
 18
 1219        public static bool timeBudgetEnabled => CommonScriptableObjects.rendererState.Get();
 120        public static float timeBudgetMax = 0.003f;
 121        public static float timeBudget = 0;
 22
 123        public static Dictionary<string, Shader> shaderByHash = new ();
 24
 25        private static Shader mainShader;
 26
 27        public static string ComputeHash(Material mat)
 28        {
 029            return mat.ComputeCRC().ToString();
 30        }
 31
 32        static Shader EnsureMainShader()
 33        {
 034            if (mainShader == null) { mainShader = Shader.Find("DCL/Universal Render Pipeline/Lit"); }
 35
 036            return mainShader;
 37        }
 38
 39        public static Material ProcessSingleMaterial(Material mat, Mode cachingFlags = Mode.CACHE_EVERYTHING)
 40        {
 1241            if ((cachingFlags & Mode.CACHE_SHADERS) != 0)
 42            {
 1243                string shaderHash = mat.shader.name;
 44
 1245                if (!shaderByHash.ContainsKey(shaderHash))
 46                {
 247                    if (!mat.shader.name.Contains("Error")) { shaderByHash.Add(shaderHash, Shader.Find(mat.shader.name))
 048                    else { shaderByHash.Add(shaderHash, EnsureMainShader()); }
 49                }
 50
 1251                mat.shader = shaderByHash[shaderHash];
 52            }
 53
 54            //NOTE(Brian): Have to copy material because will be unloaded later.
 1255            var materialCopy = new Material(mat);
 1256            SRPBatchingHelper.OptimizeMaterial(materialCopy);
 57
 1258            if ((cachingFlags & Mode.CACHE_MATERIALS) != 0)
 59            {
 1260                int crc = mat.ComputeCRC();
 1261                string hash = crc.ToString();
 62
 63                RefCountedMaterialData refCountedMat;
 64
 1265                if (!PersistentAssetCache.MaterialCacheByCRC.ContainsKey(hash))
 66                {
 67#if UNITY_EDITOR
 268                    materialCopy.name += $" (crc: {materialCopy.ComputeCRC()})";
 69#endif
 270                    PersistentAssetCache.MaterialCacheByCRC.Add(hash, new RefCountedMaterialData(hash, materialCopy));
 71                }
 72
 1273                refCountedMat = PersistentAssetCache.MaterialCacheByCRC[hash];
 1274                refCountedMat.IncreaseRefCount();
 1275                return refCountedMat.material;
 76            }
 77
 078            return materialCopy;
 79        }
 80
 81        public static IEnumerator Process(List<Renderer> renderers, bool enableRenderers = true, Mode cachingFlags = Mod
 82        {
 1283            if (renderers == null)
 084                yield break;
 85
 1286            int renderersCount = renderers.Count;
 87
 1288            if (renderersCount == 0)
 089                yield break;
 90
 1291            var matList = new List<Material>(1);
 92
 4893            for (int i = 0; i < renderersCount; i++)
 94            {
 1295                Renderer r = renderers[i];
 96
 1297                if (r.name.ToLower().Contains("_collider"))
 98                    continue;
 99
 12100                if (!enableRenderers)
 12101                    r.enabled = false;
 102
 12103                matList.Clear();
 104
 12105                var sharedMats = r.sharedMaterials;
 106
 48107                for (int i1 = 0; i1 < sharedMats.Length; i1++)
 108                {
 12109                    Material mat = sharedMats[i1];
 110
 12111                    if (mat == null)
 112                        continue;
 113
 12114                    float elapsedTime = Time.realtimeSinceStartup;
 115
 12116                    matList.Add(ProcessSingleMaterial(mat, cachingFlags));
 117
 12118                    if (timeBudgetEnabled)
 119                    {
 0120                        elapsedTime = Time.realtimeSinceStartup - elapsedTime;
 0121                        timeBudget -= elapsedTime;
 122
 0123                        if (timeBudget < 0)
 124                        {
 0125                            yield return null;
 0126                            timeBudget += timeBudgetMax;
 127                        }
 128                    }
 129                }
 130
 12131                if (r != null)
 12132                    r.sharedMaterials = matList.ToArray();
 12133            }
 12134        }
 135    }
 136}