Added menu to show nodes documentation and updated import plugin

This commit is contained in:
RodZill4 2019-11-10 15:02:00 +01:00
parent d37fc835f9
commit 85599c2fea
8 changed files with 104 additions and 60 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View 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()

View File

@ -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():

View File

@ -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() var file = File.new()
if file.file_exists(release_doc_path): if file.file_exists(p+"/index.html"):
# Open local prebuilt documentation (used in release builds) return p
OS.shell_open(release_doc_path) return ""
elif file.file_exists(devel_doc_path):
# Open local documentation built from source (used during development) func show_doc() -> void:
OS.shell_open(devel_doc_path) var doc_dir = get_doc_dir()
else: if doc_dir != "":
# Open online documentation OS.shell_open(doc_dir+"/index.html")
OS.shell_open("https://rodzill4.github.io/godot-procedural-textures/doc/")
func show_doc_is_disabled() -> bool:
return get_doc_dir() == ""
func show_library_item_doc() -> void:
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")

View File

@ -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

View File

@ -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("."))