Skip to content

Commit b72a1c0

Browse files
committed
feat: add GradationMode.Diagonal with 4 colors
close #308
1 parent fc09152 commit b72a1c0

File tree

5 files changed

+111
-27
lines changed

5 files changed

+111
-27
lines changed

Packages/src/Editor/UIEffectEditor.cs

+42-17
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ public class UIEffect2Editor : Editor
7979
private SerializedProperty _gradationMode;
8080
private SerializedProperty _gradationColor1;
8181
private SerializedProperty _gradationColor2;
82+
private SerializedProperty _gradationColor3;
83+
private SerializedProperty _gradationColor4;
8284
private SerializedProperty _gradationGradient;
8385
private SerializedProperty _gradationOffset;
8486
private SerializedProperty _gradationScale;
@@ -163,6 +165,8 @@ private void OnEnable()
163165
_gradationMode = serializedObject.FindProperty("m_GradationMode");
164166
_gradationColor1 = serializedObject.FindProperty("m_GradationColor1");
165167
_gradationColor2 = serializedObject.FindProperty("m_GradationColor2");
168+
_gradationColor3 = serializedObject.FindProperty("m_GradationColor3");
169+
_gradationColor4 = serializedObject.FindProperty("m_GradationColor4");
166170
_gradationGradient = serializedObject.FindProperty("m_GradationGradient");
167171
_gradationOffset = serializedObject.FindProperty("m_GradationOffset");
168172
_gradationScale = serializedObject.FindProperty("m_GradationScale");
@@ -340,22 +344,19 @@ public void DrawProperties()
340344
case GradationMode.AngleGradient:
341345
DrawGradientField(_gradationGradient);
342346
break;
347+
case GradationMode.Diagonal:
348+
DrawColorPickerField("Top", _gradationColor1, _gradationColor2);
349+
DrawColorPickerField("Bottom", _gradationColor3, _gradationColor4);
350+
break;
343351
default:
344-
DrawColorPickerField(_gradationColor1);
352+
DrawColorPickerField(EditorGUILayout.GetControlRect(), _gradationColor1, true);
345353
var r = EditorGUILayout.GetControlRect();
346354
r.width -= 24;
347-
r.height = EditorGUIUtility.singleLineHeight;
348-
DrawColorPickerField(r, _gradationColor2);
355+
DrawColorPickerField(r, _gradationColor2, true);
349356

350357
r.x += r.width + 4;
351358
r.width = 20;
352-
// Swap colors
353-
if (GUI.Button(r, EditorGUIUtility.IconContent("preaudioloopoff"), "iconbutton"))
354-
{
355-
(_gradationColor1.colorValue, _gradationColor2.colorValue)
356-
= (_gradationColor2.colorValue, _gradationColor1.colorValue);
357-
}
358-
359+
SwapColorsButton(r, _gradationColor1, _gradationColor2);
359360
break;
360361
}
361362

@@ -405,17 +406,35 @@ public void DrawProperties()
405406
}
406407
}
407408

408-
private static void DrawColorPickerField(SerializedProperty color, bool showAlpha = true)
409+
private static void DrawColorPickerField(string label, SerializedProperty color1, SerializedProperty color2)
409410
{
411+
var labelWidth = EditorGUIUtility.labelWidth;
410412
var r = EditorGUILayout.GetControlRect();
411-
r.height = EditorGUIUtility.singleLineHeight;
412-
DrawColorPickerField(r, color, showAlpha);
413+
r.width -= 24;
414+
EditorGUI.PrefixLabel(new Rect(r.x, r.y, labelWidth, r.height), EditorGUIUtility.TrTempContent(label));
415+
416+
var indentLevel = EditorGUI.indentLevel;
417+
EditorGUI.indentLevel = 0;
418+
var rPos = new Rect(r.x + labelWidth, r.y, (r.width - labelWidth) / 2, r.height);
419+
DrawColorPickerField(rPos, GUIContent.none, color1, true);
420+
421+
rPos.x += rPos.width;
422+
DrawColorPickerField(rPos, GUIContent.none, color2, true);
423+
424+
// Swap colors button
425+
SwapColorsButton(new Rect(r.x + r.width + 4, r.y, 20, 20), color1, color2);
426+
EditorGUI.indentLevel = indentLevel;
413427
}
414428

415-
private static void DrawColorPickerField(Rect rect, SerializedProperty color, bool showAlpha = true)
429+
private static void DrawColorPickerField(Rect rect, SerializedProperty color, bool showAlpha)
416430
{
417431
var label = EditorGUIUtility.TrTempContent(color.displayName);
418432
label.tooltip = color.tooltip;
433+
DrawColorPickerField(rect, label, color, showAlpha);
434+
}
435+
436+
private static void DrawColorPickerField(Rect rect, GUIContent label, SerializedProperty color, bool showAlpha)
437+
{
419438
var hdr = UIEffectProjectSettings.useHdrColorPicker;
420439
EditorGUI.showMixedValue = color.hasMultipleDifferentValues;
421440

@@ -430,8 +449,6 @@ private static void DrawColorPickerField(Rect rect, SerializedProperty color, bo
430449
private static void DrawGradientField(SerializedProperty gradient)
431450
{
432451
var r = EditorGUILayout.GetControlRect();
433-
r.height = EditorGUIUtility.singleLineHeight;
434-
435452
var label = EditorGUIUtility.TrTempContent(gradient.displayName);
436453
label.tooltip = gradient.tooltip;
437454
var hdr = UIEffectProjectSettings.useHdrColorPicker;
@@ -480,7 +497,7 @@ private static void DrawColor(SerializedProperty color, ColorFilter filter, Colo
480497
color.colorValue = Color.white;
481498
}
482499

483-
DrawColorPickerField(color, showAlpha);
500+
DrawColorPickerField(EditorGUILayout.GetControlRect(), color, showAlpha);
484501
}
485502
}
486503

@@ -502,6 +519,14 @@ private static void DrawColor(SerializedProperty filter, SerializedProperty colo
502519
EditorGUI.indentLevel--;
503520
}
504521

522+
private static void SwapColorsButton(Rect rect, SerializedProperty color1, SerializedProperty color2)
523+
{
524+
if (GUI.Button(rect, EditorGUIUtility.IconContent("preaudioloopoff"), "iconbutton"))
525+
{
526+
(color1.colorValue, color2.colorValue) = (color2.colorValue, color1.colorValue);
527+
}
528+
}
529+
505530
private static bool DrawHeaderPopup(SerializedProperty sp)
506531
{
507532
var r = EditorGUILayout.GetControlRect();

Packages/src/Runtime/Enums.cs

+11-10
Original file line numberDiff line numberDiff line change
@@ -94,16 +94,17 @@ public enum PatternArea
9494
public enum GradationMode
9595
{
9696
None = 0,
97-
Horizontal,
98-
HorizontalGradient,
99-
Vertical,
100-
VerticalGradient,
101-
RadialFast,
102-
RadialDetail,
103-
DiagonalToRightBottom,
104-
DiagonalToLeftBottom,
105-
Angle,
106-
AngleGradient
97+
Horizontal = 1,
98+
HorizontalGradient = 2,
99+
Vertical = 3,
100+
VerticalGradient = 4,
101+
RadialFast = 5,
102+
RadialDetail = 6,
103+
Diagonal = 11,
104+
DiagonalToRightBottom = 7,
105+
DiagonalToLeftBottom = 8,
106+
Angle = 9,
107+
AngleGradient = 10
107108
}
108109

109110
internal static class BlendTypeConverter

Packages/src/Runtime/UIEffect.cs

+36
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,12 @@ public class UIEffect : UIEffectBase
163163
[SerializeField]
164164
protected Color m_GradationColor2 = Color.white;
165165

166+
[SerializeField]
167+
protected Color m_GradationColor3 = Color.white;
168+
169+
[SerializeField]
170+
protected Color m_GradationColor4 = Color.white;
171+
166172
[SerializeField]
167173
private Gradient m_GradationGradient = new Gradient();
168174

@@ -854,6 +860,28 @@ public Color gradationColor2
854860
}
855861
}
856862

863+
public Color gradationColor3
864+
{
865+
get => m_GradationColor3;
866+
set
867+
{
868+
if (m_GradationColor3 == value) return;
869+
context.gradationColor3 = m_GradationColor3 = value;
870+
SetVerticesDirty();
871+
}
872+
}
873+
874+
public Color gradationColor4
875+
{
876+
get => m_GradationColor4;
877+
set
878+
{
879+
if (m_GradationColor4 == value) return;
880+
context.gradationColor4 = m_GradationColor4 = value;
881+
SetVerticesDirty();
882+
}
883+
}
884+
857885
public float gradationOffset
858886
{
859887
get => m_GradationOffset;
@@ -1024,6 +1052,8 @@ protected override void UpdateContext(UIEffectContext c)
10241052
c.gradationMode = m_GradationMode;
10251053
c.gradationColor1 = m_GradationColor1;
10261054
c.gradationColor2 = m_GradationColor2;
1055+
c.gradationColor3 = m_GradationColor3;
1056+
c.gradationColor4 = m_GradationColor4;
10271057
c.gradationGradient = m_GradationGradient;
10281058
c.gradationOffset = m_GradationOffset;
10291059
c.gradationScale = m_GradationScale;
@@ -1168,8 +1198,11 @@ public void LoadPreset(UIEffect preset)
11681198
m_GradationMode = preset.m_GradationMode;
11691199
m_GradationColor1 = preset.m_GradationColor1;
11701200
m_GradationColor2 = preset.m_GradationColor2;
1201+
m_GradationColor3 = preset.m_GradationColor3;
1202+
m_GradationColor4 = preset.m_GradationColor4;
11711203
m_GradationGradient = new Gradient();
11721204
m_GradationGradient.SetKeys(preset.m_GradationGradient.colorKeys, preset.m_GradationGradient.alphaKeys);
1205+
m_GradationGradient.mode = preset.m_GradationGradient.mode;
11731206
m_GradationOffset = preset.m_GradationOffset;
11741207
m_GradationScale = preset.m_GradationScale;
11751208
m_GradationRotation = preset.m_GradationRotation;
@@ -1242,8 +1275,11 @@ internal void CopyFrom(UIEffectContext c)
12421275
m_GradationMode = c.gradationMode;
12431276
m_GradationColor1 = c.gradationColor1;
12441277
m_GradationColor2 = c.gradationColor2;
1278+
m_GradationColor3 = c.gradationColor3;
1279+
m_GradationColor4 = c.gradationColor4;
12451280
m_GradationGradient = new Gradient();
12461281
m_GradationGradient.SetKeys(c.gradationGradient.colorKeys, c.gradationGradient.alphaKeys);
1282+
m_GradationGradient.mode = c.gradationGradient.mode;
12471283
m_GradationOffset = c.gradationOffset;
12481284
m_GradationScale = c.gradationScale;
12491285
m_GradationRotation = c.gradationRotation;

Packages/src/Runtime/UIEffectContext.cs

+7
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ public class UIEffectContext
222222
public GradationMode gradationMode;
223223
public Color gradationColor1;
224224
public Color gradationColor2;
225+
public Color gradationColor3;
226+
public Color gradationColor4;
225227
public Gradient gradationGradient;
226228
public float gradationOffset;
227229
public float gradationScale;
@@ -305,6 +307,8 @@ public void CopyFrom(UIEffectContext preset)
305307
gradationMode = preset.gradationMode;
306308
gradationColor1 = preset.gradationColor1;
307309
gradationColor2 = preset.gradationColor2;
310+
gradationColor3 = preset.gradationColor3;
311+
gradationColor4 = preset.gradationColor4;
308312
gradationGradient = preset.gradationGradient;
309313
gradationOffset = preset.gradationOffset;
310314
gradationScale = preset.gradationScale;
@@ -527,6 +531,9 @@ private void ApplyGradation(List<UIVertex> verts, Rect rect, Matrix4x4 m, bool c
527531
case GradationMode.Vertical:
528532
GradientUtil.DoVerticalGradient(verts, a, b, offset, scale, rect, m);
529533
break;
534+
case GradationMode.Diagonal:
535+
GradientUtil.DoDiagonal(verts, a, b, gradationColor3, gradationColor4, offset, scale, rect, m);
536+
break;
530537
case GradationMode.DiagonalToRightBottom:
531538
GradientUtil.DoDiagonalGradientToRightBottom(verts, a, b, offset, scale, rect, m);
532539
break;

Packages/src/Runtime/Utilities/GradientUtil.cs

+15
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,21 @@ static Color Evaluate(Gradient gradient, Rect rect, float t, float offset, float
159159
}
160160
}
161161

162+
public static void DoDiagonal(List<UIVertex> verts, Color a, Color b, Color c, Color d, float offset,
163+
float scale, Rect rect, Matrix4x4 m)
164+
{
165+
for (var i = 0; i < verts.Count; i++)
166+
{
167+
var vt = verts[i];
168+
var x = Mathf.InverseLerp(rect.xMin, rect.xMax, m.MultiplyPoint3x4(vt.position).x);
169+
var y = Mathf.InverseLerp(rect.yMin, rect.yMax, m.MultiplyPoint3x4(vt.position).y);
170+
var tx = Mathf.Clamp01(offset + (x - 0.5f) * scale + 0.5f);
171+
var ty = Mathf.Clamp01(offset + (0.5f - y) * scale + 0.5f);
172+
vt.color *= Color.Lerp(Color.Lerp(a, b, tx), Color.Lerp(c, d, tx), ty);
173+
verts[i] = vt;
174+
}
175+
}
176+
162177
public static void DoDiagonalGradientToRightBottom(List<UIVertex> verts, Color a, Color b, float offset,
163178
float scale, Rect rect, Matrix4x4 m)
164179
{

0 commit comments

Comments
 (0)