diff --git a/addons/material_maker/engine/gen_base.gd b/addons/material_maker/engine/gen_base.gd index e787b08..74798f8 100644 --- a/addons/material_maker/engine/gen_base.gd +++ b/addons/material_maker/engine/gen_base.gd @@ -7,6 +7,7 @@ Base class for texture generators, that defines their API """ signal parameter_changed +signal output_changed(index) class InputPort: var generator : MMGenBase = null @@ -49,6 +50,9 @@ func can_be_deleted() -> bool: func toggle_editable() -> bool: return false +func is_template() -> bool: + return model != null + func is_editable() -> bool: return false @@ -117,6 +121,7 @@ func notify_output_change(output_index : int) -> void: var targets = get_targets(output_index) for target in targets: target.generator.source_changed(target.input_index) + emit_signal("output_changed", output_index) func source_changed(__) -> void: emit_signal("parameter_changed", "__input_changed__", 0) diff --git a/material_maker/main_window.gd b/material_maker/main_window.gd index d3791e4..f95eea5 100644 --- a/material_maker/main_window.gd +++ b/material_maker/main_window.gd @@ -16,6 +16,7 @@ onready var layout = $VBoxContainer/Layout var library var preview_2d var preview_3d +var hierarchy onready var preview_2d_background = $VBoxContainer/Layout/SplitRight/ProjectsPane/Preview2D onready var preview_2d_background_button = $VBoxContainer/Layout/SplitRight/ProjectsPane/PreviewUI/Preview2DButton @@ -130,6 +131,8 @@ func _ready() -> void: library = layout.get_pane("Library") preview_2d = layout.get_pane("Preview2D") preview_3d = layout.get_pane("Preview3D") + hierarchy = layout.get_pane("Hierarchy") + hierarchy.connect("group_selected", self, "on_group_selected") # Load recent projects load_recents() @@ -521,6 +524,7 @@ func _on_PopupMenu_id_pressed(id) -> void: # Preview func update_preview() -> void: + hierarchy.update_from_graph_edit(get_current_graph_edit()) var status need_update = true if updating: @@ -587,6 +591,11 @@ func _on_Projects_tab_changed(tab) -> void: current_tab = new_tab update_preview() +func on_group_selected(generator) -> void: + var graph_edit : MMGraphEdit = get_current_graph_edit() + if graph_edit != null: + graph_edit.edit_subgraph(generator) + func _exit_tree() -> void: # Save the window position and size to remember it when restarting the application config_cache.set_value("window", "screen", OS.current_screen) diff --git a/material_maker/main_window_layout.gd b/material_maker/main_window_layout.gd index 8ea4b42..30b268c 100644 --- a/material_maker/main_window_layout.gd +++ b/material_maker/main_window_layout.gd @@ -9,7 +9,8 @@ const PANE_POSITIONS = { const PANES = [ { name="Library", scene=preload("res://material_maker/library.tscn"), position="TopLeft" }, { name="Preview2D", scene=preload("res://material_maker/preview/preview_2d_panel.tscn"), position="BottomLeft" }, - { name="Preview3D", scene=preload("res://material_maker/preview/preview_3d_panel.tscn"), position="BottomLeft" } + { name="Preview3D", scene=preload("res://material_maker/preview/preview_3d_panel.tscn"), position="BottomLeft" }, + { name="Hierarchy", scene=preload("res://material_maker/widgets/graph_tree/hierarchy_pane.tscn"), position="TopRight" } ] var panes = {} diff --git a/material_maker/widgets/graph_tree/hierarchy_pane.gd b/material_maker/widgets/graph_tree/hierarchy_pane.gd new file mode 100644 index 0000000..aa29f61 --- /dev/null +++ b/material_maker/widgets/graph_tree/hierarchy_pane.gd @@ -0,0 +1,57 @@ +extends Tree + +signal group_selected + +func update_from_graph_edit(graph_edit) -> void: + set_column_expand(0, true) +# columns = 4 +# for i in range(1, 4): +# set_column_expand(i, false) +# set_column_min_width(i, 24) + if graph_edit == null: + return + var file_name = "PTex" + if graph_edit.save_path != null: + file_name = graph_edit.save_path.get_file() + fill_tree(graph_edit.top_generator, graph_edit.generator, file_name) + +func fill_tree(top : MMGenGraph, selected : MMGenGraph, top_name : String) -> void: + clear() + if top == null or selected == null: + return + var root : TreeItem = create_item(null) + root.set_text(0, top_name) + if top == selected: + root.set_custom_color(0, Color(0.5, 0.5, 1)) + else: + root.set_custom_color(0, Color(1, 1, 1)) + root.set_metadata(0, top) + fill_item(root, top, selected) + +#func set_icon(item, generator): +# var result = generator.render(0, 24, true) +# while result is GDScriptFunctionState: +# result = yield(result, "completed") +# var tex = ImageTexture.new() +# result.copy_to_texture(tex) +# result.release() +# item.set_icon(3, tex) + +func fill_item(parent : TreeItem, generator : MMGenGraph, selected : MMGenGraph) -> void: + for c in generator.get_children(): + if c is MMGenGraph: + if c.is_template(): + continue + var item : TreeItem = create_item(parent) + item.set_text(0, c.get_type_name()) + if c == selected: + item.set_custom_color(0, Color(0.5, 0.5, 1)) + elif c.is_editable(): + item.set_custom_color(0, Color(1, 1, 1)) + item.set_metadata(0, c) +# if c.get_output_defs().size() > 0: +# call_deferred("set_icon", item, c) + fill_item(item, c, selected) + +func _on_Hierarchy_item_double_clicked(): + emit_signal("group_selected", get_selected().get_metadata(0)) diff --git a/material_maker/widgets/graph_tree/hierarchy_pane.tscn b/material_maker/widgets/graph_tree/hierarchy_pane.tscn new file mode 100644 index 0000000..efda9e1 --- /dev/null +++ b/material_maker/widgets/graph_tree/hierarchy_pane.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://material_maker/widgets/graph_tree/hierarchy_pane.gd" type="Script" id=1] + +[node name="Hierarchy" type="Tree"] +anchor_right = 1.0 +anchor_bottom = 1.0 +rect_min_size = Vector2( 200, 150 ) +allow_reselect = true +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +[connection signal="item_activated" from="." to="." method="_on_Hierarchy_item_double_clicked"] +[connection signal="item_double_clicked" from="." to="." method="_on_Hierarchy_item_double_clicked"]