Skip to content

Commit 5f94c2a

Browse files
authored
Added circuit/metro style (diagonal) connections (contributed by williamchange)
Add circuit/metro style connections(diagonal)
2 parents c6ae583 + eb1b0d1 commit 5f94c2a

3 files changed

Lines changed: 171 additions & 150 deletions

File tree

material_maker/panels/graph_edit/graph_edit.gd

Lines changed: 126 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -468,10 +468,10 @@ func do_disconnect_node(from : String, from_slot : int, to : String, to_slot : i
468468
return true
469469
return false
470470

471-
func on_cut_connections(connections_to_cut : Array):
471+
func on_cut_connections(connections_to_be_cut : Array):
472472
var generator_hier_name : String = generator.get_hier_name()
473473
var conns : Array = []
474-
for c in connections_to_cut:
474+
for c in connections_to_be_cut:
475475
var from_gen = get_node(str(c.from_node)).generator
476476
var to_gen = get_node(str(c.to_node)).generator
477477
if do_disconnect_node(c.from_node, c.from_port, c.to_node, c.to_port):
@@ -1631,150 +1631,185 @@ func add_reroute_to_output(node : MMGraphNodeMinimal, port_index : int) -> void:
16311631
var next = generator.serialize()
16321632
undoredo_create_step("Reroute output", generator.get_hier_name(), prev, next)
16331633

1634-
func _get_connection_line(from: Vector2, to: Vector2) -> PackedVector2Array:
1635-
var off : float = 15.0 * connection_lines_curvature * 0.5 * zoom
1636-
var points : PackedVector2Array = PackedVector2Array()
1634+
func _get_connection_line(from : Vector2, to : Vector2) -> PackedVector2Array:
1635+
var off := 15.0 * connection_lines_curvature * 0.5 * zoom
1636+
var points := PackedVector2Array()
1637+
var mid := (from + to) * 0.5
16371638
match connection_line_style:
16381639
ConnectionStyle.DIRECT:
1639-
return PackedVector2Array([from,to])
1640+
if to.x > from.x:
1641+
off += (to.x - from.x) * 0.1
1642+
var ma := Vector2(maxf(mid.x, from.x + off), mid.y)
1643+
var mb := Vector2(minf(mid.x, to.x - off), mid.y)
1644+
var f1 := Vector2(from.x + off, from.y)
1645+
var t1 := Vector2(to.x - off, to.y)
1646+
points.append_array([from, f1, (f1 + ma) * 0.5, (t1 + mb) * 0.5, t1, to])
1647+
return points
16401648

16411649
ConnectionStyle.BEZIER:
16421650
# default behavior, adapted from:
16431651
# github.com/godotengine/godot/blob/4.4/scene/gui/graph_edit.cpp#L1282
1644-
var x_diff = to.x - from.x
1645-
var cp_offset = x_diff * connection_lines_curvature
1652+
var x_diff := to.x - from.x
1653+
var cp_offset := x_diff * connection_lines_curvature
16461654
if x_diff < 0:
16471655
cp_offset *= -1
16481656

1649-
var curve : Curve2D = Curve2D.new()
1657+
var curve := Curve2D.new()
16501658
curve.add_point(from)
16511659
curve.set_point_out(0, Vector2(cp_offset, 0))
16521660
curve.add_point(to)
16531661
curve.set_point_in(1, Vector2(-cp_offset, 0))
1654-
1655-
if connection_lines_curvature > 0:
1662+
1663+
if connection_lines_curvature > 0.0:
16561664
return curve.tessellate(5, 2.0)
16571665
else:
16581666
return curve.tessellate(1)
16591667

16601668
ConnectionStyle.MANHATTAN:
16611669
if abs(from.x - to.x) < 0.5 or abs(from.y - to.y) < 0.5:
1662-
return PackedVector2Array([from,to])
1663-
var mid : Vector2 = (from + to) / 2.0
1664-
var ma : Vector2 = Vector2(max(mid.x, from.x + off), mid.y)
1665-
var mb : Vector2 = Vector2(min(mid.x, to.x - off), mid.y)
1666-
var f1 : Vector2 = Vector2(max(mid.x, from.x + off), from.y)
1667-
var t1 : Vector2 = Vector2(mb.x, to.y)
1668-
1669-
points.append(from)
1670-
points.append(f1)
1671-
points.append(ma)
1672-
points.append(mb)
1673-
points.append(t1)
1674-
points.append(to)
1670+
return PackedVector2Array([from, to])
1671+
var ma := Vector2(maxf(mid.x, from.x + off), mid.y)
1672+
var mb := Vector2(minf(mid.x, to.x - off), mid.y)
1673+
var f1 := Vector2(maxf(mid.x, from.x + off), from.y)
1674+
var t1 := Vector2(mb.x, to.y)
1675+
points.append_array([from, f1, ma, mb, t1, to])
16751676
return points
16761677

16771678
ConnectionStyle.ROUNDED:
16781679
if abs(from.x - to.x) < 0.5 or abs(from.y - to.y) < 0.5:
16791680
return PackedVector2Array([from,to])
1680-
var mid : Vector2 = (from + to) / 2.0
1681-
var mb : Vector2 = mid
1681+
var mb := mid
16821682
points.append(from)
16831683

1684-
const pts : float = 12.0 # corner arc resolution
1685-
var max_radius : float = 75.0 # max. arc radius when from < to
1686-
var inv_max_radius : float = 25.0 # max. arc radius when from > to
1684+
const pts := 12.0 # corner arc resolution
1685+
var max_radius := 75.0 # max. arc radius when from < to
1686+
var inv_max_radius := 25.0 # max. arc radius when from > to
16871687

1688-
var round_fac : float = clamp(connection_lines_curvature * 0.5, 0.0, 1.0)
1689-
max_radius = max(max_radius * round_fac, 4.0)
1690-
inv_max_radius = max(inv_max_radius * round_fac , 2.0)
1688+
var round_fac := clampf(connection_lines_curvature * 0.5, 0.0, 1.0)
1689+
max_radius = maxf(max_radius * round_fac, 4.0)
1690+
inv_max_radius = maxf(inv_max_radius * round_fac , 2.0)
1691+
1692+
var r := minf(minf(absf(to.y - from.y) * 0.25,
1693+
absf(from.x - to.x) * 0.25), max_radius)
16911694

1692-
var r : float = min(min(abs(to.y - from.y) * 0.25,
1693-
abs(from.x - to.x) * 0.25), max_radius)
1694-
16951695
if from.x < to.x:
16961696
for i : float in range(pts):
1697-
var x : float = lerp(mid.x - r, mid.x, i/pts)
1698-
var y : float = lerp(from.y, from.y + r * sign(to.y - from.y), i/pts)
1699-
points.append(lerp(Vector2(x, from.y), Vector2(mid.x, y), i/pts))
1697+
var x := lerpf(mid.x - r, mid.x, i/pts)
1698+
var y := lerpf(from.y, from.y + r * signf(to.y - from.y), i/pts)
1699+
points.append(Vector2(x, from.y).lerp(Vector2(mid.x, y), i/pts))
17001700

17011701
for i : float in range(pts):
1702-
var x : float = lerp(mid.x, mid.x + r, i/pts)
1703-
var y : float = lerp(to.y + r * sign(from.y - to.y), to.y, i/pts)
1704-
points.append(lerp(Vector2(mid.x, y),Vector2(x , to.y), i/pts))
1702+
var x := lerpf(mid.x, mid.x + r, i/pts)
1703+
var y := lerpf(to.y + r * sign(from.y - to.y), to.y, i/pts)
1704+
points.append(Vector2(mid.x, y).lerp(Vector2(x , to.y), i/pts))
17051705
else:
1706-
r = min(r, inv_max_radius)
1706+
r = minf(r, inv_max_radius)
17071707
for i : float in range(pts):
1708-
var x : float = lerp(from.x, from.x + r, i/pts)
1709-
var y : float = lerp(from.y, from.y + r * sign(to.y - from.y), i/pts)
1710-
points.append(lerp(Vector2(x , from.y), Vector2(from.x + r, y), i/pts))
1708+
var x := lerpf(from.x, from.x + r, i/pts)
1709+
var y := lerpf(from.y, from.y + r * signf(to.y - from.y), i/pts)
1710+
points.append(Vector2(x , from.y).lerp(Vector2(from.x + r, y), i/pts))
17111711

1712-
var last : Vector2 = points[points.size() - 1]
1712+
var last := points[points.size() - 1]
17131713
mb.x = last.x
1714-
var voff : float = last.y + 0.01 * sign(mid.y - last.y)
1715-
mb.y = min(mid.y + r, voff) if from.y > to.y else max(mid.y - r, voff)
1714+
var voff := last.y + 0.01 * signf(mid.y - last.y)
1715+
mb.y = minf(mid.y + r, voff) if from.y > to.y else maxf(mid.y - r, voff)
17161716
points.append(mb)
17171717

17181718
if from.y < to.y:
1719-
var t1 : Vector2 = Vector2(points[points.size() - 1].x, mb.y)
1719+
var t1 := Vector2(points[points.size() - 1].x, mb.y)
17201720
for i : float in range(pts):
1721-
var x : float = lerp(t1.x, t1.x - r, i/pts)
1722-
var y : float = lerp(t1.y, t1.y + r, i/pts)
1723-
points.append(lerp(Vector2(t1.x, y),Vector2(x , t1.y + r), i/pts))
1721+
var x := lerpf(t1.x, t1.x - r, i/pts)
1722+
var y := lerpf(t1.y, t1.y + r, i/pts)
1723+
points.append(Vector2(t1.x, y).lerp(Vector2(x , t1.y + r), i/pts))
17241724

1725-
var t2 : Vector2 = Vector2(to.x, mb.y + r)
1726-
r = min(abs(t2.y - to.y) * 0.5, r)
1725+
var t2 := Vector2(to.x, mb.y + r)
1726+
r = minf(absf(t2.y - to.y) * 0.5, r)
17271727
for i : float in range(1, pts):
1728-
var x : float = lerp(t2.x, t2.x - r, i/pts)
1729-
var y : float = lerp(t2.y, t2.y + r, i/pts)
1730-
points.append(lerp(Vector2(x, t2.y),Vector2(t2.x - r, y), i/pts))
1731-
1732-
var t3 : Vector2 = Vector2(to.x - r, to.y - r)
1728+
var x := lerpf(t2.x, t2.x - r, i/pts)
1729+
var y := lerpf(t2.y, t2.y + r, i/pts)
1730+
points.append(Vector2(x, t2.y).lerp(Vector2(t2.x - r, y), i/pts))
17331731

1732+
var t3 := Vector2(to.x - r, to.y - r)
17341733
for i : float in range(pts):
1735-
var x : float = lerp(t3.x, t3.x + r, i/pts)
1736-
var y : float = lerp(t3.y, t3.y + r, i/pts)
1737-
points.append(lerp(Vector2(t3.x, y),Vector2(x , t3.y + r), i/pts))
1734+
var x := lerpf(t3.x, t3.x + r, i/pts)
1735+
var y := lerpf(t3.y, t3.y + r, i/pts)
1736+
points.append(Vector2(t3.x, y).lerp(Vector2(x , t3.y + r), i/pts))
17381737
else:
1739-
var t4 : Vector2 = points[points.size() - 1]
1738+
var t4 := points[points.size() - 1]
17401739

1741-
r = min(abs(t4.y - to.y) * 0.5, r)
1740+
r = minf(absf(t4.y - to.y) * 0.5, r)
17421741
for i : float in range(pts):
1743-
var x : float = lerp(t4.x, t4.x - r, i/pts)
1744-
var y : float = lerp(t4.y, t4.y - r, i/pts)
1745-
points.append(lerp(Vector2(t4.x, y),Vector2(x, t4.y - r),i/pts))
1746-
var t5 : Vector2 = Vector2(to.x, t4.y - r)
1742+
var x := lerpf(t4.x, t4.x - r, i/pts)
1743+
var y := lerpf(t4.y, t4.y - r, i/pts)
1744+
points.append(Vector2(t4.x, y).lerp(Vector2(x, t4.y - r),i/pts))
17471745

1748-
r = min(abs(t5.y - to.y) * 0.5, r)
1746+
var t5 := Vector2(to.x, t4.y - r)
1747+
r = minf(absf(t5.y - to.y) * 0.5, r)
17491748
for i : float in range(pts):
1750-
var x : float = lerp(t5.x, t5.x - r, i/pts)
1751-
var y : float = lerp(t5.y, t5.y - r, i/pts)
1752-
points.append(lerp(Vector2(x, t5.y),Vector2(t5.x - r ,y), i/pts))
1749+
var x := lerpf(t5.x, t5.x - r, i/pts)
1750+
var y := lerpf(t5.y, t5.y - r, i/pts)
1751+
points.append(Vector2(x, t5.y).lerp(Vector2(t5.x - r ,y), i/pts))
17531752

1754-
var t6 : Vector2 = Vector2(to.x - r, to.y + r)
1753+
var t6 := Vector2(to.x - r, to.y + r)
17551754
for i : float in range(pts):
1756-
var x : float = lerp(t6.x, t6.x + r, i/pts)
1757-
var y : float = lerp(t6.y, t6.y - r, i/pts)
1758-
points.append(lerp(Vector2(t6.x, y),Vector2(x , t6.y - r), i/pts))
1755+
var x := lerpf(t6.x, t6.x + r, i/pts)
1756+
var y := lerpf(t6.y, t6.y - r, i/pts)
1757+
points.append(Vector2(t6.x, y).lerp(Vector2(x , t6.y - r), i/pts))
17591758
points.append(to)
17601759
return points
17611760

17621761
ConnectionStyle.DIAGONAL:
1763-
if to.x > from.x:
1764-
off += (to.x-from.x) * 0.1
1765-
1766-
var mid : Vector2 = (from + to) / 2.0
1767-
var ma : Vector2 = Vector2(max(mid.x, from.x + off), mid.y)
1768-
var mb : Vector2 = Vector2(min(mid.x, to.x - off), mid.y)
1769-
var f1 : Vector2 = Vector2(from.x + off, from.y)
1770-
var t1 : Vector2 = Vector2(to.x - off, to.y)
1771-
1772-
points.append(from)
1773-
points.append(f1)
1774-
points.append((f1 + ma) * 0.5)
1775-
points.append((t1 + mb) * 0.5)
1776-
points.append(t1)
1777-
points.append(to)
1762+
var start := from
1763+
var end := to
1764+
from.x += off
1765+
to.x -= off
1766+
1767+
if abs(from.x - to.x) < 0.5:
1768+
return PackedVector2Array([start, from, to, end])
1769+
elif abs(from.y - to.y) < 0.5:
1770+
return PackedVector2Array([start, end])
1771+
1772+
var diff := mid - from
1773+
var from_a := mid - Vector2(diff.y, diff.y)
1774+
var mid_b := mid + Vector2(diff.x, diff.x)
1775+
var corner_from := Vector2(from.x, mid.y)
1776+
var corner_to := Vector2(to.x, mid.y)
1777+
1778+
var stack := (func(dir: float, diff_y: float) -> void:
1779+
var max_off := absf(diff_y) * 0.5
1780+
var h_offset = (corner_from.x - max_off) - (corner_to.x + max_off) >= 0.0
1781+
if not h_offset:
1782+
max_off = clampf(diff.x * 0.5, -diff.x, diff.y)
1783+
points.append(from)
1784+
points.append(Vector2(corner_from.x, corner_from.y - max_off * dir))
1785+
if h_offset:
1786+
points.append(Vector2(corner_from.x - max_off, corner_from.y))
1787+
points.append(Vector2(corner_to.x + max_off, corner_to.y))
1788+
points.append(Vector2(corner_to.x, corner_to.y + max_off * dir))
1789+
points.append(to))
1790+
1791+
points.append(start)
1792+
1793+
if from.y < to.y:
1794+
if from.x > to.x:
1795+
stack.call(1.0, diff.y)
1796+
else:
1797+
if from_a.x < from.x:
1798+
from_a = mid - Vector2(diff.x, diff.x)
1799+
else:
1800+
mid_b = mid + Vector2(diff.y, diff.y)
1801+
points.append_array([from, from_a, mid, mid_b, to])
1802+
elif from.y > to.y:
1803+
if from.x > to.x:
1804+
stack.call(-1.0, mid.y - to.y)
1805+
else:
1806+
from_a = mid + Vector2(diff.y, -diff.y)
1807+
mid_b = mid + Vector2(-diff.y, diff.y)
1808+
if from_a.x < from.x:
1809+
mid_b = mid + Vector2(diff.x, -diff.x)
1810+
from_a = mid - Vector2(diff.x, -diff.x)
1811+
points.append_array([from, from_a, mid, mid_b, to])
1812+
points.append(end)
17781813
return points
17791814
_:
17801815
return points

material_maker/panels/graph_edit/graph_edit.tscn

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ script = ExtResource("3")
9898
[connection signal="node_selected" from="." to="." method="_on_GraphEdit_node_selected"]
9999
[connection signal="paste_nodes_request" from="." to="." method="paste"]
100100
[connection signal="resized" from="." to="." method="_on_resized"]
101-
[connection signal="visibility_changed" from="." to="." method="_on_GraphEdit_visibility_changed"]
102101
[connection signal="timeout" from="Timer" to="." method="do_send_changed_signal"]
103102
[connection signal="text_changed" from="GraphUI/SubGraphUI/Label" to="." method="_on_Label_text_changed"]
104103
[connection signal="descriptions_changed" from="GraphUI/SubGraphUI/Description" to="." method="_on_Description_descriptions_changed"]

0 commit comments

Comments
 (0)