75 lines
2.3 KiB
C#
75 lines
2.3 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace Coffee.UIParticleExtensions
|
|
{
|
|
internal class ModifiedMaterial
|
|
{
|
|
private static readonly List<MatEntry> s_Entries = new List<MatEntry>();
|
|
|
|
public static Material Add(Material baseMat, Texture texture, int id)
|
|
{
|
|
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) continue;
|
|
++e.count;
|
|
return e.customMat;
|
|
}
|
|
|
|
e = new MatEntry();
|
|
e.count = 1;
|
|
e.baseMat = baseMat;
|
|
e.texture = texture;
|
|
e.id = id;
|
|
e.customMat = new Material(baseMat);
|
|
e.customMat.hideFlags = HideFlags.HideAndDontSave;
|
|
if (texture)
|
|
e.customMat.mainTexture = texture;
|
|
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);
|
|
DestroyImmediate(e.customMat);
|
|
e.baseMat = null;
|
|
e.texture = null;
|
|
s_Entries.RemoveAt(i);
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
private static void DestroyImmediate(Object obj)
|
|
{
|
|
if (!obj) return;
|
|
if (Application.isEditor)
|
|
Object.DestroyImmediate(obj);
|
|
else
|
|
Object.Destroy(obj);
|
|
}
|
|
|
|
private class MatEntry
|
|
{
|
|
public Material baseMat;
|
|
public Material customMat;
|
|
public int count;
|
|
public Texture texture;
|
|
public int id;
|
|
}
|
|
}
|
|
}
|