Skip to content

Commit 08e9ba7

Browse files
committed
feat: add GradationMode.Angle and GradationMode.AngleGradient
1 parent aeb78ed commit 08e9ba7

File tree

7 files changed

+186
-20
lines changed

7 files changed

+186
-20
lines changed

Packages/src/Editor/UIEffectEditor.cs

+10-2
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public class UIEffect2Editor : Editor
6666
private SerializedProperty _gradationGradient;
6767
private SerializedProperty _gradationOffset;
6868
private SerializedProperty _gradationScale;
69+
private SerializedProperty _gradationRotation;
6970

7071
private bool _expandOthers;
7172
private SerializedProperty _allowToModifyMeshShape;
@@ -128,6 +129,7 @@ private void OnEnable()
128129
_gradationGradient = serializedObject.FindProperty("m_GradationGradient");
129130
_gradationOffset = serializedObject.FindProperty("m_GradationOffset");
130131
_gradationScale = serializedObject.FindProperty("m_GradationScale");
132+
_gradationRotation = serializedObject.FindProperty("m_GradationRotation");
131133

132134
_allowToModifyMeshShape = serializedObject.FindProperty("m_AllowToModifyMeshShape");
133135
}
@@ -283,10 +285,10 @@ public void DrawProperties()
283285
{
284286
case GradationMode.HorizontalGradient:
285287
case GradationMode.VerticalGradient:
288+
case GradationMode.AngleGradient:
286289
EditorGUILayout.PropertyField(_gradationGradient);
287290
break;
288291
default:
289-
{
290292
EditorGUILayout.PropertyField(_gradationColor1);
291293
var r = EditorGUILayout.GetControlRect();
292294
r.width -= 20;
@@ -302,11 +304,17 @@ public void DrawProperties()
302304
}
303305

304306
break;
305-
}
306307
}
307308

308309
EditorGUILayout.PropertyField(_gradationOffset);
309310
EditorGUILayout.PropertyField(_gradationScale);
311+
312+
if ((GradationMode)_gradationMode.intValue == GradationMode.Angle
313+
|| (GradationMode)_gradationMode.intValue == GradationMode.AngleGradient)
314+
{
315+
EditorGUILayout.PropertyField(_gradationRotation);
316+
}
317+
310318
EditorGUI.indentLevel--;
311319
}
312320

Packages/src/Runtime/Enums.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,9 @@ public enum GradationMode
8686
RadialFast,
8787
RadialDetail,
8888
DiagonalToRightBottom,
89-
DiagonalToLeftBottom
89+
DiagonalToLeftBottom,
90+
Angle,
91+
AngleGradient
9092
}
9193

9294
internal static class BlendTypeConverter

Packages/src/Runtime/UIEffect.cs

+27-1
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,11 @@ public class UIEffect : UIEffectBase
148148
protected GradationMode m_GradationMode = GradationMode.None;
149149

150150
[SerializeField]
151+
[ColorUsage(true, true)]
151152
protected Color m_GradationColor1 = Color.white;
152153

153154
[SerializeField]
155+
[ColorUsage(true, true)]
154156
protected Color m_GradationColor2 = Color.white;
155157

156158
[SerializeField]
@@ -164,6 +166,10 @@ public class UIEffect : UIEffectBase
164166
[SerializeField]
165167
protected float m_GradationScale = 1;
166168

169+
[SerializeField]
170+
[Range(0, 360)]
171+
private float m_GradationRotation = 0;
172+
167173
[SerializeField]
168174
protected bool m_AllowToModifyMeshShape = true;
169175

@@ -696,6 +702,18 @@ public float gradationScale
696702
}
697703
}
698704

705+
public float gradationRotation
706+
{
707+
get => m_GradationRotation;
708+
set
709+
{
710+
value = Mathf.Repeat(value, 360);
711+
if (Mathf.Approximately(m_GradationRotation, value)) return;
712+
context.gradationRotation = m_GradationRotation = value;
713+
SetVerticesDirty();
714+
}
715+
}
716+
699717
public bool allowToModifyMeshShape
700718
{
701719
get => m_AllowToModifyMeshShape;
@@ -819,6 +837,7 @@ protected override void UpdateContext(UIEffectContext c)
819837
c.gradationGradient = m_GradationGradient;
820838
c.gradationOffset = m_GradationOffset;
821839
c.gradationScale = m_GradationScale;
840+
c.gradationRotation = m_GradationRotation;
822841

823842
c.allowToModifyMeshShape = m_AllowToModifyMeshShape;
824843
}
@@ -855,10 +874,16 @@ public override void SetRate(float rate, UIEffectTweener.CullingMask mask)
855874
transitionRate = rate;
856875
}
857876

858-
if (gradationMode != GradationMode.None && 0 < (mask & UIEffectTweener.CullingMask.Gradiation))
877+
if (gradationMode != GradationMode.None && 0 < (mask & UIEffectTweener.CullingMask.GradiationOffset))
859878
{
860879
gradationOffset = Mathf.Lerp(-1f, 1f, rate);
861880
}
881+
882+
if ((gradationMode == GradationMode.Angle || gradationMode == GradationMode.AngleGradient)
883+
&& 0 < (mask & UIEffectTweener.CullingMask.GradiationRotation))
884+
{
885+
gradationRotation = Mathf.Lerp(0f, 360f, rate);
886+
}
862887
}
863888

864889
public override bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
@@ -993,6 +1018,7 @@ internal void CopyFrom(UIEffectContext c)
9931018
m_GradationGradient = c.gradationGradient;
9941019
m_GradationOffset = c.gradationOffset;
9951020
m_GradationScale = c.gradationScale;
1021+
m_GradationRotation = c.gradationRotation;
9961022

9971023
m_AllowToModifyMeshShape = c.allowToModifyMeshShape;
9981024

Packages/src/Runtime/UIEffectContext.cs

+31-1
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,8 @@ public class UIEffectContext
181181
public Gradient gradationGradient;
182182
public float gradationOffset;
183183
public float gradationScale;
184+
public float gradationRotation;
184185
private List<float> _keyTimes;
185-
private List<float> _splitTimes;
186186

187187
public bool allowToModifyMeshShape;
188188

@@ -253,6 +253,7 @@ public void CopyFrom(UIEffectContext preset)
253253
gradationGradient = preset.gradationGradient;
254254
gradationOffset = preset.gradationOffset;
255255
gradationScale = preset.gradationScale;
256+
gradationRotation = preset.gradationRotation;
256257

257258
allowToModifyMeshShape = preset.allowToModifyMeshShape;
258259
}
@@ -442,6 +443,7 @@ private void ApplyGradation(List<UIVertex> verts, Rect rect, Matrix4x4 m)
442443
var offset = gradationOffset;
443444
var scale = gradationScale;
444445
var grad = gradationGradient;
446+
var rot = gradationRotation;
445447
switch (gradationMode)
446448
{
447449
case GradationMode.Horizontal:
@@ -462,6 +464,10 @@ private void ApplyGradation(List<UIVertex> verts, Rect rect, Matrix4x4 m)
462464
case GradationMode.RadialDetail:
463465
GradientUtil.DoRadialGradient(verts, a, b, offset, scale, rect, m, 12);
464466
break;
467+
case GradationMode.Angle:
468+
m = Matrix4x4.Rotate(Quaternion.Euler(0, 0, rot)) * m;
469+
GradientUtil.DoHorizontalGradient(verts, a, b, offset, scale, rect, m);
470+
break;
465471
case GradationMode.HorizontalGradient:
466472
{
467473
if (_keyTimes == null)
@@ -503,6 +509,30 @@ private void ApplyGradation(List<UIVertex> verts, Rect rect, Matrix4x4 m)
503509
{
504510
GradientUtil.DoVerticalGradient(verts, grad, offset, scale, rect, m);
505511
}
512+
513+
break;
514+
}
515+
case GradationMode.AngleGradient:
516+
{
517+
if (_keyTimes == null)
518+
{
519+
_keyTimes = InternalListPool<float>.Rent();
520+
GradientUtil.GetKeyTimes(grad, _keyTimes);
521+
}
522+
523+
m = Matrix4x4.Rotate(Quaternion.Euler(0, 0, rot)) * m;
524+
if (allowToModifyMeshShape)
525+
{
526+
var splitTimes = InternalListPool<float>.Rent();
527+
GradientUtil.SplitKeyTimes(_keyTimes, splitTimes, offset, scale);
528+
GradientUtil.DoAngleGradient(verts, grad, splitTimes, offset, scale, rect, m);
529+
InternalListPool<float>.Return(ref splitTimes);
530+
}
531+
else
532+
{
533+
GradientUtil.DoHorizontalGradient(verts, grad, offset, scale, rect, m);
534+
}
535+
506536
break;
507537
}
508538
}

Packages/src/Runtime/UIEffectTweener.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ public enum CullingMask
1616
Color = 1 << 1,
1717
Sampling = 1 << 2,
1818
Transition = 1 << 3,
19-
Gradiation = 1 << 5
19+
GradiationOffset = 1 << 5,
20+
GradiationRotation = 1 << 6
2021
}
2122

2223
public enum UpdateMode

Packages/src/Runtime/Utilities/GradientUtil.cs

+11-4
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public static void DoHorizontalGradient(List<UIVertex> verts, Gradient gradient,
2727
UIVertexUtil.GetQuad(verts, i, out var lb, out var lt, out var rt, out var rb);
2828
if (i + 5 < count)
2929
{
30-
UIVertexUtil.SplitHorizontal(verts, splitTimes, lb, lt, ref rb, ref rt, rect, m);
30+
UIVertexUtil.SplitHorizontalFast(verts, splitTimes, lb, lt, ref rb, ref rt, rect, m);
3131
}
3232

3333
lb.color *= Evaluate(gradient, rect, m.MultiplyPoint3x4(lb.position).x + 0.0005f, offset, scale);
@@ -51,7 +51,7 @@ public static void DoHorizontalGradient(List<UIVertex> verts, Gradient gradient,
5151
Rect rect, Matrix4x4 m)
5252
{
5353
var count = verts.Count;
54-
for (var i = 0; i < count; i ++)
54+
for (var i = 0; i < count; i++)
5555
{
5656
var vt = verts[i];
5757
vt.color *= Evaluate(gradient, rect, m.MultiplyPoint3x4(vt.position).x, offset, scale);
@@ -90,7 +90,7 @@ public static void DoVerticalGradient(List<UIVertex> verts, Gradient gradient, L
9090
UIVertexUtil.GetQuad(verts, i, out var lb, out var lt, out var rt, out var rb);
9191
if (i + 5 < count)
9292
{
93-
UIVertexUtil.SplitVertical(verts, splitTimes, lb, ref lt, rb, ref rt, rect, m);
93+
UIVertexUtil.SplitVerticalFast(verts, splitTimes, lb, ref lt, rb, ref rt, rect, m);
9494
}
9595

9696
lb.color *= Evaluate(gradient, rect, m.MultiplyPoint3x4(lb.position).y + 0.0005f, offset, scale);
@@ -114,7 +114,7 @@ public static void DoVerticalGradient(List<UIVertex> verts, Gradient gradient, f
114114
Rect rect, Matrix4x4 m)
115115
{
116116
var count = verts.Count;
117-
for (var i = 0; i < count; i ++)
117+
for (var i = 0; i < count; i++)
118118
{
119119
var vt = verts[i];
120120
vt.color *= Evaluate(gradient, rect, m.MultiplyPoint3x4(vt.position).y, offset, scale);
@@ -215,6 +215,13 @@ static Color DoGradient(UIVertex vt, Color a, Color b, Rect rect, Matrix4x4 m, f
215215
}
216216
}
217217

218+
public static void DoAngleGradient(List<UIVertex> verts, Gradient gradient, List<float> splitTimes,
219+
float offset, float scale, Rect rect, Matrix4x4 m)
220+
{
221+
UIVertexUtil.SplitAngle(verts, splitTimes, rect, m);
222+
DoHorizontalGradient(verts, gradient, offset, scale, rect, m);
223+
}
224+
218225
public static void GetKeyTimes(Gradient gradient, List<float> results)
219226
{
220227
results.Clear();

0 commit comments

Comments
 (0)