summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Common/BaseMaterialEffect.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-04-07 21:33:14 +0800
committerchai <chaifix@163.com>2021-04-07 21:33:14 +0800
commitc47b92e92cf33ae8bf2f38929e137294397e4735 (patch)
treec67ae3419eaf15e84f1679186e107f598de33978 /Assets/Scripts/Common/BaseMaterialEffect.cs
Diffstat (limited to 'Assets/Scripts/Common/BaseMaterialEffect.cs')
-rw-r--r--Assets/Scripts/Common/BaseMaterialEffect.cs193
1 files changed, 193 insertions, 0 deletions
diff --git a/Assets/Scripts/Common/BaseMaterialEffect.cs b/Assets/Scripts/Common/BaseMaterialEffect.cs
new file mode 100644
index 0000000..0cf2d7a
--- /dev/null
+++ b/Assets/Scripts/Common/BaseMaterialEffect.cs
@@ -0,0 +1,193 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace Coffee.UIEffects
+{
+ /// <summary>
+ /// Abstract effect base for UI.
+ /// </summary>
+ [DisallowMultipleComponent]
+ public abstract class BaseMaterialEffect : BaseMeshEffect, IParameterTexture, IMaterialModifier
+ {
+ protected static readonly Hash128 k_InvalidHash = new Hash128();
+ protected static readonly List<UIVertex> s_TempVerts = new List<UIVertex>();
+ private static readonly StringBuilder s_StringBuilder = new StringBuilder();
+
+ Hash128 _effectMaterialHash;
+
+ /// <summary>
+ /// Gets or sets the parameter index.
+ /// </summary>
+ public int parameterIndex { get; set; }
+
+ /// <summary>
+ /// Gets the parameter texture.
+ /// </summary>
+ public virtual ParameterTexture paramTex
+ {
+ get { return null; }
+ }
+
+ /// <summary>
+ /// Mark the vertices as dirty.
+ /// </summary>
+ public void SetMaterialDirty()
+ {
+ connector.SetMaterialDirty(graphic);
+
+ foreach (var effect in syncEffects)
+ {
+ effect.SetMaterialDirty();
+ }
+ }
+
+ public virtual Hash128 GetMaterialHash(Material baseMaterial)
+ {
+ return k_InvalidHash;
+ }
+
+ public Material GetModifiedMaterial(Material baseMaterial)
+ {
+ return GetModifiedMaterial(baseMaterial, graphic);
+ }
+
+ public virtual Material GetModifiedMaterial(Material baseMaterial, Graphic graphic)
+ {
+ if (!isActiveAndEnabled) return baseMaterial;
+
+ var oldHash = _effectMaterialHash;
+ _effectMaterialHash = GetMaterialHash(baseMaterial);
+ var modifiedMaterial = baseMaterial;
+ if (_effectMaterialHash.isValid)
+ {
+ modifiedMaterial = MaterialCache.Register(baseMaterial, _effectMaterialHash, ModifyMaterial, graphic);
+ }
+
+ MaterialCache.Unregister(oldHash);
+
+ return modifiedMaterial;
+ }
+
+ // protected bool isTMProMobile (Material material)
+ // {
+ // return material && material.shader && material.shader.name.StartsWith ("TextMeshPro/Mobile/", StringComparison.Ordinal);
+ // }
+
+ public virtual void ModifyMaterial(Material newMaterial, Graphic graphic)
+ {
+ if (isActiveAndEnabled && paramTex != null)
+ paramTex.RegisterMaterial(newMaterial);
+ }
+
+ protected void SetShaderVariants(Material newMaterial, params object[] variants)
+ {
+ // Set shader keywords as variants
+ var keywords = variants.Where(x => 0 < (int) x)
+ .Select(x => x.ToString().ToUpper())
+ .Concat(newMaterial.shaderKeywords)
+ .Distinct()
+ .ToArray();
+ newMaterial.shaderKeywords = keywords;
+
+ // Add variant name
+ s_StringBuilder.Length = 0;
+ s_StringBuilder.Append(Path.GetFileName(newMaterial.shader.name));
+ foreach (var keyword in keywords)
+ {
+ s_StringBuilder.Append("-");
+ s_StringBuilder.Append(keyword);
+ }
+
+ newMaterial.name = s_StringBuilder.ToString();
+ }
+
+#if UNITY_EDITOR
+ protected override void Reset()
+ {
+ if (!isActiveAndEnabled) return;
+ SetMaterialDirty();
+ SetVerticesDirty();
+ SetEffectParamsDirty();
+ }
+
+ protected override void OnValidate()
+ {
+ if (!isActiveAndEnabled) return;
+ SetVerticesDirty();
+ SetEffectParamsDirty();
+ }
+#endif
+
+ /// <summary>
+ /// This function is called when the object becomes enabled and active.
+ /// </summary>
+ protected override void OnEnable()
+ {
+ base.OnEnable();
+
+ if (paramTex != null)
+ {
+ paramTex.Register(this);
+ }
+
+ SetMaterialDirty();
+ SetEffectParamsDirty();
+
+ // foreach (var mr in GetComponentsInChildren<UIEffectMaterialResolver> ())
+ // {
+ // mr.GetComponent<Graphic> ().SetMaterialDirty ();
+ // mr.GetComponent<Graphic> ().SetVerticesDirty ();
+ // }
+ }
+
+ /// <summary>
+ /// This function is called when the behaviour becomes disabled () or inactive.
+ /// </summary>
+ protected override void OnDisable()
+ {
+ base.OnDisable();
+
+ SetMaterialDirty();
+
+ if (paramTex != null)
+ {
+ paramTex.Unregister(this);
+ }
+
+ MaterialCache.Unregister(_effectMaterialHash);
+ _effectMaterialHash = k_InvalidHash;
+ }
+
+ // protected override void OnDidApplyAnimationProperties()
+ // {
+ // SetEffectParamsDirty();
+ // }
+
+ // protected override void OnTextChanged (UnityEngine.Object obj)
+ // {
+ // base.OnTextChanged (obj);
+ //
+ //
+ // foreach (var sm in GetComponentsInChildren<TMPro.TMP_SubMeshUI> ())
+ // {
+ // if(!sm.GetComponent<UIEffectMaterialResolver>())
+ // {
+ // var mr = sm.gameObject.AddComponent<UIEffectMaterialResolver> ();
+ //
+ // targetGraphic.SetAllDirty ();
+ // //targetGraphic.SetVerticesDirty ();
+ //
+ // //mr.GetComponent<Graphic> ().SetMaterialDirty ();
+ // //mr.GetComponent<Graphic> ().SetVerticesDirty ();
+ //
+ //
+ // }
+ // }
+ // }
+ }
+}