extends Control var resource = null var progress : float = 0.0 onready var progress_bar = $VBoxContainer/ProgressBar onready var mutex : Mutex = Mutex.new() onready var semaphore : Semaphore = Semaphore.new() onready var thread: Thread = Thread.new() func _ready(): randomize() set_process(false) var resource_path : String if Directory.new().file_exists("res://material_maker/main_window.tscn"): if OS.get_cmdline_args().size() > 0 and (OS.get_cmdline_args()[0] == "--export" or OS.get_cmdline_args()[0] == "--export-material"): var output = [] var dir : Directory = Directory.new() match OS.get_name(): "Windows": var bat_file_path : String = OS.get_system_dir(OS.SYSTEM_DIR_DOWNLOADS)+"\\mm_cd.bat" var bat_file : File = File.new() bat_file.open(bat_file_path, File.WRITE) bat_file.store_line("cd") bat_file.close() OS.execute(bat_file_path, [], true, output) dir.remove(bat_file_path) dir.change_dir(output[0].split("\n")[2]) var target : String = "Godot" var output_dir : String = dir.get_current_dir() var size : int = 0 var files : Array = [] var i = 1 while i < OS.get_cmdline_args().size(): match OS.get_cmdline_args()[i]: "-t", "--target": i += 1 target = OS.get_cmdline_args()[i] "-o", "--output-dir": i += 1 output_dir = OS.get_cmdline_args()[i] "--size": i += 1 size = int(OS.get_cmdline_args()[i]) if size < 0: show_error("ERROR: incorrect size "+OS.get_cmdline_args()[i]) return _: files.push_back(OS.get_cmdline_args()[i]) i += 1 if !dir.dir_exists(output_dir): show_error("ERROR: Output directory '%s' does not exist" % output_dir) return var expanded_files = [] for f in files: var basedir : String = f.get_base_dir() if basedir == "": basedir = "." var basename : String = f.get_file() if basename.find("*") != -1: basename = basename.replace("*", ".*") if dir.open(basedir) == OK: var regex : RegEx = RegEx.new() regex.compile("^"+basename+"$") dir.list_dir_begin() var file_name = dir.get_next() while file_name != "": if regex.search(file_name) and file_name.get_extension() == "ptex": expanded_files.push_back(basedir+"/"+file_name) file_name = dir.get_next() else: expanded_files.push_back(f) export_files(expanded_files, output_dir, target, size) return else: resource_path = "res://material_maker/main_window.tscn" else: resource_path = "res://demo/demo.tscn" var locale = load("res://material_maker/locale/locale.gd").new() locale.read_translations() set_process(true) thread.start(self, "load_resource", resource_path, Thread.PRIORITY_HIGH) func load_resource(resource_path : String): var loader : ResourceInteractiveLoader = ResourceLoader.load_interactive(resource_path) if loader == null: # check for errors return while true: mutex.lock() if false: # fake loading mode progress += 0.02 if progress > 1: progress = 0 else: var err = loader.poll() if err == ERR_FILE_EOF: resource = loader.get_resource() progress = -1 mutex.unlock() return elif err == OK: progress = float(loader.get_stage()) / loader.get_stage_count() else: progress = -1 mutex.unlock() return mutex.unlock() semaphore.wait() var wait : float = 0.0 func _process(delta) -> void: wait += delta if wait < 0.01: return wait = 0.0 if mutex.try_lock() == OK: if progress < 0: if resource == null: print("error") queue_free() else: var scene = resource.instance() get_node("/root").add_child(scene) thread.wait_to_finish() queue_free() else: progress_bar.value = 100.0*progress mutex.unlock() semaphore.post() func export_files(files, output_dir, target, size) -> void: $VBoxContainer/ProgressBar.min_value = 0 $VBoxContainer/ProgressBar.max_value = files.size() $VBoxContainer/ProgressBar.value = 0 for f in files: var gen = mm_loader.load_gen(f) if gen != null: add_child(gen) for c in gen.get_children(): if c.has_method("export_material"): if c.has_method("get_export_profiles"): if c.get_export_profiles().find(target) == -1: show_error("ERROR: Unsupported target %s"+target) continue $VBoxContainer/Label.text = "Exporting "+f.get_file() var prefix : String = output_dir+"/"+f.get_file().get_basename() var result = c.export_material(prefix, target, size) while result is GDScriptFunctionState: result = yield(result, "completed") gen.queue_free() $VBoxContainer/ProgressBar.value += 1 get_tree().quit() func show_error(message : String): $ErrorPanel.show() $ErrorPanel/Label.text = message