mirror of
https://github.com/Relintai/material-maker.git
synced 2024-11-13 06:27:18 +01:00
Added menu to show nodes documentation and updated import plugin
This commit is contained in:
parent
d37fc835f9
commit
85599c2fea
@ -150,7 +150,8 @@ func get_generated_texture(slot, file_prefix = null) -> ImageTexture:
|
|||||||
if file_prefix != null:
|
if file_prefix != null:
|
||||||
var file_name = "%s_%s.png" % [ file_prefix, slot ]
|
var file_name = "%s_%s.png" % [ file_prefix, slot ]
|
||||||
if File.new().file_exists(file_name):
|
if File.new().file_exists(file_name):
|
||||||
return load(file_name) as ImageTexture
|
var texture = load(file_name)
|
||||||
|
return texture
|
||||||
else:
|
else:
|
||||||
return null
|
return null
|
||||||
else:
|
else:
|
||||||
@ -162,7 +163,6 @@ func update_spatial_material(m, file_prefix = null) -> void:
|
|||||||
if m is SpatialMaterial:
|
if m is SpatialMaterial:
|
||||||
# Make the material double-sided for better visiblity in the preview
|
# Make the material double-sided for better visiblity in the preview
|
||||||
m.params_cull_mode = SpatialMaterial.CULL_DISABLED
|
m.params_cull_mode = SpatialMaterial.CULL_DISABLED
|
||||||
|
|
||||||
m.albedo_color = parameters.albedo_color
|
m.albedo_color = parameters.albedo_color
|
||||||
m.albedo_texture = get_generated_texture("albedo", file_prefix)
|
m.albedo_texture = get_generated_texture("albedo", file_prefix)
|
||||||
m.metallic = parameters.metallic
|
m.metallic = parameters.metallic
|
||||||
@ -239,11 +239,13 @@ func export_textures(prefix, editor_interface = null) -> SpatialMaterial:
|
|||||||
if Engine.editor_hint and editor_interface != null:
|
if Engine.editor_hint and editor_interface != null:
|
||||||
var resource_filesystem = editor_interface.get_resource_filesystem()
|
var resource_filesystem = editor_interface.get_resource_filesystem()
|
||||||
resource_filesystem.scan()
|
resource_filesystem.scan()
|
||||||
yield(resource_filesystem, "filesystem_changed")
|
yield(resource_filesystem, "resources_reimported")
|
||||||
|
print("resources_reimported")
|
||||||
var new_material = SpatialMaterial.new()
|
var new_material = SpatialMaterial.new()
|
||||||
update_spatial_material(new_material, prefix)
|
update_spatial_material(new_material, prefix)
|
||||||
ResourceSaver.save("%s.tres" % [ prefix ], new_material)
|
var file_name : String = "%s.tres" % [ prefix ]
|
||||||
resource_filesystem.scan()
|
ResourceSaver.save(file_name, new_material)
|
||||||
|
resource_filesystem.update_file(file_name)
|
||||||
return new_material
|
return new_material
|
||||||
|
|
||||||
return null
|
return null
|
||||||
|
@ -47,7 +47,7 @@ func add_node(node) -> void:
|
|||||||
func connect_node(from, from_slot, to, to_slot):
|
func connect_node(from, from_slot, to, to_slot):
|
||||||
if generator.connect_children(get_node(from).generator, from_slot, get_node(to).generator, to_slot):
|
if generator.connect_children(get_node(from).generator, from_slot, get_node(to).generator, to_slot):
|
||||||
var disconnect = get_source(to, to_slot)
|
var disconnect = get_source(to, to_slot)
|
||||||
if disconnect != null:
|
if !disconnect.empty():
|
||||||
.disconnect_node(disconnect.node, disconnect.slot, to, to_slot)
|
.disconnect_node(disconnect.node, disconnect.slot, to, to_slot)
|
||||||
.connect_node(from, from_slot, to, to_slot)
|
.connect_node(from, from_slot, to, to_slot)
|
||||||
send_changed_signal()
|
send_changed_signal()
|
||||||
@ -214,12 +214,11 @@ func save_file(filename) -> void:
|
|||||||
func export_textures() -> void:
|
func export_textures() -> void:
|
||||||
if save_path != null:
|
if save_path != null:
|
||||||
var prefix = save_path.left(save_path.rfind("."))
|
var prefix = save_path.left(save_path.rfind("."))
|
||||||
for c in get_children():
|
for g in top_generator.get_children():
|
||||||
if c is GraphNode:
|
if g.has_method("render_textures"):
|
||||||
if c.generator.has_method("render_textures"):
|
g.render_textures()
|
||||||
c.generator.render_textures()
|
if g.has_method("export_textures"):
|
||||||
if c.generator.has_method("export_textures"):
|
g.export_textures(prefix, editor_interface)
|
||||||
c.generator.export_textures(prefix, editor_interface)
|
|
||||||
|
|
||||||
# Cut / copy / paste
|
# Cut / copy / paste
|
||||||
|
|
||||||
|
@ -3,10 +3,10 @@ extends EditorImportPlugin
|
|||||||
|
|
||||||
var plugin = null
|
var plugin = null
|
||||||
|
|
||||||
const PRESET_NAMES = [ "Skip", "Import with Material Maker" ]
|
const PRESET_NAMES = [ "Render in game", "Prerender" ]
|
||||||
const PRESET_OPTIONS = [
|
const PRESET_OPTIONS = [
|
||||||
[{ name="skip", default_value=true }],
|
[{ name="render", default_value=false }],
|
||||||
[{ name="skip", default_value=false }]
|
[{ name="render", default_value=true }]
|
||||||
]
|
]
|
||||||
|
|
||||||
func _init(p) -> void:
|
func _init(p) -> void:
|
||||||
@ -37,7 +37,7 @@ func get_recognized_extensions() -> Array:
|
|||||||
return [ "ptex" ]
|
return [ "ptex" ]
|
||||||
|
|
||||||
func get_resource_type() -> String:
|
func get_resource_type() -> String:
|
||||||
return "Material"
|
return "SpatialMaterial"
|
||||||
|
|
||||||
func get_save_extension() -> String:
|
func get_save_extension() -> String:
|
||||||
return "tres"
|
return "tres"
|
||||||
@ -46,11 +46,19 @@ func get_visible_name() -> String:
|
|||||||
return "Material Maker Importer"
|
return "Material Maker Importer"
|
||||||
|
|
||||||
func import(source_file: String, save_path: String, options: Dictionary, platform_variants: Array, gen_files: Array) -> int:
|
func import(source_file: String, save_path: String, options: Dictionary, platform_variants: Array, gen_files: Array) -> int:
|
||||||
if !options.skip:
|
var filename = save_path + "." + get_save_extension()
|
||||||
var filename = save_path + "." + get_save_extension()
|
if options.render:
|
||||||
var material = plugin.generate_material(source_file)
|
var material = plugin.generate_material(source_file)
|
||||||
while material is GDScriptFunctionState:
|
while material is GDScriptFunctionState:
|
||||||
material = yield(material, "completed")
|
material = yield(material, "completed")
|
||||||
if material != null:
|
if material != null:
|
||||||
ResourceSaver.save(filename, material)
|
ResourceSaver.save(filename, material)
|
||||||
|
else:
|
||||||
|
var material : SpatialMaterial = SpatialMaterial.new()
|
||||||
|
material.set_script(preload("res://addons/material_maker/import_plugin/ptex_spatial_material.gd"))
|
||||||
|
var file : File = File.new()
|
||||||
|
if file.open(source_file, File.READ) == OK:
|
||||||
|
material.set_ptex_no_render(to_json(parse_json(file.get_as_text())))
|
||||||
|
file.close()
|
||||||
|
ResourceSaver.save(filename, material)
|
||||||
return OK
|
return OK
|
||||||
|
29
addons/material_maker/import_plugin/ptex_spatial_material.gd
Normal file
29
addons/material_maker/import_plugin/ptex_spatial_material.gd
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
tool
|
||||||
|
extends SpatialMaterial
|
||||||
|
|
||||||
|
export var ptex : String = "" setget set_ptex
|
||||||
|
|
||||||
|
func set_ptex_no_render(s : String) -> void :
|
||||||
|
ptex = s
|
||||||
|
|
||||||
|
func set_ptex(s : String) -> void :
|
||||||
|
if ptex == s:
|
||||||
|
return
|
||||||
|
ptex = s
|
||||||
|
call_deferred("update_texture")
|
||||||
|
|
||||||
|
func update_texture() -> void:
|
||||||
|
var loader = MMGenLoader.new()
|
||||||
|
var mm_graph = loader.create_gen(parse_json(ptex))
|
||||||
|
if mm_graph == null:
|
||||||
|
return
|
||||||
|
var mm_material : MMGenMaterial = mm_graph.get_node("Material")
|
||||||
|
if ! (mm_material is MMGenMaterial):
|
||||||
|
return
|
||||||
|
mm_renderer.add_child(mm_graph)
|
||||||
|
var status = mm_material.render_textures()
|
||||||
|
while status is GDScriptFunctionState:
|
||||||
|
status = yield(status, "completed")
|
||||||
|
mm_material.update_spatial_material(self)
|
||||||
|
mm_graph.queue_free()
|
||||||
|
|
@ -22,15 +22,16 @@ func _unhandled_input(event : InputEvent) -> void:
|
|||||||
filter_line_edit.select_all()
|
filter_line_edit.select_all()
|
||||||
|
|
||||||
func get_selected_item_name() -> String:
|
func get_selected_item_name() -> String:
|
||||||
var tree_item : TreeItem = tree.get_selected()
|
return get_item_path(tree.get_selected())
|
||||||
var rv = ""
|
|
||||||
while tree_item != null and tree_item != tree.get_root():
|
func get_selected_item_doc_name() -> String:
|
||||||
if rv == "":
|
var item : TreeItem = tree.get_selected()
|
||||||
rv = tree_item.get_text(0)
|
if item == null:
|
||||||
else:
|
return ""
|
||||||
rv = tree_item.get_text(0)+"/"+rv
|
var m : Dictionary = item.get_metadata(0)
|
||||||
tree_item = tree_item.get_parent()
|
if m == null or !m.has("icon"):
|
||||||
return rv
|
return ""
|
||||||
|
return m.icon
|
||||||
|
|
||||||
func add_library(file_name : String, filter : String = "") -> bool:
|
func add_library(file_name : String, filter : String = "") -> bool:
|
||||||
var root = tree.get_root()
|
var root = tree.get_root()
|
||||||
@ -110,6 +111,8 @@ func add_item(item, item_name, item_icon = null, item_parent = null, force_expan
|
|||||||
return add_item(item, suffix, item_icon, new_parent, force_expand)
|
return add_item(item, suffix, item_icon, new_parent, force_expand)
|
||||||
|
|
||||||
func get_item_path(item : TreeItem) -> String:
|
func get_item_path(item : TreeItem) -> String:
|
||||||
|
if item == null:
|
||||||
|
return ""
|
||||||
var item_path = item.get_text(0)
|
var item_path = item.get_text(0)
|
||||||
var item_parent = item.get_parent()
|
var item_parent = item.get_parent()
|
||||||
while item_parent != tree.get_root():
|
while item_parent != tree.get_root():
|
||||||
|
@ -40,7 +40,8 @@ const MENU = [
|
|||||||
{ menu="Tools", command="add_to_user_library", description="Add selected node to user library" },
|
{ menu="Tools", command="add_to_user_library", description="Add selected node to user library" },
|
||||||
{ menu="Tools", command="export_library", description="Export the nodes library" },
|
{ menu="Tools", command="export_library", description="Export the nodes library" },
|
||||||
|
|
||||||
{ menu="Help", command="show_doc", description="User manual" },
|
{ menu="Help", command="show_doc", shortcut="F1", description="User manual" },
|
||||||
|
{ menu="Help", command="show_library_item_doc", shortcut="Control+F1", description="Show selected library item documentation" },
|
||||||
{ menu="Help", command="bug_report", description="Report a bug" },
|
{ menu="Help", command="bug_report", description="Report a bug" },
|
||||||
{ menu="Help" },
|
{ menu="Help" },
|
||||||
{ menu="Help", command="about", description="About" }
|
{ menu="Help", command="about", description="About" }
|
||||||
@ -100,6 +101,8 @@ func create_menu(menu, menu_name) -> PopupMenu:
|
|||||||
for i in MENU.size():
|
for i in MENU.size():
|
||||||
if MENU[i].has("standalone_only") and MENU[i].standalone_only and Engine.editor_hint:
|
if MENU[i].has("standalone_only") and MENU[i].standalone_only and Engine.editor_hint:
|
||||||
continue
|
continue
|
||||||
|
if MENU[i].has("editor_only") and MENU[i].editor_only and !Engine.editor_hint:
|
||||||
|
continue
|
||||||
if MENU[i].menu != menu_name:
|
if MENU[i].menu != menu_name:
|
||||||
continue
|
continue
|
||||||
if MENU[i].has("submenu"):
|
if MENU[i].has("submenu"):
|
||||||
@ -366,27 +369,38 @@ func export_library() -> void:
|
|||||||
func do_export_library(path : String) -> void:
|
func do_export_library(path : String) -> void:
|
||||||
library.export_libraries(path)
|
library.export_libraries(path)
|
||||||
|
|
||||||
func show_doc() -> void:
|
func get_doc_dir() -> String:
|
||||||
var base_dir = OS.get_executable_path().replace("\\", "/").get_base_dir()
|
var base_dir = OS.get_executable_path().replace("\\", "/").get_base_dir()
|
||||||
|
|
||||||
# In release builds, documentation is expected to be located in
|
# In release builds, documentation is expected to be located in
|
||||||
# a subdirectory of the program directory
|
# a subdirectory of the program directory
|
||||||
var release_doc_path = base_dir.plus_file("doc/index.html")
|
var release_doc_path = base_dir.plus_file("doc")
|
||||||
|
|
||||||
# In development, documentation is part of the project files.
|
# In development, documentation is part of the project files.
|
||||||
# We can use a globalized `res://` path here as the project isn't exported.
|
# We can use a globalized `res://` path here as the project isn't exported.
|
||||||
var devel_doc_path = ProjectSettings.globalize_path("res://addons/material_maker/doc/_build/html/index.html")
|
var devel_doc_path = ProjectSettings.globalize_path("res://addons/material_maker/doc/_build/html")
|
||||||
|
for p in [ release_doc_path, devel_doc_path ]:
|
||||||
|
var file = File.new()
|
||||||
|
if file.file_exists(p+"/index.html"):
|
||||||
|
return p
|
||||||
|
return ""
|
||||||
|
|
||||||
var file = File.new()
|
func show_doc() -> void:
|
||||||
if file.file_exists(release_doc_path):
|
var doc_dir = get_doc_dir()
|
||||||
# Open local prebuilt documentation (used in release builds)
|
if doc_dir != "":
|
||||||
OS.shell_open(release_doc_path)
|
OS.shell_open(doc_dir+"/index.html")
|
||||||
elif file.file_exists(devel_doc_path):
|
|
||||||
# Open local documentation built from source (used during development)
|
func show_doc_is_disabled() -> bool:
|
||||||
OS.shell_open(devel_doc_path)
|
return get_doc_dir() == ""
|
||||||
else:
|
|
||||||
# Open online documentation
|
func show_library_item_doc() -> void:
|
||||||
OS.shell_open("https://rodzill4.github.io/godot-procedural-textures/doc/")
|
var doc_dir : String = get_doc_dir()
|
||||||
|
if doc_dir != "":
|
||||||
|
var doc_name = library.get_selected_item_doc_name()
|
||||||
|
if doc_name != "":
|
||||||
|
var doc_path : String = doc_dir+"/node_"+doc_name+".html"
|
||||||
|
OS.shell_open(doc_path)
|
||||||
|
|
||||||
|
func show_library_item_doc_is_disabled() -> bool:
|
||||||
|
return get_doc_dir() == "" or library.get_selected_item_doc_name() == ""
|
||||||
|
|
||||||
func bug_report() -> void:
|
func bug_report() -> void:
|
||||||
OS.shell_open("https://github.com/RodZill4/godot-procedural-textures/issues")
|
OS.shell_open("https://github.com/RodZill4/godot-procedural-textures/issues")
|
||||||
|
@ -45,35 +45,35 @@ margin_bottom = 20.0
|
|||||||
margin_right = 35.0
|
margin_right = 35.0
|
||||||
margin_bottom = 20.0
|
margin_bottom = 20.0
|
||||||
text = "File"
|
text = "File"
|
||||||
items = [ "New material", null, 0, false, false, 0, 0, null, "", false, "Load material", null, 0, false, false, 1, 268435535, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Save material", null, 0, false, false, 4, 268435539, null, "", false, "Save material as...", null, 0, false, false, 5, 301989971, null, "", false, "Save all materials...", null, 0, false, false, 6, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Export material", null, 0, false, false, 8, 268435525, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Close material", null, 0, false, false, 10, 0, null, "", false, "Quit", null, 0, false, false, 11, 268435537, null, "", false ]
|
items = [ "New material", null, 0, false, false, 0, 0, null, "", false, "Load material", null, 0, false, false, 1, 268435535, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Save material", null, 0, false, false, 4, 268435539, null, "", false, "Save material as...", null, 0, false, false, 5, 301989971, null, "", false, "Save all materials...", null, 0, false, false, 6, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Export material", null, 0, false, false, 8, 268435525, null, "", false, "Export embedded PTEX", null, 0, false, false, 9, 301989957, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Close material", null, 0, false, false, 11, 0, null, "", false, "Quit", null, 0, false, false, 12, 268435537, null, "", false ]
|
||||||
|
|
||||||
[node name="Edit" type="MenuButton" parent="VBoxContainer/Menu"]
|
[node name="Edit" type="MenuButton" parent="VBoxContainer/Menu"]
|
||||||
margin_left = 39.0
|
margin_left = 39.0
|
||||||
margin_right = 75.0
|
margin_right = 75.0
|
||||||
margin_bottom = 20.0
|
margin_bottom = 20.0
|
||||||
text = "Edit"
|
text = "Edit"
|
||||||
items = [ "Cut", null, 0, false, false, 12, 268435544, null, "", false, "Copy", null, 0, false, false, 13, 268435523, null, "", false, "Paste", null, 0, false, false, 14, 268435542, null, "", false ]
|
items = [ "Cut", null, 0, false, false, 13, 268435544, null, "", false, "Copy", null, 0, false, false, 14, 268435523, null, "", false, "Paste", null, 0, false, false, 15, 268435542, null, "", false ]
|
||||||
|
|
||||||
[node name="View" type="MenuButton" parent="VBoxContainer/Menu"]
|
[node name="View" type="MenuButton" parent="VBoxContainer/Menu"]
|
||||||
margin_left = 79.0
|
margin_left = 79.0
|
||||||
margin_right = 121.0
|
margin_right = 121.0
|
||||||
margin_bottom = 20.0
|
margin_bottom = 20.0
|
||||||
text = "View"
|
text = "View"
|
||||||
items = [ "Center view", null, 0, false, false, 15, 67, null, "", false, "Reset zoom", null, 0, false, false, 16, 268435504, null, "", false ]
|
items = [ "Center view", null, 0, false, false, 16, 67, null, "", false, "Reset zoom", null, 0, false, false, 17, 268435504, null, "", false ]
|
||||||
|
|
||||||
[node name="Tools" type="MenuButton" parent="VBoxContainer/Menu"]
|
[node name="Tools" type="MenuButton" parent="VBoxContainer/Menu"]
|
||||||
margin_left = 125.0
|
margin_left = 125.0
|
||||||
margin_right = 171.0
|
margin_right = 171.0
|
||||||
margin_bottom = 20.0
|
margin_bottom = 20.0
|
||||||
text = "Tools"
|
text = "Tools"
|
||||||
items = [ "Create", null, 0, false, false, -1, 0, null, "PopupMenu", false, "Create group", null, 0, false, false, 18, 268435527, null, "", false, "Make selected nodes editable", null, 0, false, false, 19, 268435525, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Add selected node to user library", null, 0, false, false, 21, 0, null, "", false, "Export the nodes library", null, 0, false, false, 22, 0, null, "", false ]
|
items = [ "Create", null, 0, false, false, -1, 0, null, "PopupMenu", false, "Create group", null, 0, false, false, 19, 268435527, null, "", false, "Make selected nodes editable", null, 0, false, false, 20, 268435525, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Add selected node to user library", null, 0, false, false, 22, 0, null, "", false, "Export the nodes library", null, 0, false, false, 23, 0, null, "", false ]
|
||||||
|
|
||||||
[node name="Help" type="MenuButton" parent="VBoxContainer/Menu"]
|
[node name="Help" type="MenuButton" parent="VBoxContainer/Menu"]
|
||||||
margin_left = 175.0
|
margin_left = 175.0
|
||||||
margin_right = 217.0
|
margin_right = 217.0
|
||||||
margin_bottom = 20.0
|
margin_bottom = 20.0
|
||||||
text = "Help"
|
text = "Help"
|
||||||
items = [ "User manual", null, 0, false, false, 23, 0, null, "", false, "Report a bug", null, 0, false, false, 24, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "About", null, 0, false, false, 26, 0, null, "", false ]
|
items = [ "User manual", null, 0, false, false, 24, 16777244, null, "", false, "Show selected library item documentation", null, 0, false, false, 25, 285212700, null, "", false, "Report a bug", null, 0, false, false, 26, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "About", null, 0, false, false, 28, 0, null, "", false ]
|
||||||
|
|
||||||
[node name="HBoxContainer" type="HSplitContainer" parent="VBoxContainer"]
|
[node name="HBoxContainer" type="HSplitContainer" parent="VBoxContainer"]
|
||||||
margin_top = 24.0
|
margin_top = 24.0
|
||||||
|
@ -7,19 +7,8 @@ var importer = null
|
|||||||
|
|
||||||
func _enter_tree() -> void:
|
func _enter_tree() -> void:
|
||||||
add_tool_menu_item("Material Maker", self, "open_material_maker")
|
add_tool_menu_item("Material Maker", self, "open_material_maker")
|
||||||
add_tool_menu_item("Register Material Maker Import", self, "register_material_maker_import")
|
|
||||||
|
|
||||||
func register_material_maker_import(__) -> void:
|
|
||||||
importer = preload("res://addons/material_maker/import_plugin/ptex_import.gd").new(self)
|
importer = preload("res://addons/material_maker/import_plugin/ptex_import.gd").new(self)
|
||||||
add_import_plugin(importer)
|
add_import_plugin(importer)
|
||||||
remove_tool_menu_item("Register Material Maker Import")
|
|
||||||
add_tool_menu_item("Unregister Material Maker Import", self, "unregister_material_maker_import")
|
|
||||||
|
|
||||||
func unregister_material_maker_import(__) -> void:
|
|
||||||
remove_import_plugin(importer)
|
|
||||||
importer = null
|
|
||||||
remove_tool_menu_item("Unregister Material Maker Import")
|
|
||||||
add_tool_menu_item("Register Material Maker Import", self, "register_material_maker_import")
|
|
||||||
|
|
||||||
func _exit_tree() -> void:
|
func _exit_tree() -> void:
|
||||||
remove_tool_menu_item("Material Maker")
|
remove_tool_menu_item("Material Maker")
|
||||||
@ -59,7 +48,7 @@ func generate_material(ptex_filename: String) -> Material:
|
|||||||
if generator.has_node("Material"):
|
if generator.has_node("Material"):
|
||||||
var gen_material = generator.get_node("Material")
|
var gen_material = generator.get_node("Material")
|
||||||
if gen_material != null:
|
if gen_material != null:
|
||||||
var return_value = gen_material.render_textures(mm_renderer)
|
var return_value = gen_material.render_textures()
|
||||||
while return_value is GDScriptFunctionState:
|
while return_value is GDScriptFunctionState:
|
||||||
return_value = yield(return_value, "completed")
|
return_value = yield(return_value, "completed")
|
||||||
var prefix = ptex_filename.left(ptex_filename.rfind("."))
|
var prefix = ptex_filename.left(ptex_filename.rfind("."))
|
||||||
|
Loading…
Reference in New Issue
Block a user