diff --git a/addons/material_maker/graph_edit.gd b/addons/material_maker/graph_edit.gd
index eab0249..f79bcb9 100644
--- a/addons/material_maker/graph_edit.gd
+++ b/addons/material_maker/graph_edit.gd
@@ -117,7 +117,7 @@ func create_nodes(data, position = null):
return
if data.has("type"):
var node = null
- if File.new().file_exists("res://addons/material_maker/nodes/"+data.type+".json"):
+ if File.new().file_exists("res://addons/material_maker/nodes/"+data.type+".mmn"):
node = preload("res://addons/material_maker/nodes/node_generic.gd").new()
node.model = data.type
else:
diff --git a/addons/material_maker/icons/icons.svg b/addons/material_maker/icons/icons.svg
index 54563e2..61805a8 100644
--- a/addons/material_maker/icons/icons.svg
+++ b/addons/material_maker/icons/icons.svg
@@ -48,9 +48,9 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="2.8"
- inkscape:cx="161.54776"
- inkscape:cy="928.95264"
+ inkscape:zoom="1.1274425"
+ inkscape:cx="116.41955"
+ inkscape:cy="914.64295"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
@@ -205,5 +205,70 @@
id="rect874"
style="opacity:1;fill:#afafaf;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke" />
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/material_maker/icons/load.png b/addons/material_maker/icons/load.png
new file mode 100644
index 0000000..a30d97e
Binary files /dev/null and b/addons/material_maker/icons/load.png differ
diff --git a/addons/material_maker/icons/minus.png b/addons/material_maker/icons/minus.png
new file mode 100644
index 0000000..4d18aa8
Binary files /dev/null and b/addons/material_maker/icons/minus.png differ
diff --git a/addons/material_maker/icons/plus.png b/addons/material_maker/icons/plus.png
new file mode 100644
index 0000000..1b3d9e1
Binary files /dev/null and b/addons/material_maker/icons/plus.png differ
diff --git a/addons/material_maker/library/base.json b/addons/material_maker/library/base.json
index 4f95e00..9765c5b 100644
--- a/addons/material_maker/library/base.json
+++ b/addons/material_maker/library/base.json
@@ -210,6 +210,10 @@
"tree_item":"Miscellaneous/Switch",
"type":"switch"
},
+ {
+ "tree_item":"Miscellaneous/Custom",
+ "type":"custom"
+ },
{
"tree_item":"Miscellaneous/Remote",
"type":"remote"
diff --git a/addons/material_maker/main_window.tscn b/addons/material_maker/main_window.tscn
index c488d39..12b560e 100644
--- a/addons/material_maker/main_window.tscn
+++ b/addons/material_maker/main_window.tscn
@@ -6,7 +6,7 @@
[ext_resource path="res://addons/material_maker/widgets/tabs.gd" type="Script" id=4]
[ext_resource path="res://addons/material_maker/renderer.tscn" type="PackedScene" id=5]
-[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/nodes/bricks.json b/addons/material_maker/nodes/bricks.mmn
similarity index 100%
rename from addons/material_maker/nodes/bricks.json
rename to addons/material_maker/nodes/bricks.mmn
diff --git a/addons/material_maker/nodes/custom/custom.gd b/addons/material_maker/nodes/custom/custom.gd
index 760164c..0549671 100644
--- a/addons/material_maker/nodes/custom/custom.gd
+++ b/addons/material_maker/nodes/custom/custom.gd
@@ -2,7 +2,52 @@ tool
extends "res://addons/material_maker/nodes/node_generic.gd"
func _on_Edit_pressed():
- pass # replace with function body
+ var edit_window = load("res://addons/material_maker/widgets/node_editor/node_editor.tscn").instance()
+ if model_data != null:
+ edit_window.set_model_data(model_data)
+ edit_window.connect("node_changed", self, "update_node")
+ add_child(edit_window)
+ edit_window.popup_centered()
+
+func _on_Load_pressed():
+ var dialog = FileDialog.new()
+ add_child(dialog)
+ dialog.rect_min_size = Vector2(500, 500)
+ dialog.access = FileDialog.ACCESS_FILESYSTEM
+ dialog.mode = FileDialog.MODE_OPEN_FILE
+ dialog.add_filter("*.mmn;Material Maker Node")
+ dialog.connect("file_selected", self, "do_load_node")
+ dialog.popup_centered()
+
+func do_load_node(file_name):
+ set_model(file_name)
func _on_Save_pressed():
- pass # replace with function body
+ var dialog = FileDialog.new()
+ add_child(dialog)
+ dialog.rect_min_size = Vector2(500, 500)
+ dialog.access = FileDialog.ACCESS_FILESYSTEM
+ dialog.mode = FileDialog.MODE_SAVE_FILE
+ dialog.add_filter("*.mmn;Material Maker Node")
+ dialog.connect("file_selected", self, "do_save_node")
+ dialog.popup_centered()
+
+func do_save_node(file_name):
+ var file = File.new()
+ if file.open(file_name, File.WRITE) == OK:
+ file.store_string(to_json(model_data))
+ file.close()
+ model = file_name
+
+func deserialize(data):
+ if data.has("model_data"):
+ update_node(data.model_data)
+ .deserialize(data)
+
+func serialize():
+ var file = model
+ model = "custom"
+ var return_value = .serialize()
+ model = file
+ return_value.model_data = model_data
+ return return_value
diff --git a/addons/material_maker/nodes/custom/custom.tscn b/addons/material_maker/nodes/custom/custom.tscn
index 0b08856..407d493 100644
--- a/addons/material_maker/nodes/custom/custom.tscn
+++ b/addons/material_maker/nodes/custom/custom.tscn
@@ -1,19 +1,20 @@
-[gd_scene load_steps=4 format=2]
+[gd_scene load_steps=5 format=2]
[ext_resource path="res://addons/material_maker/nodes/custom/custom.gd" type="Script" id=1]
[ext_resource path="res://addons/material_maker/icons/edit.png" type="Texture" id=2]
-[ext_resource path="res://addons/material_maker/icons/save.png" type="Texture" id=3]
+[ext_resource path="res://addons/material_maker/icons/load.png" type="Texture" id=3]
+[ext_resource path="res://addons/material_maker/icons/save.png" type="Texture" id=4]
-[node name="Custom" type="GraphNode" index="0"]
+[node name="Custom" type="GraphNode"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
-margin_left = 385.0
-margin_top = 287.0
-margin_right = 479.0
-margin_bottom = 338.0
+margin_left = 1.0
+margin_top = 2.0
+margin_right = 95.0
+margin_bottom = 53.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 1
@@ -34,6 +35,7 @@ slot/0/right_enabled = false
slot/0/right_type = 0
slot/0/right_color = Color( 1, 1, 1, 1 )
script = ExtResource( 1 )
+model = null
[node name="CustomNodeButtons" type="HBoxContainer" parent="." index="0"]
@@ -43,7 +45,7 @@ anchor_right = 0.0
anchor_bottom = 0.0
margin_left = 16.0
margin_top = 24.0
-margin_right = 78.0
+margin_right = 107.0
margin_bottom = 46.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
@@ -76,7 +78,7 @@ icon = ExtResource( 2 )
flat = true
align = 1
-[node name="Save" type="Button" parent="CustomNodeButtons" index="1"]
+[node name="Load" type="Button" parent="CustomNodeButtons" index="1"]
anchor_left = 0.0
anchor_top = 0.0
@@ -100,8 +102,34 @@ icon = ExtResource( 3 )
flat = true
align = 1
+[node name="Save" type="Button" parent="CustomNodeButtons" index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 63.0
+margin_right = 91.0
+margin_bottom = 22.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
+icon = ExtResource( 4 )
+flat = true
+align = 1
+
[connection signal="pressed" from="CustomNodeButtons/Edit" to="." method="_on_Edit_pressed"]
+[connection signal="pressed" from="CustomNodeButtons/Load" to="." method="_on_Load_pressed"]
+
[connection signal="pressed" from="CustomNodeButtons/Save" to="." method="_on_Save_pressed"]
diff --git a/addons/material_maker/nodes/node_generic.gd b/addons/material_maker/nodes/node_generic.gd
index 4dba772..9dd6de1 100644
--- a/addons/material_maker/nodes/node_generic.gd
+++ b/addons/material_maker/nodes/node_generic.gd
@@ -14,7 +14,7 @@ func set_model(m):
var file = File.new()
var file_name = m
if !file.file_exists(file_name):
- file_name = "res://addons/material_maker/nodes/%s.json" % [ m ]
+ file_name = "res://addons/material_maker/nodes/%s.mmn" % [ m ]
if file.file_exists(file_name):
if file.open(file_name, File.READ) != OK:
return
@@ -33,6 +33,16 @@ func update_node(data):
return
if !data.has("name"):
return
+ # Clean node
+ parameters = {}
+ var custom_node_buttons = null
+ for c in get_children():
+ if c.name != "CustomNodeButtons":
+ remove_child(c)
+ c.queue_free()
+ else:
+ custom_node_buttons = c
+ # Rebuild node
title = data.name
model_data = data
uses_seed = false
@@ -99,6 +109,8 @@ func update_node(data):
set_slot(i, false, 0, color_right, enable_right, 0, color_right)
else:
model_data.outputs = []
+ if custom_node_buttons != null:
+ move_child(custom_node_buttons, get_child_count()-1)
func subst(string, uv = ""):
string = string.replace("$(name)", name)
diff --git a/addons/material_maker/nodes/noise.json b/addons/material_maker/nodes/noise.mmn
similarity index 100%
rename from addons/material_maker/nodes/noise.json
rename to addons/material_maker/nodes/noise.mmn
diff --git a/addons/material_maker/widgets/node_editor/input.gd b/addons/material_maker/widgets/node_editor/input.gd
new file mode 100644
index 0000000..110290e
--- /dev/null
+++ b/addons/material_maker/widgets/node_editor/input.gd
@@ -0,0 +1,8 @@
+tool
+extends HBoxContainer
+
+func _ready():
+ pass
+
+func _on_Delete_pressed():
+ queue_free()
diff --git a/addons/material_maker/widgets/node_editor/input.tscn b/addons/material_maker/widgets/node_editor/input.tscn
new file mode 100644
index 0000000..595861a
--- /dev/null
+++ b/addons/material_maker/widgets/node_editor/input.tscn
@@ -0,0 +1,159 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/material_maker/widgets/node_editor/input.gd" type="Script" id=1]
+[ext_resource path="res://addons/material_maker/icons/minus.png" type="Texture" id=2]
+
+[node name="Parameter" type="HBoxContainer"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 201.0
+margin_bottom = 24.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="Delete" type="Button" parent="." index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 28.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 = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+icon = ExtResource( 2 )
+flat = true
+align = 1
+
+[node name="Name" type="LineEdit" parent="." index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 32.0
+margin_right = 102.0
+margin_bottom = 24.0
+rect_min_size = Vector2( 70, 0 )
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+hint_tooltip = "Input name"
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 1
+size_flags_horizontal = 1
+size_flags_vertical = 1
+text = "name"
+focus_mode = 2
+context_menu_enabled = true
+placeholder_alpha = 0.6
+caret_blink = false
+caret_blink_speed = 0.65
+caret_position = 0
+_sections_unfolded = [ "Hint", "Rect" ]
+
+[node name="Label" type="LineEdit" parent="." index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 106.0
+margin_right = 176.0
+margin_bottom = 24.0
+rect_min_size = Vector2( 70, 0 )
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+hint_tooltip = "Input Label"
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 1
+size_flags_horizontal = 1
+size_flags_vertical = 1
+text = "Label"
+focus_mode = 2
+context_menu_enabled = true
+placeholder_alpha = 0.6
+caret_blink = false
+caret_blink_speed = 0.65
+caret_position = 0
+_sections_unfolded = [ "Hint", "Rect" ]
+
+[node name="Type" type="OptionButton" parent="." index="3"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 180.0
+margin_right = 282.0
+margin_bottom = 24.0
+rect_min_size = Vector2( 102, 0 )
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+hint_tooltip = "Input flag"
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+action_mode = 0
+enabled_focus_mode = 2
+shortcut = null
+group = null
+text = "GreyScale"
+flat = false
+align = 0
+items = [ "GreyScale", null, false, 0, null, "Color", null, false, 1, null ]
+selected = 0
+_sections_unfolded = [ "Focus", "Hint", "Rect" ]
+
+[node name="Default" type="LineEdit" parent="." index="4"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 286.0
+margin_right = 356.0
+margin_bottom = 24.0
+rect_min_size = Vector2( 70, 0 )
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+hint_tooltip = "Default value"
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 1
+size_flags_horizontal = 1
+size_flags_vertical = 1
+text = "0.0"
+focus_mode = 2
+context_menu_enabled = true
+placeholder_alpha = 0.6
+caret_blink = false
+caret_blink_speed = 0.65
+caret_position = 0
+_sections_unfolded = [ "Hint", "Rect" ]
+
+[connection signal="pressed" from="Delete" to="." method="_on_Delete_pressed"]
+
+
diff --git a/addons/material_maker/widgets/node_editor/node_editor.gd b/addons/material_maker/widgets/node_editor/node_editor.gd
index 7655466..f47cb34 100644
--- a/addons/material_maker/widgets/node_editor/node_editor.gd
+++ b/addons/material_maker/widgets/node_editor/node_editor.gd
@@ -1,16 +1,62 @@
+tool
extends WindowDialog
-var model_data
+var model_data = null
-func _init(data):
- model_data = data
+const ParameterEditor = preload("res://addons/material_maker/widgets/node_editor/parameter.tscn")
+const InputEditor = preload("res://addons/material_maker/widgets/node_editor/input.tscn")
+const OutputEditor = preload("res://addons/material_maker/widgets/node_editor/output.tscn")
-func _ready():
- # Called when the node is added to the scene for the first time.
- # Initialization here
- pass
+signal node_changed
-#func _process(delta):
-# # Called every frame. Delta is time since last frame.
-# # Update game logic here.
-# pass
+func add_item(parent, scene):
+ var object = scene.instance()
+ parent.add_child(object)
+ parent.move_child(object, parent.get_child_count()-2)
+ return object
+
+func set_model_data(data):
+ if data.has("name"):
+ $Sizer/Tabs/General/Name/Name.text = data.name
+ if data.has("parameters"):
+ for p in data.parameters:
+ add_item($Sizer/Tabs/General/Parameters/Sizer, ParameterEditor).set_model_data(p)
+ if data.has("outputs"):
+ for o in data.outputs:
+ add_item($Sizer/Tabs/General/Outputs/Sizer, OutputEditor).set_model_data(o)
+ if data.has("global"):
+ $Sizer/Tabs/Global.text = data.global
+ if data.has("instance"):
+ $Sizer/Tabs/Instance.text = data.instance
+
+func get_model_data():
+ var data = {
+ name=$Sizer/Tabs/General/Name/Name.text,
+ global=$Sizer/Tabs/Global.text,
+ instance=$Sizer/Tabs/Instance.text,
+ }
+ data.parameters = []
+ for p in $Sizer/Tabs/General/Parameters/Sizer.get_children():
+ if p.has_method("get_model_data"):
+ data.parameters.append(p.get_model_data())
+ data.outputs = []
+ for o in $Sizer/Tabs/General/Outputs/Sizer.get_children():
+ if o.has_method("get_model_data"):
+ data.outputs.append(o.get_model_data())
+ return data
+
+func _on_AddParameter_pressed():
+ add_item($Sizer/Tabs/General/Parameters/Sizer, ParameterEditor)
+
+func _on_AddInput_pressed():
+ add_item($Sizer/Tabs/General/Inputs/Sizer, InputEditor)
+
+func _on_AddOutput_pressed():
+ add_item($Sizer/Tabs/General/Outputs/Sizer, OutputEditor)
+
+func _on_OK_pressed():
+ emit_signal("node_changed", get_model_data())
+ queue_free()
+
+func _on_Cancel_pressed():
+ 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 ffc7dcd..6992718 100644
--- a/addons/material_maker/widgets/node_editor/node_editor.tscn
+++ b/addons/material_maker/widgets/node_editor/node_editor.tscn
@@ -1,27 +1,29 @@
-[gd_scene load_steps=2 format=2]
+[gd_scene load_steps=3 format=2]
[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
anchor_right = 0.0
anchor_bottom = 0.0
-margin_right = 469.0
-margin_bottom = 373.0
+margin_right = 726.0
+margin_bottom = 399.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 = false
+popup_exclusive = true
window_title = "Node Editor"
resizable = false
script = ExtResource( 1 )
+_sections_unfolded = [ "Popup" ]
-[node name="Tabs" type="TabContainer" parent="." index="1"]
+[node name="Sizer" type="VBoxContainer" parent="." index="0"]
anchor_left = 0.0
anchor_top = 0.0
@@ -29,15 +31,368 @@ 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 = 3
+size_flags_vertical = 3
+alignment = 0
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="Tabs" type="TabContainer" parent="Sizer" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 726.0
+margin_bottom = 375.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
mouse_filter = 0
mouse_default_cursor_shape = 0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+tab_align = 0
+tabs_visible = true
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="General" type="VBoxContainer" parent="Sizer/Tabs" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 4.0
+margin_top = 32.0
+margin_right = -4.0
+margin_bottom = -4.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
-tab_align = 0
-tabs_visible = true
+alignment = 0
-[node name="Global" type="TextEdit" parent="Tabs" index="0"]
+[node name="Name" type="HBoxContainer" parent="Sizer/Tabs/General" index="0"]
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 718.0
+margin_bottom = 24.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 1
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+alignment = 0
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="LabelName" type="Label" parent="Sizer/Tabs/General/Name" 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
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="Name" type="LineEdit" parent="Sizer/Tabs/General/Name" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 46.0
+margin_right = 718.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
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="LabelParameters" type="Label" parent="Sizer/Tabs/General" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 28.0
+margin_right = 718.0
+margin_bottom = 42.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 = "Parameters:"
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="Parameters" type="ScrollContainer" parent="Sizer/Tabs/General" index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 46.0
+margin_right = 718.0
+margin_bottom = 181.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = true
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+scroll_horizontal_enabled = false
+scroll_horizontal = 0
+scroll_vertical_enabled = true
+scroll_vertical = 0
+scroll_deadzone = 0
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="Sizer" type="VBoxContainer" parent="Sizer/Tabs/General/Parameters" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 718.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 = 3
+size_flags_vertical = 1
+alignment = 0
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="AddParameter" type="Button" parent="Sizer/Tabs/General/Parameters/Sizer" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 28.0
+margin_bottom = 22.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 = 0
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+icon = ExtResource( 2 )
+flat = true
+align = 1
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="LabelInputs" type="Label" parent="Sizer/Tabs/General" index="3"]
+
+visible = false
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 176.0
+margin_right = 718.0
+margin_bottom = 190.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 = "Inputs:"
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="Inputs" type="ScrollContainer" parent="Sizer/Tabs/General" index="4"]
+
+visible = false
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 139.0
+margin_right = 718.0
+margin_bottom = 228.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = true
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+scroll_horizontal_enabled = false
+scroll_horizontal = 0
+scroll_vertical_enabled = true
+scroll_vertical = 0
+scroll_deadzone = 0
+_sections_unfolded = [ "Scroll", "Size Flags" ]
+
+[node name="Sizer" type="VBoxContainer" parent="Sizer/Tabs/General/Inputs" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 718.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 = 3
+size_flags_vertical = 1
+alignment = 0
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="AddInput" type="Button" parent="Sizer/Tabs/General/Inputs/Sizer" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 28.0
+margin_bottom = 22.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 = 0
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+icon = ExtResource( 2 )
+flat = true
+align = 1
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="LabelOutputs" type="Label" parent="Sizer/Tabs/General" index="5"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 185.0
+margin_right = 718.0
+margin_bottom = 199.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 = "Outputs:"
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="Outputs" type="ScrollContainer" parent="Sizer/Tabs/General" index="6"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 203.0
+margin_right = 718.0
+margin_bottom = 339.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = true
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+scroll_horizontal_enabled = false
+scroll_horizontal = 0
+scroll_vertical_enabled = true
+scroll_vertical = 0
+scroll_deadzone = 0
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="Sizer" type="VBoxContainer" parent="Sizer/Tabs/General/Outputs" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 718.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 = 3
+size_flags_vertical = 1
+alignment = 0
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="AddOutput" type="Button" parent="Sizer/Tabs/General/Outputs/Sizer" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 28.0
+margin_bottom = 22.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 = 0
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+icon = ExtResource( 2 )
+flat = true
+align = 1
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="Global" type="TextEdit" parent="Sizer/Tabs" index="1"]
+
+visible = false
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 1.0
@@ -70,4 +425,117 @@ caret_blink = false
caret_blink_speed = 0.65
caret_moving_by_right_click = true
+[node name="Instance" type="TextEdit" parent="Sizer/Tabs" index="2"]
+
+visible = false
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 4.0
+margin_top = 32.0
+margin_right = -4.0
+margin_bottom = -4.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
+text = ""
+readonly = false
+highlight_current_line = false
+syntax_highlighting = false
+show_line_numbers = false
+highlight_all_occurrences = false
+override_selected_font_color = false
+context_menu_enabled = true
+smooth_scrolling = false
+v_scroll_speed = 80.0
+hiding_enabled = 0
+wrap_lines = false
+caret_block_mode = false
+caret_blink = false
+caret_blink_speed = 0.65
+caret_moving_by_right_click = true
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Sizer" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 291.0
+margin_top = 379.0
+margin_right = 435.0
+margin_bottom = 399.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 = 1
+alignment = 0
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="OK" type="Button" parent="Sizer/HBoxContainer" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 70.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 70, 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
+
+[node name="Cancel" type="Button" parent="Sizer/HBoxContainer" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 74.0
+margin_right = 144.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 70, 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
+
+[connection signal="pressed" from="Sizer/Tabs/General/Parameters/Sizer/AddParameter" to="." method="_on_AddParameter_pressed"]
+
+[connection signal="pressed" from="Sizer/Tabs/General/Inputs/Sizer/AddInput" to="." method="_on_AddInput_pressed"]
+
+[connection signal="pressed" from="Sizer/Tabs/General/Outputs/Sizer/AddOutput" to="." method="_on_AddOutput_pressed"]
+
+[connection signal="pressed" from="Sizer/HBoxContainer/OK" to="." method="_on_OK_pressed"]
+
+[connection signal="pressed" from="Sizer/HBoxContainer/Cancel" to="." method="_on_Cancel_pressed"]
+
diff --git a/addons/material_maker/widgets/node_editor/output.gd b/addons/material_maker/widgets/node_editor/output.gd
new file mode 100644
index 0000000..71c9972
--- /dev/null
+++ b/addons/material_maker/widgets/node_editor/output.gd
@@ -0,0 +1,22 @@
+tool
+extends HBoxContainer
+
+func _ready():
+ pass
+
+func set_model_data(data):
+ if data.has("rgb"):
+ $Type.selected = 1
+ $Default.text = data.rgb
+ elif data.has("f"):
+ $Type.selected = 0
+ $Default.text = data.f
+
+func get_model_data():
+ if $Type.selected == 1:
+ return { rgb=$Default.text }
+ else:
+ return { f=$Default.text }
+
+func _on_Delete_pressed():
+ queue_free()
diff --git a/addons/material_maker/widgets/node_editor/output.tscn b/addons/material_maker/widgets/node_editor/output.tscn
new file mode 100644
index 0000000..3be4c3e
--- /dev/null
+++ b/addons/material_maker/widgets/node_editor/output.tscn
@@ -0,0 +1,105 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/material_maker/widgets/node_editor/output.gd" type="Script" id=1]
+[ext_resource path="res://addons/material_maker/icons/minus.png" type="Texture" id=2]
+
+[node name="Output" type="HBoxContainer"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 201.0
+margin_bottom = 24.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 1
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+alignment = 0
+script = ExtResource( 1 )
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="Delete" type="Button" parent="." index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 28.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 = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+icon = ExtResource( 2 )
+flat = true
+align = 1
+
+[node name="Type" type="OptionButton" parent="." index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 32.0
+margin_right = 134.0
+margin_bottom = 24.0
+rect_min_size = Vector2( 102, 0 )
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+hint_tooltip = "Input flag"
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+action_mode = 0
+enabled_focus_mode = 2
+shortcut = null
+group = null
+text = "GreyScale"
+flat = false
+align = 0
+items = [ "GreyScale", null, false, 0, null, "Color", null, false, 1, null ]
+selected = 0
+_sections_unfolded = [ "Focus", "Hint", "Rect" ]
+
+[node name="Default" type="LineEdit" parent="." index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 138.0
+margin_right = 201.0
+margin_bottom = 24.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+hint_tooltip = "Default value"
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 1
+size_flags_horizontal = 3
+size_flags_vertical = 1
+text = "0.0"
+focus_mode = 2
+context_menu_enabled = true
+placeholder_alpha = 0.6
+caret_blink = false
+caret_blink_speed = 0.65
+caret_position = 0
+_sections_unfolded = [ "Hint", "Rect", "Size Flags" ]
+
+[connection signal="pressed" from="Delete" to="." method="_on_Delete_pressed"]
+
+
diff --git a/addons/material_maker/widgets/node_editor/parameter.gd b/addons/material_maker/widgets/node_editor/parameter.gd
new file mode 100644
index 0000000..9024680
--- /dev/null
+++ b/addons/material_maker/widgets/node_editor/parameter.gd
@@ -0,0 +1,60 @@
+tool
+extends HBoxContainer
+
+const PARAMETER_TYPE = [ "float", "size", "enum", "boolean" ]
+
+func _ready():
+ pass
+
+func set_model_data(data):
+ if data.has("name"):
+ $Name.text = data.name
+ if data.has("label"):
+ $Label.text = data.label
+ if !data.has("type"):
+ return
+ for t in $Types.get_children():
+ t.visible = false
+ var w = null
+ if data.type == "float":
+ $Type.selected = 0
+ w = $Types/T0
+ if data.has("min"):
+ $Types/T0/Min.value = data.min
+ if data.has("max"):
+ $Types/T0/Max.value = data.max
+ if data.has("step"):
+ $Types/T0/Step.value = data.step
+ $Types/T0/SpinBox.pressed = ( data.has("widget") && data.widget == "spinbox" )
+ elif data.type == "size":
+ $Type.selected = 1
+ w = $Types/T1
+ elif data.type == "enum":
+ $Type.selected = 2
+ w = $Types/T2
+ elif data.type == "boolean":
+ $Type.selected = 3
+ w = $Types/T3
+ if w != null:
+ w.visible = true
+
+func get_model_data():
+ var data = {
+ name=$Name.text,
+ label=$Label.text,
+ type=PARAMETER_TYPE[$Type.selected],
+ }
+ if $Type.selected == 0:
+ data.min = $Types/T0/Min.value
+ data.max = $Types/T0/Max.value
+ data.step = $Types/T0/Step.value
+ if $Types/T0/SpinBox.pressed:
+ data.widget = "spinbox"
+ return data
+
+func _on_Delete_pressed():
+ queue_free()
+
+func _on_OptionButton_item_selected(ID):
+ for c in $Types.get_children():
+ c.visible = "T"+str(ID) == c.name
diff --git a/addons/material_maker/widgets/node_editor/parameter.tscn b/addons/material_maker/widgets/node_editor/parameter.tscn
new file mode 100644
index 0000000..81ae5bc
--- /dev/null
+++ b/addons/material_maker/widgets/node_editor/parameter.tscn
@@ -0,0 +1,498 @@
+[gd_scene load_steps=3 format=2]
+
+[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"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 201.0
+margin_bottom = 24.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="Delete" type="Button" parent="." index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 28.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 = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+icon = ExtResource( 2 )
+flat = true
+align = 1
+
+[node name="Name" type="LineEdit" parent="." index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 32.0
+margin_right = 102.0
+margin_bottom = 24.0
+rect_min_size = Vector2( 70, 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 = 1
+size_flags_vertical = 1
+text = "name"
+focus_mode = 2
+context_menu_enabled = true
+placeholder_alpha = 0.6
+caret_blink = false
+caret_blink_speed = 0.65
+caret_position = 0
+_sections_unfolded = [ "Rect" ]
+
+[node name="Label" type="LineEdit" parent="." index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 106.0
+margin_right = 176.0
+margin_bottom = 24.0
+rect_min_size = Vector2( 70, 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 = 1
+size_flags_vertical = 1
+text = "Label"
+focus_mode = 2
+context_menu_enabled = true
+placeholder_alpha = 0.6
+caret_blink = false
+caret_blink_speed = 0.65
+caret_position = 0
+_sections_unfolded = [ "Rect" ]
+
+[node name="Type" type="OptionButton" parent="." index="3"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 180.0
+margin_right = 250.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 = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+action_mode = 0
+enabled_focus_mode = 2
+shortcut = null
+group = null
+text = "Float"
+flat = false
+align = 0
+items = [ "Float", null, false, 0, null, "Size", null, false, 1, null, "Enum", null, false, 2, null, "Boolean", null, false, 3, null ]
+selected = 0
+
+[node name="Types" type="HBoxContainer" parent="." index="4"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 254.0
+margin_right = 669.0
+margin_bottom = 24.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="T0" type="HBoxContainer" parent="Types" index="0"]
+
+editor/display_folded = true
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 415.0
+margin_bottom = 24.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
+_sections_unfolded = [ "Visibility" ]
+
+[node name="LabelMin" type="Label" parent="Types/T0" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 5.0
+margin_right = 28.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 = "Min:"
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+
+[node name="Min" type="SpinBox" parent="Types/T0" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 32.0
+margin_right = 106.0
+margin_bottom = 24.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
+min_value = -65536.0
+max_value = 65535.0
+step = 0.0
+page = 0.0
+value = 0.0
+exp_edit = false
+rounded = false
+editable = true
+prefix = ""
+suffix = ""
+
+[node name="LabelMax" type="Label" parent="Types/T0" index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 110.0
+margin_top = 5.0
+margin_right = 140.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 = "Max:"
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+
+[node name="Max" type="SpinBox" parent="Types/T0" index="3"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 144.0
+margin_right = 218.0
+margin_bottom = 24.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
+min_value = -65536.0
+max_value = 65535.0
+step = 0.0
+page = 0.0
+value = 0.0
+exp_edit = false
+rounded = false
+editable = true
+prefix = ""
+suffix = ""
+
+[node name="LabelStep" type="Label" parent="Types/T0" index="4"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 222.0
+margin_top = 5.0
+margin_right = 254.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 = "Step:"
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+
+[node name="Step" type="SpinBox" parent="Types/T0" index="5"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 258.0
+margin_right = 332.0
+margin_bottom = 24.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
+min_value = 0.0
+max_value = 65535.0
+step = 0.0
+page = 0.0
+value = 0.0
+exp_edit = false
+rounded = false
+editable = true
+prefix = ""
+suffix = ""
+
+[node name="SpinBox" type="CheckBox" parent="Types/T0" index="6"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 336.0
+margin_right = 415.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 = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = true
+enabled_focus_mode = 2
+shortcut = null
+group = null
+text = "SpinBox"
+flat = false
+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
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 148.0
+margin_bottom = 24.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="LabelMin" type="Label" parent="Types/T1" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 5.0
+margin_right = 28.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 = "Min:"
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+
+[node name="Min" type="OptionButton" parent="Types/T1" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 32.0
+margin_right = 71.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 = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+action_mode = 0
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = false
+align = 0
+items = [ ]
+selected = -1
+
+[node name="LabelMax" type="Label" parent="Types/T1" index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 75.0
+margin_top = 5.0
+margin_right = 105.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 = "Max:"
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+
+[node name="Max" type="OptionButton" parent="Types/T1" index="3"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 109.0
+margin_right = 148.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 = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+action_mode = 0
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = false
+align = 0
+items = [ ]
+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
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 39.0
+margin_bottom = 24.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="OptionButton" type="OptionButton" parent="Types/T2" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 39.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 = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+action_mode = 0
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = false
+align = 0
+items = [ ]
+selected = -1
+
+[node name="T3" type="HBoxContainer" parent="Types" index="3"]
+
+visible = false
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_bottom = 24.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
+
+[connection signal="pressed" from="Delete" to="." method="_on_Delete_pressed"]
+
+[connection signal="item_selected" from="Type" to="." method="_on_OptionButton_item_selected"]
+
+