Skip to content

Commit b57e98b

Browse files
committed
feat: add TransitionFilter.Pattern feature
1 parent eadb477 commit b57e98b

File tree

7 files changed

+238
-6
lines changed

7 files changed

+238
-6
lines changed

Packages/src/Editor/UIEffectEditor.cs

+15-1
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,11 @@ public class UIEffect2Editor : Editor
4848
private SerializedProperty _transitionKeepAspectRatio;
4949
private SerializedProperty _transitionWidth;
5050
private SerializedProperty _transitionSoftness;
51+
private SerializedProperty _transitionRange;
5152
private SerializedProperty _transitionColorFilter;
5253
private SerializedProperty _transitionColor;
5354
private SerializedProperty _transitionColorGlow;
55+
private SerializedProperty _transitionPatternReverse;
5456

5557
private SerializedProperty _targetMode;
5658
private SerializedProperty _targetColor;
@@ -119,9 +121,11 @@ private void OnEnable()
119121
_transitionKeepAspectRatio = serializedObject.FindProperty("m_TransitionKeepAspectRatio");
120122
_transitionWidth = serializedObject.FindProperty("m_TransitionWidth");
121123
_transitionSoftness = serializedObject.FindProperty("m_TransitionSoftness");
124+
_transitionRange = serializedObject.FindProperty("m_TransitionRange");
122125
_transitionColorFilter = serializedObject.FindProperty("m_TransitionColorFilter");
123126
_transitionColor = serializedObject.FindProperty("m_TransitionColor");
124127
_transitionColorGlow = serializedObject.FindProperty("m_TransitionColorGlow");
128+
_transitionPatternReverse = serializedObject.FindProperty("m_TransitionPatternReverse");
125129

126130
_targetMode = serializedObject.FindProperty("m_TargetMode");
127131
_targetColor = serializedObject.FindProperty("m_TargetColor");
@@ -229,7 +233,17 @@ public void DrawProperties()
229233
EditorGUILayout.PropertyField(_transitionReverse, EditorGUIUtility.TrTempContent("Reverse"));
230234
EditorGUI.indentLevel--;
231235

232-
if (2 < _transitionFilter.intValue)
236+
if (_transitionFilter.intValue == (int)TransitionFilter.Pattern)
237+
{
238+
EditorGUILayout.PropertyField(_transitionWidth, EditorGUIUtility.TrTempContent("Pattern Size"));
239+
EditorGUILayout.PropertyField(_transitionRange, EditorGUIUtility.TrTempContent("Pattern Range"));
240+
EditorGUILayout.PropertyField(_transitionPatternReverse,
241+
EditorGUIUtility.TrTempContent("Pattern Reverse"));
242+
prevColorFilter = (ColorFilter)_transitionColorFilter.intValue;
243+
EditorGUILayout.PropertyField(_transitionColorFilter);
244+
DrawColor(_transitionColorFilter, _transitionColor, prevColorFilter);
245+
}
246+
else if (2 < _transitionFilter.intValue)
233247
{
234248
EditorGUILayout.PropertyField(_transitionWidth);
235249
EditorGUILayout.PropertyField(_transitionSoftness);

Packages/src/Runtime/Enums.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ public enum TransitionFilter
4646
Shiny = 4,
4747
Mask = 5,
4848
Melt = 6,
49-
Burn = 7
49+
Burn = 7,
50+
Pattern = 8
5051
}
5152

5253
public enum BlendType
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
using System;
2+
using UnityEditor;
3+
using UnityEngine;
4+
5+
namespace Coffee.UIEffectInternal
6+
{
7+
[Serializable]
8+
public struct MinMax01
9+
{
10+
[SerializeField]
11+
private float m_Min;
12+
13+
[SerializeField]
14+
private float m_Max;
15+
16+
public MinMax01(float min, float max)
17+
{
18+
m_Min = Mathf.Clamp01(Mathf.Min(min, max));
19+
m_Max = Mathf.Clamp01(Mathf.Max(min, max));
20+
}
21+
22+
public float min
23+
{
24+
get => m_Min;
25+
set
26+
{
27+
m_Min = Mathf.Clamp01(value);
28+
m_Max = Mathf.Max(value, m_Max);
29+
}
30+
}
31+
32+
public float max
33+
{
34+
get => m_Max;
35+
set
36+
{
37+
m_Max = Mathf.Clamp01(value);
38+
m_Min = Mathf.Min(value, m_Min);
39+
}
40+
}
41+
42+
public float average => (m_Max + m_Min) * 0.5f;
43+
44+
public bool Approximately(MinMax01 other)
45+
{
46+
return Mathf.Approximately(m_Min, other.m_Min) && Mathf.Approximately(m_Max, other.m_Max);
47+
}
48+
}
49+
50+
#if UNITY_EDITOR
51+
[CustomPropertyDrawer(typeof(MinMax01))]
52+
public class MinMaxRangeDrawer : PropertyDrawer
53+
{
54+
private const float k_NumWidth = 50;
55+
private const float k_Space = 5;
56+
private SerializedProperty _max;
57+
private SerializedProperty _min;
58+
59+
private static bool IsSingleLine(GUIContent label)
60+
{
61+
return EditorGUIUtility.wideMode || label == null || string.IsNullOrEmpty(label.text);
62+
}
63+
64+
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
65+
{
66+
return IsSingleLine(label) ? 18 : 36;
67+
}
68+
69+
public override void OnGUI(Rect position, SerializedProperty prop, GUIContent label)
70+
{
71+
EditorGUI.BeginProperty(position, label, prop);
72+
73+
if (_min == null)
74+
{
75+
prop.Next(true);
76+
_min = prop.Copy();
77+
prop.Next(true);
78+
_max = prop.Copy();
79+
}
80+
81+
if (IsSingleLine(label))
82+
{
83+
position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
84+
}
85+
else
86+
{
87+
EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
88+
var indent = (EditorGUI.indentLevel + 1) * 15f;
89+
position = new Rect(position.x + indent, position.y + 18, position.width - indent, 16);
90+
}
91+
92+
var min = _min.floatValue;
93+
var max = _max.floatValue;
94+
if (Draw(position, ref min, ref max))
95+
{
96+
_min.floatValue = min;
97+
_max.floatValue = max;
98+
}
99+
100+
EditorGUI.EndProperty();
101+
}
102+
103+
public static bool Draw(Rect position, ref float minValue, ref float maxValue)
104+
{
105+
var indentLevel = EditorGUI.indentLevel;
106+
EditorGUI.indentLevel = 0;
107+
EditorGUI.BeginChangeCheck();
108+
109+
var rect = new Rect(position.x, position.y, k_NumWidth, position.height);
110+
minValue = Mathf.Clamp(EditorGUI.FloatField(rect, minValue), 0, maxValue);
111+
112+
rect.x += rect.width + k_Space;
113+
rect.width = position.width - k_NumWidth * 2 - k_Space * 2;
114+
EditorGUI.MinMaxSlider(rect, ref minValue, ref maxValue, 0, 1);
115+
116+
rect.x += rect.width + k_Space;
117+
rect.width = k_NumWidth;
118+
maxValue = Mathf.Clamp(EditorGUI.FloatField(rect, maxValue), minValue, 1);
119+
120+
EditorGUI.indentLevel = indentLevel;
121+
return EditorGUI.EndChangeCheck();
122+
}
123+
124+
public static bool DrawLayout(GUIContent label, ref float minValue, ref float maxValue)
125+
{
126+
Rect position;
127+
if (IsSingleLine(label))
128+
{
129+
position = EditorGUILayout.GetControlRect(true, 18f);
130+
position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
131+
}
132+
else
133+
{
134+
position = EditorGUILayout.GetControlRect(true, 36f);
135+
EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
136+
var indent = (EditorGUI.indentLevel + 1) * 15f;
137+
position = new Rect(position.x + indent, position.y + 18, position.width - indent, 16);
138+
}
139+
140+
return Draw(position, ref minValue, ref maxValue);
141+
}
142+
}
143+
#endif
144+
}

Packages/src/Runtime/Internal/Utilities/MinMax01.cs.meta

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Packages/src/Runtime/UIEffect.cs

+35
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ public class UIEffect : UIEffectBase
8181
[SerializeField]
8282
protected float m_TransitionSoftness = 0.2f;
8383

84+
[SerializeField]
85+
protected MinMax01 m_TransitionRange = new MinMax01(0, 1);
86+
8487
[SerializeField]
8588
protected ColorFilter m_TransitionColorFilter = ColorFilter.MultiplyAdditive;
8689

@@ -90,6 +93,9 @@ public class UIEffect : UIEffectBase
9093
[SerializeField]
9194
protected bool m_TransitionColorGlow = false;
9295

96+
[SerializeField]
97+
protected bool m_TransitionPatternReverse = false;
98+
9399
[SerializeField]
94100
protected TargetMode m_TargetMode = TargetMode.None;
95101

@@ -454,6 +460,17 @@ public float transitionSoftness
454460
}
455461
}
456462

463+
public MinMax01 transitionRange
464+
{
465+
get => m_TransitionRange;
466+
set
467+
{
468+
if (m_TransitionRange.Approximately(value)) return;
469+
context.transitionRange = m_TransitionRange = value;
470+
SetMaterialDirty();
471+
}
472+
}
473+
457474
public ColorFilter transitionColorFilter
458475
{
459476
get => m_TransitionColorFilter;
@@ -487,6 +504,17 @@ public bool transitionColorGlow
487504
}
488505
}
489506

507+
public bool transitionPatternReverse
508+
{
509+
get => m_TransitionPatternReverse;
510+
set
511+
{
512+
if (m_TransitionPatternReverse == value) return;
513+
context.transitionPatternReverse = m_TransitionPatternReverse = value;
514+
SetMaterialDirty();
515+
}
516+
}
517+
490518
public TargetMode targetMode
491519
{
492520
get => m_TargetMode;
@@ -924,9 +952,11 @@ protected override void UpdateContext(UIEffectContext c)
924952
c.transitionKeepAspectRatio = m_TransitionKeepAspectRatio;
925953
c.transitionWidth = m_TransitionWidth;
926954
c.transitionSoftness = m_TransitionSoftness;
955+
c.transitionRange = m_TransitionRange;
927956
c.transitionColorFilter = m_TransitionColorFilter;
928957
c.transitionColor = m_TransitionColor;
929958
c.transitionColorGlow = m_TransitionColorGlow;
959+
c.transitionPatternReverse = m_TransitionPatternReverse;
930960

931961
c.targetMode = m_TargetMode;
932962
c.targetColor = m_TargetColor;
@@ -1014,6 +1044,7 @@ public override bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
10141044
case TransitionFilter.None:
10151045
case TransitionFilter.Shiny:
10161046
case TransitionFilter.Mask:
1047+
case TransitionFilter.Pattern:
10171048
return true;
10181049
default:
10191050
return transitionRate < 1;
@@ -1058,9 +1089,11 @@ public void LoadPreset(UIEffect preset)
10581089
m_TransitionKeepAspectRatio = preset.m_TransitionKeepAspectRatio;
10591090
m_TransitionWidth = preset.m_TransitionWidth;
10601091
m_TransitionSoftness = preset.m_TransitionSoftness;
1092+
m_TransitionRange = preset.m_TransitionRange;
10611093
m_TransitionColorFilter = preset.m_TransitionColorFilter;
10621094
m_TransitionColor = preset.m_TransitionColor;
10631095
m_TransitionColorGlow = preset.m_TransitionColorGlow;
1096+
m_TransitionPatternReverse = preset.m_TransitionPatternReverse;
10641097

10651098
m_TargetMode = preset.m_TargetMode;
10661099
m_TargetColor = preset.m_TargetColor;
@@ -1127,9 +1160,11 @@ internal void CopyFrom(UIEffectContext c)
11271160
m_TransitionKeepAspectRatio = c.transitionKeepAspectRatio;
11281161
m_TransitionWidth = c.transitionWidth;
11291162
m_TransitionSoftness = c.transitionSoftness;
1163+
m_TransitionRange = c.transitionRange;
11301164
m_TransitionColorFilter = c.transitionColorFilter;
11311165
m_TransitionColor = c.transitionColor;
11321166
m_TransitionColorGlow = c.transitionColorGlow;
1167+
m_TransitionPatternReverse = c.transitionPatternReverse;
11331168

11341169
m_TargetMode = c.targetMode;
11351170
m_TargetColor = c.targetColor;

Packages/src/Runtime/UIEffectContext.cs

+10-1
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@ public class UIEffectContext
2828
private static readonly int s_TransitionTex_ST = Shader.PropertyToID("_TransitionTex_ST");
2929
private static readonly int s_TransitionWidth = Shader.PropertyToID("_TransitionWidth");
3030
private static readonly int s_TransitionSoftness = Shader.PropertyToID("_TransitionSoftness");
31+
private static readonly int s_TransitionRange = Shader.PropertyToID("_TransitionRange");
3132
private static readonly int s_TransitionColorFilter = Shader.PropertyToID("_TransitionColorFilter");
3233
private static readonly int s_TransitionColor = Shader.PropertyToID("_TransitionColor");
3334
private static readonly int s_TransitionColorGlow = Shader.PropertyToID("_TransitionColorGlow");
35+
private static readonly int s_TransitionPatternReverse = Shader.PropertyToID("_TransitionPatternReverse");
3436
private static readonly int s_TargetColor = Shader.PropertyToID("_TargetColor");
3537
private static readonly int s_TargetRange = Shader.PropertyToID("_TargetRange");
3638
private static readonly int s_TargetSoftness = Shader.PropertyToID("_TargetSoftness");
@@ -87,7 +89,8 @@ public class UIEffectContext
8789
"TRANSITION_SHINY",
8890
"TRANSITION_MASK",
8991
"TRANSITION_MELT",
90-
"TRANSITION_BURN"
92+
"TRANSITION_BURN",
93+
"TRANSITION_PATTERN"
9194
};
9295

9396
private static readonly string[] s_TransitionColorKeywords =
@@ -180,9 +183,11 @@ public class UIEffectContext
180183
public bool transitionKeepAspectRatio = true;
181184
public float transitionWidth = 0.2f;
182185
public float transitionSoftness = 0.2f;
186+
public MinMax01 transitionRange = new MinMax01(0, 1);
183187
public ColorFilter transitionColorFilter = ColorFilter.MultiplyAdditive;
184188
public Color transitionColor = new Color(0f, 0.5f, 1.0f, 1.0f);
185189
public bool transitionColorGlow;
190+
public bool transitionPatternReverse;
186191

187192
public TargetMode targetMode = TargetMode.None;
188193
public Color targetColor = Color.white;
@@ -259,9 +264,11 @@ public void CopyFrom(UIEffectContext preset)
259264
transitionRotation = preset.transitionRotation;
260265
transitionWidth = preset.transitionWidth;
261266
transitionSoftness = preset.transitionSoftness;
267+
transitionRange = preset.transitionRange;
262268
transitionColor = preset.transitionColor;
263269
transitionColorFilter = preset.transitionColorFilter;
264270
transitionColorGlow = preset.transitionColorGlow;
271+
transitionPatternReverse = preset.transitionPatternReverse;
265272

266273
targetMode = preset.targetMode;
267274
targetColor = preset.targetColor;
@@ -331,9 +338,11 @@ public void ApplyToMaterial(Material material, float actualSamplingScale = 1f)
331338
transitionTexOffset.x, transitionTexOffset.y));
332339
material.SetFloat(s_TransitionWidth, Mathf.Clamp01(transitionWidth));
333340
material.SetFloat(s_TransitionSoftness, Mathf.Clamp01(transitionSoftness));
341+
material.SetVector(s_TransitionRange, new Vector2(transitionRange.min, transitionRange.max));
334342
material.SetInt(s_TransitionColorFilter, (int)transitionColorFilter);
335343
material.SetColor(s_TransitionColor, transitionColor);
336344
material.SetInt(s_TransitionColorGlow, transitionColorGlow ? 1 : 0);
345+
material.SetInt(s_TransitionPatternReverse, transitionPatternReverse ? 1 : 0);
337346

338347
material.SetColor(s_TargetColor, targetColor);
339348
material.SetFloat(s_TargetRange, Mathf.Clamp01(targetRange));

0 commit comments

Comments
 (0)