diff options
author | chai <chaifix@163.com> | 2021-04-07 21:33:14 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-04-07 21:33:14 +0800 |
commit | c47b92e92cf33ae8bf2f38929e137294397e4735 (patch) | |
tree | c67ae3419eaf15e84f1679186e107f598de33978 /Assets/Scripts/Common/GraphicConnector.cs |
Diffstat (limited to 'Assets/Scripts/Common/GraphicConnector.cs')
-rw-r--r-- | Assets/Scripts/Common/GraphicConnector.cs | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/Assets/Scripts/Common/GraphicConnector.cs b/Assets/Scripts/Common/GraphicConnector.cs new file mode 100644 index 0000000..3046297 --- /dev/null +++ b/Assets/Scripts/Common/GraphicConnector.cs @@ -0,0 +1,151 @@ +using UnityEngine; +using UnityEngine.UI; +using System; +using System.Collections.Generic; + +namespace Coffee.UIEffects +{ + public class GraphicConnector + { + private static readonly List<GraphicConnector> s_Connectors = new List<GraphicConnector>(); + + private static readonly Dictionary<Type, GraphicConnector> s_ConnectorMap = + new Dictionary<Type, GraphicConnector>(); + + private static readonly GraphicConnector s_EmptyConnector = new GraphicConnector(); + +#if UNITY_EDITOR + [UnityEditor.InitializeOnLoadMethod] +#endif + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] + private static void Init() + { + AddConnector(new GraphicConnector()); + } + + protected static void AddConnector(GraphicConnector connector) + { + s_Connectors.Add(connector); + s_Connectors.Sort((x, y) => y.priority - x.priority); + } + + public static GraphicConnector FindConnector(Graphic graphic) + { + if (!graphic) return s_EmptyConnector; + + var type = graphic.GetType(); + GraphicConnector connector = null; + if (s_ConnectorMap.TryGetValue(type, out connector)) return connector; + + foreach (var c in s_Connectors) + { + if (!c.IsValid(graphic)) continue; + + s_ConnectorMap.Add(type, c); + return c; + } + + return s_EmptyConnector; + } + + /// <summary> + /// Connector priority. + /// </summary> + protected virtual int priority + { + get { return -1; } + } + + /// <summary> + /// Extra channel. + /// </summary> + public virtual AdditionalCanvasShaderChannels extraChannel + { + get { return AdditionalCanvasShaderChannels.TexCoord1; } + } + + /// <summary> + /// The connector is valid for the component. + /// </summary> + protected virtual bool IsValid(Graphic graphic) + { + return true; + } + + /// <summary> + /// Find effect shader. + /// </summary> + public virtual Shader FindShader(string shaderName) + { + return Shader.Find("Hidden/" + shaderName); + } + + /// <summary> + /// This function is called when the object becomes enabled and active. + /// </summary> + public virtual void OnEnable(Graphic graphic) + { + } + + /// <summary> + /// This function is called when the behaviour becomes disabled () or inactive. + /// </summary> + public virtual void OnDisable(Graphic graphic) + { + } + + /// <summary> + /// Mark the vertices as dirty. + /// </summary> + public virtual void SetVerticesDirty(Graphic graphic) + { + if (graphic) + graphic.SetVerticesDirty(); + } + + /// <summary> + /// Mark the material as dirty. + /// </summary> + public virtual void SetMaterialDirty(Graphic graphic) + { + if (graphic) + graphic.SetMaterialDirty(); + } + + /// <summary> + /// Gets position factor for area. + /// </summary> + public virtual void GetPositionFactor(EffectArea area, int index, Rect rect, Vector2 position, out float x, out float y) + { + if (area == EffectArea.Fit) + { + x = Mathf.Clamp01((position.x - rect.xMin) / rect.width); + y = Mathf.Clamp01((position.y - rect.yMin) / rect.height); + } + else + { + x = Mathf.Clamp01(position.x / rect.width + 0.5f); + y = Mathf.Clamp01(position.y / rect.height + 0.5f); + } + } + + public virtual bool IsText(Graphic graphic) + { + return graphic && graphic is Text; + } + + public virtual void SetExtraChannel(ref UIVertex vertex, Vector2 value) + { + vertex.uv1 = value; + } + + /// <summary> + /// Normalize vertex position by local matrix. + /// </summary> + public virtual void GetNormalizedFactor(EffectArea area, int index, Matrix2x3 matrix, Vector2 position, + out Vector2 normalizedPos) + { + normalizedPos = matrix * position; + } + } +} |