mirror of
https://github.com/Relintai/material-maker.git
synced 2024-12-23 21:16:54 +01:00
More UI progress...
Refactored preview stuff and updated new UI
This commit is contained in:
parent
30c711920f
commit
0e1f891910
4
.gitignore
vendored
4
.gitignore
vendored
@ -16,3 +16,7 @@ addons/procedural_material/models/models.dae.import
|
||||
/examples/*.import
|
||||
examples/input_image.png.import
|
||||
examples/input_image.png.import
|
||||
*.import
|
||||
*.import
|
||||
*.import
|
||||
*.import
|
||||
|
@ -8,13 +8,23 @@ func get_drag_data(position):
|
||||
var selected_item = get_selected()
|
||||
if selected_item != null:
|
||||
var data = selected_item.get_metadata(0)
|
||||
var preview
|
||||
if data.has("icon") && data.has("library"):
|
||||
var filename = data.library.left(data.library.rfind("."))+"/"+data.icon+".png"
|
||||
preview = TextureRect.new()
|
||||
preview.texture = ImageTexture.new()
|
||||
preview.texture.load(filename)
|
||||
else:
|
||||
preview = Label.new()
|
||||
preview.text = data.tree_item
|
||||
set_drag_preview(preview)
|
||||
return data
|
||||
return null
|
||||
|
||||
|
||||
func _ready():
|
||||
var root = create_item()
|
||||
add_library("res://addons/procedural_material/material_library.json")
|
||||
add_library("res://addons/procedural_material/library/base.json")
|
||||
add_library("res://addons/procedural_material/library/user.json")
|
||||
|
||||
func add_library(filename):
|
||||
var root = get_root()
|
||||
@ -24,6 +34,7 @@ func add_library(filename):
|
||||
var lib = parse_json(file.get_as_text())
|
||||
file.close()
|
||||
for m in lib.lib:
|
||||
m.library = filename
|
||||
add_item(m, m.tree_item, root)
|
||||
|
||||
func add_item(item, item_name, item_parent):
|
||||
|
@ -6,6 +6,7 @@
|
||||
},
|
||||
{
|
||||
"tree_item":"Generators/Pattern",
|
||||
"icon":"pattern",
|
||||
"type":"pattern",
|
||||
"mix":0,
|
||||
"x_scale":4,
|
||||
@ -16,6 +17,7 @@
|
||||
{
|
||||
"tree_item":"Generators/Bricks",
|
||||
"type":"bricks",
|
||||
"icon":"bricks",
|
||||
"bevel":0.1,
|
||||
"columns":3,
|
||||
"mortar":0.1,
|
||||
@ -25,6 +27,7 @@
|
||||
{
|
||||
"tree_item":"Generators/Perlin Noise",
|
||||
"type":"perlin",
|
||||
"icon":"perlin",
|
||||
"iterations":3,
|
||||
"persistence":0.5,
|
||||
"scale_x":4,
|
||||
@ -33,6 +36,7 @@
|
||||
{
|
||||
"tree_item":"Generators/Voronoi Noise",
|
||||
"type":"voronoi",
|
||||
"icon":"voronoi",
|
||||
"intensity":1,
|
||||
"scale_x":4,
|
||||
"scale_y":4
|
||||
@ -40,8 +44,7 @@
|
||||
{
|
||||
"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"
|
||||
"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":1,"g":1,"pos":1,"r":1}]
|
||||
},
|
||||
{
|
||||
"tree_item":"Filters/Blend",
|
BIN
addons/procedural_material/library/base/bricks.png
Normal file
BIN
addons/procedural_material/library/base/bricks.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 455 B |
BIN
addons/procedural_material/library/base/pattern.png
Normal file
BIN
addons/procedural_material/library/base/pattern.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 646 B |
BIN
addons/procedural_material/library/base/perlin.png
Normal file
BIN
addons/procedural_material/library/base/perlin.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.4 KiB |
BIN
addons/procedural_material/library/base/voronoi.png
Normal file
BIN
addons/procedural_material/library/base/voronoi.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.4 KiB |
@ -14,6 +14,7 @@ const MENU = [
|
||||
{ menu="File" },
|
||||
{ menu="File", command="close_material", description="Close material" },
|
||||
{ menu="File", command="exit", description="Exit" },
|
||||
{ menu="Tools", command="save_icons", description="Save icons for selected nodes" },
|
||||
{ menu="Help", command="about", description="About" }
|
||||
]
|
||||
|
||||
@ -37,10 +38,14 @@ func create_menu(menu, menu_name):
|
||||
menu.add_separator()
|
||||
return menu
|
||||
|
||||
func new_material():
|
||||
func new_pane():
|
||||
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()
|
||||
return graph_edit
|
||||
|
||||
func new_material():
|
||||
var graph_edit = new_pane()
|
||||
graph_edit.update_tab_title()
|
||||
|
||||
func load_material():
|
||||
@ -54,9 +59,7 @@ func 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()
|
||||
var graph_edit = new_pane()
|
||||
graph_edit.do_load_file(filename)
|
||||
|
||||
func save_material():
|
||||
@ -68,6 +71,12 @@ func save_material_as():
|
||||
func close_material():
|
||||
$VBoxContainer/HBoxContainer/Projects.get_current_tab_control().queue_free()
|
||||
|
||||
func save_icons():
|
||||
var graphedit = $VBoxContainer/HBoxContainer/Projects.get_current_tab_control()
|
||||
for n in graphedit.get_children():
|
||||
if n is GraphNode and n.selected:
|
||||
graphedit.export_texture(n, "res://addons/procedural_material/library/icons/"+n.name+".png", 64)
|
||||
|
||||
func exit():
|
||||
queue_free()
|
||||
|
||||
@ -76,11 +85,28 @@ func _on_PopupMenu_id_pressed(id):
|
||||
if MENU[id].has("command"):
|
||||
call(MENU[id].command)
|
||||
|
||||
# Preview
|
||||
|
||||
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())
|
||||
update_preview_2d()
|
||||
|
||||
func update_preview_2d(node = null):
|
||||
var graphedit = $VBoxContainer/HBoxContainer/Projects.get_current_tab_control()
|
||||
var preview = $VBoxContainer/HBoxContainer/VBoxContainer/Preview
|
||||
if node == null:
|
||||
for n in graphedit.get_children():
|
||||
if n is GraphNode and n.selected:
|
||||
node = n
|
||||
break
|
||||
if node != null:
|
||||
graphedit.setup_material(preview.get_2d_material(), node.get_textures(), node.generate_shader())
|
||||
|
||||
func _on_Projects_tab_changed(tab):
|
||||
if tab != current_tab:
|
||||
$VBoxContainer/HBoxContainer/Projects.get_current_tab_control().connect("graph_changed", self, "update_preview")
|
||||
$VBoxContainer/HBoxContainer/Projects.get_current_tab_control().connect("node_selected", self, "update_preview_2d")
|
||||
current_tab = tab
|
||||
update_preview()
|
||||
|
@ -4,7 +4,7 @@
|
||||
[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="MainWindow" type="Panel" index="0"]
|
||||
[node name="MainWindow" type="Panel"]
|
||||
|
||||
anchor_left = 0.0
|
||||
anchor_top = 0.0
|
||||
@ -74,14 +74,64 @@ flat = true
|
||||
align = 1
|
||||
items = [ ]
|
||||
|
||||
[node name="Help" type="MenuButton" parent="VBoxContainer/Menu" index="1"]
|
||||
[node name="Edit" type="MenuButton" parent="VBoxContainer/Menu" index="1"]
|
||||
|
||||
anchor_left = 0.0
|
||||
anchor_top = 0.0
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_left = 39.0
|
||||
margin_right = 81.0
|
||||
margin_right = 75.0
|
||||
margin_bottom = 20.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
|
||||
toggle_mode = false
|
||||
action_mode = 0
|
||||
enabled_focus_mode = 0
|
||||
shortcut = null
|
||||
group = null
|
||||
text = "Edit"
|
||||
flat = true
|
||||
align = 1
|
||||
items = [ ]
|
||||
|
||||
[node name="Tools" type="MenuButton" parent="VBoxContainer/Menu" index="2"]
|
||||
|
||||
anchor_left = 0.0
|
||||
anchor_top = 0.0
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_left = 79.0
|
||||
margin_right = 125.0
|
||||
margin_bottom = 20.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
|
||||
toggle_mode = false
|
||||
action_mode = 0
|
||||
enabled_focus_mode = 0
|
||||
shortcut = null
|
||||
group = null
|
||||
text = "Tools"
|
||||
flat = true
|
||||
align = 1
|
||||
items = [ ]
|
||||
|
||||
[node name="Help" type="MenuButton" parent="VBoxContainer/Menu" index="3"]
|
||||
|
||||
anchor_left = 0.0
|
||||
anchor_top = 0.0
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_left = 129.0
|
||||
margin_right = 171.0
|
||||
margin_bottom = 20.0
|
||||
rect_pivot_offset = Vector2( 0, 0 )
|
||||
rect_clip_content = false
|
||||
|
@ -107,12 +107,12 @@ func generate_shader():
|
||||
if $GraphEdit/Material != null:
|
||||
$GraphEdit/Material.update_materials($Preview/Preview.get_materials())
|
||||
if selected_node != null:
|
||||
$GraphEdit.setup_material(texture_preview_material, selected_node.get_textures(), selected_node.generate_shader())
|
||||
$GraphEdit.setup_material($Preview/Preview.get_2d_material(), selected_node.get_textures(), selected_node.generate_shader())
|
||||
|
||||
func _on_GraphEdit_node_selected(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())
|
||||
$GraphEdit.setup_material($Preview/Preview.get_2d_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:
|
||||
|
@ -4,7 +4,7 @@
|
||||
[ext_resource path="res://addons/procedural_material/graph_edit.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/procedural_material/preview.tscn" type="PackedScene" id=3]
|
||||
|
||||
[sub_resource type="Shader" id=1]
|
||||
[sub_resource type="Shader" id=5]
|
||||
|
||||
code = "shader_type canvas_item;
|
||||
|
||||
@ -14,10 +14,10 @@ void fragment() {
|
||||
"
|
||||
_sections_unfolded = [ "Resource" ]
|
||||
|
||||
[sub_resource type="ShaderMaterial" id=2]
|
||||
[sub_resource type="ShaderMaterial" id=6]
|
||||
|
||||
render_priority = 0
|
||||
shader = SubResource( 1 )
|
||||
shader = SubResource( 5 )
|
||||
|
||||
[sub_resource type="Animation" id=3]
|
||||
|
||||
@ -103,7 +103,7 @@ tracks/2/keys = {
|
||||
"values": [ 3 ]
|
||||
}
|
||||
|
||||
[node name="ProceduralMaterialEditor" type="MarginContainer"]
|
||||
[node name="ProceduralMaterialEditor" type="MarginContainer" index="0"]
|
||||
|
||||
anchor_left = 0.0
|
||||
anchor_top = 0.0
|
||||
@ -148,14 +148,15 @@ _sections_unfolded = [ "Mouse" ]
|
||||
|
||||
[node name="SelectedPreview" type="ColorRect" parent="Preview/Preview" index="4"]
|
||||
|
||||
material = SubResource( 2 )
|
||||
visible = false
|
||||
material = SubResource( 6 )
|
||||
anchor_left = 0.0
|
||||
anchor_top = 0.0
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_left = 2.0
|
||||
margin_top = 252.0
|
||||
margin_right = 98.0
|
||||
margin_top = 2.0
|
||||
margin_right = 348.0
|
||||
margin_bottom = 348.0
|
||||
rect_min_size = Vector2( 96, 96 )
|
||||
rect_pivot_offset = Vector2( 0, 0 )
|
||||
|
@ -1,6 +1,8 @@
|
||||
tool
|
||||
extends ViewportContainer
|
||||
|
||||
var preview_maximized = false
|
||||
|
||||
const ENVIRONMENTS = [
|
||||
"experiment", "lobby", "night", "park", "schelde"
|
||||
]
|
||||
@ -10,19 +12,36 @@ func _ready():
|
||||
$MaterialPreview/Objects/Cube.set_surface_material(0, m)
|
||||
$MaterialPreview/Objects/Cylinder.set_surface_material(0, m)
|
||||
$ObjectRotate.play("rotate")
|
||||
_on_Environment_item_selected($Environment.selected)
|
||||
$Preview2D.material = $Preview2D.material.duplicate(true)
|
||||
_on_Environment_item_selected($Config/Environment.selected)
|
||||
_on_Preview_resized()
|
||||
|
||||
func _on_Environment_item_selected(id):
|
||||
$MaterialPreview/WorldEnvironment.environment.background_sky.panorama = load("res://addons/procedural_material/panoramas/"+ENVIRONMENTS[id]+".hdr")
|
||||
|
||||
func _on_Model_item_selected(id):
|
||||
var model = $Model.get_item_text(id)
|
||||
var model = $Config/Model.get_item_text(id)
|
||||
for c in $MaterialPreview/Objects.get_children():
|
||||
c.visible = (c.get_name() == model)
|
||||
|
||||
func get_materials():
|
||||
return [ $MaterialPreview/Objects/Cube.get_surface_material(0) ]
|
||||
|
||||
func get_2d_material():
|
||||
return $Preview2D.material
|
||||
|
||||
func _on_Preview_resized():
|
||||
if preview_maximized:
|
||||
var size = min(rect_size.x, rect_size.y)
|
||||
$Preview2D.rect_position = 0.5*Vector2(rect_size.x-size, rect_size.y-size)
|
||||
$Preview2D.rect_size = Vector2(size, size)
|
||||
else:
|
||||
$Preview2D.rect_position = Vector2(0, rect_size.y-64)
|
||||
$Preview2D.rect_size = Vector2(64, 64)
|
||||
|
||||
func _on_Preview2D_gui_input(ev):
|
||||
if ev is InputEventMouseButton && ev.button_index == 1 && ev.doubleclick:
|
||||
preview_maximized = !preview_maximized
|
||||
_on_Preview_resized()
|
||||
|
||||
|
||||
func _on_Preview_item_rect_changed():
|
||||
$MaterialPreview.size = rect_size
|
||||
|
@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=9 format=2]
|
||||
[gd_scene load_steps=11 format=2]
|
||||
|
||||
[ext_resource path="res://addons/procedural_material/preview.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/procedural_material/panoramas/park.hdr" type="Texture" id=2]
|
||||
@ -195,16 +195,27 @@ adjustment_contrast = 1.0
|
||||
adjustment_saturation = 1.0
|
||||
_sections_unfolded = [ "Background" ]
|
||||
|
||||
[sub_resource type="Shader" id=7]
|
||||
|
||||
code = "shader_type canvas_item;
|
||||
"
|
||||
|
||||
[sub_resource type="ShaderMaterial" id=8]
|
||||
|
||||
render_priority = 0
|
||||
shader = SubResource( 7 )
|
||||
|
||||
[node name="Preview" type="ViewportContainer"]
|
||||
|
||||
anchor_left = 1.0
|
||||
anchor_top = 0.0
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 0.0
|
||||
margin_left = -364.0
|
||||
margin_left = -398.0
|
||||
margin_top = 3.0
|
||||
margin_right = -14.0
|
||||
margin_bottom = 353.0
|
||||
margin_right = -3.0
|
||||
margin_bottom = 373.0
|
||||
rect_min_size = Vector2( 200, 200 )
|
||||
rect_pivot_offset = Vector2( 0, 0 )
|
||||
rect_clip_content = false
|
||||
mouse_filter = 2
|
||||
@ -230,7 +241,7 @@ _sections_unfolded = [ "Playback Options" ]
|
||||
[node name="MaterialPreview" type="Viewport" parent="." index="1"]
|
||||
|
||||
arvr = false
|
||||
size = Vector2( 350, 350 )
|
||||
size = Vector2( 395, 370 )
|
||||
own_world = true
|
||||
world = null
|
||||
transparent_bg = false
|
||||
@ -256,7 +267,7 @@ _sections_unfolded = [ "GUI", "Render Target" ]
|
||||
|
||||
[node name="Objects" type="Spatial" parent="MaterialPreview" index="0"]
|
||||
|
||||
transform = Transform( 0.965183, 0, -0.26156, 0, 1, 0, 0.26156, 0, 0.965183, 0, 0, 0 )
|
||||
transform = Transform( -0.376032, 0, -0.926603, 0, 1, 0, 0.926603, 0, -0.376032, 0, 0, 0 )
|
||||
_sections_unfolded = [ "Transform" ]
|
||||
|
||||
[node name="Cube" type="MeshInstance" parent="MaterialPreview/Objects" index="0"]
|
||||
@ -336,14 +347,31 @@ _sections_unfolded = [ "Transform" ]
|
||||
|
||||
environment = SubResource( 6 )
|
||||
|
||||
[node name="Model" type="OptionButton" parent="." index="2"]
|
||||
[node name="Config" type="HBoxContainer" parent="." index="2"]
|
||||
|
||||
editor/display_folded = true
|
||||
anchor_left = 0.0
|
||||
anchor_top = 0.0
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 0.0
|
||||
margin_bottom = 20.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="Model" type="OptionButton" parent="Config" index="0"]
|
||||
|
||||
anchor_left = 0.0
|
||||
anchor_top = 0.0
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_right = 110.0
|
||||
margin_right = 100.0
|
||||
margin_bottom = 20.0
|
||||
rect_min_size = Vector2( 100, 0 )
|
||||
rect_pivot_offset = Vector2( 0, 0 )
|
||||
rect_clip_content = false
|
||||
focus_mode = 2
|
||||
@ -361,15 +389,18 @@ flat = false
|
||||
align = 0
|
||||
items = [ "Cube", null, false, 0, null, "Cylinder", null, false, 1, null ]
|
||||
selected = 0
|
||||
_sections_unfolded = [ "Margin", "Rect" ]
|
||||
|
||||
[node name="Environment" type="OptionButton" parent="." index="3"]
|
||||
[node name="Environment" type="OptionButton" parent="Config" index="1"]
|
||||
|
||||
anchor_left = 1.0
|
||||
anchor_left = 0.0
|
||||
anchor_top = 0.0
|
||||
anchor_right = 1.0
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_left = -110.0
|
||||
margin_left = 104.0
|
||||
margin_right = 204.0
|
||||
margin_bottom = 20.0
|
||||
rect_min_size = Vector2( 100, 0 )
|
||||
rect_pivot_offset = Vector2( 0, 0 )
|
||||
rect_clip_content = false
|
||||
focus_mode = 2
|
||||
@ -387,9 +418,33 @@ flat = false
|
||||
align = 0
|
||||
items = [ "Experiment", null, false, 0, null, "Lobby", null, false, 1, null, "Night", null, false, 2, null, "Park", null, false, 3, null, "Schelde", null, false, 4, null ]
|
||||
selected = 3
|
||||
_sections_unfolded = [ "Rect" ]
|
||||
|
||||
[connection signal="item_selected" from="Model" to="." method="_on_Model_item_selected"]
|
||||
[node name="Preview2D" type="ColorRect" parent="." index="3"]
|
||||
|
||||
[connection signal="item_selected" from="Environment" to="." method="_on_Environment_item_selected"]
|
||||
material = SubResource( 8 )
|
||||
anchor_left = 0.0
|
||||
anchor_top = 1.0
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 1.0
|
||||
margin_top = -64.0
|
||||
margin_right = 64.0
|
||||
rect_min_size = Vector2( 64, 64 )
|
||||
rect_pivot_offset = Vector2( 0, 0 )
|
||||
rect_clip_content = false
|
||||
mouse_filter = 1
|
||||
mouse_default_cursor_shape = 0
|
||||
size_flags_horizontal = 0
|
||||
size_flags_vertical = 8
|
||||
color = Color( 1, 1, 1, 1 )
|
||||
_sections_unfolded = [ "Anchor", "Material", "Mouse", "Rect", "Size Flags" ]
|
||||
|
||||
[connection signal="resized" from="." to="." method="_on_Preview_resized"]
|
||||
|
||||
[connection signal="item_selected" from="Config/Model" to="." method="_on_Model_item_selected"]
|
||||
|
||||
[connection signal="item_selected" from="Config/Environment" to="." method="_on_Environment_item_selected"]
|
||||
|
||||
[connection signal="gui_input" from="Preview2D" to="." method="_on_Preview2D_gui_input"]
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user