diff --git a/addons/material_maker/engine/nodes/gen_portal.gd b/addons/material_maker/engine/nodes/gen_portal.gd index 5aa757aef..402d3a160 100644 --- a/addons/material_maker/engine/nodes/gen_portal.gd +++ b/addons/material_maker/engine/nodes/gen_portal.gd @@ -16,6 +16,7 @@ var io : Portal var source : MMGenBase.OutputPort var editable := false +var color : Color = Color.WHITE func is_editable() -> bool: return true @@ -91,6 +92,7 @@ func _get_shader_code(uv : String, output_index : int, context : MMGenContext) - func _serialize(data : Dictionary) -> Dictionary: data.io = io data.port_type = port_type + data.color = MMType.serialize_value(color) # remove unused field data.erase("seed_int") @@ -101,3 +103,5 @@ func _deserialize(data : Dictionary) -> void: io = data.io if data.has("port_type"): port_type = data.port_type + if data.has("color"): + color = MMType.deserialize_value(data.color) diff --git a/material_maker/doc/aperture_nodes.rst b/material_maker/doc/aperture_nodes.rst index 8cd8743c4..f9c054357 100644 --- a/material_maker/doc/aperture_nodes.rst +++ b/material_maker/doc/aperture_nodes.rst @@ -14,6 +14,8 @@ In/Out nodes are connected via an identifier displayed as a label on top of the node. This can be set by double-clicking the node/label or pressing F2/Enter when a node is selected. +Label color can be changed by pressing F when a node is selected. + While multiple output nodes can use the same identifier to reference the same input node, input nodes must use unique(to the current graph/subgraph) identifiers. diff --git a/material_maker/doc/user_interface_shortcuts.rst b/material_maker/doc/user_interface_shortcuts.rst index b0ea0d3ec..1a814bbc0 100644 --- a/material_maker/doc/user_interface_shortcuts.rst +++ b/material_maker/doc/user_interface_shortcuts.rst @@ -82,7 +82,7 @@ Graph Editor +-------------------------------------------------------+----------------------------------------------------+ | :kbd:`Ctrl/Cmd-Shift-F` | Frame selected node(s) | +-------------------------------------------------------+----------------------------------------------------+ -| :kbd:`F` | Color selected comment node(s) | +| :kbd:`F` | Color selected comment/aperture node(s) | +-------------------------------------------------------+----------------------------------------------------+ | :kbd:`C` | Centers view | +-------------------------------------------------------+----------------------------------------------------+ diff --git a/material_maker/nodes/comment/comment.gd b/material_maker/nodes/comment/comment.gd index 4bc3d62ce..1a91cf91b 100644 --- a/material_maker/nodes/comment/comment.gd +++ b/material_maker/nodes/comment/comment.gd @@ -162,9 +162,9 @@ func set_color(c): $Popup.hide() if c == generator.color: return - var undo_action = { type="comment_color_change", node=generator.get_hier_name(), color=generator.color } - var redo_action = { type="comment_color_change", node=generator.get_hier_name(), color=c } - get_parent().undoredo.add("Change comment color", [undo_action], [redo_action], true) + var _undo_action = { type="node_color_change", node=generator.get_hier_name(), color=generator.color } + var _redo_action = { type="node_color_change", node=generator.get_hier_name(), color=c } + get_parent().undoredo.add("Change comment color", [_undo_action], [_redo_action], false) generator.color = c update_stylebox() get_parent().send_changed_signal() diff --git a/material_maker/nodes/portal/portal.gd b/material_maker/nodes/portal/portal.gd index 188ee99bf..0116b2bfe 100644 --- a/material_maker/nodes/portal/portal.gd +++ b/material_maker/nodes/portal/portal.gd @@ -30,13 +30,12 @@ func _draw() -> void: # label var label_pos := size * 0.5 - var label_color := Color.WHITE - if "light" in mm_globals.main_window.theme.resource_path: - label_color = Color.BLACK + var label_color : Color = generator.color var label_size = LABEL_FONT.get_string_size(get_link(), HORIZONTAL_ALIGNMENT_CENTER, -1, label_font_size) var label_draw_pos := label_pos - Vector2(label_size.x * 0.5, label_y_offset) if not is_editing: + draw_string_outline(LABEL_FONT, label_draw_pos, get_link(), HORIZONTAL_ALIGNMENT_CENTER, -1, label_font_size, 5, Color.BLACK) draw_string(LABEL_FONT, label_draw_pos, get_link(), HORIZONTAL_ALIGNMENT_CENTER, -1, label_font_size, label_color) # label dragger @@ -230,6 +229,16 @@ func set_link_from_selection() -> void: if source_portal.is_portal_in(): generator.set_parameter("link", source_portal.get_link()) +func set_color(c : Color) -> void: + if c == generator.color: + return + var _undo_action = { type="node_color_change", node=generator.get_hier_name(), color=generator.color } + var _redo_action = { type="node_color_change", node=generator.get_hier_name(), color=c } + get_parent().undoredo.add("Change portal color", [_undo_action], [_redo_action], false) + generator.color = c + queue_redraw() + get_parent().send_changed_signal() + #region portal link edit ## Replaces all links from [param from_link] to [param new_link]. diff --git a/material_maker/panels/graph_edit/graph_edit.gd b/material_maker/panels/graph_edit/graph_edit.gd index 4ee270890..583ebfc8d 100644 --- a/material_maker/panels/graph_edit/graph_edit.gd +++ b/material_maker/panels/graph_edit/graph_edit.gd @@ -293,7 +293,7 @@ func _gui_input(event) -> void: scroll_offset.y += 0.5*size.y accept_event() KEY_F: - color_comment_nodes() + colorize_nodes() KEY_G: if not get_selected_nodes().is_empty(): has_grab = true @@ -1325,13 +1325,16 @@ func undoredo_command(command : Dictionary) -> void: if has_node("node_"+g.name): var node = get_node("node_"+g.name) node.update_node() - "comment_color_change": + "node_color_change": var g = get_node_from_hier_name(command.node) g.color = command.color if g.get_parent() == generator: if has_node("node_"+g.name): var node = get_node("node_"+g.name) - node.update_node() + if node is MMGraphComment: + node.update_node() + elif node is MMGraphPortal: + node.queue_redraw() _: print("Unknown undo/redo command:") print(command) @@ -1826,33 +1829,43 @@ func _get_connection_line(from : Vector2, to : Vector2) -> PackedVector2Array: _: return points -func color_comment_nodes() -> void: - var comments := get_children().filter( - func(n): return (n is MMGraphComment and n.selected)) - if not comments.is_empty(): - undoredo.start_group() - var picker : PopupPanel = preload("res://material_maker/widgets/color_picker_popup/color_picker_popup.tscn").instantiate() - picker.hide() - add_child(picker) - var color_picker : ColorPicker = picker.get_node("ColorPicker") - for node in comments: - color_picker.color_changed.connect(node.set_color) - color_picker.color = node.generator.color - var csf = get_window().content_scale_factor - picker.about_to_popup.connect(func(): - if mm_globals.has_config("color_picker_color_mode"): - color_picker.color_mode = mm_globals.get_config("color_picker_color_mode") - if mm_globals.has_config("color_picker_shape"): - color_picker.picker_shape = mm_globals.get_config("color_picker_shape")) - picker.popup_hide.connect(func(): - mm_globals.set_config("color_picker_color_mode", color_picker.color_mode) - mm_globals.set_config("color_picker_shape", color_picker.picker_shape)) - picker.content_scale_factor = csf - picker.min_size = picker.get_contents_minimum_size() * csf - picker.position = get_screen_position() + get_local_mouse_position() * csf - picker.popup_hide.connect(picker.queue_free) - picker.popup_hide.connect(undoredo.end_group) - picker.popup() +func colorize_nodes() -> void: + var nodes : Array[GraphElement] + for n in get_children(): + if (n is MMGraphPortal or n is MMGraphComment) and n.selected: + nodes.push_back(n) + if nodes.is_empty(): + return + undoredo.start_group() + + var picker = ColorPicker.new() + var popup : PopupPanel = PopupPanel.new() + popup.add_child(picker) + popup.hide() + add_child(popup) + picker.edit_alpha = false + picker.edit_intensity = false + + var csf = get_window().content_scale_factor + popup.about_to_popup.connect(func() -> void: + if mm_globals.has_config("color_picker_color_mode"): + picker.color_mode = mm_globals.get_config("color_picker_color_mode") + if mm_globals.has_config("color_picker_shape"): + picker.picker_shape = mm_globals.get_config("color_picker_shape")) + popup.popup_hide.connect(func() -> void: + mm_globals.set_config("color_picker_color_mode", picker.color_mode) + mm_globals.set_config("color_picker_shape", picker.picker_shape)) + + popup.content_scale_factor = csf + popup.min_size = popup.get_contents_minimum_size() * csf + popup.position = get_screen_position() + get_local_mouse_position() * csf + + picker.color = nodes[0].generator.color + for node in nodes: + picker.color_changed.connect(node.set_color) + popup.popup_hide.connect(undoredo.end_group) + popup.popup_hide.connect(popup.queue_free) + popup.popup() func _on_resized() -> void: $GraphUI.size = Vector2.ZERO