Skip to content

Commit

Permalink
feat: update the effect architecture
Browse files Browse the repository at this point in the history
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
mob-sakai committed Apr 10, 2020
1 parent 24710fc commit 4c08c8c
Show file tree
Hide file tree
Showing 46 changed files with 4,261 additions and 5,407 deletions.
3 changes: 1 addition & 2 deletions Assets/Coffee.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions Assets/Coffee/UIExtensions/UIEffect/Scripts.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

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 ();
//
//
// }
// }
// }
}
}
Loading

0 comments on commit 4c08c8c

Please sign in to comment.