using System.Collections.Generic; using UnityEngine; namespace Coffee.UIParticleExtensions { internal class ModifiedMaterial { private static readonly List s_Entries = new List(); public static Material Add(Material baseMat, Texture texture, int id, int props) { MatEntry e; for (var i = 0; i < s_Entries.Count; i++) { e = s_Entries[i]; if (e.baseMat != baseMat || e.texture != texture || e.id != id || e.props != props) continue; ++e.count; return e.customMat; } e = new MatEntry { count = 1, baseMat = baseMat, texture = texture, id = id, props = props, customMat = new Material(baseMat) { name = $"{baseMat.name}_{id}", hideFlags = HideFlags.HideAndDontSave, mainTexture = texture ? texture : null } }; s_Entries.Add(e); //Debug.LogFormat(">>>> ModifiedMaterial.Add -> count = count:{0}, mat:{1}, tex:{2}, id:{3}", s_Entries.Count, baseMat, texture, id); return e.customMat; } public static void Remove(Material customMat) { if (!customMat) return; for (var i = 0; i < s_Entries.Count; ++i) { var e = s_Entries[i]; if (e.customMat != customMat) continue; if (--e.count == 0) { //Debug.LogFormat(">>>> ModifiedMaterial.Remove -> count:{0}, mat:{1}, tex:{2}, id:{3}", s_Entries.Count - 1, e.customMat, e.texture, e.id); Misc.DestroyImmediate(e.customMat); e.customMat = null; e.baseMat = null; e.texture = null; s_Entries.RemoveAt(i); } break; } } private class MatEntry { public Material baseMat; public int count; public Material customMat; public int id; public int props; public Texture texture; } } }