From 8f6cde8c85e98440b88208fc4eaafb828e8d28e1 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RF1QVV7\\ER" Date: Wed, 11 Jan 2023 22:39:11 -0400 Subject: [PATCH 1/7] Implemented changes from previous repository. Began implementation of UI based on the main window's menu bar (rather than a menu popup in the tool options). --- material_maker/main_window.gd | 6 +- material_maker/main_window.tscn | 35 +++- mml_linker/PortLineEdit.gd | 22 +++ mml_linker/server.gd | 287 ++++++++++++++++++++++++++++++++ project.godot | 7 + start.tscn | 3 - 6 files changed, 354 insertions(+), 6 deletions(-) create mode 100644 mml_linker/PortLineEdit.gd create mode 100644 mml_linker/server.gd diff --git a/material_maker/main_window.gd b/material_maker/main_window.gd index 7539daa6d..93e8c4825 100644 --- a/material_maker/main_window.gd +++ b/material_maker/main_window.gd @@ -103,6 +103,7 @@ const MENU = [ { menu="Tools/Set painting environment", submenu="paint_environment", mode="paint", not_in_ports=["HTML5"] }, { menu="Tools/-" }, { menu="Tools/Environment editor", command="environment_editor", not_in_ports=["HTML5"] }, + { menu="Tools/Start server", command="start_server" }, #{ menu="Tools/Generate screenshots for the library nodes", command="generate_screenshots", mode="material" }, { menu="Help/User manual", command="show_doc", shortcut="F1" }, @@ -919,9 +920,12 @@ func _on_PaintEnvironment_id_pressed(id) -> void: if paint != null: paint.set_environment(id) - func environment_editor() -> void: add_child(load("res://material_maker/windows/environment_editor/environment_editor.tscn").instance()) + +func start_server() -> void: + add_child(load("res://mml_linker/server.tscn").instance()) + # ----------------------------------------------------------------------- # Help menu diff --git a/material_maker/main_window.tscn b/material_maker/main_window.tscn index ce8377944..50e139352 100644 --- a/material_maker/main_window.tscn +++ b/material_maker/main_window.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=25 format=2] +[gd_scene load_steps=27 format=2] [ext_resource path="res://material_maker/main_window.gd" type="Script" id=1] [ext_resource path="res://material_maker/main_window_layout.gd" type="Script" id=2] @@ -15,6 +15,8 @@ [ext_resource path="res://material_maker/tools/environment_manager/environment_manager.tscn" type="PackedScene" id=13] [ext_resource path="res://material_maker/tools/library_manager/library_manager.gd" type="Script" id=14] [ext_resource path="res://material_maker/icons/paste_none.tres" type="Texture" id=15] +[ext_resource path="res://mml_linker/server.gd" type="Script" id=17] +[ext_resource path="res://mml_linker/PortLineEdit.gd" type="Script" id=18] [sub_resource type="Shader" id=1] resource_local_to_scene = true @@ -167,7 +169,7 @@ margin_right = 1268.0 margin_bottom = 25.0 [node name="Menu" type="HBoxContainer" parent="VBoxContainer/TopBar"] -margin_right = 1177.0 +margin_right = 993.0 margin_bottom = 25.0 size_flags_horizontal = 3 @@ -178,6 +180,32 @@ text = "File" items = [ "New material", null, 0, false, false, 0, 0, null, "", false, "Load material", null, 0, false, false, 1, 268435535, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Save material", null, 0, false, false, 4, 268435539, null, "", false, "Save material as...", null, 0, false, false, 5, 301989971, null, "", false, "Save all materials...", null, 0, false, false, 6, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Export material", null, 0, false, false, 8, 268435525, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Close material", null, 0, false, false, 10, 0, null, "", false, "Quit", null, 0, false, false, 11, 268435537, null, "", false ] switch_on_hover = true +[node name="Server" type="HBoxContainer" parent="VBoxContainer/TopBar"] +margin_left = 997.0 +margin_right = 1177.0 +margin_bottom = 25.0 +script = ExtResource( 17 ) + +[node name="ServerStartCheckBox" type="CheckBox" parent="VBoxContainer/TopBar/Server"] +margin_right = 71.0 +margin_bottom = 25.0 +text = "Server" + +[node name="PortLabel" type="Label" parent="VBoxContainer/TopBar/Server"] +margin_left = 75.0 +margin_right = 116.0 +margin_bottom = 25.0 +text = "Port:" +align = 2 + +[node name="PortLineEdit" type="LineEdit" parent="VBoxContainer/TopBar/Server"] +margin_left = 120.0 +margin_right = 180.0 +margin_bottom = 25.0 +text = "6001" +placeholder_text = "Port" +script = ExtResource( 18 ) + [node name="Share" parent="VBoxContainer/TopBar" instance=ExtResource( 12 )] margin_left = 1181.0 margin_right = 1268.0 @@ -453,6 +481,9 @@ __meta__ = { [node name="AnimationPlayer" type="AnimationPlayer" parent="UndoRedoLabel"] anims/show = SubResource( 7 ) +[connection signal="toggled" from="VBoxContainer/TopBar/Server/ServerStartCheckBox" to="VBoxContainer/TopBar/Server" method="toggle"] +[connection signal="text_entered" from="VBoxContainer/TopBar/Server/PortLineEdit" to="VBoxContainer/TopBar/Server/PortLineEdit" method="_on_PortLineEdit_text_entered"] +[connection signal="valid_port_entered" from="VBoxContainer/TopBar/Server/PortLineEdit" to="VBoxContainer/TopBar/Server" method="set_port"] [connection signal="dragged" from="VBoxContainer/Layout" to="VBoxContainer/Layout" method="_on_Left_dragged"] [connection signal="resized" from="VBoxContainer/Layout" to="VBoxContainer/Layout" method="_on_Layout_resized"] [connection signal="tab_changed" from="VBoxContainer/Layout/Left/Top" to="VBoxContainer/Layout" method="_on_tab_changed"] diff --git a/mml_linker/PortLineEdit.gd b/mml_linker/PortLineEdit.gd new file mode 100644 index 000000000..56de03361 --- /dev/null +++ b/mml_linker/PortLineEdit.gd @@ -0,0 +1,22 @@ +extends LineEdit + + +var previous_string : String = "6001" +signal valid_port_entered + +func _ready(): + pass # Replace with function body. + +func _on_PortLineEdit_text_entered(string : String) -> void: + print("a") + if string == previous_string: + print("b") + return + if string.is_valid_integer(): + print("c") + var int_value = int(string) + if not 1080 < int_value and int_value < 65536: + print("d") + text = previous_string + return + emit_signal("valid_port_entered", int_value) diff --git a/mml_linker/server.gd b/mml_linker/server.gd new file mode 100644 index 000000000..8012bb249 --- /dev/null +++ b/mml_linker/server.gd @@ -0,0 +1,287 @@ +extends Control +class_name MMLServer + +var _server : WebSocketServer = WebSocketServer.new() +var port = 6001 +var project : MMGraphEdit +var _remote : MMGenRemote +var remote_params_gens_dict = {} +var local_params_gens_dict = {} + +signal informing + +var command_key_requirements : Dictionary = { + "ping" : [], + "load_ptex" : ["filepath"] +} + +var map_to_output_index = { + "albedo" : 0, + "roughness" : 13, + "metallicity" : 12, + "normal" : 7, + "depth" : 8, + "sss" : 5, + "emission" : 2, + "occlusion" : 9, + "displace" : 8 +} + +func _ready(): + set_process(false) + +func start(): + print("start()") + var error = _server.listen(port) + if error != OK: + inform("Error setting up server. (Has a server already been started?)") + return + _server.connect("client_connected", self, "_connected") + _server.connect("client_disconnected", self, "_disconnected") + _server.connect("client_close_request", self, "_close_request") + _server.connect("data_received", self, "_on_data") + #var info_node = get_parent().info_node.connect("informing", self) + connect("informing", get_parent(), "_on_informing") + set_process(true) + +func stop(): + print("stop()") + _server.stop() + set_process(false) + +func toggle(boolean : bool) -> void: + if boolean: + start() + else: + stop() + +func _connected(id, proto): + inform("Client %d connected with protocol: %s" % [id, proto]) + +func _close_request(id, code, reason): + inform("Client %d disconnecting with code: %d, reason: %s" % [id, code, reason]) + +func _disconnected(id, was_clean = false): + inform("Client %d disconnected, clean: %s" % [id, str(was_clean)]) + +func _on_data(id): + ### TODO: Authentication + print("Packet received.") + var pkt : PoolByteArray = _server.get_peer(id).get_packet() + var pkt_string : String = pkt.get_string_from_ascii() + inform("Got data from client %d: %s, ... echoing" % [id, pkt_string.substr(0, 140)]) + + print("pkt_string: ", pkt_string) + var data = parse_json(pkt_string) + print("Data: ",str(data).substr(0,140)) + var command : String = data["command"] + match command: + + "ping": + var data_dict = { "command" : "pong" } + send_json_data(id, data_dict) + + "load_ptex": + var filepath : String = data["filepath"] + load_ptex(filepath) + inform_and_send(id, "Finished loading ptex file.") + var remote_parameters = find_parameters_in_remote(_remote) + var local_parameters = find_local_parameters() + if data["reset_parameters"]: + var set_remote_parameters_command = { "command":"init_parameters", "image_name":data["image_name"], "parameters_type":"remote", "parameters":remote_parameters} + send_json_data(id, set_remote_parameters_command) + var set_local_parameters_command = { "command":"init_parameters", "image_name":data["image_name"], "parameters_type":"local", "parameters":local_parameters} + send_json_data(id, set_local_parameters_command) + var parameters_loaded_notify_command = { "command":"parameters_loaded"} + send_json_data(id, parameters_loaded_notify_command) + else: + var request_parameters_command = { "command":"request_parameters", "image_name":data["image_name"]} + send_json_data(id, request_parameters_command) + + "request_render": + inform("Performing render") + var render_result + for map in data['maps']: + render_result = render(map_to_output_index[map], data["resolution"]) + while render_result is GDScriptFunctionState: + render_result = yield(render_result, "completed") + send_image_data(id, data['image_name'], map, data['resolution'], render_result) + + "parameter_change": + var node_name = data["node_name"] + var parameter_name = data["param_name"] + var render_result + if not (data["parameter_type"] == "remote" or data["parameter_type"] == "local"): + inform("Error interpreting 'parameter_type' argument.") + return + var is_remote = data["parameter_type"] == "remote" + print("parameter_change") + if data["render"] == 'False': + set_parameter_value(node_name, parameter_name, data['param_value'], is_remote) + return + if data["render"] != 'True': + inform("Error interpreting 'render' argument.") + for map in data["maps"]: + if data["parameter_type"] == "remote": + render_result = change_parameter_and_render(node_name, parameter_name, data["param_value"], map, data["resolution"], true) + elif data["parameter_type"] == "local": + render_result = change_parameter_and_render(node_name, parameter_name, data["param_value"], map, data["resolution"], false) + else: + inform_and_send(id, "ERROR: Unable to determine parameter type.") + + while render_result is GDScriptFunctionState: + render_result = yield(render_result, "completed") + + send_image_data(id, data["image_name"], map, data["resolution"], render_result) + inform_and_send(id, "Parameter changed, render finished and transfered.") + + "set_multiple_parameters": + print(data) + if local_params_gens_dict.empty() and remote_params_gens_dict.empty(): + inform("Finding parameters") + find_parameters_in_remote(_remote) + find_local_parameters() + for parameter_string in data["parameters"]: + var parameter = parse_json(parameter_string) + var node_name = parameter["node_name"] + var param_name = parameter["param_name"] + var param_label = parameter["param_label"] + var param_value = parameter["param_value"] + var is_remote = parameter["param_type"] == "remote" + set_parameter_value(node_name, param_name, param_value, is_remote) + + var parameters_loaded_notify_command = { "command":"parameters_loaded"} + send_json_data(id, parameters_loaded_notify_command) + _: + inform_and_send(id, "Unable to read message command.") + + +func send_json_data(id : int, data : Dictionary) -> void: + var response = PoolByteArray() + response.append_array("json|".to_utf8()) + var json_data = to_json(data) + response.append_array(json_data.to_utf8()) + _server.get_peer(id).put_packet(response) + +func send_image_data(id : int, image_name : String, map : String, resolution : int, image_data : PoolByteArray) -> void: # Unfortunately there's apparently a limit to the size of elements in Godot's dictionaries, this is a workaround + var response = PoolByteArray() + var suffix = "_" + map if map != "albedo" else "" + var prefix_size = 16 + len(image_name) + len(suffix) + var prefix_size_string = str(prefix_size).pad_zeros(3) + var padded_resolution_string = str(resolution).pad_zeros(4) + response.append_array("image|{}|{}|{}|".format([prefix_size_string, image_name + suffix, padded_resolution_string], "{}").to_utf8()) + response.append_array(image_data) + _server.get_peer(id).put_packet(response) + +func load_ptex(filepath : String) -> void: + #var material_loaded = mm_globals.main_window.do_load_material(filepath, true, false) + var material_loaded = mm_globals.main_window.do_load_material(filepath, true) + project = mm_globals.main_window.get_current_project() + var material_node = project.get_material_node() + _remote = get_remote() + find_local_parameters() + + +func render(output_index : int, resolution : int): + # Too similar to load_ptex() + var material_node = project.get_material_node() + var result = material_node.render(material_node, output_index, resolution) + while result is GDScriptFunctionState: + result = yield(result, "completed") + var image_output : Image = result.texture.get_data() + image_output.convert(Image.FORMAT_RGBA8) + var output = image_output.get_data() + result.release(material_node) + return output + +func get_remote() -> MMGenRemote: + for child in project.top_generator.get_children(): + if child.get_type() == "remote": + return child + inform("Warning: Remote node not found.") + return null + +func find_parameters_in_remote(remote_gen : MMGenRemote) -> Array: + remote_params_gens_dict.clear() + var output = [] + if not remote_gen: + inform("No remote node found.") + return output + for widget in remote_gen.widgets: + for lw in widget.linked_widgets: + var top_gen = project.top_generator.get_node(lw.node) + var param = top_gen.get_parameter(lw.widget) + output.push_back( { 'node' : lw.node, 'param_name' : lw.widget, 'param_value' : param, 'param_label':widget.label } ) + remote_params_gens_dict["{}/{}".format([lw.node, lw.widget], "{}")] = top_gen + return output + +func find_local_parameters() -> Array: + var output = [] + for child in project.top_generator.get_children(): + if child.get_type() == "remote": + continue + for param in child.parameters: + var identifier = "{}/{}".format([child.get_hier_name(), param], "{}") + #if identifier in local_params_gens_dict: + # inform("Repeated node parameter name ".format([identifier], "{}")) + local_params_gens_dict[identifier] = child + output.push_back( { 'node' : child.get_hier_name(), 'param_name' : param, 'param_label':"", 'param_value' : child.get_parameter(param), 'param_type':child.get_parameter_def(param) } ) + print("local_params_gens_dict: ", local_params_gens_dict) + return output + +func set_parameter_value(node_name : String, param_name : String, value : String, is_remote : bool): + var dict = remote_params_gens_dict if is_remote else local_params_gens_dict + var identifier = "{}/{}".format([node_name, param_name], "{}") + var gen = dict[identifier] + var type = gen.get_parameter_def(param_name).type + var typed_value = null + if type == "enum" or type == "boolean" or type == "size": + typed_value = int(value) + elif type == "float": + typed_value = float(value) + elif value.is_valid_integer(): + typed_value = value + else: + inform("Invalid parameter value input.") + return + gen.set_parameter(param_name, typed_value) + +#func close(id) -> void: +# print("Close()") +# _server.stop() +# get_parent().queue_free() + +func inform(message : String) -> void: + print(message) + emit_signal("informing", message) + +func inform_and_send(id : int, message : String) -> void: + inform(message) + var data = { "command":"inform", "info":message } + send_json_data(id, data) + +func change_parameter_and_render(node_name : String, param_name : String, parameter_value : String, map : String, resolution : int, is_remote : bool) -> void: + set_parameter_value(node_name, param_name, parameter_value, is_remote) + print("ResolutioN: ", resolution) + var result = render(map_to_output_index[map], resolution) + while result is GDScriptFunctionState: + result = yield(result, "completed") + return result + +var i = 0 +func _process(delta): + # DEBUG: + if i % 30 == 0: + print("Connection status: ", _server.get_connection_status()) + i += 1 + _server.poll() + +func try_set_port_string(port_string : String): + if not port_string.is_valid_integer(): + return + +func set_port(new_port : int): + print("Setting port to ", new_port) + port = new_port + _server.stop() + _server.listen(new_port) diff --git a/project.godot b/project.godot index ee1b7ce23..7c39edbbc 100644 --- a/project.godot +++ b/project.godot @@ -145,6 +145,11 @@ _global_script_classes=[ { "path": "res://material_maker/nodes/remote/remote.gd" }, { "base": "Control", +"class": "MMLServer", +"language": "GDScript", +"path": "res://mml_linker/server.gd" +}, { +"base": "Control", "class": "MMNodeLink", "language": "GDScript", "path": "res://material_maker/widgets/linked_widgets/link.gd" @@ -202,6 +207,7 @@ _global_script_class_icons={ "MMGraphNodeGeneric": "", "MMGraphNodeMinimal": "", "MMGraphNodeRemote": "", +"MMLServer": "", "MMNodeLink": "", "MMPaths": "", "MMPolygon": "", @@ -317,6 +323,7 @@ limits/message_queue/max_size_kb=16384 [network] limits/debugger_stdout/max_chars_per_second=204800000 +limits/websocket_server/max_out_buffer_kb=4700 [rendering] diff --git a/start.tscn b/start.tscn index cc3099690..a865ce0ae 100644 --- a/start.tscn +++ b/start.tscn @@ -37,9 +37,6 @@ border_color = Color( 1, 0, 0, 1 ) anchor_right = 1.0 anchor_bottom = 1.0 script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} [node name="VBoxContainer" type="VBoxContainer" parent="."] anchor_left = 0.5 From bc46a2acffa905fe8a3b2cf373a0c90ce1bea575 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RF1QVV7\\ER" Date: Wed, 11 Jan 2023 23:29:33 -0400 Subject: [PATCH 2/7] inform() is now managed by mm_globals.set_tip_text(). Cleanup. --- material_maker/inform_label.gd | 14 ++++++++++++++ material_maker/main_window.tscn | 12 +++++++++++- mml_linker/server.gd | 17 +++-------------- 3 files changed, 28 insertions(+), 15 deletions(-) create mode 100644 material_maker/inform_label.gd diff --git a/material_maker/inform_label.gd b/material_maker/inform_label.gd new file mode 100644 index 000000000..4935dbcc4 --- /dev/null +++ b/material_maker/inform_label.gd @@ -0,0 +1,14 @@ +extends Label + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + get_parent().connect("informing", self, "_on_informing") + +func _on_informing(new_text : String) -> void: + text = new_text diff --git a/material_maker/main_window.tscn b/material_maker/main_window.tscn index 50e139352..dc5d41ea6 100644 --- a/material_maker/main_window.tscn +++ b/material_maker/main_window.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=27 format=2] +[gd_scene load_steps=28 format=2] [ext_resource path="res://material_maker/main_window.gd" type="Script" id=1] [ext_resource path="res://material_maker/main_window_layout.gd" type="Script" id=2] @@ -15,6 +15,7 @@ [ext_resource path="res://material_maker/tools/environment_manager/environment_manager.tscn" type="PackedScene" id=13] [ext_resource path="res://material_maker/tools/library_manager/library_manager.gd" type="Script" id=14] [ext_resource path="res://material_maker/icons/paste_none.tres" type="Texture" id=15] +[ext_resource path="res://material_maker/inform_label.gd" type="Script" id=16] [ext_resource path="res://mml_linker/server.gd" type="Script" id=17] [ext_resource path="res://mml_linker/PortLineEdit.gd" type="Script" id=18] @@ -206,6 +207,15 @@ text = "6001" placeholder_text = "Port" script = ExtResource( 18 ) +[node name="InformLabel" type="Label" parent="VBoxContainer/TopBar/Server"] +visible = false +margin_left = 184.0 +margin_right = 560.0 +margin_bottom = 25.0 +text = "The quick brown fox jumps over the lazy dog" +clip_text = true +script = ExtResource( 16 ) + [node name="Share" parent="VBoxContainer/TopBar" instance=ExtResource( 12 )] margin_left = 1181.0 margin_right = 1268.0 diff --git a/mml_linker/server.gd b/mml_linker/server.gd index 8012bb249..069aad03c 100644 --- a/mml_linker/server.gd +++ b/mml_linker/server.gd @@ -40,8 +40,6 @@ func start(): _server.connect("client_disconnected", self, "_disconnected") _server.connect("client_close_request", self, "_close_request") _server.connect("data_received", self, "_on_data") - #var info_node = get_parent().info_node.connect("informing", self) - connect("informing", get_parent(), "_on_informing") set_process(true) func stop(): @@ -65,7 +63,6 @@ func _disconnected(id, was_clean = false): inform("Client %d disconnected, clean: %s" % [id, str(was_clean)]) func _on_data(id): - ### TODO: Authentication print("Packet received.") var pkt : PoolByteArray = _server.get_peer(id).get_packet() var pkt_string : String = pkt.get_string_from_ascii() @@ -183,7 +180,6 @@ func load_ptex(filepath : String) -> void: func render(output_index : int, resolution : int): - # Too similar to load_ptex() var material_node = project.get_material_node() var result = material_node.render(material_node, output_index, resolution) while result is GDScriptFunctionState: @@ -222,8 +218,6 @@ func find_local_parameters() -> Array: continue for param in child.parameters: var identifier = "{}/{}".format([child.get_hier_name(), param], "{}") - #if identifier in local_params_gens_dict: - # inform("Repeated node parameter name ".format([identifier], "{}")) local_params_gens_dict[identifier] = child output.push_back( { 'node' : child.get_hier_name(), 'param_name' : param, 'param_label':"", 'param_value' : child.get_parameter(param), 'param_type':child.get_parameter_def(param) } ) print("local_params_gens_dict: ", local_params_gens_dict) @@ -246,14 +240,9 @@ func set_parameter_value(node_name : String, param_name : String, value : String return gen.set_parameter(param_name, typed_value) -#func close(id) -> void: -# print("Close()") -# _server.stop() -# get_parent().queue_free() - func inform(message : String) -> void: print(message) - emit_signal("informing", message) + mm_globals.set_tip_text(message) func inform_and_send(id : int, message : String) -> void: inform(message) @@ -271,8 +260,8 @@ func change_parameter_and_render(node_name : String, param_name : String, parame var i = 0 func _process(delta): # DEBUG: - if i % 30 == 0: - print("Connection status: ", _server.get_connection_status()) + #if i % 30 == 0: + # print("Connection status: ", _server.get_connection_status()) i += 1 _server.poll() From 9edf5eee3f15455a51e83b2da5aa90e5eea687c7 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RF1QVV7\\ER" Date: Thu, 12 Jan 2023 00:02:23 -0400 Subject: [PATCH 3/7] As with the previous repository, implemented an optional try_to_rescue argument in main_window's do_load_material() and graph_edit's load_file() so that it doesn't necessarily require confirmation from the user to load a rescue file. --- material_maker/main_window.gd | 4 ++-- material_maker/panels/graph_edit/graph_edit.gd | 4 ++-- mml_linker/server.gd | 5 ++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/material_maker/main_window.gd b/material_maker/main_window.gd index 93e8c4825..04bfd1eee 100644 --- a/material_maker/main_window.gd +++ b/material_maker/main_window.gd @@ -576,9 +576,9 @@ func create_new_graph_edit_if_needed() -> MMGraphEdit: graph_edit = new_graph_panel() return graph_edit -func do_load_material(filename : String, update_hierarchy : bool = true) -> bool: +func do_load_material(filename : String, update_hierarchy : bool = true, try_to_rescue : bool = true) -> bool: var graph_edit : MMGraphEdit = create_new_graph_edit_if_needed() - graph_edit.load_file(filename) + graph_edit.load_file(filename, try_to_rescue) if update_hierarchy: hierarchy.update_from_graph_edit(get_current_graph_edit()) return true diff --git a/material_maker/panels/graph_edit/graph_edit.gd b/material_maker/panels/graph_edit/graph_edit.gd index 7fb96d390..acdeb1cfa 100644 --- a/material_maker/panels/graph_edit/graph_edit.gd +++ b/material_maker/panels/graph_edit/graph_edit.gd @@ -525,12 +525,12 @@ func find_buffers(g) -> int: rv += find_buffers(c) return rv -func load_file(filename) -> bool: +func load_file(filename, try_to_rescue : bool = true) -> bool: var rescued = false var new_generator = null var file = File.new() var recovery_path = filename+".mmcr" - if filename != null and file.file_exists(recovery_path): + if filename != null and file.file_exists(recovery_path) and try_to_rescue: var dialog = preload("res://material_maker/windows/accept_dialog/accept_dialog.tscn").instance() dialog.dialog_text = "Rescue file for "+filename.get_file()+" was found.\nLoad it?" dialog.get_ok().text = "Rescue" diff --git a/mml_linker/server.gd b/mml_linker/server.gd index 069aad03c..747571149 100644 --- a/mml_linker/server.gd +++ b/mml_linker/server.gd @@ -171,8 +171,8 @@ func send_image_data(id : int, image_name : String, map : String, resolution : i _server.get_peer(id).put_packet(response) func load_ptex(filepath : String) -> void: - #var material_loaded = mm_globals.main_window.do_load_material(filepath, true, false) - var material_loaded = mm_globals.main_window.do_load_material(filepath, true) + var material_loaded = mm_globals.main_window.do_load_material(filepath, true, false) + #var material_loaded = mm_globals.main_window.do_load_material(filepath, true) project = mm_globals.main_window.get_current_project() var material_node = project.get_material_node() _remote = get_remote() @@ -251,7 +251,6 @@ func inform_and_send(id : int, message : String) -> void: func change_parameter_and_render(node_name : String, param_name : String, parameter_value : String, map : String, resolution : int, is_remote : bool) -> void: set_parameter_value(node_name, param_name, parameter_value, is_remote) - print("ResolutioN: ", resolution) var result = render(map_to_output_index[map], resolution) while result is GDScriptFunctionState: result = yield(result, "completed") From 584d9b0f023ef93e03d04f8743a3c1bfa4e63328 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RF1QVV7\\ER" Date: Sun, 22 Jan 2023 19:05:35 -0400 Subject: [PATCH 4/7] Refactoring; several functions related to parameters and remotes are now located at ProjectContainer.gd --- mml_linker/ProjectContainer.gd | 78 ++++++++++++++ mml_linker/README.md | 1 + mml_linker/server.gd | 181 +++++++++++++++++++-------------- project.godot | 6 ++ 4 files changed, 191 insertions(+), 75 deletions(-) create mode 100644 mml_linker/ProjectContainer.gd create mode 100644 mml_linker/README.md diff --git a/mml_linker/ProjectContainer.gd b/mml_linker/ProjectContainer.gd new file mode 100644 index 000000000..19a8b403a --- /dev/null +++ b/mml_linker/ProjectContainer.gd @@ -0,0 +1,78 @@ +extends Node +#class_name MMLProjectContainer +class_name MMLProjectContainer + +# Class that finds and contains data from MM projects to be used along MMLServer + +var remote_params_gens_dict : Dictionary = {} +var local_params_gens_dict : Dictionary = {} +var project : MMGraphEdit +var remote_gen : MMGenRemote +#var _image_name : String +var material_node : MMGenMaterial +#var server : MMLServer +var remote_parameters +var local_parameters + +func init(project : MMGraphEdit, _image_name : String): + #image_name = _image_name + self.project = project + material_node = project.get_material_node() + remote_gen = find_remote() + remote_parameters = find_remote_parameters() + local_parameters = find_local_parameters() + +func inform(text): + print("Unimplemented") + +func find_remote() -> MMGenRemote: + for child in project.top_generator.get_children(): + if child.get_type() == "remote": + return child + inform("Warning: Remote node not found.") + return null + +func find_remote_parameters() -> Array: + remote_params_gens_dict.clear() + + var output = [] + #if not remote_gen: + if remote_gen == null: + inform("No remote node found.") + return output + for widget in remote_gen.widgets: + for lw in widget.linked_widgets: + var top_gen = project.top_generator.get_node(lw.node) + var param = top_gen.get_parameter(lw.widget) + output.push_back( { 'node' : lw.node, 'param_name' : lw.widget, 'param_value' : param, 'param_label':widget.label } ) + remote_params_gens_dict["{}/{}".format([lw.node, lw.widget], "{}")] = top_gen + return output + +func find_local_parameters() -> Array: + var output = [] + for child in project.top_generator.get_children(): + if child.get_type() == "remote": + continue + for param in child.parameters: + var identifier = "{}/{}".format([child.get_hier_name(), param], "{}") + local_params_gens_dict[identifier] = child + output.push_back( { 'node' : child.get_hier_name(), 'param_name' : param, 'param_label':"", 'param_value' : child.get_parameter(param), 'param_type':child.get_parameter_def(param) } ) + print("local_params_gens_dict: ", local_params_gens_dict) + return output + +func set_parameter_value(node_name : String, param_name : String, value : String, is_remote : bool): + var dict = remote_params_gens_dict if is_remote else local_params_gens_dict + var identifier = "{}/{}".format([node_name, param_name], "{}") + var gen = dict[identifier] + var type = gen.get_parameter_def(param_name).type + var typed_value = null + if type == "enum" or type == "boolean" or type == "size": + typed_value = int(value) + elif type == "float": + typed_value = float(value) + elif value.is_valid_integer(): + typed_value = value + else: + inform("Invalid parameter value input.") + return + gen.set_parameter(param_name, typed_value) diff --git a/mml_linker/README.md b/mml_linker/README.md new file mode 100644 index 000000000..1dbdbed0f --- /dev/null +++ b/mml_linker/README.md @@ -0,0 +1 @@ +# mml_linker diff --git a/mml_linker/server.gd b/mml_linker/server.gd index 747571149..fce752a66 100644 --- a/mml_linker/server.gd +++ b/mml_linker/server.gd @@ -3,10 +3,11 @@ class_name MMLServer var _server : WebSocketServer = WebSocketServer.new() var port = 6001 -var project : MMGraphEdit -var _remote : MMGenRemote -var remote_params_gens_dict = {} -var local_params_gens_dict = {} +#var project : MMGraphEdit +#var _remote : MMGenRemote +#var name_to_material_data = {} +#var name_to_param_dicts = {} +var name_to_project_container = {} signal informing @@ -80,14 +81,20 @@ func _on_data(id): "load_ptex": var filepath : String = data["filepath"] - load_ptex(filepath) + load_ptex(data["image_name"], filepath) inform_and_send(id, "Finished loading ptex file.") - var remote_parameters = find_parameters_in_remote(_remote) - var local_parameters = find_local_parameters() + #print("mat_data: ", name_to_material_data) + #var remote_parameters = find_parameters_in_remote(name_to_material_data[data["image_name"]].project) + #var local_parameters = find_local_parameters(name_to_material_data['image_name'].project) + #project_container.find_parameters_in_remote() + #project_container.find_local_parameters() if data["reset_parameters"]: - var set_remote_parameters_command = { "command":"init_parameters", "image_name":data["image_name"], "parameters_type":"remote", "parameters":remote_parameters} + var project_container = name_to_project_container[data['image_name']] + #var set_remote_parameters_command = { "command":"init_parameters", "image_name":data["image_name"], "parameters_type":"remote", "parameters":remote_parameters} + var set_remote_parameters_command = { "command":"init_parameters", "image_name":data["image_name"], "parameters_type":"remote", "parameters":project_container.remote_parameters} send_json_data(id, set_remote_parameters_command) - var set_local_parameters_command = { "command":"init_parameters", "image_name":data["image_name"], "parameters_type":"local", "parameters":local_parameters} + #var set_local_parameters_command = { "command":"init_parameters", "image_name":data["image_name"], "parameters_type":"local", "parameters":local_parameters} + var set_local_parameters_command = { "command":"init_parameters", "image_name":data["image_name"], "parameters_type":"local", "parameters":project_container.local_parameters} send_json_data(id, set_local_parameters_command) var parameters_loaded_notify_command = { "command":"parameters_loaded"} send_json_data(id, parameters_loaded_notify_command) @@ -98,8 +105,10 @@ func _on_data(id): "request_render": inform("Performing render") var render_result + #var material = name_to_material_data[data['image_name']] + var material = name_to_project_container[data['image_name']].material_node for map in data['maps']: - render_result = render(map_to_output_index[map], data["resolution"]) + render_result = render(material, map_to_output_index[map], data["resolution"]) while render_result is GDScriptFunctionState: render_result = yield(render_result, "completed") send_image_data(id, data['image_name'], map, data['resolution'], render_result) @@ -112,17 +121,20 @@ func _on_data(id): inform("Error interpreting 'parameter_type' argument.") return var is_remote = data["parameter_type"] == "remote" + #var material = name_to_material_data[data['image_name']] + var project_container = name_to_project_container[data['image_name']] + var material = project_container.material_node print("parameter_change") if data["render"] == 'False': - set_parameter_value(node_name, parameter_name, data['param_value'], is_remote) + project_container.set_parameter_value(material, node_name, parameter_name, data['param_value'], is_remote) return if data["render"] != 'True': inform("Error interpreting 'render' argument.") for map in data["maps"]: if data["parameter_type"] == "remote": - render_result = change_parameter_and_render(node_name, parameter_name, data["param_value"], map, data["resolution"], true) + render_result = change_parameter_and_render(project_container, node_name, parameter_name, data["param_value"], map, data["resolution"], true) elif data["parameter_type"] == "local": - render_result = change_parameter_and_render(node_name, parameter_name, data["param_value"], map, data["resolution"], false) + render_result = change_parameter_and_render(project_container, node_name, parameter_name, data["param_value"], map, data["resolution"], false) else: inform_and_send(id, "ERROR: Unable to determine parameter type.") @@ -134,18 +146,20 @@ func _on_data(id): "set_multiple_parameters": print(data) - if local_params_gens_dict.empty() and remote_params_gens_dict.empty(): - inform("Finding parameters") - find_parameters_in_remote(_remote) - find_local_parameters() +# if local_params_gens_dict.empty() and remote_params_gens_dict.empty(): +# inform("Finding parameters") +# find_parameters_in_remote(name_to_material_data[data["image_name"]].remote) +# find_local_parameters(name_to_material_data['image_name'].project) for parameter_string in data["parameters"]: + var material = "dummy" var parameter = parse_json(parameter_string) var node_name = parameter["node_name"] var param_name = parameter["param_name"] var param_label = parameter["param_label"] var param_value = parameter["param_value"] var is_remote = parameter["param_type"] == "remote" - set_parameter_value(node_name, param_name, param_value, is_remote) + var project_container = name_to_project_container[data['image_name']] + project_container.set_parameter_value(node_name, param_name, param_value, is_remote) var parameters_loaded_notify_command = { "command":"parameters_loaded"} send_json_data(id, parameters_loaded_notify_command) @@ -170,17 +184,30 @@ func send_image_data(id : int, image_name : String, map : String, resolution : i response.append_array(image_data) _server.get_peer(id).put_packet(response) -func load_ptex(filepath : String) -> void: +func load_ptex(image_name : String, filepath : String) -> void: var material_loaded = mm_globals.main_window.do_load_material(filepath, true, false) - #var material_loaded = mm_globals.main_window.do_load_material(filepath, true) - project = mm_globals.main_window.get_current_project() + + var project = mm_globals.main_window.get_current_project() var material_node = project.get_material_node() - _remote = get_remote() - find_local_parameters() + #_remote = get_remote(_project) + #var material_data = { material=material_node, project = _project, remote_node= _remote} + + var project_container = MMLProjectContainer.new(); + project_container.init(project, image_name) + name_to_project_container[image_name] = project_container + + #project_container.image_name = image_name + #project_container.project = project + #project_container.remote = _remote + #name_to_material_data['image_name'] = material_data + #name_to_material_data['image_name'].material = material + #name_to_material_data['image_name'].project = project + #name_to_material_data['image_name']._remote = _remote + #find_local_parameters(_project) -func render(output_index : int, resolution : int): - var material_node = project.get_material_node() +func render(material_node : MMGenMaterial, output_index : int, resolution : int): + #var material_node = project.get_material_node() var result = material_node.render(material_node, output_index, resolution) while result is GDScriptFunctionState: result = yield(result, "completed") @@ -190,55 +217,59 @@ func render(output_index : int, resolution : int): result.release(material_node) return output -func get_remote() -> MMGenRemote: - for child in project.top_generator.get_children(): - if child.get_type() == "remote": - return child - inform("Warning: Remote node not found.") - return null +#func get_remote(project : MMGraphEdit) -> MMGenRemote: +# for child in project.top_generator.get_children(): +# if child.get_type() == "remote": +# return child +# inform("Warning: Remote node not found.") +# return null -func find_parameters_in_remote(remote_gen : MMGenRemote) -> Array: - remote_params_gens_dict.clear() - var output = [] - if not remote_gen: - inform("No remote node found.") - return output - for widget in remote_gen.widgets: - for lw in widget.linked_widgets: - var top_gen = project.top_generator.get_node(lw.node) - var param = top_gen.get_parameter(lw.widget) - output.push_back( { 'node' : lw.node, 'param_name' : lw.widget, 'param_value' : param, 'param_label':widget.label } ) - remote_params_gens_dict["{}/{}".format([lw.node, lw.widget], "{}")] = top_gen - return output +#func find_parameters_in_remote(remote_gen : MMGenRemote) -> Array: +#func find_parameters_in_remote(image_name : String) -> Array: +# remote_params_gens_dict.clear() +# +# var output = [] +# #if not remote_gen: +# var remote_gen = name_to_material_data[image_name].remote +# if remote_gen == null: +# inform("No remote node found.") +# return output +# for widget in remote_gen.widgets: +# for lw in widget.linked_widgets: +# var top_gen = name_to_material_data[image_name].project.top_generator.get_node(lw.node) +# var param = top_gen.get_parameter(lw.widget) +# output.push_back( { 'node' : lw.node, 'param_name' : lw.widget, 'param_value' : param, 'param_label':widget.label } ) +# remote_params_gens_dict["{}/{}".format([lw.node, lw.widget], "{}")] = top_gen +# return output -func find_local_parameters() -> Array: - var output = [] - for child in project.top_generator.get_children(): - if child.get_type() == "remote": - continue - for param in child.parameters: - var identifier = "{}/{}".format([child.get_hier_name(), param], "{}") - local_params_gens_dict[identifier] = child - output.push_back( { 'node' : child.get_hier_name(), 'param_name' : param, 'param_label':"", 'param_value' : child.get_parameter(param), 'param_type':child.get_parameter_def(param) } ) - print("local_params_gens_dict: ", local_params_gens_dict) - return output - -func set_parameter_value(node_name : String, param_name : String, value : String, is_remote : bool): - var dict = remote_params_gens_dict if is_remote else local_params_gens_dict - var identifier = "{}/{}".format([node_name, param_name], "{}") - var gen = dict[identifier] - var type = gen.get_parameter_def(param_name).type - var typed_value = null - if type == "enum" or type == "boolean" or type == "size": - typed_value = int(value) - elif type == "float": - typed_value = float(value) - elif value.is_valid_integer(): - typed_value = value - else: - inform("Invalid parameter value input.") - return - gen.set_parameter(param_name, typed_value) +#func find_local_parameters(image_name) -> Array: +# var output = [] +# for child in project.top_generator.get_children(): +# if child.get_type() == "remote": +# continue +# for param in child.parameters: +# var identifier = "{}/{}".format([child.get_hier_name(), param], "{}") +# local_params_gens_dict[identifier] = child +# output.push_back( { 'node' : child.get_hier_name(), 'param_name' : param, 'param_label':"", 'param_value' : child.get_parameter(param), 'param_type':child.get_parameter_def(param) } ) +# print("local_params_gens_dict: ", local_params_gens_dict) +# return output +# +#func set_parameter_value(material : MMGenMaterial, node_name : String, param_name : String, value : String, is_remote : bool): +# var dict = remote_params_gens_dict if is_remote else local_params_gens_dict +# var identifier = "{}/{}".format([node_name, param_name], "{}") +# var gen = dict[identifier] +# var type = gen.get_parameter_def(param_name).type +# var typed_value = null +# if type == "enum" or type == "boolean" or type == "size": +# typed_value = int(value) +# elif type == "float": +# typed_value = float(value) +# elif value.is_valid_integer(): +# typed_value = value +# else: +# inform("Invalid parameter value input.") +# return +# gen.set_parameter(param_name, typed_value) func inform(message : String) -> void: print(message) @@ -249,9 +280,9 @@ func inform_and_send(id : int, message : String) -> void: var data = { "command":"inform", "info":message } send_json_data(id, data) -func change_parameter_and_render(node_name : String, param_name : String, parameter_value : String, map : String, resolution : int, is_remote : bool) -> void: - set_parameter_value(node_name, param_name, parameter_value, is_remote) - var result = render(map_to_output_index[map], resolution) +func change_parameter_and_render(project_container, node_name : String, param_name : String, parameter_value : String, map : String, resolution : int, is_remote : bool) -> void: + project_container.set_parameter_value(material, node_name, param_name, parameter_value, is_remote) + var result = render(project_container.material_node, map_to_output_index[map], resolution) while result is GDScriptFunctionState: result = yield(result, "completed") return result diff --git a/project.godot b/project.godot index b93a0aa74..ca77e6296 100644 --- a/project.godot +++ b/project.godot @@ -144,6 +144,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://material_maker/nodes/remote/remote.gd" }, { +"base": "Node", +"class": "MMLProjectContainer", +"language": "GDScript", +"path": "res://mml_linker/ProjectContainer.gd" +}, { "base": "Control", "class": "MMLServer", "language": "GDScript", @@ -207,6 +212,7 @@ _global_script_class_icons={ "MMGraphNodeGeneric": "", "MMGraphNodeMinimal": "", "MMGraphNodeRemote": "", +"MMLProjectContainer": "", "MMLServer": "", "MMNodeLink": "", "MMPaths": "", From 7c88ff72d2f6d48c4efa48538433aa17082ef1b0 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RF1QVV7\\ER" Date: Sun, 22 Jan 2023 19:15:54 -0400 Subject: [PATCH 5/7] Cleanup. --- mml_linker/ProjectContainer.gd | 7 +-- mml_linker/server.gd | 93 ++-------------------------------- 2 files changed, 4 insertions(+), 96 deletions(-) diff --git a/mml_linker/ProjectContainer.gd b/mml_linker/ProjectContainer.gd index 19a8b403a..93113be74 100644 --- a/mml_linker/ProjectContainer.gd +++ b/mml_linker/ProjectContainer.gd @@ -1,5 +1,4 @@ extends Node -#class_name MMLProjectContainer class_name MMLProjectContainer # Class that finds and contains data from MM projects to be used along MMLServer @@ -8,14 +7,11 @@ var remote_params_gens_dict : Dictionary = {} var local_params_gens_dict : Dictionary = {} var project : MMGraphEdit var remote_gen : MMGenRemote -#var _image_name : String var material_node : MMGenMaterial -#var server : MMLServer var remote_parameters var local_parameters -func init(project : MMGraphEdit, _image_name : String): - #image_name = _image_name +func init(project : MMGraphEdit): self.project = project material_node = project.get_material_node() remote_gen = find_remote() @@ -36,7 +32,6 @@ func find_remote_parameters() -> Array: remote_params_gens_dict.clear() var output = [] - #if not remote_gen: if remote_gen == null: inform("No remote node found.") return output diff --git a/mml_linker/server.gd b/mml_linker/server.gd index fce752a66..3abe50b11 100644 --- a/mml_linker/server.gd +++ b/mml_linker/server.gd @@ -3,10 +3,6 @@ class_name MMLServer var _server : WebSocketServer = WebSocketServer.new() var port = 6001 -#var project : MMGraphEdit -#var _remote : MMGenRemote -#var name_to_material_data = {} -#var name_to_param_dicts = {} var name_to_project_container = {} signal informing @@ -83,17 +79,10 @@ func _on_data(id): var filepath : String = data["filepath"] load_ptex(data["image_name"], filepath) inform_and_send(id, "Finished loading ptex file.") - #print("mat_data: ", name_to_material_data) - #var remote_parameters = find_parameters_in_remote(name_to_material_data[data["image_name"]].project) - #var local_parameters = find_local_parameters(name_to_material_data['image_name'].project) - #project_container.find_parameters_in_remote() - #project_container.find_local_parameters() if data["reset_parameters"]: var project_container = name_to_project_container[data['image_name']] - #var set_remote_parameters_command = { "command":"init_parameters", "image_name":data["image_name"], "parameters_type":"remote", "parameters":remote_parameters} var set_remote_parameters_command = { "command":"init_parameters", "image_name":data["image_name"], "parameters_type":"remote", "parameters":project_container.remote_parameters} send_json_data(id, set_remote_parameters_command) - #var set_local_parameters_command = { "command":"init_parameters", "image_name":data["image_name"], "parameters_type":"local", "parameters":local_parameters} var set_local_parameters_command = { "command":"init_parameters", "image_name":data["image_name"], "parameters_type":"local", "parameters":project_container.local_parameters} send_json_data(id, set_local_parameters_command) var parameters_loaded_notify_command = { "command":"parameters_loaded"} @@ -105,7 +94,6 @@ func _on_data(id): "request_render": inform("Performing render") var render_result - #var material = name_to_material_data[data['image_name']] var material = name_to_project_container[data['image_name']].material_node for map in data['maps']: render_result = render(material, map_to_output_index[map], data["resolution"]) @@ -121,12 +109,11 @@ func _on_data(id): inform("Error interpreting 'parameter_type' argument.") return var is_remote = data["parameter_type"] == "remote" - #var material = name_to_material_data[data['image_name']] var project_container = name_to_project_container[data['image_name']] var material = project_container.material_node print("parameter_change") if data["render"] == 'False': - project_container.set_parameter_value(material, node_name, parameter_name, data['param_value'], is_remote) + project_container.set_parameter_value(node_name, parameter_name, data['param_value'], is_remote) return if data["render"] != 'True': inform("Error interpreting 'render' argument.") @@ -145,11 +132,6 @@ func _on_data(id): inform_and_send(id, "Parameter changed, render finished and transfered.") "set_multiple_parameters": - print(data) -# if local_params_gens_dict.empty() and remote_params_gens_dict.empty(): -# inform("Finding parameters") -# find_parameters_in_remote(name_to_material_data[data["image_name"]].remote) -# find_local_parameters(name_to_material_data['image_name'].project) for parameter_string in data["parameters"]: var material = "dummy" var parameter = parse_json(parameter_string) @@ -186,28 +168,13 @@ func send_image_data(id : int, image_name : String, map : String, resolution : i func load_ptex(image_name : String, filepath : String) -> void: var material_loaded = mm_globals.main_window.do_load_material(filepath, true, false) - var project = mm_globals.main_window.get_current_project() var material_node = project.get_material_node() - #_remote = get_remote(_project) - #var material_data = { material=material_node, project = _project, remote_node= _remote} - var project_container = MMLProjectContainer.new(); - project_container.init(project, image_name) + project_container.init(project) name_to_project_container[image_name] = project_container - - #project_container.image_name = image_name - #project_container.project = project - #project_container.remote = _remote - #name_to_material_data['image_name'] = material_data - #name_to_material_data['image_name'].material = material - #name_to_material_data['image_name'].project = project - #name_to_material_data['image_name']._remote = _remote - #find_local_parameters(_project) - func render(material_node : MMGenMaterial, output_index : int, resolution : int): - #var material_node = project.get_material_node() var result = material_node.render(material_node, output_index, resolution) while result is GDScriptFunctionState: result = yield(result, "completed") @@ -216,60 +183,6 @@ func render(material_node : MMGenMaterial, output_index : int, resolution : int) var output = image_output.get_data() result.release(material_node) return output - -#func get_remote(project : MMGraphEdit) -> MMGenRemote: -# for child in project.top_generator.get_children(): -# if child.get_type() == "remote": -# return child -# inform("Warning: Remote node not found.") -# return null - -#func find_parameters_in_remote(remote_gen : MMGenRemote) -> Array: -#func find_parameters_in_remote(image_name : String) -> Array: -# remote_params_gens_dict.clear() -# -# var output = [] -# #if not remote_gen: -# var remote_gen = name_to_material_data[image_name].remote -# if remote_gen == null: -# inform("No remote node found.") -# return output -# for widget in remote_gen.widgets: -# for lw in widget.linked_widgets: -# var top_gen = name_to_material_data[image_name].project.top_generator.get_node(lw.node) -# var param = top_gen.get_parameter(lw.widget) -# output.push_back( { 'node' : lw.node, 'param_name' : lw.widget, 'param_value' : param, 'param_label':widget.label } ) -# remote_params_gens_dict["{}/{}".format([lw.node, lw.widget], "{}")] = top_gen -# return output - -#func find_local_parameters(image_name) -> Array: -# var output = [] -# for child in project.top_generator.get_children(): -# if child.get_type() == "remote": -# continue -# for param in child.parameters: -# var identifier = "{}/{}".format([child.get_hier_name(), param], "{}") -# local_params_gens_dict[identifier] = child -# output.push_back( { 'node' : child.get_hier_name(), 'param_name' : param, 'param_label':"", 'param_value' : child.get_parameter(param), 'param_type':child.get_parameter_def(param) } ) -# print("local_params_gens_dict: ", local_params_gens_dict) -# return output -# -#func set_parameter_value(material : MMGenMaterial, node_name : String, param_name : String, value : String, is_remote : bool): -# var dict = remote_params_gens_dict if is_remote else local_params_gens_dict -# var identifier = "{}/{}".format([node_name, param_name], "{}") -# var gen = dict[identifier] -# var type = gen.get_parameter_def(param_name).type -# var typed_value = null -# if type == "enum" or type == "boolean" or type == "size": -# typed_value = int(value) -# elif type == "float": -# typed_value = float(value) -# elif value.is_valid_integer(): -# typed_value = value -# else: -# inform("Invalid parameter value input.") -# return -# gen.set_parameter(param_name, typed_value) func inform(message : String) -> void: print(message) @@ -281,7 +194,7 @@ func inform_and_send(id : int, message : String) -> void: send_json_data(id, data) func change_parameter_and_render(project_container, node_name : String, param_name : String, parameter_value : String, map : String, resolution : int, is_remote : bool) -> void: - project_container.set_parameter_value(material, node_name, param_name, parameter_value, is_remote) + project_container.set_parameter_value(node_name, param_name, parameter_value, is_remote) var result = render(project_container.material_node, map_to_output_index[map], resolution) while result is GDScriptFunctionState: result = yield(result, "completed") From e4eddf73f69c4e7e19cec94f79678cc8173fd016 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RF1QVV7\\ER" Date: Sun, 22 Jan 2023 19:53:36 -0400 Subject: [PATCH 6/7] Implemented informing in ProjectContainer.gd --- mml_linker/ProjectContainer.gd | 13 +++++++------ mml_linker/server.gd | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/mml_linker/ProjectContainer.gd b/mml_linker/ProjectContainer.gd index 93113be74..4252d7f30 100644 --- a/mml_linker/ProjectContainer.gd +++ b/mml_linker/ProjectContainer.gd @@ -11,6 +11,8 @@ var material_node : MMGenMaterial var remote_parameters var local_parameters +signal warning + func init(project : MMGraphEdit): self.project = project material_node = project.get_material_node() @@ -18,14 +20,13 @@ func init(project : MMGraphEdit): remote_parameters = find_remote_parameters() local_parameters = find_local_parameters() -func inform(text): - print("Unimplemented") - func find_remote() -> MMGenRemote: for child in project.top_generator.get_children(): if child.get_type() == "remote": + print("\n\n\nRemote node found.\n\n\n") + emit_signal("\n\n\nRemote node found.\n\n\n") return child - inform("Warning: Remote node not found.") + emit_signal("warning", "Warning: Remote node not found.") return null func find_remote_parameters() -> Array: @@ -33,7 +34,7 @@ func find_remote_parameters() -> Array: var output = [] if remote_gen == null: - inform("No remote node found.") + emit_signal("warning", "\n\n\nRemote node not found.\n\n\n") return output for widget in remote_gen.widgets: for lw in widget.linked_widgets: @@ -68,6 +69,6 @@ func set_parameter_value(node_name : String, param_name : String, value : String elif value.is_valid_integer(): typed_value = value else: - inform("Invalid parameter value input.") + emit_signal("warning", "Warning: Invalid parameter value input.") return gen.set_parameter(param_name, typed_value) diff --git a/mml_linker/server.gd b/mml_linker/server.gd index 3abe50b11..3b465709d 100644 --- a/mml_linker/server.gd +++ b/mml_linker/server.gd @@ -172,6 +172,7 @@ func load_ptex(image_name : String, filepath : String) -> void: var material_node = project.get_material_node() var project_container = MMLProjectContainer.new(); project_container.init(project) + project_container.connect("warning", self, "inform") name_to_project_container[image_name] = project_container func render(material_node : MMGenMaterial, output_index : int, resolution : int): From 3e29a6a019344e482e18e5fcd969d8c9efb8dd0f Mon Sep 17 00:00:00 2001 From: "DESKTOP-RF1QVV7\\ER" Date: Sun, 22 Jan 2023 19:58:23 -0400 Subject: [PATCH 7/7] Deleted leftover "Start server" menu. Issue: the "set_multiple_parameters" option causes MM to hang temporarily. Is now able to work with multiple simultaneous materials (projects). --- material_maker/main_window.gd | 5 ----- mml_linker/server.gd | 1 + 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/material_maker/main_window.gd b/material_maker/main_window.gd index 9107ee774..57d2c76bc 100644 --- a/material_maker/main_window.gd +++ b/material_maker/main_window.gd @@ -103,7 +103,6 @@ const MENU = [ { menu="Tools/Set painting environment", submenu="paint_environment", mode="paint", not_in_ports=["HTML5"] }, { menu="Tools/-" }, { menu="Tools/Environment editor", command="environment_editor", not_in_ports=["HTML5"] }, - { menu="Tools/Start server", command="start_server" }, #{ menu="Tools/Generate screenshots for the library nodes", command="generate_screenshots", mode="material" }, { menu="Help/User manual", command="show_doc", shortcut="F1" }, @@ -921,10 +920,6 @@ func _on_PaintEnvironment_id_pressed(id) -> void: func environment_editor() -> void: add_child(load("res://material_maker/windows/environment_editor/environment_editor.tscn").instance()) - -func start_server() -> void: - add_child(load("res://mml_linker/server.tscn").instance()) - # ----------------------------------------------------------------------- # Help menu diff --git a/mml_linker/server.gd b/mml_linker/server.gd index 3b465709d..888273e2e 100644 --- a/mml_linker/server.gd +++ b/mml_linker/server.gd @@ -132,6 +132,7 @@ func _on_data(id): inform_and_send(id, "Parameter changed, render finished and transfered.") "set_multiple_parameters": + # Unfortunately, something changed with 1.2 that this (from the "Submit Ptex to MM" button in Blender) causes MM to hang until an error occurs (still works after that) for parameter_string in data["parameters"]: var material = "dummy" var parameter = parse_json(parameter_string)