You've already forked taptap2024_GJ_chidouren
193 lines
5.8 KiB
C#
193 lines
5.8 KiB
C#
|
|
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()
|
|||
|
|
{
|
|||
|
|
this.connector.SetMaterialDirty(this.graphic);
|
|||
|
|
|
|||
|
|
foreach (var effect in this.syncEffects)
|
|||
|
|
{
|
|||
|
|
effect.SetMaterialDirty();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public virtual Hash128 GetMaterialHash(Material baseMaterial)
|
|||
|
|
{
|
|||
|
|
return k_InvalidHash;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public Material GetModifiedMaterial(Material baseMaterial)
|
|||
|
|
{
|
|||
|
|
return GetModifiedMaterial(baseMaterial, this.graphic);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public virtual Material GetModifiedMaterial(Material baseMaterial, Graphic graphic)
|
|||
|
|
{
|
|||
|
|
if (!this.isActiveAndEnabled) return baseMaterial;
|
|||
|
|
|
|||
|
|
var oldHash = this._effectMaterialHash;
|
|||
|
|
this._effectMaterialHash = GetMaterialHash(baseMaterial);
|
|||
|
|
var modifiedMaterial = baseMaterial;
|
|||
|
|
if (this._effectMaterialHash.isValid)
|
|||
|
|
{
|
|||
|
|
modifiedMaterial = MaterialCache.Register(baseMaterial, this._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 (this.isActiveAndEnabled && this.paramTex != null) this.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 (!this.isActiveAndEnabled) return;
|
|||
|
|
SetMaterialDirty();
|
|||
|
|
SetVerticesDirty();
|
|||
|
|
SetEffectParamsDirty();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected override void OnValidate()
|
|||
|
|
{
|
|||
|
|
if (!this.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 (this.paramTex != null)
|
|||
|
|
{
|
|||
|
|
this.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 (this.paramTex != null)
|
|||
|
|
{
|
|||
|
|
this.paramTex.Unregister(this);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
MaterialCache.Unregister(this._effectMaterialHash);
|
|||
|
|
this._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 ();
|
|||
|
|
//
|
|||
|
|
//
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
}
|