Updated new UI and more refactoring

This commit is contained in:
Rodolphe Suescun 2018-08-05 18:46:23 +02:00
parent 6f0eb8e8e1
commit 63685f8771
22 changed files with 837 additions and 596 deletions

2
.gitignore vendored
View File

@ -14,3 +14,5 @@ addons/procedural_material/models/models.dae
addons/procedural_material/models/models.dae.import
/examples/*.png
/examples/*.import
examples/input_image.png.import
examples/input_image.png.import

View File

@ -1,6 +1,9 @@
tool
extends GraphEdit
var save_path = null
signal save_path_changed
signal graph_changed
func _ready():
@ -11,15 +14,12 @@ func get_source(node, port):
if c.to == node && c.to_port == port:
return { node=c.from, slot=c.from_port }
func add_node(node, position = null):
func add_node(node, global_position = null):
add_child(node)
if position != null:
node.offset = position
if global_position != null:
node.offset = (scroll_offset + global_position - rect_global_position) / zoom
node.connect("close_request", self, "remove_node", [ node ])
func add_node_globalpos(node, global_position):
add_node(node, (scroll_offset + global_position - rect_global_position) / zoom)
func remove_node(node):
var node_name = node.name
for c in get_connection_list():
@ -39,22 +39,66 @@ func _on_GraphEdit_disconnection_request(from, from_slot, to, to_slot):
disconnect_node(from, from_slot, to, to_slot)
send_changed_signal();
# Global operations on graph
func update_tab_title():
var title = "[unnamed]"
if save_path != null:
title = save_path.right(save_path.rfind("/")+1)
get_parent().set_tab_title(get_index(), title)
func set_save_path(path):
if path != save_path:
save_path = path
if get_parent() is TabContainer:
update_tab_title()
else:
emit_signal("save_path_changed", self, path)
func clear_material():
clear_connections()
for c in get_children():
if c is GraphNode:
remove_child(c)
c.free()
send_changed_signal()
func new_material():
clear_material()
var node_type = load("res://addons/procedural_material/nodes/material.tscn")
create_node({name="Material", type="material"})
set_save_path(null)
func create_node(data, global_position = null):
if !data.has("type"):
return null
var node_type = load("res://addons/procedural_material/nodes/"+data.type+".tscn")
if node_type != null:
var node = node_type.instance()
add_node(node)
do_send_changed_signal()
if data.has("name") && !has_node(data.name):
node.name = data.name
else:
var i = 0
while true:
var node_name = data.type+"_"+str(i)
if !has_node(node_name):
node.name = node_name
break
i += 1
add_node(node, global_position)
node.deserialize(data)
send_changed_signal()
func load_file(filename):
func load_file():
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("*.ptex;Procedural textures file")
dialog.connect("file_selected", self, "do_load_file")
dialog.popup_centered()
func do_load_file(filename):
var file = File.new()
if file.open(filename, File.READ) != OK:
return
@ -62,19 +106,29 @@ func load_file(filename):
file.close()
clear_material()
for n in data.nodes:
if !n.has("type"):
continue
var node_type = load("res://addons/procedural_material/nodes/"+n.type+".tscn")
if node_type != null:
var node = node_type.instance()
node.name = n.name
add_node(node)
node.deserialize(n)
var node = create_node(n)
for c in data.connections:
connect_node(c.from, c.from_port, c.to, c.to_port)
do_send_changed_signal()
set_save_path(filename)
send_changed_signal()
func save_file(filename):
func save_file():
if save_path != null:
do_save_file(save_path)
else:
save_file_as()
func save_file_as():
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("*.ptex;Procedural textures file")
dialog.connect("file_selected", self, "do_save_file")
dialog.popup_centered()
func do_save_file(filename):
var data = { nodes = [] }
for c in get_children():
if c is GraphNode:
@ -84,20 +138,34 @@ func save_file(filename):
if file.open(filename, File.WRITE) == OK:
file.store_string(to_json(data))
file.close()
set_save_path(filename)
func export_textures(size = 512):
if save_path != null:
var prefix = save_path.left(save_path.rfind("."))
$GraphEdit/Material.export_textures(prefix)
func send_changed_signal():
$Timer.stop()
$Timer.start()
func do_send_changed_signal():
emit_signal("graph_changed")
func can_drop_data(position, data):
return typeof(data) == TYPE_DICTIONARY and data.has('type')
func drop_data(position, data):
var node = create_node(data, get_global_transform().xform(position))
return true
# Save shader to image, create image texture
func setup_material(shader_material, textures, shader_code):
for k in textures.keys():
shader_material.set_shader_param(k+"_tex", textures[k])
shader_material.shader.code = shader_code
# Save shader to image
var render_queue = []
func render_to_viewport(node, size, method, args):

View File

@ -1,8 +1,7 @@
[gd_scene load_steps=7 format=2]
[gd_scene load_steps=6 format=2]
[ext_resource path="res://addons/procedural_material/graph_edit.gd" type="Script" id=1]
[ext_resource path="res://addons/procedural_material/nodes/material.tscn" type="PackedScene" id=2]
[ext_resource path="res://addons/procedural_material/nodes/material.gd" type="Script" id=3]
[sub_resource type="Theme" id=1]
@ -249,10 +248,8 @@ shader = SubResource( 2 )
self_modulate = Color( 1, 1, 1, 0 )
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_right = 1280.0
margin_bottom = 718.0
anchor_right = 1.0
anchor_bottom = 1.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = true
focus_mode = 2
@ -268,75 +265,21 @@ zoom = 1.0
script = ExtResource( 1 )
_sections_unfolded = [ "Material", "Mouse", "Visibility" ]
[node name="Material" type="GraphNode" parent="." index="2" instance=ExtResource( 2 )]
[node name="Material" parent="." index="0" instance=ExtResource( 2 )]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_right = 111.0
margin_bottom = 118.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
theme = SubResource( 1 )
title = "Material"
offset = Vector2( 0, 0 )
show_close = false
resizable = false
selected = false
comment = false
overlay = 0
slot/0/left_enabled = true
slot/0/left_type = 0
slot/0/left_color = Color( 0.5, 0.5, 1, 1 )
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/right_enabled = false
slot/1/right_type = 0
slot/1/right_color = Color( 0.5, 0.5, 1, 1 )
slot/2/left_enabled = true
slot/2/left_type = 0
slot/2/left_color = Color( 0.498039, 0.498039, 1, 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.498039, 0.498039, 1, 1 )
slot/3/right_enabled = false
slot/3/right_type = 0
slot/3/right_color = Color( 0.498039, 0.498039, 1, 1 )
slot/4/left_enabled = true
slot/4/left_type = 0
slot/4/left_color = Color( 0.498039, 0.498039, 1, 1 )
slot/4/right_enabled = false
slot/4/right_type = 0
slot/4/right_color = Color( 0.498039, 0.498039, 1, 1 )
slot/5/left_enabled = true
slot/5/left_type = 0
slot/5/left_color = Color( 0.498039, 0.498039, 1, 1 )
slot/5/right_enabled = false
slot/5/right_type = 0
slot/5/right_color = Color( 0.498039, 0.498039, 1, 1 )
script = ExtResource( 3 )
_sections_unfolded = [ "Anchor", "Margin", "Mouse", "Theme", "slot", "slot/2", "slot/3", "slot/4", "slot/5" ]
[node name="Timer" type="Timer" parent="." index="3"]
[node name="Timer" type="Timer" parent="." index="1"]
process_mode = 1
wait_time = 0.1
wait_time = 0.2
one_shot = true
autostart = false
[node name="SaveViewport" type="Viewport" parent="." index="4"]
[node name="SaveViewport" type="Viewport" parent="." index="2"]
arvr = false
size = Vector2( 0, 0 )

View File

@ -0,0 +1,49 @@
extends Tree
# class member variables go here, for example:
# var a = 2
# var b = "textvar"
func get_drag_data(position):
var selected_item = get_selected()
if selected_item != null:
var data = selected_item.get_metadata(0)
return data
return null
func _ready():
var root = create_item()
add_library("res://addons/procedural_material/material_library.json")
func add_library(filename):
var root = get_root()
var file = File.new()
if file.open(filename, File.READ) != OK:
return
var lib = parse_json(file.get_as_text())
file.close()
for m in lib.lib:
add_item(m, m.tree_item, root)
func add_item(item, item_name, item_parent):
var slash_position = item_name.find("/")
if slash_position == -1:
var new_item = create_item(item_parent)
new_item.set_text(0, item_name)
new_item.set_metadata(0, item)
return new_item
else:
var prefix = item_name.left(slash_position)
var suffix = item_name.right(slash_position+1)
var new_parent = null
var c = item_parent.get_children()
while c != null:
if c.get_text(0) == prefix:
new_parent = c
break
c = c.get_next()
if new_parent == null:
new_parent = create_item(item_parent)
new_parent.set_text(0, prefix)
return add_item(item, suffix, new_parent)

View File

@ -0,0 +1,86 @@
extends Panel
var current_tab = -1
const MENU = [
{ menu="File", command="new_material", description="New material" },
{ menu="File", command="load_material", description="Load material" },
{ menu="File" },
{ menu="File", command="save_material", description="Save material" },
{ menu="File", command="save_material_as", description="Save material as..." },
{ menu="File", command="save_all_materials", description="Save all materials..." },
{ menu="File" },
{ menu="File", command="export_material", description="Export material" },
{ menu="File" },
{ menu="File", command="close_material", description="Close material" },
{ menu="File", command="exit", description="Exit" },
{ menu="Help", command="about", description="About" }
]
func _ready():
for m in $VBoxContainer/Menu.get_children():
create_menu(m.get_popup(), m.name)
func create_menu(menu, menu_name):
menu.connect("id_pressed", self, "_on_PopupMenu_id_pressed")
for i in MENU.size():
if MENU[i].menu != menu_name:
continue
if MENU[i].has("submenu"):
var submenu = PopupMenu.new()
create_menu(submenu, MENU[i].submenu)
menu.add_child(submenu)
menu.add_submenu_item(MENU[i].description, submenu.get_name())
elif MENU[i].has("description"):
menu.add_item(MENU[i].description, i)
else:
menu.add_separator()
return menu
func new_material():
var graph_edit = preload("res://addons/procedural_material/graph_edit.tscn").instance()
$VBoxContainer/HBoxContainer/Projects.add_child(graph_edit)
$VBoxContainer/HBoxContainer/Projects.current_tab = graph_edit.get_index()
graph_edit.update_tab_title()
func load_material():
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("*.ptex;Procedural textures file")
dialog.connect("file_selected", self, "do_load_material")
dialog.popup_centered()
func do_load_material(filename):
var graph_edit = preload("res://addons/procedural_material/graph_edit.tscn").instance()
$VBoxContainer/HBoxContainer/Projects.add_child(graph_edit)
$VBoxContainer/HBoxContainer/Projects.current_tab = graph_edit.get_index()
graph_edit.do_load_file(filename)
func save_material():
$VBoxContainer/HBoxContainer/Projects.get_current_tab_control().save_file()
func save_material_as():
$VBoxContainer/HBoxContainer/Projects.get_current_tab_control().save_file_as()
func close_material():
$VBoxContainer/HBoxContainer/Projects.get_current_tab_control().queue_free()
func exit():
queue_free()
func _on_PopupMenu_id_pressed(id):
var node_type = null
if MENU[id].has("command"):
call(MENU[id].command)
func update_preview():
var material_node = $VBoxContainer/HBoxContainer/Projects.get_current_tab_control().get_node("Material")
if material_node != null:
material_node.update_materials($VBoxContainer/HBoxContainer/VBoxContainer/Preview.get_materials())
func _on_Projects_tab_changed(tab):
$VBoxContainer/HBoxContainer/Projects.get_current_tab_control().connect("graph_changed", self, "update_preview")
current_tab = tab

View File

@ -1,8 +1,10 @@
[gd_scene load_steps=2 format=2]
[gd_scene load_steps=4 format=2]
[ext_resource path="res://addons/procedural_material/graph_edit.tscn" type="PackedScene" id=1]
[ext_resource path="res://addons/procedural_material/main_window.gd" type="Script" id=1]
[ext_resource path="res://addons/procedural_material/library.gd" type="Script" id=2]
[ext_resource path="res://addons/procedural_material/preview.tscn" type="PackedScene" id=3]
[node name="PanelContainer" type="Panel"]
[node name="MainWindow" type="Panel" index="0"]
anchor_left = 0.0
anchor_top = 0.0
@ -14,6 +16,7 @@ mouse_filter = 0
mouse_default_cursor_shape = 0
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource( 1 )
_sections_unfolded = [ "Anchor", "Grow Direction", "Margin", "Rect", "Size Flags", "custom_constants" ]
[node name="VBoxContainer" type="VBoxContainer" parent="." index="0"]
@ -47,7 +50,7 @@ size_flags_horizontal = 1
size_flags_vertical = 1
alignment = 0
[node name="FileMenu" type="MenuButton" parent="VBoxContainer/Menu" index="0"]
[node name="File" type="MenuButton" parent="VBoxContainer/Menu" index="0"]
anchor_left = 0.0
anchor_top = 0.0
@ -71,7 +74,7 @@ flat = true
align = 1
items = [ ]
[node name="HelpMenu" type="MenuButton" parent="VBoxContainer/Menu" index="1"]
[node name="Help" type="MenuButton" parent="VBoxContainer/Menu" index="1"]
anchor_left = 0.0
anchor_top = 0.0
@ -116,22 +119,58 @@ collapsed = false
dragger_visibility = 0
_sections_unfolded = [ "Size Flags" ]
[node name="Panel" type="Panel" parent="VBoxContainer/HBoxContainer" index="0"]
[node name="VBoxContainer" type="VSplitContainer" parent="VBoxContainer/HBoxContainer" index="0"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_right = 100.0
margin_right = 314.0
margin_bottom = 696.0
rect_min_size = Vector2( 100, 100 )
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
_sections_unfolded = [ "Rect" ]
size_flags_horizontal = 3
size_flags_vertical = 3
split_offset = 0
collapsed = false
dragger_visibility = 0
_sections_unfolded = [ "Size Flags" ]
[node name="Library" type="Tree" parent="VBoxContainer/HBoxContainer/VBoxContainer" index="0"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_right = 314.0
margin_bottom = 342.0
rect_min_size = Vector2( 100, 100 )
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = true
focus_mode = 2
mouse_filter = 0
mouse_default_cursor_shape = 0
size_flags_horizontal = 3
size_flags_vertical = 3
columns = 1
allow_reselect = false
allow_rmb_select = false
hide_folding = false
hide_root = true
drop_mode_flags = 0
select_mode = 0
script = ExtResource( 2 )
[node name="Preview" parent="VBoxContainer/HBoxContainer/VBoxContainer" index="1" instance=ExtResource( 3 )]
anchor_left = 0.0
anchor_right = 0.0
margin_left = 0.0
margin_top = 354.0
margin_right = 314.0
margin_bottom = 696.0
[node name="Projects" type="TabContainer" parent="VBoxContainer/HBoxContainer" index="1"]
@ -139,26 +178,20 @@ anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_left = 112.0
margin_left = 326.0
margin_right = 1280.0
margin_bottom = 696.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_horizontal = 3
size_flags_vertical = 3
size_flags_stretch_ratio = 3.0
tab_align = 0
tabs_visible = true
_sections_unfolded = [ "Size Flags" ]
[node name="blah" parent="VBoxContainer/HBoxContainer/Projects" index="0" instance=ExtResource( 1 )]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 4.0
margin_top = 32.0
margin_right = -4.0
margin_bottom = -4.0
[connection signal="tab_changed" from="VBoxContainer/HBoxContainer/Projects" to="." method="_on_Projects_tab_changed"]

View File

@ -0,0 +1,70 @@
{"lib":[
{
"tree_item":"Generators/Image",
"type":"image",
"file_path":null
},
{
"tree_item":"Generators/Pattern",
"type":"pattern",
"mix":0,
"x_scale":4,
"x_wave":0,
"y_scale":4,
"y_wave":0
},
{
"tree_item":"Generators/Bricks",
"type":"bricks",
"bevel":0.1,
"columns":3,
"mortar":0.1,
"row_offset":0.5,
"rows":6
},
{
"tree_item":"Generators/Perlin Noise",
"type":"perlin",
"iterations":3,
"persistence":0.5,
"scale_x":4,
"scale_y":4
},
{
"tree_item":"Generators/Voronoi Noise",
"type":"voronoi",
"intensity":1,
"scale_x":4,
"scale_y":4
},
{
"tree_item":"Filters/Colorize",
"type":"colorize",
"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":1,"g":1,"pos":1,"r":1}],
"name":"colorize_0"
},
{
"tree_item":"Filters/Blend",
"type":"blend",
"amount":0.5,
"blend_type":0
},
{
"tree_item":"Filters/Transform",
"type":"transform",
"rotate":0,
"scale":1,
"translate_x":0,
"translate_y":0
},
{
"tree_item":"Filters/Warp",
"type":"warp",
"amount":0.5
},
{
"tree_item":"Filters/Normal map",
"type":"normal_map",
"amount":0.5
}
]}

View File

@ -170,7 +170,8 @@ func serialize():
return data
func deserialize(data):
offset = Vector2(data.node_position.x, data.node_position.y)
if data.has("node_position"):
offset = Vector2(data.node_position.x, data.node_position.y)
for w in property_widgets:
var variable = w.name
if data.has(variable):

View File

@ -29,5 +29,6 @@ func serialize():
return data
func deserialize(data):
$Control.deserialize(data.gradient)
if data.has("gradient"):
$Control.deserialize(data.gradient)
.deserialize(data)

View File

@ -12,7 +12,7 @@ func set_texture(path):
if path != null:
texture.load(path)
$TextureButton.texture_normal = texture
get_parent().get_parent().generate_shader()
update_shaders()
func get_textures():
var list = {}
@ -47,5 +47,6 @@ func serialize():
return data
func deserialize(data):
set_texture(data.file_path)
if data.has("file_path"):
set_texture(data.file_path)
.deserialize(data)

View File

@ -12,8 +12,8 @@ anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_top = 1.0
margin_right = 192.0
margin_bottom = 79.0
margin_right = 208.0
margin_bottom = 100.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 1
@ -21,7 +21,7 @@ mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 1
theme = SubResource( 1 )
title = "Sine"
title = "Pattern"
offset = Vector2( 0, 0 )
show_close = true
resizable = false
@ -57,13 +57,13 @@ anchor_right = 0.0
anchor_bottom = 0.0
margin_left = 16.0
margin_top = 24.0
margin_right = 177.0
margin_right = 192.0
margin_bottom = 44.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 1
mouse_default_cursor_shape = 0
size_flags_horizontal = 0
size_flags_horizontal = 3
size_flags_vertical = 1
alignment = 0
_sections_unfolded = [ "Size Flags" ]
@ -75,7 +75,7 @@ anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_top = 3.0
margin_right = 66.0
margin_right = 81.0
margin_bottom = 17.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
@ -94,8 +94,8 @@ anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_left = 70.0
margin_right = 161.0
margin_left = 85.0
margin_right = 176.0
margin_bottom = 20.0
rect_min_size = Vector2( 82, 0 )
rect_pivot_offset = Vector2( 0, 0 )
@ -131,9 +131,10 @@ rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 1
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_horizontal = 3
size_flags_vertical = 1
alignment = 0
_sections_unfolded = [ "Size Flags" ]
[node name="Label" type="Label" parent="HBoxContainer1" index="0"]
@ -225,7 +226,7 @@ rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 1
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_horizontal = 3
size_flags_vertical = 1
alignment = 0
_sections_unfolded = [ "Rect", "Size Flags" ]

View File

@ -1,14 +1,13 @@
tool
extends Container
var save_path = null
var popup_menu = null
var popup_position = Vector2(0, 0)
var selected_node = null
var texture_preview_material = null
var preview_maximized = false
const MENU = [
{ command="new_texture", description="New material" },
{ command="load_texture", description="Load material" },
@ -69,79 +68,57 @@ func _on_PopupMenu_id_pressed(id):
if MENU[id].has("command"):
call(MENU[id].command)
elif MENU[id].has("name"):
node_type = load("res://addons/procedural_material/nodes/"+MENU[id].name+".tscn")
if node_type != null:
var node = node_type.instance()
var i = 0
while true:
var name = MENU[id].name+"_"+str(i)
if !$GraphEdit.has_node(name):
node.set_name(name)
break
i += 1
$GraphEdit.add_node(node, popup_position)
node.offset = ($GraphEdit.scroll_offset + popup_position - $GraphEdit.rect_global_position) / $GraphEdit.zoom
$GraphEdit.create_node({type=MENU[id].name}, popup_position)
func set_save_path(path):
save_path = path
func set_save_path(graph_edit, path):
if !Engine.editor_hint:
if save_path != null:
OS.set_window_title("Procedural textures (%s)" % save_path)
if path != null:
OS.set_window_title("Procedural textures (%s)" % path)
else:
OS.set_window_title("Procedural textures")
func new_texture():
$GraphEdit.new_material()
set_save_path(null)
func load_texture():
selected_node = null
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("*.ptex;Procedural textures file")
dialog.connect("file_selected", self, "do_load_texture")
dialog.popup_centered()
func do_load_texture(path):
set_save_path(path)
$GraphEdit.load_file(save_path)
$GraphEdit.load_file()
func save_texture():
if save_path != null:
$GraphEdit.save_file(save_path)
else:
save_texture_as()
$GraphEdit.save_file()
func save_texture_as():
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("*.ptex;Procedural textures file")
dialog.connect("file_selected", self, "do_save_texture")
dialog.popup_centered()
$GraphEdit.save_file_as()
func do_save_texture(path):
set_save_path(path)
$GraphEdit.save_file(save_path)
func export_texture():
$GraphEdit.export_textures()
func export_texture(size = 512):
#$GraphEdit.export_texture(selected_node, "res://generated_image.png", size)
var prefix = save_path.left(save_path.rfind("."))
$GraphEdit/Material.export_textures(prefix)
func get_selected_node():
var rv = null
for c in $GraphEdit.get_children():
if c is GraphNode && c.selected:
if rv != null:
return null
else:
rv = c
return rv
func generate_shader():
var selected_node = get_selected_node()
if $GraphEdit/Material != null:
$GraphEdit/Material.update_materials($Preview/Preview.get_materials())
if selected_node != null && selected_node is GraphNode:
if selected_node != null:
$GraphEdit.setup_material(texture_preview_material, selected_node.get_textures(), selected_node.generate_shader())
func _on_GraphEdit_node_selected(node):
if selected_node != node && node is GraphNode:
selected_node = node
var selected_node = get_selected_node()
if selected_node != null:
$GraphEdit.setup_material(texture_preview_material, selected_node.get_textures(), selected_node.generate_shader())
func _on_SelectedPreview_gui_input(ev):
if ev is InputEventMouseButton && ev.button_index == 1 && ev.doubleclick:
if preview_maximized:
$Preview/Preview/SelectedPreview/SelectedPreviewAnimation.play("minimize")
else:
$Preview/Preview/SelectedPreview/SelectedPreviewAnimation.play("maximize")
preview_maximized = !preview_maximized

File diff suppressed because one or more lines are too long

View File

@ -1,8 +1,6 @@
tool
extends ViewportContainer
var preview_maximized = false
const ENVIRONMENTS = [
"experiment", "lobby", "night", "park", "schelde"
]
@ -14,14 +12,6 @@ func _ready():
$ObjectRotate.play("rotate")
_on_Environment_item_selected($Environment.selected)
func _on_SelectedPreview_gui_input(ev):
if ev is InputEventMouseButton && ev.button_index == 1 && ev.doubleclick:
if preview_maximized:
$SelectedPreviewAnimation.play("minimize")
else:
$SelectedPreviewAnimation.play("maximize")
preview_maximized = !preview_maximized
func _on_Environment_item_selected(id):
$MaterialPreview/WorldEnvironment.environment.background_sky.panorama = load("res://addons/procedural_material/panoramas/"+ENVIRONMENTS[id]+".hdr")
@ -32,3 +22,7 @@ func _on_Model_item_selected(id):
func get_materials():
return [ $MaterialPreview/Objects/Cube.get_surface_material(0) ]
func _on_Preview_item_rect_changed():
$MaterialPreview.size = rect_size

File diff suppressed because one or more lines are too long

1
examples/dry_earth.ptex Normal file
View File

@ -0,0 +1 @@
{"connections":[{"from":"perlin_0","from_port":0,"to":"colorize_0","to_port":0},{"from":"voronoi_0","from_port":1,"to":"colorize_1","to_port":0},{"from":"colorize_0","from_port":0,"to":"blend_0","to_port":1},{"from":"blend_0","from_port":0,"to":"Material","to_port":0},{"from":"colorize_1","from_port":0,"to":"warp_0","to_port":0},{"from":"perlin_1","from_port":0,"to":"warp_0","to_port":1},{"from":"warp_0","from_port":0,"to":"blend_0","to_port":0},{"from":"perlin_1","from_port":0,"to":"colorize_2","to_port":0},{"from":"colorize_2","from_port":0,"to":"Material","to_port":2},{"from":"colorize_3","from_port":0,"to":"Material","to_port":1},{"from":"perlin_1","from_port":0,"to":"colorize_3","to_port":0},{"from":"warp_0","from_port":0,"to":"colorize_4","to_port":0},{"from":"normal_map_0","from_port":0,"to":"Material","to_port":4},{"from":"colorize_4","from_port":0,"to":"blend_1","to_port":1},{"from":"blend_1","from_port":0,"to":"normal_map_0","to_port":0},{"from":"perlin_0","from_port":0,"to":"blend_1","to_port":0}],"nodes":[{"intensity":0.6,"name":"voronoi_0","node_position":{"x":-165,"y":-96.75},"scale_x":4,"scale_y":4,"type":"voronoi"},{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":1,"g":1,"pos":0.081818,"r":1}],"name":"colorize_1","node_position":{"x":93,"y":-117.75},"type":"colorize"},{"iterations":3,"name":"perlin_1","node_position":{"x":-144,"y":50.25},"persistence":0.5,"scale_x":4,"scale_y":4,"type":"perlin"},{"gradient":[{"b":0.200277,"g":0.378784,"pos":0.254545,"r":0.557292},{"b":0.03776,"g":0.150513,"pos":0.663636,"r":0.25}],"name":"colorize_0","node_position":{"x":338,"y":-237.75},"type":"colorize"},{"iterations":10,"name":"perlin_0","node_position":{"x":56,"y":-361.75},"persistence":0.9,"scale_x":2,"scale_y":2,"type":"perlin"},{"name":"Material","node_position":{"x":786,"y":53},"type":"material"},{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":0.15625,"g":0.15625,"pos":1,"r":0.15625}],"name":"colorize_3","node_position":{"x":465,"y":33.25},"type":"colorize"},{"gradient":[{"b":0.90625,"g":0.90625,"pos":0,"r":0.90625},{"b":0.890625,"g":0.890625,"pos":1,"r":0.890625}],"name":"colorize_2","node_position":{"x":454,"y":104.25},"type":"colorize"},{"amount":0.4,"blend_type":2,"name":"blend_0","node_position":{"x":541,"y":-82.75},"type":"blend"},{"amount":0.4,"name":"warp_0","node_position":{"x":264,"y":-13.75},"type":"warp"},{"amount":0.35,"name":"normal_map_0","node_position":{"x":652,"y":222.25},"type":"normal_map"},{"gradient":[{"b":1,"g":1,"pos":0,"r":1},{"b":0,"g":0,"pos":1,"r":0}],"name":"colorize_4","node_position":{"x":228,"y":213.25},"type":"colorize"},{"amount":0.5,"blend_type":0,"name":"blend_1","node_position":{"x":454,"y":226.25},"type":"blend"}]}

1
examples/floor1.ptex Normal file
View File

@ -0,0 +1 @@
{"connections":[{"from":"bricks_0","from_port":0,"to":"colorize_0","to_port":0},{"from":"perlin_0","from_port":0,"to":"warp_0","to_port":1},{"from":"colorize_0","from_port":0,"to":"warp_0","to_port":0},{"from":"bricks_0","from_port":0,"to":"colorize_1","to_port":0},{"from":"normal_map_0","from_port":0,"to":"Material","to_port":4},{"from":"transform_0","from_port":0,"to":"blend_0","to_port":0},{"from":"blend_0","from_port":0,"to":"blend_1","to_port":1},{"from":"transform_1","from_port":0,"to":"transform_2","to_port":0},{"from":"transform_1","from_port":0,"to":"blend_2","to_port":0},{"from":"transform_2","from_port":0,"to":"blend_2","to_port":1},{"from":"blend_2","from_port":0,"to":"colorize_3","to_port":0},{"from":"colorize_3","from_port":0,"to":"transform_3","to_port":0},{"from":"blend_1","from_port":0,"to":"transform_1","to_port":0},{"from":"pattern_1","from_port":0,"to":"blend_0","to_port":1},{"from":"pattern_1","from_port":0,"to":"transform_0","to_port":0},{"from":"pattern_0","from_port":0,"to":"colorize_2","to_port":0},{"from":"colorize_2","from_port":0,"to":"blend_1","to_port":0},{"from":"colorize_1","from_port":0,"to":"normal_map_0","to_port":0},{"from":"warp_0","from_port":0,"to":"blend_3","to_port":0},{"from":"blend_3","from_port":0,"to":"Material","to_port":0},{"from":"colorize_0","from_port":0,"to":"colorize_4","to_port":0},{"from":"colorize_4","from_port":0,"to":"blend_3","to_port":1},{"from":"transform_3","from_port":0,"to":"blend_3","to_port":2}],"nodes":[{"bevel":0.05,"columns":6,"mortar":0.05,"name":"bricks_0","node_position":{"x":22,"y":247},"row_offset":0,"rows":6,"type":"bricks"},{"iterations":3,"name":"perlin_0","node_position":{"x":295,"y":220},"persistence":0.5,"scale_x":4,"scale_y":4,"type":"perlin"},{"gradient":[{"b":0.406358,"g":0.500692,"pos":0.027273,"r":0.557292},{"b":0,"g":0.21875,"pos":0.127273,"r":1}],"name":"colorize_0","node_position":{"x":294,"y":83},"type":"colorize"},{"amount":1,"name":"normal_map_0","node_position":{"x":759,"y":424},"type":"normal_map"},{"name":"Material","node_position":{"x":916,"y":424},"type":"material"},{"mix":0,"name":"pattern_0","node_position":{"x":-840,"y":785},"type":"pattern","x_scale":2,"x_wave":0,"y_scale":1,"y_wave":0},{"name":"transform_0","node_position":{"x":-792,"y":930},"rotate":270,"scale":1,"translate_x":0,"translate_y":0,"type":"transform"},{"mix":0,"name":"pattern_1","node_position":{"x":-884,"y":1153},"type":"pattern","x_scale":1,"x_wave":2,"y_scale":1,"y_wave":2},{"amount":1,"blend_type":3,"name":"blend_0","node_position":{"x":-513,"y":1036},"type":"blend"},{"name":"transform_2","node_position":{"x":-189,"y":938},"rotate":90,"scale":1,"translate_x":0,"translate_y":0,"type":"transform"},{"amount":0.5,"blend_type":0,"name":"blend_2","node_position":{"x":41,"y":910},"type":"blend"},{"gradient":[{"b":0,"g":0,"pos":0.645455,"r":0},{"b":1,"g":1,"pos":0.781818,"r":1}],"name":"colorize_2","node_position":{"x":-572.181396,"y":751},"type":"colorize"},{"amount":1,"blend_type":2,"name":"blend_1","node_position":{"x":-393,"y":822},"type":"blend"},{"name":"transform_1","node_position":{"x":-185,"y":775},"rotate":0,"scale":1,"translate_x":-0.25,"translate_y":-0,"type":"transform"},{"gradient":[{"b":1,"g":1,"pos":0.309091,"r":1},{"b":0,"g":0,"pos":0.481818,"r":0}],"name":"colorize_3","node_position":{"x":47,"y":803},"type":"colorize"},{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":1,"g":1,"pos":1,"r":1}],"name":"colorize_1","node_position":{"x":329,"y":383},"type":"colorize"},{"name":"transform_3","node_position":{"x":137,"y":618},"rotate":0,"scale":0.5,"translate_x":0,"translate_y":0,"type":"transform"},{"amount":0.2,"name":"warp_0","node_position":{"x":694,"y":155},"type":"warp"},{"amount":1,"blend_type":0,"name":"blend_3","node_position":{"x":876.976318,"y":196.25},"type":"blend"},{"gradient":[{"b":0,"g":0,"pos":0,"r":0.489583},{"b":0,"g":0,"pos":1,"r":0.489583}],"name":"colorize_4","node_position":{"x":598.976318,"y":258.25},"type":"colorize"}]}

View File

@ -0,0 +1 @@
{"connections":[{"from":"perlin_0","from_port":0,"to":"colorize_0","to_port":0},{"from":"voronoi_0","from_port":0,"to":"colorize_1","to_port":0},{"from":"colorize_0","from_port":0,"to":"blend_0","to_port":0},{"from":"colorize_1","from_port":0,"to":"blend_0","to_port":2},{"from":"perlin_0","from_port":0,"to":"normal_map_0","to_port":0},{"from":"normal_map_0","from_port":0,"to":"Material","to_port":4},{"from":"colorize_3","from_port":0,"to":"Material","to_port":1},{"from":"colorize_1","from_port":0,"to":"colorize_3","to_port":0},{"from":"colorize_3","from_port":0,"to":"Material","to_port":2},{"from":"voronoi_0","from_port":2,"to":"blend_0","to_port":1},{"from":"voronoi_0","from_port":0,"to":"colorize_2","to_port":0},{"from":"perlin_0","from_port":0,"to":"colorize_4","to_port":0},{"from":"blend_0","from_port":0,"to":"blend_1","to_port":0},{"from":"colorize_4","from_port":0,"to":"blend_1","to_port":1},{"from":"blend_1","from_port":0,"to":"Material","to_port":0},{"from":"colorize_2","from_port":0,"to":"blend_1","to_port":2}],"nodes":[{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":0,"g":0,"pos":1,"r":0}],"name":"colorize_3","node_position":{"x":655,"y":93.25},"type":"colorize"},{"gradient":[{"b":0.15682,"g":0.734375,"pos":0.454545,"r":0.247062},{"b":0.112522,"g":0.317708,"pos":0.881818,"r":0.144582}],"name":"colorize_0","node_position":{"x":335,"y":-261.75},"type":"colorize"},{"iterations":9,"name":"perlin_0","node_position":{"x":-25,"y":-27.75},"persistence":0.8,"scale_x":6,"scale_y":6,"type":"perlin"},{"intensity":1,"name":"voronoi_0","node_position":{"x":269,"y":-104.75},"scale_x":14,"scale_y":14,"type":"voronoi"},{"name":"Material","node_position":{"x":996,"y":22},"type":"material"},{"amount":0.8,"name":"normal_map_0","node_position":{"x":494,"y":258.25},"type":"normal_map"},{"gradient":[{"b":0,"g":0,"pos":0.263636,"r":0},{"b":1,"g":1,"pos":0.436364,"r":1}],"name":"colorize_1","node_position":{"x":524,"y":-26.75},"type":"colorize"},{"gradient":[{"b":0,"g":0,"pos":0.118182,"r":0},{"b":1,"g":1,"pos":0.190909,"r":1}],"name":"colorize_2","node_position":{"x":413,"y":71.25},"type":"colorize"},{"gradient":[{"b":0,"g":0.96875,"pos":0,"r":1},{"b":0,"g":1,"pos":1,"r":1}],"name":"colorize_4","node_position":{"x":407,"y":-177.75},"type":"colorize"},{"amount":0.5,"blend_type":0,"name":"blend_0","node_position":{"x":643,"y":-244.75},"type":"blend"},{"amount":0.5,"blend_type":0,"name":"blend_1","node_position":{"x":826,"y":-119.75},"type":"blend"}]}

1
examples/rock.ptex Normal file
View File

@ -0,0 +1 @@
{"connections":[{"from":"voronoi_0","from_port":0,"to":"blend_0","to_port":0},{"from":"voronoi_0","from_port":1,"to":"blend_0","to_port":1},{"from":"perlin_0","from_port":0,"to":"blend_0","to_port":2},{"from":"blend_0","from_port":0,"to":"colorize_0","to_port":0},{"from":"colorize_0","from_port":0,"to":"Material","to_port":0},{"from":"normal_map_0","from_port":0,"to":"Material","to_port":4},{"from":"perlin_0","from_port":0,"to":"colorize_1","to_port":0},{"from":"colorize_1","from_port":0,"to":"Material","to_port":1},{"from":"perlin_0","from_port":0,"to":"colorize_2","to_port":0},{"from":"colorize_2","from_port":0,"to":"Material","to_port":2},{"from":"perlin_0","from_port":0,"to":"normal_map_0","to_port":0}],"nodes":[{"name":"Material","node_position":{"x":768,"y":239},"type":"material"},{"intensity":1,"name":"voronoi_0","node_position":{"x":128,"y":394},"scale_x":4,"scale_y":4,"type":"voronoi"},{"amount":0.5,"name":"normal_map_0","node_position":{"x":531,"y":432},"type":"normal_map"},{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":0.260417,"g":0.260417,"pos":1,"r":0.260417}],"name":"colorize_1","node_position":{"x":533,"y":343},"type":"colorize"},{"amount":0.5,"blend_type":0,"name":"blend_0","node_position":{"x":327,"y":411},"type":"blend"},{"gradient":[{"b":0.391927,"g":0.523519,"pos":0,"r":0.583333},{"b":0.240885,"g":0.276693,"pos":0.354545,"r":0.3125},{"b":0.391927,"g":0.523519,"pos":0.681818,"r":0.583333},{"b":0.240885,"g":0.276693,"pos":0.963636,"r":0.3125}],"name":"colorize_0","node_position":{"x":530,"y":171},"type":"colorize"},{"iterations":6,"name":"perlin_0","node_position":{"x":122,"y":191},"persistence":0.85,"scale_x":4,"scale_y":4,"type":"perlin"},{"gradient":[{"b":0.364583,"g":0.364583,"pos":0,"r":0.364583},{"b":1,"g":1,"pos":1,"r":1}],"name":"colorize_2","node_position":{"x":526,"y":258},"type":"colorize"}]}

1
examples/stone_wall.ptex Normal file
View File

@ -0,0 +1 @@
{"connections":[{"from":"Warp","from_port":0,"to":"colorize_2","to_port":0},{"from":"colorize_2","from_port":0,"to":"blend_0","to_port":2},{"from":"colorize_1","from_port":0,"to":"blend_0","to_port":0},{"from":"colorize_0","from_port":0,"to":"blend_0","to_port":1},{"from":"blend_0","from_port":0,"to":"Material","to_port":0},{"from":"normal_map_0","from_port":0,"to":"Material","to_port":4},{"from":"colorize_2","from_port":0,"to":"colorize_4","to_port":0},{"from":"colorize_4","from_port":0,"to":"Material","to_port":2},{"from":"colorize_2","from_port":0,"to":"colorize_5","to_port":0},{"from":"colorize_5","from_port":0,"to":"Material","to_port":1},{"from":"Bricks","from_port":0,"to":"Warp","to_port":0},{"from":"blend_1","from_port":0,"to":"colorize_1","to_port":0},{"from":"Bricks","from_port":1,"to":"blend_1","to_port":1},{"from":"Warp","from_port":0,"to":"blend_2","to_port":0},{"from":"Perlin","from_port":0,"to":"blend_2","to_port":1},{"from":"blend_2","from_port":0,"to":"colorize_3","to_port":0},{"from":"blend_2","from_port":0,"to":"colorize_6","to_port":0},{"from":"colorize_6","from_port":0,"to":"normal_map_0","to_port":0},{"from":"Perlin","from_port":0,"to":"blend_1","to_port":0},{"from":"Perlin","from_port":0,"to":"colorize_0","to_port":0},{"from":"colorize_3","from_port":0,"to":"Material","to_port":5},{"from":"perlin_0","from_port":0,"to":"Warp","to_port":1}],"nodes":[{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":0,"g":0,"pos":1,"r":0}],"name":"colorize_5","node_position":{"x":837,"y":157},"type":"colorize"},{"amount":0.1,"name":"Warp","node_position":{"x":384,"y":10.75},"type":"warp"},{"gradient":[{"b":1,"g":1,"pos":0,"r":1},{"b":0,"g":0,"pos":1,"r":0}],"name":"colorize_6","node_position":{"x":743,"y":291},"type":"colorize"},{"gradient":[{"b":0.119792,"g":0.119792,"pos":0,"r":0.119792},{"b":0,"g":0,"pos":1,"r":0}],"name":"colorize_3","node_position":{"x":774,"y":400},"type":"colorize"},{"amount":0.5,"blend_type":0,"name":"blend_2","node_position":{"x":536,"y":331},"type":"blend"},{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":1,"g":1,"pos":0.063636,"r":1}],"name":"colorize_2","node_position":{"x":535.943665,"y":163},"type":"colorize"},{"amount":0.5,"blend_type":0,"name":"blend_0","node_position":{"x":836.943726,"y":-71},"type":"blend"},{"gradient":[{"b":0.864583,"g":0.864583,"pos":0,"r":0.864583},{"b":0.854167,"g":0.854167,"pos":1,"r":0.854167}],"name":"colorize_4","node_position":{"x":708,"y":224},"type":"colorize"},{"amount":0.5,"name":"normal_map_0","node_position":{"x":917,"y":273},"type":"normal_map"},{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":1,"g":1,"pos":1,"r":1}],"name":"colorize_0","node_position":{"x":560.943665,"y":50},"type":"colorize"},{"iterations":4,"name":"perlin_0","node_position":{"x":92,"y":210},"persistence":0.75,"scale_x":4,"scale_y":4,"type":"perlin"},{"amount":0.5,"blend_type":6,"name":"blend_1","node_position":{"x":351,"y":244},"type":"blend"},{"bevel":0.2,"columns":3,"mortar":0.1,"name":"Bricks","node_position":{"x":107,"y":-27},"row_offset":0.5,"rows":6,"type":"bricks"},{"iterations":10,"name":"Perlin","node_position":{"x":102,"y":-195},"persistence":0.75,"scale_x":4,"scale_y":4,"type":"perlin"},{"name":"Material","node_position":{"x":1109,"y":161},"type":"material"},{"gradient":[{"b":0.557292,"g":0.557292,"pos":0,"r":0.557292},{"b":0.180664,"g":0.22934,"pos":0.2,"r":0.234375},{"b":0.60574,"g":0.694487,"pos":0.345455,"r":0.755208},{"b":0.144423,"g":0.184147,"pos":0.554545,"r":0.229167},{"b":0.447537,"g":0.553291,"pos":0.736364,"r":0.588542},{"b":0.212674,"g":0.236125,"pos":1,"r":0.291667}],"name":"colorize_1","node_position":{"x":561.943665,"y":-78},"type":"colorize"}]}

View File

@ -0,0 +1 @@
{"connections":[{"from":"bricks_0","from_port":0,"to":"colorize_0","to_port":0},{"from":"colorize_0","from_port":0,"to":"blend_0","to_port":0},{"from":"perlin_0","from_port":0,"to":"blend_0","to_port":1},{"from":"blend_0","from_port":0,"to":"Material","to_port":0},{"from":"blend_0","from_port":0,"to":"colorize_1","to_port":0},{"from":"colorize_1","from_port":0,"to":"normal_map_0","to_port":0},{"from":"normal_map_0","from_port":0,"to":"Material","to_port":4},{"from":"blend_0","from_port":0,"to":"Material","to_port":2},{"from":"colorize_2","from_port":0,"to":"Material","to_port":1},{"from":"blend_0","from_port":0,"to":"colorize_2","to_port":0}],"nodes":[{"name":"Material","node_position":{"x":1036,"y":14},"type":"material"},{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":0,"g":0,"pos":1,"r":0}],"name":"colorize_2","node_position":{"x":862,"y":16.25},"type":"colorize"},{"amount":0.5,"name":"normal_map_0","node_position":{"x":891,"y":82.25},"type":"normal_map"},{"gradient":[{"b":1,"g":1,"pos":0,"r":1},{"b":0,"g":0,"pos":1,"r":0}],"name":"colorize_1","node_position":{"x":726,"y":100.25},"type":"colorize"},{"amount":0.5,"blend_type":0,"name":"blend_0","node_position":{"x":660,"y":-20.75},"type":"blend"},{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":0.213623,"g":0.391325,"pos":0.154545,"r":0.651042}],"name":"colorize_0","node_position":{"x":478,"y":-5.75},"type":"colorize"},{"bevel":0,"columns":1,"mortar":0.05,"name":"bricks_0","node_position":{"x":281,"y":-2.75},"row_offset":0.5,"rows":9,"type":"bricks"},{"iterations":7,"name":"perlin_0","node_position":{"x":391,"y":157.25},"persistence":0.75,"scale_x":4,"scale_y":20,"type":"perlin"}]}

View File

@ -11,7 +11,7 @@ config_version=3
[application]
config/name="Procedural textures"
run/main_scene="res://addons/procedural_material/pm_editor.tscn"
run/main_scene="res://addons/procedural_material/main_window.tscn"
config/icon="res://icon.png"
[display]