diff options
Diffstat (limited to 'Assets/Scripts/Common/BaseMaterialEffect.cs')
-rw-r--r-- | Assets/Scripts/Common/BaseMaterialEffect.cs | 193 |
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 (); + // + // + // } + // } + // } + } +} |