From 201f911f75f04b694609e3d1312777ddf01e685d Mon Sep 17 00:00:00 2001 From: RodZill4 Date: Tue, 24 Sep 2019 22:25:46 +0200 Subject: [PATCH] More progress on remote and various fixes --- addons/material_maker/engine/gen_material.gd | 21 +++-- addons/material_maker/engine/gen_remote.gd | 29 ++++++- addons/material_maker/engine/gen_switch.gd | 2 +- addons/material_maker/engine/renderer.gd | 11 +-- addons/material_maker/engine/renderer.tscn | 1 - addons/material_maker/main_window.tscn | 1 + addons/material_maker/nodes/generic.gd | 83 +++++++++++-------- addons/material_maker/nodes/remote.gd | 82 ++++++++++-------- addons/material_maker/nodes/remote.tscn | 8 +- .../widgets/linked_widgets/config_control.gd | 16 +--- .../widgets/linked_widgets/link.gd | 79 ++++++++++++++---- .../widgets/linked_widgets/linked_control.gd | 15 +++- .../linked_widgets/linked_control_base.gd | 13 ++- .../linked_control_buttons.tscn | 60 +------------- project.godot | 18 ++++ 15 files changed, 257 insertions(+), 182 deletions(-) diff --git a/addons/material_maker/engine/gen_material.gd b/addons/material_maker/engine/gen_material.gd index abd407f..ac4439b 100644 --- a/addons/material_maker/engine/gen_material.gd +++ b/addons/material_maker/engine/gen_material.gd @@ -13,7 +13,7 @@ const TEXTURE_LIST = [ { port=2, texture="roughness" }, { port=3, texture="emission" }, { port=4, texture="normal_texture" }, - { port=5, texture="ambient_occlusion" }, + { port=5, texture="ao_texture" }, { port=6, texture="depth_texture" } ] @@ -34,9 +34,12 @@ func get_type_name(): func get_parameter_defs(): return [ { name="albedo_color", label="Albedo", type="color", default={ r=1.0, g=1.0, b=1.0, a=1.0} }, - { name="metallic", label="Metallic", type="float", min=0.0, max=1.0, default=1.0 }, - { name="roughness", label="Roughness", type="float", min=0.0, max=1.0, default=1.0 }, - { name="emission_energy", label="Emission", type="float", min=0.0, max=8.0, default=1.0 } + { name="metallic", label="Metallic", type="float", min=0.0, max=1.0, step=0.05, default=1.0 }, + { name="roughness", label="Roughness", type="float", min=0.0, max=1.0, step=0.05, default=1.0 }, + { name="emission_energy", label="Emission", type="float", min=0.0, max=8.0, step=0.05, default=1.0 }, + { name="normal_scale", label="Normal", type="float", min=0.0, max=8.0, step=0.05, default=1.0 }, + { name="ao_light_affect", label="Ambient occlusion", type="float", min=0.0, max=1.0, step=0.05, default=1.0 }, + { name="depth_scale", label="Depth", type="float", min=0.0, max=1.0, step=0.05, default=1.0 } ] func get_input_defs(): @@ -46,6 +49,7 @@ func get_input_defs(): { name="roughness_texture", label="", type="f" }, { name="emission_texture", label="", type="rgb" }, { name="normal_texture", label="", type="rgb" }, + { name="ao_texture", label="", type="f" }, { name="depth_texture", label="", type="f" } ] @@ -124,23 +128,24 @@ func update_spatial_material(m, file_prefix = null): if Engine.editor_hint: if (generated_textures.mrao.mask & (1 << 2)) != 0: m.ao_enabled = true - #m.ao_light_affect = parameters.ao_light_affect + m.ao_light_affect = parameters.ao_light_affect m.ao_texture = m.metallic_texture m.ao_texture_channel = SpatialMaterial.TEXTURE_CHANNEL_BLUE else: m.ao_enabled = false else: - texture = get_generated_texture("ambient_occlusion", file_prefix) + texture = get_generated_texture("ao_texture", file_prefix) if texture != null: m.ao_enabled = true - #m.ao_light_affect = parameters.ao_light_affect + m.ao_light_affect = parameters.ao_light_affect m.ao_texture = texture else: m.ao_enabled = false texture = get_generated_texture("depth_texture", file_prefix) if texture != null: m.depth_enabled = true - #m.depth_scale = parameters.depth_scale + m.depth_deep_parallax = true + m.depth_scale = parameters.depth_scale m.depth_texture = texture else: m.depth_enabled = false diff --git a/addons/material_maker/engine/gen_remote.gd b/addons/material_maker/engine/gen_remote.gd index e0d5976..954c533 100644 --- a/addons/material_maker/engine/gen_remote.gd +++ b/addons/material_maker/engine/gen_remote.gd @@ -18,7 +18,7 @@ func set_widgets(w): i += 1 func get_type(): - return "remot" + return "remote" func get_type_name(): return "Remote" @@ -68,3 +68,30 @@ func _serialize(data): data.type = "remote" data.widgets = widgets return data + +func create_linked_control(label): + var index = widgets.size() + widgets.push_back({ label=label, type="linked_control", linked_widgets=[] }) + return index + +func create_config_control(label): + var index = widgets.size() + widgets.push_back({ label=label, type="config_control", linked_widgets=[], configurations=[] }) + return index + +func can_link_parameter(index, generator, param): + return true + +func link_parameter(index, generator, param): + if !can_link_parameter(index, generator, param): + return + widgets[index].linked_widgets.push_back({ node=generator.name, widget=param }) + if widgets[index].linked_widgets.size() == 1: + parameters["param"+str(index)] = generator.parameters[param] + emit_signal("parameter_changed", "", null) + +func remove_parameter(index): + for i in range(index, widgets.size()-2): + parameters["param"+str(i)] = parameters["param"+str(i+1)] + widgets.remove(index) + emit_signal("parameter_changed", "", null) \ No newline at end of file diff --git a/addons/material_maker/engine/gen_switch.gd b/addons/material_maker/engine/gen_switch.gd index f8f72a8..6ed0a96 100644 --- a/addons/material_maker/engine/gen_switch.gd +++ b/addons/material_maker/engine/gen_switch.gd @@ -31,7 +31,7 @@ func get_output_defs(): return rv func source_changed(input_index : int): - notify_output_change(input_index % parameters.outputs) + notify_output_change(input_index % int(parameters.outputs)) func _get_shader_code(uv : String, output_index : int, context : MMGenContext): var source = get_source(output_index+parameters.source*parameters.outputs) diff --git a/addons/material_maker/engine/renderer.gd b/addons/material_maker/engine/renderer.gd index 14d7420..ea28b29 100644 --- a/addons/material_maker/engine/renderer.gd +++ b/addons/material_maker/engine/renderer.gd @@ -6,6 +6,7 @@ export(String) var debug_path = null var debug_file_index : int = 0 var rendering : bool = false +signal done func _ready(): $ColorRect.material = $ColorRect.material.duplicate(true) @@ -70,9 +71,8 @@ func setup_material(shader_material, textures, shader_code): shader_material.shader.code = shader_code func render_shader(shader, textures, render_size): - if rendering: - print("Already rendering...") - return false + while rendering: + yield(self, "done") rendering = true if debug_path != null and debug_path != "": var f = File.new() @@ -91,6 +91,7 @@ func render_shader(shader, textures, render_size): render_target_update_mode = Viewport.UPDATE_ONCE update_worlds() yield(get_tree(), "idle_frame") - yield(get_tree(), "idle_frame") + #yield(get_tree(), "idle_frame") rendering = false - return true \ No newline at end of file + return true + emit_signal("done") diff --git a/addons/material_maker/engine/renderer.tscn b/addons/material_maker/engine/renderer.tscn index bbbdd44..e87b3b7 100644 --- a/addons/material_maker/engine/renderer.tscn +++ b/addons/material_maker/engine/renderer.tscn @@ -23,7 +23,6 @@ render_target_v_flip = true render_target_update_mode = 1 gui_disable_input = true script = ExtResource( 1 ) -debug_path = null [node name="ColorRect" type="ColorRect" parent="."] material = SubResource( 2 ) diff --git a/addons/material_maker/main_window.tscn b/addons/material_maker/main_window.tscn index fb86ec5..dd905c3 100644 --- a/addons/material_maker/main_window.tscn +++ b/addons/material_maker/main_window.tscn @@ -96,6 +96,7 @@ tab_align = 0 tab_close_display_policy = 1 [node name="Renderer" parent="." instance=ExtResource( 5 )] +debug_path = "" [node name="NodeFactory" type="Node" parent="."] script = ExtResource( 6 ) diff --git a/addons/material_maker/nodes/generic.gd b/addons/material_maker/nodes/generic.gd index cd8883b..1b4481b 100644 --- a/addons/material_maker/nodes/generic.gd +++ b/addons/material_maker/nodes/generic.gd @@ -1,14 +1,16 @@ tool extends GraphNode +class_name MMGraphNodeGeneric var generator = null setget set_generator var controls = {} +var ignore_parameter_change = false func set_generator(g): generator = g generator.connect("parameter_changed", self, "on_parameter_changed") - update_node() + call_deferred("update_node") func on_close_request(): generator.get_parent().remove_generator(generator) @@ -17,6 +19,8 @@ func on_offset_changed(): generator.position = offset func on_parameter_changed(p, v): + if ignore_parameter_change: + return var o = controls[p] if o is LineEdit: o.text = str(v) @@ -36,6 +40,7 @@ func on_parameter_changed(p, v): o.value = gradient else: print("unsupported widget "+str(o)) + update_shaders() func initialize_properties(): var parameter_names = [] @@ -67,21 +72,64 @@ func update_shaders(): get_parent().send_changed_signal() func _on_text_changed(new_text, variable): + ignore_parameter_change = true generator.set_parameter(variable, float(new_text)) + ignore_parameter_change = false update_shaders() func _on_value_changed(new_value, variable): + ignore_parameter_change = true generator.set_parameter(variable, new_value) + ignore_parameter_change = false update_shaders() func _on_color_changed(new_color, variable): + ignore_parameter_change = true generator.set_parameter(variable, new_color) + ignore_parameter_change = false update_shaders() func _on_gradient_changed(new_gradient, variable): + ignore_parameter_change = true generator.set_parameter(variable, new_gradient) + ignore_parameter_change = false update_shaders() +func create_parameter_control(p : Dictionary): + var control = null + if p.type == "float": + if p.has("widget") and p.widget == "spinbox": + control = SpinBox.new() + else: + control = HSlider.new() + control.min_value = p.min + control.max_value = p.max + control.step = 0.005 if !p.has("step") else p.step + control.allow_greater = true + control.allow_lesser = true + if p.has("default"): + control.value = p.default + control.rect_min_size.x = 80 + elif p.type == "size": + control = OptionButton.new() + for i in range(p.first, p.last+1): + var s = pow(2, i) + control.add_item("%dx%d" % [ s, s ]) + control.selected = 0 if !p.has("default") else p.default-p.first + elif p.type == "enum": + control = OptionButton.new() + for i in range(p.values.size()): + var value = p.values[i] + control.add_item(value.name) + control.selected = 0 if !p.has("default") else p.default + elif p.type == "boolean": + control = CheckBox.new() + elif p.type == "color": + control = ColorPickerButton.new() + elif p.type == "gradient": + control = preload("res://addons/material_maker/widgets/gradient_editor.tscn").instance() + return control + func update_node(): # Clean node var custom_node_buttons = null @@ -133,38 +181,7 @@ func update_node(): for p in generator.get_parameter_defs(): if !p.has("name") or !p.has("type"): continue - var control = null - if p.type == "float": - if p.has("widget") and p.widget == "spinbox": - control = SpinBox.new() - else: - control = HSlider.new() - control.min_value = p.min - control.max_value = p.max - control.step = 0.005 if !p.has("step") else p.step - control.allow_greater = true - control.allow_lesser = true - if p.has("default"): - control.value = p.default - control.rect_min_size.x = 80 - elif p.type == "size": - control = OptionButton.new() - for i in range(p.first, p.last+1): - var s = pow(2, i) - control.add_item("%dx%d" % [ s, s ]) - control.selected = 0 if !p.has("default") else p.default-p.first - elif p.type == "enum": - control = OptionButton.new() - for i in range(p.values.size()): - var value = p.values[i] - control.add_item(value.name) - control.selected = 0 if !p.has("default") else p.default - elif p.type == "boolean": - control = CheckBox.new() - elif p.type == "color": - control = ColorPickerButton.new() - elif p.type == "gradient": - control = preload("res://addons/material_maker/widgets/gradient_editor.tscn").instance() + var control = create_parameter_control(p) if control != null: var label = p.name control.name = label diff --git a/addons/material_maker/nodes/remote.gd b/addons/material_maker/nodes/remote.gd index 2f9d393..feb3d34 100644 --- a/addons/material_maker/nodes/remote.gd +++ b/addons/material_maker/nodes/remote.gd @@ -1,43 +1,56 @@ tool -extends "res://addons/material_maker/node_base.gd" +extends MMGraphNodeGeneric +class_name MMGraphNodeRemote const LinkedControl = preload("res://addons/material_maker/widgets/linked_widgets/linked_control.tscn") const ConfigControl = preload("res://addons/material_maker/widgets/linked_widgets/config_control.tscn") -var generator = null setget set_generator - -func set_generator(g): - generator = g - call_deferred("update_node") - +func add_control(text, control): + var index = $Controls.get_child_count() / 4 + var label = preload("res://addons/material_maker/widgets/linked_widgets/editable_label.tscn").instance() + label.set_text(text) + $Controls.add_child(label) + $Controls.add_child(control) + var button = Button.new() + button.icon = preload("res://addons/material_maker/icons/link.png") + $Controls.add_child(button) + button.connect("pressed", self, "_on_Link_pressed", [ index ]) + button = Button.new() + button.icon = preload("res://addons/material_maker/icons/remove.png") + $Controls.add_child(button) + button.connect("pressed", generator, "remove_parameter", [ index ]) func update_node(): - for w in generator.widgets: - var widget - if w.type == "linked_control": - widget = LinkedControl.instance() - elif w.type == "config_control": - widget = ConfigControl.instance() - else: - continue - add_control(widget) - widget.deserialize(w) - -func add_control(widget): - var controls = widget.get_associated_controls() - $Controls.add_child(controls.label) - $Controls.add_child(widget) - $Controls.add_child(controls.buttons) + var i : int = 0 + for c in $Controls.get_children(): + c.queue_free() + yield(get_tree(), "idle_frame") + controls = {} + for p in generator.get_parameter_defs(): + var control = create_parameter_control(p) + if control != null: + control.name = p.name + controls[control.name] = control + add_control(generator.widgets[i].label, control) + i += 1 + rect_size = Vector2(0, 0) + initialize_properties() func _on_AddLink_pressed(): - var widget = LinkedControl.instance() - add_control(widget) - widget.pick_linked() + var widget = Control.new() + add_control("Unnamed", widget) + var link = MMNodeLink.new(get_parent()) + link.pick(widget, generator, generator.create_linked_control("Unnamed"), true) func _on_AddConfig_pressed(): - var widget = ConfigControl.instance() - add_control(widget) - widget.pick_linked() + var widget = Control.new() + add_control("Unnamed", widget) + var link = MMNodeLink.new(get_parent()) + link.pick(widget, generator, generator.create_config_control("Unnamed"), true) + +func _on_Link_pressed(index): + var link = MMNodeLink.new(get_parent()) + link.pick($Controls.get_child(index*4+1), generator, index) func _on_Remote_resize_request(new_minsize): print("_on_Remote_resize_request") @@ -46,9 +59,8 @@ func _on_Remote_resize_request(new_minsize): func _on_HBoxContainer_minimum_size_changed(): print("_on_HBoxContainer_minimum_size_changed "+str($HBoxContainer.rect_min_size)) -func serialize(): - var widgets = [] - for i in range(1, $Controls.get_child_count(), 3): - widgets.append($Controls.get_child(i).serialize()) - var data = { type="remote", node_position={x=offset.x,y=offset.y}, editable=true, widgets=widgets } - return data +func on_parameter_changed(p, v): + if p == "": + update_node() + else: + .on_parameter_changed(p, v) \ No newline at end of file diff --git a/addons/material_maker/nodes/remote.tscn b/addons/material_maker/nodes/remote.tscn index 1c19a2e..941f019 100644 --- a/addons/material_maker/nodes/remote.tscn +++ b/addons/material_maker/nodes/remote.tscn @@ -1,14 +1,14 @@ [gd_scene load_steps=5 format=2] [ext_resource path="res://addons/material_maker/nodes/remote.gd" type="Script" id=1] -[ext_resource path="res://addons/material_maker/icons/link.png" type="Texture" id=2] -[ext_resource path="res://addons/material_maker/icons/config.png" type="Texture" id=3] +[ext_resource path="res://addons/material_maker/icons/add_link.png" type="Texture" id=2] +[ext_resource path="res://addons/material_maker/icons/add_config.png" type="Texture" id=3] [sub_resource type="Theme" id=1] [node name="Remote" type="GraphNode"] margin_right = 95.0 -margin_bottom = 55.0 +margin_bottom = 52.0 mouse_filter = 1 theme = SubResource( 1 ) title = "Remote" @@ -32,7 +32,7 @@ margin_left = 16.0 margin_top = 24.0 margin_right = 79.0 margin_bottom = 24.0 -columns = 3 +columns = 4 [node name="HBoxContainer" type="HBoxContainer" parent="."] margin_left = 16.0 diff --git a/addons/material_maker/widgets/linked_widgets/config_control.gd b/addons/material_maker/widgets/linked_widgets/config_control.gd index 5672a38..8100501 100644 --- a/addons/material_maker/widgets/linked_widgets/config_control.gd +++ b/addons/material_maker/widgets/linked_widgets/config_control.gd @@ -48,15 +48,8 @@ func duplicate_value(value): value = value.duplicate() return value -func apply_configuration(c): - for w in configurations[c]: - var value = duplicate_value(w.value) - w.widget.set(WIDGETS[get_widget_type(w.widget)].value_attr, value) - w.node.generator.set_parameter(w.widget.name, value) - var graph_node = get_parent() - while !(graph_node is GraphNode): - graph_node = graph_node.get_parent() - graph_node.update_shaders() +func apply_configuration(i): + get_parent().get_parent().generator.set_parameter("param"+str(get_index()%4-1), i) func do_update_configuration(name): var configuration = [] @@ -78,7 +71,7 @@ func _on_item_selected(ID): if ID >= 0 && ID < count: current = button.get_item_text(ID) update_options() - apply_configuration(current) + apply_configuration(ID) elif ID == count+1: button.selected = 0 update_configuration() @@ -116,10 +109,9 @@ func deserialize(data): var configuration = [] for e in c: var node = graph_edit.get_node("node_"+e.node) - print(e.widget) var widget = null for w in node.controls: - if w.name == e.widget: + if w == e.widget: widget = w break configuration.append({ node=node, widget=widget, value=Types.deserialize_value(e.value) }) diff --git a/addons/material_maker/widgets/linked_widgets/link.gd b/addons/material_maker/widgets/linked_widgets/link.gd index 368bb0b..7d3df28 100644 --- a/addons/material_maker/widgets/linked_widgets/link.gd +++ b/addons/material_maker/widgets/linked_widgets/link.gd @@ -1,33 +1,84 @@ +tool extends Control +class_name MMNodeLink -var clip_pos = Vector2(0, 0) -var clip_size = Vector2(0, 0) var end var source = null var target = null -func _ready(): - mouse_filter = Control.MOUSE_FILTER_IGNORE +var generator = null +var param_index = 0 +var creating = false -func clip(p, s): - clip_pos = p - rect_global_position = Vector2(0, 0) - rect_size = s +func _init(parent): + size_flags_horizontal = SIZE_EXPAND_FILL + size_flags_vertical = SIZE_EXPAND_FILL + rect_size = parent.rect_size rect_clip_content = true + parent.add_child(self) + +func pick(s, g, i, c = false): + source = s + end = get_global_transform().xform_inv(source.get_global_transform().xform(0.5*source.rect_size)) + generator = g + param_index = i + creating = c + set_process_input(true) + +func show_link(s, t): + set_process_input(false) + mouse_filter = Control.MOUSE_FILTER_IGNORE + source = s + target = t + update() func closest(rect, point): return Vector2(max(rect.position.x, min(rect.end.x, point.x)), max(rect.position.y, min(rect.end.y, point.y))) +func find_control(gp): + for c in get_parent().get_children(): + if c is GraphNode: + if c.get("controls") != null: + for w in c.controls: + var widget = c.controls[w] + if Rect2(widget.rect_global_position, widget.rect_size*widget.get_global_transform().get_scale()).has_point(gp): + return { node=c, widget=widget } + return null + func _draw(): - var start = source.rect_global_position+0.5*source.rect_size*source.get_global_transform().get_scale() + draw_rect(Rect2(rect_position, rect_size), Color(1.0, 0.0, 0.0, 0.2)) + draw_rect(Rect2(rect_position, rect_size), Color(1.0, 1.0, 0.0), false) + var start = get_global_transform().xform_inv(source.get_global_transform().xform(0.5*source.rect_size)) var color = Color(1, 0.5, 0.5, 0.5) var rect if target != null: color = Color(0.5, 1, 0.5, 0.5) - rect = Rect2(target.rect_global_position, target.rect_size*target.get_global_transform().get_scale()) - draw_rect(Rect2(rect.position-clip_pos, rect.size), color, false) + rect = get_global_transform().xform_inv(target.get_global_transform().xform(Rect2(Vector2(0, 0), target.rect_size))) + draw_rect(rect, color, false) end = closest(rect, start) - rect = Rect2(source.rect_global_position, source.rect_size*source.get_global_transform().get_scale()) - draw_rect(Rect2(rect.position-clip_pos, rect.size), color, false) + rect = get_global_transform().xform_inv(source.get_global_transform().xform(Rect2(Vector2(0, 0), source.rect_size))) + draw_rect(rect, color, false) start = closest(rect, end) - draw_line(start-clip_pos, end-clip_pos, color, 1, true) + draw_line(start, end, color, 1, true) + +func _input(event): + if event is InputEventKey: + if event.scancode == KEY_ESCAPE: + set_process_input(false) + queue_free() + elif event is InputEventMouseMotion: + var control = find_control(event.global_position) + end = get_global_transform().xform_inv(event.global_position) + target = control.widget if control != null and generator.can_link_parameter(param_index, control.node.generator, control.widget.name) else null + update() + elif event is InputEventMouseButton: + if event.pressed: + if event.button_index == BUTTON_LEFT: + var control = find_control(event.global_position) + if control != null: + generator.link_parameter(param_index, control.node.generator, control.widget.name) + elif creating: + generator.remove_parameter(param_index) + set_process_input(false) + queue_free() + get_tree().set_input_as_handled() diff --git a/addons/material_maker/widgets/linked_widgets/linked_control.gd b/addons/material_maker/widgets/linked_widgets/linked_control.gd index 5f24ccd..82ebee5 100644 --- a/addons/material_maker/widgets/linked_widgets/linked_control.gd +++ b/addons/material_maker/widgets/linked_widgets/linked_control.gd @@ -77,19 +77,28 @@ func _on_value_changed(v): func _on_color_changed(c): for l in linked_widgets: l.widget.color = c - l.node.parameters[l.widget.name] = c + var parent = l.widget.get_parent() + while !(parent is GraphNode): + parent = parent.get_parent() + parent.generator.set_parameter(l.widget.name, c) update_shaders() func _on_item_selected(i): for l in linked_widgets: l.widget.selected = i - l.node.parameters[l.widget.name] = i + var parent = l.widget.get_parent() + while !(parent is GraphNode): + parent = parent.get_parent() + parent.generator.set_parameter(l.widget.name, i) update_shaders() func _on_gradient_updated(g): for l in linked_widgets: l.widget.value = g - l.node.parameters[l.widget.name] = g + var parent = l.widget.get_parent() + while !(parent is GraphNode): + parent = parent.get_parent() + parent.generator.set_parameter(l.widget.name, g) update_shaders() func serialize(): diff --git a/addons/material_maker/widgets/linked_widgets/linked_control_base.gd b/addons/material_maker/widgets/linked_widgets/linked_control_base.gd index 19a3612..0952958 100644 --- a/addons/material_maker/widgets/linked_widgets/linked_control_base.gd +++ b/addons/material_maker/widgets/linked_widgets/linked_control_base.gd @@ -61,11 +61,9 @@ func _on_mouse_entered(): links = [] var viewport = get_viewport() for w in linked_widgets: - var link = Link.new() - link.clip(graph_edit.rect_global_position, graph_edit.rect_size) + var link = Link.new(graph_edit) link.source = self link.target = w.widget - graph_edit.add_child(link) links.append(link) func _on_mouse_exited(): @@ -90,8 +88,9 @@ func find_control(gp): if c is GraphNode: if c.get("controls") != null: for w in c.controls: - if Rect2(w.rect_global_position, w.rect_size*w.get_global_transform().get_scale()).has_point(gp): - return { node=c, widget=w } + var widget = c.controls[w] + if Rect2(widget.rect_global_position, widget.rect_size*widget.get_global_transform().get_scale()).has_point(gp): + return { node=c, widget=widget } return null func _input(event): @@ -123,11 +122,9 @@ func pick_linked(): return # Create line that will be shown when looking for a target var viewport = get_viewport() - link = Link.new() - link.clip(graph_edit.rect_global_position, graph_edit.rect_size) + link = Link.new(graph_edit) link.source = self link.end = rect_global_position+0.5*rect_size*get_global_transform().get_scale() - graph_edit.add_child(link) set_process_input(true) pointed_control = null diff --git a/addons/material_maker/widgets/linked_widgets/linked_control_buttons.tscn b/addons/material_maker/widgets/linked_widgets/linked_control_buttons.tscn index f87a71b..761e7c5 100644 --- a/addons/material_maker/widgets/linked_widgets/linked_control_buttons.tscn +++ b/addons/material_maker/widgets/linked_widgets/linked_control_buttons.tscn @@ -4,76 +4,22 @@ [ext_resource path="res://addons/material_maker/icons/link.png" type="Texture" id=2] [ext_resource path="res://addons/material_maker/icons/remove.png" type="Texture" id=3] -[node name="Buttons" type="HBoxContainer" index="0"] - -anchor_left = 0.0 -anchor_top = 0.0 -anchor_right = 0.0 -anchor_bottom = 0.0 +[node name="Buttons" type="HBoxContainer"] margin_right = 60.0 margin_bottom = 22.0 -rect_pivot_offset = Vector2( 0, 0 ) -rect_clip_content = false -mouse_filter = 1 -mouse_default_cursor_shape = 0 -size_flags_horizontal = 1 -size_flags_vertical = 1 -alignment = 0 script = ExtResource( 1 ) -[node name="Link" type="Button" parent="." index="0"] - -anchor_left = 0.0 -anchor_top = 0.0 -anchor_right = 0.0 -anchor_bottom = 0.0 +[node name="Link" type="Button" parent="."] margin_right = 28.0 margin_bottom = 22.0 -rect_pivot_offset = Vector2( 0, 0 ) -rect_clip_content = false hint_tooltip = "Link new parameter" -focus_mode = 2 -mouse_filter = 0 -mouse_default_cursor_shape = 0 -size_flags_horizontal = 1 -size_flags_vertical = 1 -toggle_mode = false -enabled_focus_mode = 2 -shortcut = null -group = null icon = ExtResource( 2 ) -flat = false -align = 1 -_sections_unfolded = [ "Hint" ] -[node name="Remove" type="Button" parent="." index="1"] - -anchor_left = 0.0 -anchor_top = 0.0 -anchor_right = 0.0 -anchor_bottom = 0.0 +[node name="Remove" type="Button" parent="."] margin_left = 32.0 margin_right = 60.0 margin_bottom = 22.0 -rect_pivot_offset = Vector2( 0, 0 ) -rect_clip_content = false hint_tooltip = "Delete this control" -focus_mode = 2 -mouse_filter = 0 -mouse_default_cursor_shape = 0 -size_flags_horizontal = 1 -size_flags_vertical = 1 -toggle_mode = false -enabled_focus_mode = 2 -shortcut = null -group = null icon = ExtResource( 3 ) -flat = false -align = 1 -_sections_unfolded = [ "Hint" ] - [connection signal="pressed" from="Link" to="." method="_on_Link_pressed"] - [connection signal="pressed" from="Remove" to="." method="_on_Remove_pressed"] - - diff --git a/project.godot b/project.godot index b80c364..0aab12b 100644 --- a/project.godot +++ b/project.godot @@ -84,6 +84,21 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://addons/material_maker/types/gradient.gd" }, { +"base": "GraphNode", +"class": "MMGraphNodeGeneric", +"language": "GDScript", +"path": "res://addons/material_maker/nodes/generic.gd" +}, { +"base": "MMGraphNodeGeneric", +"class": "MMGraphNodeRemote", +"language": "GDScript", +"path": "res://addons/material_maker/nodes/remote.gd" +}, { +"base": "Control", +"class": "MMNodeLink", +"language": "GDScript", +"path": "res://addons/material_maker/widgets/linked_widgets/link.gd" +}, { "base": "Node", "class": "MMType", "language": "GDScript", @@ -105,6 +120,9 @@ _global_script_class_icons={ "MMGenSwitch": "", "MMGenTexture": "", "MMGradient": "", +"MMGraphNodeGeneric": "", +"MMGraphNodeRemote": "", +"MMNodeLink": "", "MMType": "" }