summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Enums/EffectArea.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-04-07 21:33:14 +0800
committerchai <chaifix@163.com>2021-04-07 21:33:14 +0800
commitc47b92e92cf33ae8bf2f38929e137294397e4735 (patch)
treec67ae3419eaf15e84f1679186e107f598de33978 /Assets/Scripts/Enums/EffectArea.cs
Diffstat (limited to 'Assets/Scripts/Enums/EffectArea.cs')
-rw-r--r--Assets/Scripts/Enums/EffectArea.cs116
1 files changed, 116 insertions, 0 deletions
diff --git a/Assets/Scripts/Enums/EffectArea.cs b/Assets/Scripts/Enums/EffectArea.cs
new file mode 100644
index 0000000..4e5fa28
--- /dev/null
+++ b/Assets/Scripts/Enums/EffectArea.cs
@@ -0,0 +1,116 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace Coffee.UIEffects
+{
+ /// <summary>
+ /// Area for effect.
+ /// </summary>
+ public enum EffectArea
+ {
+ RectTransform,
+ Fit,
+ Character,
+ }
+
+ public static class EffectAreaExtensions
+ {
+ static readonly Rect rectForCharacter = new Rect(0, 0, 1, 1);
+ static readonly Vector2[] splitedCharacterPosition = {Vector2.up, Vector2.one, Vector2.right, Vector2.zero};
+
+ /// <summary>
+ /// Gets effect for area.
+ /// </summary>
+ public static Rect GetEffectArea(this EffectArea area, VertexHelper vh, Rect rectangle, float aspectRatio = -1)
+ {
+ Rect rect = default(Rect);
+ switch (area)
+ {
+ case EffectArea.RectTransform:
+ rect = rectangle;
+ break;
+ case EffectArea.Character:
+ rect = rectForCharacter;
+ break;
+ case EffectArea.Fit:
+ // Fit to contents.
+ UIVertex vertex = default(UIVertex);
+ float xMin = float.MaxValue;
+ float yMin = float.MaxValue;
+ float xMax = float.MinValue;
+ float yMax = float.MinValue;
+ for (int i = 0; i < vh.currentVertCount; i++)
+ {
+ vh.PopulateUIVertex(ref vertex, i);
+ float x = vertex.position.x;
+ float y = vertex.position.y;
+ xMin = Mathf.Min(xMin, x);
+ yMin = Mathf.Min(yMin, y);
+ xMax = Mathf.Max(xMax, x);
+ yMax = Mathf.Max(yMax, y);
+ }
+
+ rect.Set(xMin, yMin, xMax - xMin, yMax - yMin);
+ break;
+ default:
+ rect = rectangle;
+ break;
+ }
+
+
+ if (0 < aspectRatio)
+ {
+ if (rect.width < rect.height)
+ {
+ rect.width = rect.height * aspectRatio;
+ }
+ else
+ {
+ rect.height = rect.width / aspectRatio;
+ }
+ }
+
+ return rect;
+ }
+
+ /// <summary>
+ /// Gets position factor for area.
+ /// </summary>
+ public static void GetPositionFactor(this EffectArea area, int index, Rect rect, Vector2 position, bool isText,
+ bool isTMPro, out float x, out float y)
+ {
+ if (isText && area == EffectArea.Character)
+ {
+ index = isTMPro ? (index + 3) % 4 : index % 4;
+ x = splitedCharacterPosition[index].x;
+ y = splitedCharacterPosition[index].y;
+ }
+ else 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);
+ }
+ }
+
+ /// <summary>
+ /// Normalize vertex position by local matrix.
+ /// </summary>
+ public static void GetNormalizedFactor(this EffectArea area, int index, Matrix2x3 matrix, Vector2 position,
+ bool isText, out Vector2 nomalizedPos)
+ {
+ if (isText && area == EffectArea.Character)
+ {
+ nomalizedPos = matrix * splitedCharacterPosition[(index + 3) % 4];
+ }
+ else
+ {
+ nomalizedPos = matrix * position;
+ }
+ }
+ }
+}