From 0de31f630f0758d6f240eba6d0726dc53bbae4da Mon Sep 17 00:00:00 2001 From: Nils Hausfeld Date: Sun, 24 Sep 2023 18:40:34 +0200 Subject: [PATCH] - Moved control point calculation into its own function since multiple parts of the code depend on it - 'DrawConnection' function now calls the control point calculation function - 'IntersectsConnection' function now calls the control point calculation function --- Source/Editor/Surface/Elements/OutputBox.cs | 38 +++++++++++---------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/Source/Editor/Surface/Elements/OutputBox.cs b/Source/Editor/Surface/Elements/OutputBox.cs index 2a2b87486..cf78b559c 100644 --- a/Source/Editor/Surface/Elements/OutputBox.cs +++ b/Source/Editor/Surface/Elements/OutputBox.cs @@ -33,19 +33,8 @@ namespace FlaxEditor.Surface.Elements /// The connection thickness. public static void DrawConnection(ref Float2 start, ref Float2 end, ref Color color, float thickness = 1) { - // Control points parameters - const float minControlLength = 100f; - const float maxControlLength = 150f; - var dst = (end - start).Length; - var yDst = Mathf.Abs(start.Y - end.Y); - // Calculate control points - var minControlDst = dst * 0.5f; - var maxControlDst = Mathf.Max(Mathf.Min(maxControlLength, dst), minControlLength); - var controlDst = Mathf.Lerp(minControlDst, maxControlDst, Mathf.Clamp(yDst / minControlLength, 0f, 1f)); - - var control1 = new Float2(start.X + controlDst, start.Y); - var control2 = new Float2(end.X - controlDst, end.Y); + CalculateBezierControlPoints(start, end, out var control1, out var control2); // Draw line Render2D.DrawBezier(start, control1, control2, end, color, thickness); @@ -58,6 +47,23 @@ namespace FlaxEditor.Surface.Elements */ } + private static void CalculateBezierControlPoints(Float2 start, Float2 end, out Float2 control1, out Float2 control2) + { + // Control points parameters + const float minControlLength = 100f; + const float maxControlLength = 150f; + var dst = (end - start).Length; + var yDst = Mathf.Abs(start.Y - end.Y); + + // Calculate control points + var minControlDst = dst * 0.5f; + var maxControlDst = Mathf.Max(Mathf.Min(maxControlLength, dst), minControlLength); + var controlDst = Mathf.Lerp(minControlDst, maxControlDst, Mathf.Clamp(yDst / minControlLength, 0f, 1f)); + + control1 = new Float2(start.X + controlDst, start.Y); + control2 = new Float2(end.X - controlDst, end.Y); + } + /// /// Checks if a point intersects a connection /// @@ -84,13 +90,9 @@ namespace FlaxEditor.Surface.Elements float offset = Mathf.Sign(end.Y - start.Y) * distance; if ((point.Y - (start.Y - offset)) * ((end.Y + offset) - point.Y) < 0) return false; - - // Taken from the Render2D.DrawBezier code + float squaredDistance = distance; - - var dst = (end - start) * new Float2(0.5f, 0.05f); - var control1 = new Float2(start.X + dst.X, start.Y + dst.Y); - var control2 = new Float2(end.X - dst.X, end.Y + dst.Y); + CalculateBezierControlPoints(start, end, out var control1, out var control2); var d1 = control1 - start; var d2 = control2 - control1;