diff --git a/Scripts/Editor/NodeEditorAction.cs b/Scripts/Editor/NodeEditorAction.cs index f3e3558..792631a 100644 --- a/Scripts/Editor/NodeEditorAction.cs +++ b/Scripts/Editor/NodeEditorAction.cs @@ -428,19 +428,19 @@ namespace XNodeEditor { public void DrawDraggedConnection() { if (IsDraggingPort) { Color col = NodeEditorPreferences.GetTypeColor(draggedOutput.ValueType); + col.a = draggedOutputTarget != null ? 1.0f : 0.6f; Rect fromRect; if (!_portConnectionPoints.TryGetValue(draggedOutput, out fromRect)) return; - Vector2 from = fromRect.center; - col.a = draggedOutputTarget != null ? 1.0f : 0.6f; - Vector2 to = Vector2.zero; + List gridPoints = new List(); + gridPoints.Add(fromRect.center); for (int i = 0; i < draggedOutputReroutes.Count; i++) { - to = draggedOutputReroutes[i]; - DrawNoodle(from, i == 0 ? draggedOutput : null, to, null, col); - from = to; + gridPoints.Add(draggedOutputReroutes[i]); } - to = draggedOutputTarget != null ? portConnectionPoints[draggedOutputTarget].center : WindowToGridPosition(Event.current.mousePosition); - DrawNoodle(from, draggedOutputReroutes.Any() ? null : draggedOutput, to, draggedOutputTarget, col); + if (draggedOutputTarget != null) gridPoints.Add(portConnectionPoints[draggedOutputTarget].center); + else gridPoints.Add(WindowToGridPosition(Event.current.mousePosition)); + + DrawNoodle(col, gridPoints); Color bgcol = Color.black; Color frcol = col; diff --git a/Scripts/Editor/NodeEditorGUI.cs b/Scripts/Editor/NodeEditorGUI.cs index 279daf1..c773571 100644 --- a/Scripts/Editor/NodeEditorGUI.cs +++ b/Scripts/Editor/NodeEditorGUI.cs @@ -114,57 +114,70 @@ namespace XNodeEditor { if (NodeEditorPreferences.GetSettings().autoSave) AssetDatabase.SaveAssets(); } - /// Draw a bezier from startpoint to endpoint, both in grid coordinates - public void DrawNoodle(Vector2 startPoint, XNode.NodePort startPort, Vector2 endPoint, XNode.NodePort endPort, Color col) { - startPoint = GridToWindowPosition(startPoint); - endPoint = GridToWindowPosition(endPoint); - + /// Draw a bezier from output to input in grid coordinates + public void DrawNoodle(Color col, List gridPoints) { + Vector2[] windowPoints = gridPoints.Select(x => GridToWindowPosition(x)).ToArray(); + Handles.color = col; + int length = gridPoints.Count; switch (NodeEditorPreferences.GetSettings().noodleType) { case NodeEditorPreferences.NoodleType.Curve: - float minTangent = Vector2.Distance(endPoint, startPoint)*0.5f; + Vector2 outputTangent = Vector2.right; + for (int i = 0; i < length - 1; i++) { + Vector2 inputTangent = Vector2.left; - Vector2 startTangent = Vector2.zero; - startTangent.x = (endPoint.x - startPoint.x) * 0.7f; - startTangent.x = Mathf.Sign(startTangent.x) * Mathf.Max(Mathf.Abs(startTangent.x), minTangent); - if (startPort != null) startTangent.x = Mathf.Abs(startTangent.x); + if (i == 0) outputTangent = Vector2.right * Vector2.Distance(windowPoints[i], windowPoints[i + 1]) * 0.01f * zoom; + if (i < length - 2) { + Vector2 ab = (windowPoints[i + 1] - windowPoints[i]).normalized; + Vector2 cb = (windowPoints[i + 1] - windowPoints[i + 2]).normalized; + Vector2 ac = (windowPoints[i + 2] - windowPoints[i]).normalized; + Vector2 p = (ab + cb) * 0.5f; + float tangentLength = (Vector2.Distance(windowPoints[i], windowPoints[i + 1]) + Vector2.Distance(windowPoints[i + 1], windowPoints[i + 2])) * 0.005f * zoom; + float side = ((ac.x * (windowPoints[i + 1].y - windowPoints[i].y)) - (ac.y * (windowPoints[i + 1].x - windowPoints[i].x))); - Vector2 endTangent = Vector2.zero; - endTangent.x = (startPoint.x - endPoint.x) * 0.7f; - endTangent.x = Mathf.Sign(endTangent.x) * Mathf.Max(Mathf.Abs(endTangent.x), minTangent); - if (endPort != null) endTangent.x = -Mathf.Abs(endTangent.x); + p = new Vector2(-p.y, p.x) * Mathf.Sign(side) * tangentLength; + inputTangent = p; + } + else { + inputTangent = Vector2.left * Vector2.Distance(windowPoints[i], windowPoints[i + 1]) * 0.01f * zoom; + } - Handles.DrawBezier(startPoint, endPoint, startPoint + startTangent, endPoint + endTangent, col, null, 4); + Handles.DrawBezier(windowPoints[i], windowPoints[i + 1], windowPoints[i] + ((outputTangent * 50) / zoom), windowPoints[i + 1] + ((inputTangent * 50) / zoom), col, null, 4); + outputTangent = -inputTangent; + } break; case NodeEditorPreferences.NoodleType.Line: - Handles.color = col; - Handles.DrawAAPolyLine(5, startPoint, endPoint); + for (int i = 0; i < length - 1; i++) { + Handles.DrawAAPolyLine(5, windowPoints[i], windowPoints[i + 1]); + } break; case NodeEditorPreferences.NoodleType.Angled: - Handles.color = col; - if (startPoint.x <= endPoint.x - (50 / zoom)) { - float midpoint = (startPoint.x + endPoint.x) * 0.5f; - Vector2 start_1 = startPoint; - Vector2 end_1 = endPoint; - start_1.x = midpoint; - end_1.x = midpoint; - Handles.DrawAAPolyLine(5, startPoint, start_1); - Handles.DrawAAPolyLine(5, start_1, end_1); - Handles.DrawAAPolyLine(5, end_1, endPoint); - } else { - float midpoint = (startPoint.y + endPoint.y) * 0.5f; - Vector2 start_1 = startPoint; - Vector2 end_1 = endPoint; - start_1.x += 25 / zoom; - end_1.x -= 25 / zoom; - Vector2 start_2 = start_1; - Vector2 end_2 = end_1; - start_2.y = midpoint; - end_2.y = midpoint; - Handles.DrawAAPolyLine(5, startPoint, start_1); - Handles.DrawAAPolyLine(5, start_1, start_2); - Handles.DrawAAPolyLine(5, start_2, end_2); - Handles.DrawAAPolyLine(5, end_2, end_1); - Handles.DrawAAPolyLine(5, end_1, endPoint); + for (int i = 0; i < length - 1; i++) { + if (i == length - 1) continue; // Skip last index + if (windowPoints[i].x <= windowPoints[i + 1].x - (50 / zoom)) { + float midpoint = (windowPoints[i].x + windowPoints[i + 1].x) * 0.5f; + Vector2 start_1 = windowPoints[i]; + Vector2 end_1 = windowPoints[i + 1]; + start_1.x = midpoint; + end_1.x = midpoint; + Handles.DrawAAPolyLine(5, windowPoints[i], start_1); + Handles.DrawAAPolyLine(5, start_1, end_1); + Handles.DrawAAPolyLine(5, end_1, windowPoints[i + 1]); + } else { + float midpoint = (windowPoints[i].y + windowPoints[i + 1].y) * 0.5f; + Vector2 start_1 = windowPoints[i]; + Vector2 end_1 = windowPoints[i + 1]; + start_1.x += 25 / zoom; + end_1.x -= 25 / zoom; + Vector2 start_2 = start_1; + Vector2 end_2 = end_1; + start_2.y = midpoint; + end_2.y = midpoint; + Handles.DrawAAPolyLine(5, windowPoints[i], start_1); + Handles.DrawAAPolyLine(5, start_1, start_2); + Handles.DrawAAPolyLine(5, start_2, end_2); + Handles.DrawAAPolyLine(5, end_2, end_1); + Handles.DrawAAPolyLine(5, end_1, windowPoints[i + 1]); + } } break; } @@ -198,18 +211,13 @@ namespace XNodeEditor { Rect toRect; if (!_portConnectionPoints.TryGetValue(input, out toRect)) continue; - Vector2 from = fromRect.center; - Vector2 to = Vector2.zero; List reroutePoints = output.GetReroutePoints(k); - // Loop through reroute points and draw the path - for (int i = 0; i < reroutePoints.Count; i++) { - to = reroutePoints[i]; - DrawNoodle(from, i == 0 ? output : null, to, null, connectionColor); - from = to; - } - to = toRect.center; - DrawNoodle(from, reroutePoints.Any() ? null : output, to, input, connectionColor); + List gridPoints = new List(); + gridPoints.Add(fromRect.center); + gridPoints.AddRange(reroutePoints); + gridPoints.Add(toRect.center); + DrawNoodle(connectionColor, gridPoints); // Loop through reroute points again and draw the points for (int i = 0; i < reroutePoints.Count; i++) {