Skip to content

Commit dca4896

Browse files
committed
draft ControlPointViewer
1 parent 3d950a4 commit dca4896

File tree

7 files changed

+134
-94
lines changed

7 files changed

+134
-94
lines changed

Code/Editor/Window/NodeBased/GraphMap.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ private void HandleNodeEvents(Event e)
330330
needLockEvent |= _nodeViewers[i].HandleBaseEventsOutOfPointer(e);
331331
}
332332

333-
_nodeViewers[i].HandleBaseEventsAnyway(e);
333+
_nodeViewers[i].HandleBaseEvents(e);
334334
}
335335

336336
if (needLockEvent)
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using OlegHcp;
2+
using OlegHcp.Mathematics;
3+
using UnityEditor;
4+
using UnityEngine;
5+
6+
namespace OlegHcpEditor.Window.NodeBased.NodeDrawing
7+
{
8+
internal class ControlPointViewer
9+
{
10+
private bool _controlPressed;
11+
private TransitionViewer _transitionViewer;
12+
private Vector3[] _trianglePoints = new Vector3[4];
13+
14+
public ControlPointViewer(TransitionViewer transitionViewer)
15+
{
16+
_transitionViewer = transitionViewer;
17+
}
18+
19+
public void DrawSquare(in Vector2 position, in Color color)
20+
{
21+
Handles.color = color;
22+
if (Handles.Button(position, Quaternion.identity, 4f, 8f, Handles.DotHandleCap))
23+
ButtonAction();
24+
Handles.color = Colours.White;
25+
}
26+
27+
public void DrawTriangle(in Vector2 position, in Quaternion rotation, in Color color)
28+
{
29+
Handles.color = color;
30+
if (Handles.Button(position, rotation, 6f, 8f, TriangleHandleCap))
31+
ButtonAction();
32+
Handles.color = Colours.White;
33+
}
34+
35+
public bool HandleEvents(Event e)
36+
{
37+
_controlPressed = e.control;
38+
39+
return false;
40+
}
41+
42+
private void ButtonAction()
43+
{
44+
if (Event.current.button != 0)
45+
return;
46+
47+
if (_controlPressed)
48+
_transitionViewer.Delete();
49+
else
50+
_transitionViewer.ShowInfoWindow();
51+
}
52+
53+
private void TriangleHandleCap(int controlID, Vector3 position, Quaternion rotation, float size, EventType eventType)
54+
{
55+
switch (eventType)
56+
{
57+
case EventType.MouseMove:
58+
case EventType.Layout:
59+
HandleUtility.AddControl(controlID, HandleUtility.DistanceToRectangle(position, rotation, size));
60+
break;
61+
62+
case EventType.Repaint:
63+
Vector2 pos = position;
64+
float angle = rotation.eulerAngles.z + 90f;
65+
66+
Vector2 vector0 = MathUtility.AngleToVector2(angle) * size;
67+
Vector2 vector1 = MathUtility.AngleToVector2(angle + 120f) * size;
68+
Vector2 vector2 = MathUtility.AngleToVector2(angle - 120f) * size;
69+
Vector2 lookVector = pos + vector0;
70+
71+
_trianglePoints[0] = pos + vector1;
72+
_trianglePoints[1] = lookVector;
73+
_trianglePoints[2] = lookVector;
74+
_trianglePoints[3] = pos + vector2;
75+
76+
Handles.DrawSolidRectangleWithOutline(_trianglePoints, Colours.White, default);
77+
break;
78+
}
79+
}
80+
}
81+
}

Code/Editor/Window/NodeBased/NodeDrawing/ControlPointViewer.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Code/Editor/Window/NodeBased/NodeDrawing/NodeViewer.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ internal class NodeViewer : IComparable<NodeViewer>
2424
private readonly PortViewer _out;
2525
private readonly GraphMap _map;
2626
private readonly GraphEditorWindow _window;
27-
private readonly List<TransitionViewer> _transitionViewers;
27+
private readonly List<TransitionViewer> _lineViewers;
2828

2929
private NodeDrawer _nodeDrawer;
3030
private SerializedProperty _nodeProp;
@@ -55,7 +55,7 @@ internal class NodeViewer : IComparable<NodeViewer>
5555
public NodeType Type => _type;
5656
public Type SystemType => _systemType;
5757

58-
public IReadOnlyList<TransitionViewer> TransitionViewers => _transitionViewers;
58+
public IReadOnlyList<TransitionViewer> LineViewers => _lineViewers;
5959
public SerializedProperty NodeProp => _nodeProp;
6060
public SerializedProperty NameProp => _nameProp;
6161
public NodeDrawer NodeDrawer => _nodeDrawer;
@@ -138,7 +138,7 @@ public NodeViewer(SerializedProperty nodeProp, GraphMap map, GraphEditorWindow w
138138
_systemType = EditorUtilityExt.GetTypeFromSerializedPropertyTypename(nodeProp.managedReferenceFullTypename);
139139
_type = GraphUtility.GetNodeType(_systemType);
140140
_position = nodeProp.FindPropertyRelative(RawNode.PositionFieldName).vector2Value;
141-
_transitionViewers = new List<TransitionViewer>();
141+
_lineViewers = new List<TransitionViewer>();
142142
_in = new PortViewer(this, PortType.In, _map);
143143
_out = new PortViewer(this, PortType.Out, _map);
144144
_nodeDrawer = _map.GetNodeDrawer(_systemType);
@@ -156,7 +156,7 @@ public void CreateConnections()
156156
{
157157
int nextNodeId = transitionProp.FindPropertyRelative(Transition.NodeIdFieldName).intValue;
158158
NodeViewer connectedNodeViewer = _map.NodeViewers.First(itm => itm.Id == nextNodeId);
159-
_transitionViewers.Add(new TransitionViewer(_out, connectedNodeViewer.In, _window));
159+
_lineViewers.Add(new TransitionViewer(_out, connectedNodeViewer.In, _window));
160160
}
161161
}
162162

@@ -167,7 +167,7 @@ public void Select(bool on)
167167

168168
public void CreateTransition(PortViewer destination)
169169
{
170-
if (_transitionViewers.Any(item => item.Destination.Node.Id == destination.Node.Id))
170+
if (_lineViewers.Any(item => item.Destination.Node.Id == destination.Node.Id))
171171
return;
172172

173173
SerializedProperty transitionsProperty = _nodeProp.FindPropertyRelative(RawNode.ArrayFieldName);
@@ -177,19 +177,19 @@ public void CreateTransition(PortViewer destination)
177177
newItem.FindPropertyRelative(Transition.ConditionFieldName).managedReferenceValue = null;
178178
newItem.FindPropertyRelative(Transition.PointsFieldName).ClearArray();
179179

180-
_transitionViewers.Add(new TransitionViewer(_out, destination, _window));
180+
_lineViewers.Add(new TransitionViewer(_out, destination, _window));
181181
}
182182

183183
public void RemoveTransition(NodeViewer nextNodeViewer)
184184
{
185-
TransitionViewer transition = _transitionViewers.Find(item => item.Destination.Node == nextNodeViewer);
185+
TransitionViewer transition = _lineViewers.Find(item => item.Destination.Node == nextNodeViewer);
186186
if (transition != null)
187187
RemoveTransition(transition);
188188
}
189189

190190
public void RemoveTransition(TransitionViewer transition)
191191
{
192-
_transitionViewers.Remove(transition);
192+
_lineViewers.Remove(transition);
193193
NodeViewer next = transition.Destination.Node;
194194

195195
SerializedProperty transitionsProperty = _nodeProp.FindPropertyRelative(RawNode.ArrayFieldName);
@@ -231,16 +231,16 @@ public void DrawTransitions()
231231
{
232232
if (_window.ShowPorts)
233233
{
234-
for (int i = 0; i < _transitionViewers.Count; i++)
234+
for (int i = 0; i < _lineViewers.Count; i++)
235235
{
236-
_transitionViewers[i].DrawSpline();
236+
_lineViewers[i].DrawSpline();
237237
}
238238
}
239239
else
240240
{
241-
for (int i = 0; i < _transitionViewers.Count; i++)
241+
for (int i = 0; i < _lineViewers.Count; i++)
242242
{
243-
_transitionViewers[i].DrawArrow();
243+
_lineViewers[i].DrawArrow();
244244
}
245245
}
246246
}
@@ -334,7 +334,7 @@ public bool HandleBaseEventsOutOfPointer(Event e)
334334
return needLock;
335335
}
336336

337-
public void HandleBaseEventsAnyway(Event e)
337+
public void HandleBaseEvents(Event e)
338338
{
339339
if (e.type == EventType.KeyDown)
340340
{
@@ -365,9 +365,9 @@ public bool HandleLineEvents(Event e)
365365

366366
if (IsInCamera)
367367
{
368-
for (int i = 0; i < _transitionViewers.Count; i++)
368+
for (int i = 0; i < _lineViewers.Count; i++)
369369
{
370-
if (_transitionViewers[i].HandleEvents(e))
370+
if (_lineViewers[i].HandleEvents(e, _window.ShowPorts))
371371
needLock = true;
372372
}
373373
}
@@ -379,7 +379,7 @@ public void Save()
379379
{
380380
SerializedProperty positionProperty = _nodeProp.FindPropertyRelative(RawNode.PositionFieldName);
381381
positionProperty.vector2Value = _position;
382-
_transitionViewers.ForEach(item => item.Save());
382+
_lineViewers.ForEach(item => item.Save());
383383
}
384384

385385
public int CompareTo(NodeViewer other)

Code/Editor/Window/NodeBased/NodeDrawing/PointViewer.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public PointViewer(Vector2 position, TransitionViewer transitionViewer, GraphEdi
2828
public void Draw(in Color color)
2929
{
3030
Handles.color = color;
31-
Handles.DrawSolidDisc(_window.Camera.WorldToScreen(Position), Vector3.back, VIEW_RADIUS);
31+
Handles.DrawSolidDisc(_window.Camera.WorldToScreen(_position), Vector3.back, VIEW_RADIUS);
3232
Handles.color = Colours.White;
3333
}
3434

@@ -40,7 +40,7 @@ public bool HandleEvents(Event e)
4040
{
4141
case EventType.MouseDown:
4242
Vector2 rectSize = new Vector2(PICK_SIZE, PICK_SIZE);
43-
Vector2 rectPos = _window.Camera.WorldToScreen(Position) - rectSize * 0.5f;
43+
Vector2 rectPos = _window.Camera.WorldToScreen(_position) - rectSize * 0.5f;
4444
Rect pointRect = new Rect(rectPos, rectSize);
4545

4646
if (e.button == 0)
@@ -49,13 +49,13 @@ public bool HandleEvents(Event e)
4949
{
5050
if (e.control)
5151
{
52-
_draggedPosition = Position;
52+
_draggedPosition = _position;
5353
_isDragged = e.control;
5454
needLock = true;
5555
}
5656
else
5757
{
58-
_transitionViewer.ShowTransitionInfoWindow();
58+
_transitionViewer.ShowInfoWindow();
5959
}
6060
}
6161
else

0 commit comments

Comments
 (0)