Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions export_presets.cfg

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions material_maker/nodes/base.gd
Original file line number Diff line number Diff line change
Expand Up @@ -516,6 +516,7 @@ func update_shader_generator(shader_model) -> void:
generator.set_shader_model(shader_model)
update_node()
get_parent().set_need_save()
get_parent().update_active_connections()
edit_generator_next_state = generator.get_parent().serialize().duplicate(true)

func update_sdf_generator(sdf_scene) -> void:
Expand Down
2 changes: 2 additions & 0 deletions material_maker/nodes/ios/ios.gd
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ func update_node() -> void:
add_child(add_button)
add_button.connect("pressed", Callable(generator, "add_port"))
set_slot(get_child_count()-1, false, 0, color, false, 0, color)
get_parent().update_active_connections()


func command(command_name : String, command_parameters : Array, update_node : bool = false):
var parent_generator = generator.get_parent().get_parent()
Expand Down
2 changes: 2 additions & 0 deletions material_maker/nodes/reroute/reroute.gd
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
extends MMGraphNodeMinimal

class_name MMGraphReroute

const PREVIEW_SIZES : Array[int] = [ 0, 64, 128, 192]

Expand Down Expand Up @@ -118,3 +119,4 @@ func set_preview(v : int):
theme_type_variation = "MM_ReroutePreview"
await get_tree().process_frame
size = Vector2(0, 0)
get_parent().update_active_connections(true)
1 change: 1 addition & 0 deletions material_maker/nodes/switch/switch.gd
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,4 @@ func update_node() -> void:
set_slot(i, has_input, 42, Color(1.0, 1.0, 1.0, 1.0), has_output, 42, Color(1.0, 1.0, 1.0, 1.0))
# Preview
restore_preview_widget()
get_parent().update_active_connections()
33 changes: 30 additions & 3 deletions material_maker/panels/graph_edit/graph_edit.gd
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ var undoredo_move_node_selection_changed : bool = true
enum ConnectionStyle {DIRECT, BEZIER, ROUNDED, MANHATTAN, DIAGONAL}
var connection_line_style : int = ConnectionStyle.BEZIER

var active_connections : Array[Dictionary]

@onready var drag_cut_cursor = preload("res://material_maker/icons/knife.png")
var connections_to_cut : Array[Dictionary]
var drag_cut_line : PackedVector2Array
Expand Down Expand Up @@ -141,6 +143,7 @@ func _gui_input(event) -> void:
if connections_to_cut.size():
on_cut_connections(connections_to_cut)
connections_to_cut.clear()
update_active_connections()
Input.set_custom_mouse_cursor(null)
drag_cut_line.clear()
conns.clear()
Expand Down Expand Up @@ -188,6 +191,7 @@ func _gui_input(event) -> void:
valid_drag_cut_entry = true
if event.shift_pressed:
add_reroute_under_mouse()
update_active_connections()

for c in get_children():
if ! c is GraphNode:
Expand Down Expand Up @@ -308,6 +312,7 @@ func _draw() -> void:
if lasso_points.size() > 1:
draw_polyline(lasso_points + PackedVector2Array([lasso_points[0]]),
get_theme_color("lasso_stroke", "GraphEdit"), 1.0)
$OutlineOverlay.queue_redraw()


# Misc. useful functions
Expand Down Expand Up @@ -434,6 +439,7 @@ func on_cut_connections(connections_to_cut : Array):
var from_gen = get_node(str(c.from_node)).generator
var to_gen = get_node(str(c.to_node)).generator
if do_disconnect_node(c.from_node, c.from_port, c.to_node, c.to_port):
remove_active_connection(c.from_node, c.from_port, c.to_node, c.to_port)
conns.append({from=from_gen.name,from_port=c.from_port, to=to_gen.name, to_port=c.to_port})
var undo_actions = [
{ type="add_to_graph", parent=generator_hier_name, generators=[], connections=conns }
Expand All @@ -443,7 +449,6 @@ func on_cut_connections(connections_to_cut : Array):
]
undoredo.add("Cut node connections", undo_actions, redo_actions)


func on_disconnect_node(from : String, from_slot : int, to : String, to_slot : int) -> void:
var from_gen = get_node(from).generator
var to_gen = get_node(to).generator
Expand All @@ -457,6 +462,7 @@ func on_disconnect_node(from : String, from_slot : int, to : String, to_slot : i
{ type="remove_connections", parent=generator_hier_name, connections=[connection] }
]
undoredo.add("Disconnect nodes", undo_actions, redo_actions)
remove_active_connection(from, from_slot, to, to_slot)

func on_connections_changed(removed_connections : Array, added_connections : Array) -> void:
for c in removed_connections:
Expand Down Expand Up @@ -930,6 +936,7 @@ func duplicate_selected() -> void:

func duplicate_selected_with_inputs() -> void:
do_paste(serialize_selection([], true))
update_active_connections(true)

func select_all() -> void:
for c in get_children():
Expand Down Expand Up @@ -1027,14 +1034,24 @@ func _on_ButtonTransmitsSeed_toggled(button_pressed) -> void:

var highlighting_connections : bool = false

func update_active_connections(should_hide_first : bool = false) -> void:
if should_hide_first:
$OutlineOverlay.hide()
await get_tree().process_frame
active_connections.clear()
for c in get_connection_list():
if get_node(NodePath(c.from_node)).selected or get_node(NodePath(c.to_node)).selected:
active_connections.append(c)
$OutlineOverlay.queue_redraw()
$OutlineOverlay.show.call_deferred()

func highlight_connections() -> void:
if highlighting_connections:
return
highlighting_connections = true
while Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT):
await get_tree().process_frame
for c in get_connection_list():
set_connection_activity(c.from_node, c.from_port, c.to_node, c.to_port, 1.0 if get_node(NodePath(c.from_node)).selected or get_node(NodePath(c.to_node)).selected else 0.0)
update_active_connections()
highlighting_connections = false

func _on_GraphEdit_node_selected(node : GraphElement) -> void:
Expand Down Expand Up @@ -1274,6 +1291,7 @@ func undoredo_command(command : Dictionary) -> void:
_:
print("Unknown undo/redo command:")
print(command)
update_active_connections()

func undoredo_move_node(node_name : String, old_pos : Vector2, new_pos : Vector2):
if old_pos == new_pos:
Expand Down Expand Up @@ -1750,3 +1768,12 @@ func color_comment_nodes() -> void:
picker.popup_hide.connect(picker.queue_free)
picker.popup_hide.connect(undoredo.end_group)
picker.popup()

func remove_active_connection(from : String, from_slot : int, to : String, to_slot : int) -> void:
for c in len(active_connections):
var connection : Dictionary = active_connections[c]
if (connection.from_node == from and connection.from_port == from_slot
and connection.to_node == to and connection.to_port == to_slot):
active_connections.remove_at(c)
break
$OutlineOverlay.queue_redraw()
8 changes: 6 additions & 2 deletions material_maker/panels/graph_edit/graph_edit.tscn
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
[gd_scene load_steps=8 format=3 uid="uid://dy1u50we7gtru"]
[gd_scene load_steps=9 format=3 uid="uid://dy1u50we7gtru"]

[ext_resource type="Script" uid="uid://dkp4w3at1o6cm" path="res://material_maker/panels/graph_edit/graph_edit.gd" id="1"]
[ext_resource type="Texture2D" uid="uid://c0j4px4n72di5" path="res://material_maker/icons/icons.tres" id="2"]
[ext_resource type="Script" uid="uid://bne3k0g56crmy" path="res://material_maker/tools/undo_redo/undo_redo.gd" id="3"]
[ext_resource type="PackedScene" uid="uid://buj231c2gxm4o" path="res://material_maker/widgets/desc_button/desc_button.tscn" id="4"]
[ext_resource type="Script" uid="uid://cbvroxeqaaopc" path="res://material_maker/panels/graph_edit/outline_overlay.gd" id="5_u5byk"]

[sub_resource type="AtlasTexture" id="3"]
atlas = ExtResource("2")
Expand Down Expand Up @@ -85,6 +86,10 @@ layout_mode = 2
[node name="UndoRedo" type="Node" parent="."]
script = ExtResource("3")

[node name="OutlineOverlay" type="Control" parent="."]
anchors_preset = 0
script = ExtResource("5_u5byk")

[connection signal="connection_from_empty" from="." to="." method="request_popup" binds= [true]]
[connection signal="connection_request" from="." to="." method="on_connect_node"]
[connection signal="connection_to_empty" from="." to="." method="request_popup" binds= [false]]
Expand All @@ -94,7 +99,6 @@ script = ExtResource("3")
[connection signal="node_deselected" from="." to="." method="_on_GraphEdit_node_unselected"]
[connection signal="node_selected" from="." to="." method="_on_GraphEdit_node_selected"]
[connection signal="paste_nodes_request" from="." to="." method="paste"]
[connection signal="visibility_changed" from="." to="." method="_on_GraphEdit_visibility_changed"]
[connection signal="timeout" from="Timer" to="." method="do_send_changed_signal"]
[connection signal="text_changed" from="GraphUI/SubGraphUI/Label" to="." method="_on_Label_text_changed"]
[connection signal="descriptions_changed" from="GraphUI/SubGraphUI/Description" to="." method="_on_Description_descriptions_changed"]
Expand Down
52 changes: 52 additions & 0 deletions material_maker/panels/graph_edit/outline_overlay.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
extends Control

# Connection lines outline overlay

func _ready() -> void:
owner.begin_node_move.connect(hide)
owner.end_node_move.connect(show)
owner.child_order_changed.connect(_move_behind_connections.call_deferred)


func _move_behind_connections() -> void:
# Move behind connection lines to make outlines visible in comment nodes
owner.move_child(self, owner.get_node("_connection_layer").get_index()-1)


func _draw() -> void:
if owner.active_connections.is_empty():
return

var reroute_positions : PackedVector2Array
var reroute_colors : PackedColorArray

var zoom : float = owner.zoom
for line in owner.active_connections:
if owner.has_node(NodePath(line.to_node)) and owner.has_node(NodePath(line.to_node)):
var from_node : GraphNode = owner.get_node(NodePath(line.from_node))
var to_node : GraphNode = owner.get_node(NodePath(line.to_node))

if not(from_node and to_node):
continue

var from_pos := from_node.get_output_port_position(line.from_port)*zoom + from_node.position
var to_pos := to_node.get_input_port_position(line.to_port)*zoom + to_node.position

if get_viewport_rect().intersects(Rect2(from_pos, to_pos-from_pos).abs()):
# connection outline
var line_width := maxf(10.0, owner.connection_lines_thickness)
line_width = line_width + zoom if zoom < 0.9 else line_width * zoom
draw_polyline(owner._get_connection_line(from_pos, to_pos),
to_node.get_input_port_color(line.to_port).darkened(0.35),
line_width, true)

# find unique reroute positions to avoid redrawing overlapping outlines
var reroute_highlight_color := from_node.get_output_port_color(line.from_port).darkened(0.35)
for node in [from_node, to_node]:
if node is MMGraphReroute and node.get_rect().get_center() not in reroute_positions:
reroute_positions.append(node.get_rect().get_center())
reroute_colors.append(reroute_highlight_color)

# draw reroute outlines
for p in len(reroute_positions):
draw_circle(reroute_positions[p], 20.0*zoom, reroute_colors[p], true, -1, true)
1 change: 1 addition & 0 deletions material_maker/panels/graph_edit/outline_overlay.gd.uid
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://cbvroxeqaaopc