-
-
Notifications
You must be signed in to change notification settings - Fork 811
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: update the effect architecture
This change adds the following features: - Effects components can be added at runtime - Effect mode, color mode, and blur mode can be changed at runtime - No pre-production of materials required - Support for non-default UI (TextMeshPro, SVG, Spine, etc.) in the future Closes #202, #198, #195, #189, #173, #104 BREAKING CHANGE: Scenes, prefabs and scripts using UIEffect v3.x may not work properly.
- Loading branch information
Showing
46 changed files
with
4,261 additions
and
5,407 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
181 changes: 181 additions & 0 deletions
181
Assets/Coffee/UIExtensions/UIEffect/Scripts/Common/BaseMaterialEffect.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,181 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
using System.IO; | ||
using System.Linq; | ||
using System.Text; | ||
using UnityEngine; | ||
using UnityEngine.UI; | ||
|
||
namespace Coffee.UIExtensions | ||
{ | ||
/// <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> | ||
protected void SetMaterialDirty() | ||
{ | ||
connector.SetMaterialDirty(graphic); | ||
} | ||
|
||
public virtual Hash128 GetMaterialHash(Material baseMaterial) | ||
{ | ||
return k_InvalidHash; | ||
} | ||
|
||
public virtual Material GetModifiedMaterial(Material baseMaterial) | ||
{ | ||
if (!isActiveAndEnabled) return baseMaterial; | ||
|
||
var oldHash = _effectMaterialHash; | ||
_effectMaterialHash = GetMaterialHash(baseMaterial); | ||
var modifiedMaterial = baseMaterial; | ||
if (_effectMaterialHash.isValid) | ||
{ | ||
modifiedMaterial = MaterialCache.Register(baseMaterial, _effectMaterialHash, ModifyMaterial); | ||
} | ||
|
||
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) | ||
{ | ||
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() | ||
{ | ||
if (paramTex != null) | ||
{ | ||
paramTex.Register(this); | ||
} | ||
|
||
SetVerticesDirty(); | ||
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() | ||
{ | ||
SetVerticesDirty(); | ||
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 (); | ||
// | ||
// | ||
// } | ||
// } | ||
// } | ||
} | ||
} |
File renamed without changes.
Oops, something went wrong.