From bf4a125386b12e98999b172a18774d6ba44fb893 Mon Sep 17 00:00:00 2001 From: RodZill4 Date: Fri, 26 Oct 2018 22:44:47 +0200 Subject: [PATCH] Node editor updates and support for alpha channel Added initial support for alpha channel (in combine, decompose and blend nodes). Textures with alpha channels can be exported using the material node albedo input. Updated node editor with a simple editor for enumerated parameters. --- addons/material_maker/main_window.tscn | 2 +- addons/material_maker/node_base.gd | 28 ++- addons/material_maker/nodes/blend/blend.gd | 4 +- .../material_maker/nodes/combine/combine.gd | 10 +- .../material_maker/nodes/combine/combine.tscn | 32 ++- .../nodes/decompose/decompose.gd | 8 +- .../nodes/decompose/decompose.tscn | 35 ++- .../nodes/material/material.tscn | 9 +- addons/material_maker/nodes/node_generic.gd | 2 +- addons/material_maker/renderer.gd | 2 +- addons/material_maker/renderer.tscn | 4 +- .../widgets/node_editor/enum_editor.gd | 12 + .../widgets/node_editor/enum_editor.tscn | 220 ++++++++++++++++++ .../widgets/node_editor/node_editor.tscn | 2 +- .../widgets/node_editor/parameter.gd | 75 +++++- .../widgets/node_editor/parameter.tscn | 10 +- .../material_maker/widgets/text_dialog.tscn | 5 +- 17 files changed, 421 insertions(+), 39 deletions(-) create mode 100644 addons/material_maker/widgets/node_editor/enum_editor.gd create mode 100644 addons/material_maker/widgets/node_editor/enum_editor.tscn diff --git a/addons/material_maker/main_window.tscn b/addons/material_maker/main_window.tscn index 1e75135..45f0ec0 100644 --- a/addons/material_maker/main_window.tscn +++ b/addons/material_maker/main_window.tscn @@ -7,7 +7,7 @@ [ext_resource path="res://addons/material_maker/renderer.tscn" type="PackedScene" id=5] [ext_resource path="res://addons/material_maker/node_factory.gd" type="Script" id=6] -[node name="MainWindow" type="Panel" index="0"] +[node name="MainWindow" type="Panel"] anchor_left = 0.0 anchor_top = 0.0 diff --git a/addons/material_maker/node_base.gd b/addons/material_maker/node_base.gd index 5bc44f7..c4b1830 100644 --- a/addons/material_maker/node_base.gd +++ b/addons/material_maker/node_base.gd @@ -116,15 +116,15 @@ func get_source_f(source): var rv if source.has("f"): rv = source.f - elif source.has("rgb"): + elif source.has("rgb") or source.has("rgba"): rv = "dot("+source.rgb+", vec3(1.0))/3.0" else: rv = "***error***" return rv - + func get_source_rgb(source): var rv - if source.has("rgb"): + if source.has("rgb") or source.has("rgba"): rv = source.rgb elif source.has("f"): rv = "vec3("+source.f+")" @@ -132,6 +132,18 @@ func get_source_rgb(source): rv = "***error***" return rv +func get_source_rgba(source): + var rv + if source.has("rgba"): + rv = source.rgba + elif source.has("rgb"): + rv = "vec4("+source.rgb+", 1.0)" + elif source.has("f"): + rv = "vec4(vec3("+source.f+"), 1.0)" + else: + rv = "***error***" + return rv + func reset(): generated = false generated_variants = [] @@ -145,13 +157,17 @@ func get_shader_code(uv, slot = 0): if !rv.has("f"): if rv.has("rgb"): rv.f = "(dot("+rv.rgb+", vec3(1.0))/3.0)" + elif rv.has("rgba"): + rv.f = "(dot("+rv.rgba+".rgb, vec3(1.0))/3.0)" else: rv.f = "0.0" if !rv.has("rgb"): - if rv.has("f"): - rv.rgb = "vec3("+rv.f+")" + if rv.has("rgba"): + rv.rgb = rv.rgba+".rgb" else: - rv.f = "vec3(0.0)" + rv.rgb = "vec3("+rv.f+")" + if !rv.has("rgba"): + rv.rgba = "vec4("+rv.rgb+", 1.0)" return rv func get_shader_code_with_globals(uv, slot = 0): diff --git a/addons/material_maker/nodes/blend/blend.gd b/addons/material_maker/nodes/blend/blend.gd index 32695c7..fe7a8bb 100644 --- a/addons/material_maker/nodes/blend/blend.gd +++ b/addons/material_maker/nodes/blend/blend.gd @@ -43,8 +43,8 @@ func _get_shader_code(uv): variant_index = generated_variants.size() generated_variants.append(uv) rv.code = src0_code.code+src1_code.code+src2_code.code - rv.code += "vec3 %s_%d_rgb = blend_%s(%s, %s, %s, %s);\n" % [ name, variant_index, BLEND_TYPES[parameters.blend_type].shortname, uv, src0_code.rgb, src1_code.rgb, amount_str ] - rv.rgb = "%s_%d_rgb" % [ name, variant_index ] + rv.code += "vec4 %s_%d_rgba = vec4(blend_%s(%s, %s, %s, %s * %s.a), min(1.0, %s.a + %s * %s.a));\n" % [ name, variant_index, BLEND_TYPES[parameters.blend_type].shortname, uv, src0_code.rgb, src1_code.rgb, amount_str, src0_code.rgba, src1_code.rgba, amount_str, src0_code.rgba ] + rv.rgba = "%s_%d_rgba" % [ name, variant_index ] return rv func _get_state_variables(): diff --git a/addons/material_maker/nodes/combine/combine.gd b/addons/material_maker/nodes/combine/combine.gd index 46ab830..851c070 100644 --- a/addons/material_maker/nodes/combine/combine.gd +++ b/addons/material_maker/nodes/combine/combine.gd @@ -6,19 +6,24 @@ func _get_shader_code(uv): var src0 = get_source(0) var src1 = get_source(1) var src2 = get_source(2) + var src3 = get_source(3) var src0_code = { defs="", code="", f="0.0" } var src1_code = { defs="", code="", f="0.0" } var src2_code = { defs="", code="", f="0.0" } + var src3_code = { defs="", code="", f="1.0" } if src0 != null: src0_code = src0.get_shader_code(uv) if src1 != null: src1_code = src1.get_shader_code(uv) if src2 != null: src2_code = src2.get_shader_code(uv) + if src3 != null: + src3_code = src3.get_shader_code(uv) if generated_variants.empty(): rv.defs = src0_code.defs; rv.defs += src1_code.defs; rv.defs += src2_code.defs; + rv.defs += src3_code.defs; var variant_index = generated_variants.find(uv) if variant_index == -1: variant_index = generated_variants.size() @@ -26,6 +31,7 @@ func _get_shader_code(uv): rv.code = src0_code.code rv.code += src1_code.code rv.code += src2_code.code - rv.code += "vec3 %s_%d_rgb = vec3(%s, %s, %s);\n" % [ name, variant_index, src0_code.f, src1_code.f, src2_code.f ] - rv.rgb = "%s_%d_rgb" % [ name, variant_index ] + rv.code += src3_code.code + rv.code += "vec4 %s_%d_rgba = vec4(%s, %s, %s, %s);\n" % [ name, variant_index, src0_code.f, src1_code.f, src2_code.f, src3_code.f ] + rv.rgba = "%s_%d_rgba" % [ name, variant_index ] return rv diff --git a/addons/material_maker/nodes/combine/combine.tscn b/addons/material_maker/nodes/combine/combine.tscn index 78add66..95fc506 100644 --- a/addons/material_maker/nodes/combine/combine.tscn +++ b/addons/material_maker/nodes/combine/combine.tscn @@ -2,7 +2,6 @@ [ext_resource path="res://addons/material_maker/nodes/combine/combine.gd" type="Script" id=1] - [sub_resource type="Theme" id=1] @@ -35,7 +34,7 @@ slot/0/left_type = 0 slot/0/left_color = Color( 0.756863, 0.756863, 0.756863, 1 ) slot/0/right_enabled = true slot/0/right_type = 0 -slot/0/right_color = Color( 0.5, 0.5, 1, 1 ) +slot/0/right_color = Color( 0.414353, 1, 0.388902, 0.353608 ) slot/1/left_enabled = true slot/1/left_type = 0 slot/1/left_color = Color( 0.756863, 0.756863, 0.756863, 1 ) @@ -48,8 +47,14 @@ slot/2/left_color = Color( 0.756863, 0.756863, 0.756863, 1 ) slot/2/right_enabled = false slot/2/right_type = 0 slot/2/right_color = Color( 0.498039, 0.498039, 1, 1 ) +slot/3/left_enabled = true +slot/3/left_type = 0 +slot/3/left_color = Color( 0.756863, 0.756863, 0.756863, 1 ) +slot/3/right_enabled = false +slot/3/right_type = 0 +slot/3/right_color = Color( 1, 1, 1, 1 ) script = ExtResource( 1 ) -_sections_unfolded = [ "Theme", "slot", "slot/0", "slot/1", "slot/2" ] +_sections_unfolded = [ "Theme", "slot", "slot/0", "slot/1", "slot/2", "slot/3" ] [node name="R" type="Label" parent="." index="0"] @@ -114,4 +119,25 @@ percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 +[node name="A" type="Label" parent="." index="3"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 16.0 +margin_top = 68.0 +margin_right = 86.0 +margin_bottom = 82.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 2 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 4 +text = "A" +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + diff --git a/addons/material_maker/nodes/decompose/decompose.gd b/addons/material_maker/nodes/decompose/decompose.gd index 6731b81..d42510f 100644 --- a/addons/material_maker/nodes/decompose/decompose.gd +++ b/addons/material_maker/nodes/decompose/decompose.gd @@ -1,12 +1,12 @@ tool extends "res://addons/material_maker/node_base.gd" -const OUTPUTS = [ "r", "g", "b" ] +const OUTPUTS = [ "r", "g", "b", "a" ] func _get_shader_code(uv, output = 0): var rv = { defs="", code="" } var src = get_source() - var src_code = { defs="", code="", f="0.0" } + var src_code = { defs="", code="", rgba="vec4(0.0)" } if src != null: src_code = src.get_shader_code(uv) if generated_variants.empty(): @@ -16,6 +16,6 @@ func _get_shader_code(uv, output = 0): variant_index = generated_variants.size() generated_variants.append(uv) rv.code = src_code.code - rv.code += "vec3 %s_%d_rgb = %s;\n" % [ name, variant_index, src_code.rgb ] - rv.f = "%s_%d_rgb.%s" % [ name, variant_index, OUTPUTS[output] ] + rv.code += "vec4 %s_%d_rgba = %s;\n" % [ name, variant_index, src_code.rgba ] + rv.f = "%s_%d_rgba.%s" % [ name, variant_index, OUTPUTS[output] ] return rv diff --git a/addons/material_maker/nodes/decompose/decompose.tscn b/addons/material_maker/nodes/decompose/decompose.tscn index 874ca50..3e6c074 100644 --- a/addons/material_maker/nodes/decompose/decompose.tscn +++ b/addons/material_maker/nodes/decompose/decompose.tscn @@ -2,11 +2,10 @@ [ext_resource path="res://addons/material_maker/nodes/decompose/decompose.gd" type="Script" id=1] - [sub_resource type="Theme" id=1] -[node name="Decompose" type="GraphNode" index="0"] +[node name="Decompose" type="GraphNode"] anchor_left = 0.0 anchor_top = 0.0 @@ -32,7 +31,7 @@ comment = false overlay = 0 slot/0/left_enabled = true slot/0/left_type = 0 -slot/0/left_color = Color( 0.498039, 0.498039, 1, 1 ) +slot/0/left_color = Color( 0.411765, 1, 0.388235, 0.352941 ) slot/0/right_enabled = true slot/0/right_type = 0 slot/0/right_color = Color( 0.756863, 0.756863, 0.756863, 1 ) @@ -48,8 +47,14 @@ slot/2/left_color = Color( 0.756863, 0.756863, 0.756863, 1 ) slot/2/right_enabled = true slot/2/right_type = 0 slot/2/right_color = Color( 0.756863, 0.756863, 0.756863, 1 ) +slot/3/left_enabled = false +slot/3/left_type = 0 +slot/3/left_color = Color( 1, 1, 1, 1 ) +slot/3/right_enabled = true +slot/3/right_type = 0 +slot/3/right_color = Color( 0.756863, 0.756863, 0.756863, 1 ) script = ExtResource( 1 ) -_sections_unfolded = [ "Theme", "slot", "slot/0", "slot/1", "slot/2" ] +_sections_unfolded = [ "Theme", "slot", "slot/0", "slot/1", "slot/2", "slot/3" ] [node name="R" type="Label" parent="." index="0"] @@ -117,4 +122,26 @@ percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 +[node name="A" type="Label" parent="." index="3"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 16.0 +margin_top = 68.0 +margin_right = 106.0 +margin_bottom = 82.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 2 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 4 +text = "A" +align = 2 +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + diff --git a/addons/material_maker/nodes/material/material.tscn b/addons/material_maker/nodes/material/material.tscn index 7cbd341..d52981b 100644 --- a/addons/material_maker/nodes/material/material.tscn +++ b/addons/material_maker/nodes/material/material.tscn @@ -2,7 +2,6 @@ [ext_resource path="res://addons/material_maker/nodes/material/material.gd" type="Script" id=1] - [sub_resource type="Theme" id=1] @@ -30,13 +29,13 @@ comment = false overlay = 0 slot/0/left_enabled = false slot/0/left_type = 0 -slot/0/left_color = Color( 0.5, 0.5, 1, 1 ) +slot/0/left_color = Color( 0.411765, 1, 0.388235, 0.352941 ) slot/0/right_enabled = false slot/0/right_type = 0 slot/0/right_color = Color( 0.5, 0.5, 1, 1 ) slot/1/left_enabled = true slot/1/left_type = 0 -slot/1/left_color = Color( 0.5, 0.5, 1, 1 ) +slot/1/left_color = Color( 0.411765, 1, 0.388235, 0.352941 ) slot/1/right_enabled = false slot/1/right_type = 0 slot/1/right_color = Color( 0.5, 0.5, 1, 1 ) @@ -72,12 +71,12 @@ slot/6/right_type = 0 slot/6/right_color = Color( 0.498039, 0.498039, 1, 1 ) slot/7/left_enabled = true slot/7/left_type = 0 -slot/7/left_color = Color( 0.494118, 0.494118, 1, 1 ) +slot/7/left_color = Color( 0.756863, 0.756863, 0.756863, 1 ) slot/7/right_enabled = false slot/7/right_type = 0 slot/7/right_color = Color( 0.494118, 0.494118, 1, 1 ) script = ExtResource( 1 ) -_sections_unfolded = [ "Theme", "slot", "slot/0", "slot/1", "slot/2", "slot/5" ] +_sections_unfolded = [ "Theme", "slot", "slot/0", "slot/1", "slot/2", "slot/5", "slot/7" ] [node name="resolution" type="OptionButton" parent="." index="0"] diff --git a/addons/material_maker/nodes/node_generic.gd b/addons/material_maker/nodes/node_generic.gd index 72cc9fb..dc1ece5 100644 --- a/addons/material_maker/nodes/node_generic.gd +++ b/addons/material_maker/nodes/node_generic.gd @@ -157,7 +157,7 @@ func _get_shader_code(uv, slot = 0): func get_globals(): var list = .get_globals() - if model_data.has("global") and list.find(model_data.global) == -1: + if typeof(model_data) == TYPE_DICTIONARY and model_data.has("global") and list.find(model_data.global) == -1: list.append(model_data.global) return list diff --git a/addons/material_maker/renderer.gd b/addons/material_maker/renderer.gd index e2f00b1..79d6e2e 100644 --- a/addons/material_maker/renderer.gd +++ b/addons/material_maker/renderer.gd @@ -21,7 +21,7 @@ static func generate_shader(src_code): var shader_code = src_code.defs shader_code += "void fragment() {\n" shader_code += src_code.code - shader_code += "COLOR = vec4("+src_code.rgb+", 1.0);\n" + shader_code += "COLOR = "+src_code.rgba+";\n" shader_code += "}\n" #print("GENERATED SHADER:\n"+shader_code) code += shader_code diff --git a/addons/material_maker/renderer.tscn b/addons/material_maker/renderer.tscn index edf9cfd..49f0def 100644 --- a/addons/material_maker/renderer.tscn +++ b/addons/material_maker/renderer.tscn @@ -16,13 +16,13 @@ void fragment() { render_priority = 0 shader = SubResource( 1 ) -[node name="Renderer" type="Viewport"] +[node name="Renderer" type="Viewport" index="0"] arvr = false size = Vector2( 0, 0 ) own_world = true world = null -transparent_bg = false +transparent_bg = true msaa = 2 hdr = false disable_3d = false diff --git a/addons/material_maker/widgets/node_editor/enum_editor.gd b/addons/material_maker/widgets/node_editor/enum_editor.gd new file mode 100644 index 0000000..f1b00dd --- /dev/null +++ b/addons/material_maker/widgets/node_editor/enum_editor.gd @@ -0,0 +1,12 @@ +tool +extends WindowDialog + +signal ok + +func set_value(n, v): + $VBoxContainer/GridContainer/name.text = n + $VBoxContainer/GridContainer/value.text = v + +func _on_OK_pressed(): + emit_signal("ok", $VBoxContainer/GridContainer/name.text, $VBoxContainer/GridContainer/value.text) + queue_free() diff --git a/addons/material_maker/widgets/node_editor/enum_editor.tscn b/addons/material_maker/widgets/node_editor/enum_editor.tscn new file mode 100644 index 0000000..615c370 --- /dev/null +++ b/addons/material_maker/widgets/node_editor/enum_editor.tscn @@ -0,0 +1,220 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/material_maker/widgets/node_editor/enum_editor.gd" type="Script" id=1] + +[node name="EnumEditor" type="WindowDialog" index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 137.0 +margin_bottom = 79.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +popup_exclusive = true +window_title = "Enum Editor" +resizable = false +script = ExtResource( 1 ) +_sections_unfolded = [ "Popup" ] + +[node name="VBoxContainer" type="VBoxContainer" parent="." index="1"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 1.0 +anchor_bottom = 1.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 + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer" index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 137.0 +margin_bottom = 52.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 +columns = 2 + +[node name="Label1" type="Label" parent="VBoxContainer/GridContainer" index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 42.0 +margin_bottom = 19.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 2 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 4 +text = "Name:" +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + +[node name="name" type="LineEdit" parent="VBoxContainer/GridContainer" index="1"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 46.0 +margin_right = 137.0 +margin_bottom = 24.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +focus_mode = 2 +mouse_filter = 0 +mouse_default_cursor_shape = 1 +size_flags_horizontal = 3 +size_flags_vertical = 1 +focus_mode = 2 +context_menu_enabled = true +placeholder_alpha = 0.6 +caret_blink = false +caret_blink_speed = 0.65 +caret_position = 0 + +[node name="Label2" type="Label" parent="VBoxContainer/GridContainer" index="2"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 33.0 +margin_right = 42.0 +margin_bottom = 47.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 2 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 4 +text = "Value:" +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + +[node name="value" type="LineEdit" parent="VBoxContainer/GridContainer" index="3"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 46.0 +margin_top = 28.0 +margin_right = 137.0 +margin_bottom = 52.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +focus_mode = 2 +mouse_filter = 0 +mouse_default_cursor_shape = 1 +size_flags_horizontal = 3 +size_flags_vertical = 1 +focus_mode = 2 +context_menu_enabled = true +placeholder_alpha = 0.6 +caret_blink = false +caret_blink_speed = 0.65 +caret_position = 0 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer" index="1"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 6.0 +margin_top = 56.0 +margin_right = 130.0 +margin_bottom = 76.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 1 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 4 +size_flags_vertical = 0 +alignment = 0 +_sections_unfolded = [ "Size Flags" ] + +[node name="OK" type="Button" parent="VBoxContainer/HBoxContainer" index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 60.0 +margin_bottom = 20.0 +rect_min_size = Vector2( 60, 0 ) +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +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 +text = "OK" +flat = false +align = 1 +_sections_unfolded = [ "Rect" ] + +[node name="Cancel" type="Button" parent="VBoxContainer/HBoxContainer" index="1"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 64.0 +margin_right = 124.0 +margin_bottom = 20.0 +rect_min_size = Vector2( 60, 0 ) +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +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 +text = "Cancel" +flat = false +align = 1 +_sections_unfolded = [ "Rect" ] + +[connection signal="text_entered" from="VBoxContainer/GridContainer/name" to="." method="_on_LineEdit_text_entered"] + +[connection signal="text_entered" from="VBoxContainer/GridContainer/value" to="." method="_on_LineEdit_text_entered"] + +[connection signal="pressed" from="VBoxContainer/HBoxContainer/OK" to="." method="_on_OK_pressed"] + +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Cancel" to="." method="queue_free"] + + diff --git a/addons/material_maker/widgets/node_editor/node_editor.tscn b/addons/material_maker/widgets/node_editor/node_editor.tscn index 83c2a30..d1bd303 100644 --- a/addons/material_maker/widgets/node_editor/node_editor.tscn +++ b/addons/material_maker/widgets/node_editor/node_editor.tscn @@ -3,7 +3,7 @@ [ext_resource path="res://addons/material_maker/widgets/node_editor/node_editor.gd" type="Script" id=1] [ext_resource path="res://addons/material_maker/icons/plus.png" type="Texture" id=2] -[node name="NodeEditor" type="WindowDialog" index="0"] +[node name="NodeEditor" type="WindowDialog"] anchor_left = 0.0 anchor_top = 0.0 diff --git a/addons/material_maker/widgets/node_editor/parameter.gd b/addons/material_maker/widgets/node_editor/parameter.gd index b03d1cd..e8e351e 100644 --- a/addons/material_maker/widgets/node_editor/parameter.gd +++ b/addons/material_maker/widgets/node_editor/parameter.gd @@ -5,8 +5,18 @@ var size_first = 0 var size_last = 12 var size_default = 8 +var enum_values = null +var enum_current = 0 + const PARAMETER_TYPE = [ "float", "size", "enum", "boolean" ] +const ENUM_ADD = -1 +const ENUM_EDIT = -2 +const ENUM_REMOVE = -3 +const ENUM_UP = -4 +const ENUM_DOWN = -5 + + func _ready(): pass @@ -66,6 +76,9 @@ func set_model_data(data): elif data.type == "enum": $Type.selected = 2 w = $Types/T2 + data = data.duplicate() + enum_values = data.values + update_enum_list() elif data.type == "boolean": $Type.selected = 3 w = $Types/T3 @@ -88,12 +101,72 @@ func get_model_data(): data.first = size_first data.last = size_last data.default = size_default + elif $Type.selected == 2: + data.values = enum_values return data func _on_Delete_pressed(): queue_free() -func _on_OptionButton_item_selected(ID): +func _on_Type_item_selected(ID): for c in $Types.get_children(): c.visible = "T"+str(ID) == c.name +func update_enum_list(): + var options = $Types/T2/EnumValues + options.clear() + if !enum_values.empty(): + for i in range(enum_values.size()): + var v = enum_values[i] + options.add_item(v.name+" ("+v.value+")", i) + options.add_separator() + var v = enum_values[enum_current] + options.add_item("Edit "+v.value, ENUM_EDIT) + options.add_item("Remove "+v.value, ENUM_REMOVE) + if enum_current > 0: + options.add_item("Move "+v.value+" up", ENUM_UP) + if enum_current < enum_values.size() - 1: + options.add_item("Move "+v.value+" down", ENUM_DOWN) + options.add_separator() + options.add_item("Add value", ENUM_ADD) + options.selected = enum_current + +func _on_EnumValues_item_selected(id): + id = $Types/T2/EnumValues.get_item_id(id) + if id >= 0 and id < enum_values.size(): + enum_current = id + elif id == ENUM_EDIT: + var dialog = load("res://addons/material_maker/widgets/node_editor/enum_editor.tscn").instance() + var v = enum_values[enum_current] + add_child(dialog) + dialog.set_value(v.name, v.value) + dialog.connect("ok", self, "update_enum_value", [ enum_current ]) + dialog.popup_centered() + elif id == ENUM_ADD: + var dialog = load("res://addons/material_maker/widgets/node_editor/enum_editor.tscn").instance() + add_child(dialog) + dialog.connect("ok", self, "update_enum_value", [ -1 ]) + dialog.popup_centered() + elif id == ENUM_REMOVE: + enum_values.remove(enum_current) + enum_current = 0 + elif id == ENUM_UP: + var tmp = enum_values[enum_current] + enum_values[enum_current] = enum_values[enum_current-1] + enum_values[enum_current-1] = tmp + enum_current -= 1 + elif id == ENUM_DOWN: + var tmp = enum_values[enum_current] + enum_values[enum_current] = enum_values[enum_current+1] + enum_values[enum_current+1] = tmp + enum_current += 1 + update_enum_list() + +func update_enum_value(n, v, i): + if i == -1: + enum_values.append({ name=n, value=v }) + enum_current = enum_values.size()-1 + else: + enum_values[i] = { name=n, value=v } + enum_current = i + update_enum_list() diff --git a/addons/material_maker/widgets/node_editor/parameter.tscn b/addons/material_maker/widgets/node_editor/parameter.tscn index 5d3a97c..9ab14e4 100644 --- a/addons/material_maker/widgets/node_editor/parameter.tscn +++ b/addons/material_maker/widgets/node_editor/parameter.tscn @@ -3,7 +3,7 @@ [ext_resource path="res://addons/material_maker/widgets/node_editor/parameter.gd" type="Script" id=1] [ext_resource path="res://addons/material_maker/icons/minus.png" type="Texture" id=2] -[node name="Parameter" type="HBoxContainer" index="0"] +[node name="Parameter" type="HBoxContainer"] anchor_left = 0.0 anchor_top = 0.0 @@ -370,6 +370,7 @@ align = 0 [node name="T1" type="HBoxContainer" parent="Types" index="1"] +editor/display_folded = true visible = false anchor_left = 0.0 anchor_top = 0.0 @@ -527,7 +528,6 @@ selected = -1 [node name="T2" type="HBoxContainer" parent="Types" index="2"] -editor/display_folded = true visible = false anchor_left = 0.0 anchor_top = 0.0 @@ -543,7 +543,7 @@ size_flags_horizontal = 1 size_flags_vertical = 1 alignment = 0 -[node name="OptionButton" type="OptionButton" parent="Types/T2" index="0"] +[node name="EnumValues" type="OptionButton" parent="Types/T2" index="0"] anchor_left = 0.0 anchor_top = 0.0 @@ -611,7 +611,7 @@ align = 0 [connection signal="pressed" from="Delete" to="." method="_on_Delete_pressed"] -[connection signal="item_selected" from="Type" to="." method="_on_OptionButton_item_selected"] +[connection signal="item_selected" from="Type" to="." method="_on_Type_item_selected"] [connection signal="item_selected" from="Types/T1/First" to="." method="_on_First_item_selected"] @@ -619,4 +619,6 @@ align = 0 [connection signal="item_selected" from="Types/T1/Default" to="." method="_on_Default_item_selected"] +[connection signal="item_selected" from="Types/T2/EnumValues" to="." method="_on_EnumValues_item_selected"] + diff --git a/addons/material_maker/widgets/text_dialog.tscn b/addons/material_maker/widgets/text_dialog.tscn index d7dacb6..3e4d070 100644 --- a/addons/material_maker/widgets/text_dialog.tscn +++ b/addons/material_maker/widgets/text_dialog.tscn @@ -2,7 +2,7 @@ [ext_resource path="res://addons/material_maker/widgets/text_dialog.gd" type="Script" id=1] -[node name="TextDialog" type="WindowDialog"] +[node name="TextDialog" type="WindowDialog" index="0"] anchor_left = 0.0 anchor_top = 0.0 @@ -16,10 +16,11 @@ mouse_filter = 0 mouse_default_cursor_shape = 0 size_flags_horizontal = 1 size_flags_vertical = 1 -popup_exclusive = false +popup_exclusive = true window_title = "blah" resizable = false script = ExtResource( 1 ) +_sections_unfolded = [ "Popup", "Rect" ] [node name="VBoxContainer" type="VBoxContainer" parent="." index="1"]