diff --git a/src/editor/test_run.gd b/src/editor/test_run.gd index adef088..018b744 100644 --- a/src/editor/test_run.gd +++ b/src/editor/test_run.gd @@ -93,6 +93,18 @@ static func export_temp_map(doc: Dictionary) -> Dictionary: return result +## Hand-Haltungs-Tool: liegt im Client-Projekt, weil es dessen Rig und Waffen +## direkt benutzt (kein VR, eigenes Fenster). +static func hand_pose_args(client_dir: String) -> PackedStringArray: + return PackedStringArray(["--xr-mode", "off", "--path", client_dir, + "res://tools/hand_pose_tool/hand_pose_tool.tscn"]) + + +## Import-Lauf für den Client, nötig nach neuem Stand (neue Modelle/Skripte). +static func import_args(client_dir: String) -> PackedStringArray: + return PackedStringArray(["--headless", "--path", client_dir, "--import"]) + + ## Argumentliste für den Client-Start (getestet: exakt diese Form). static func launch_args(client_dir: String, map_path: String) -> PackedStringArray: return PackedStringArray(["--path", client_dir, "--", "--testmap", map_path, "--mock-master"]) diff --git a/src/ui/help_text.gd b/src/ui/help_text.gd index b972474..06d32b9 100644 --- a/src/ui/help_text.gd +++ b/src/ui/help_text.gd @@ -76,6 +76,7 @@ static func text() -> String: ["Strg+Y / Strg+Umschalt+Z", "Wiederherstellen"], ["Strg+S / Strg+Umschalt+S", "Speichern / Speichern unter"], ["Strg+O / Strg+N", "Öffnen / Neue Map"], + ["Datei → Hand-Haltung der Waffen", "öffnet das Tool für Hände und Finger pro Waffe (eigenes Fenster)"], ["Datei → Updates prüfen", "prüft auf eine neue Version; Banner „Jetzt updaten“ lädt und startet neu"], ])) return out diff --git a/src/ui/main.gd b/src/ui/main.gd index 80d6644..e790cae 100644 --- a/src/ui/main.gd +++ b/src/ui/main.gd @@ -166,6 +166,7 @@ var update_btn: Button # „Jetzt updaten“ im Banner var check_thread: Thread # Update-Check im Hintergrund (Start/Menü) var update_thread: Thread # Update-Ausführung (pull + Import-Lauf) var _update_check_busy := false +var _hand_pose_thread: Thread = null var _update_running := false var _update_result: Dictionary = {} # letzter Check (Status/Banner-Nachfrage) @@ -794,6 +795,8 @@ func _on_menu_action(id: int) -> void: _open_resize_dialog() 7: # Updates prüfen (Selbst-Update, t_d95f087a) _on_update_check_menu() + 8: # Hand-Haltung der Waffen (Tool im Client-Projekt) + _on_hand_pose_tool() # --------------------------------------------- UI-Größe + Fenster (t_297221b5) -- @@ -1021,6 +1024,50 @@ func _startup_update_check() -> void: _updater_check_async(false) +## Hand-Haltungs-Tool starten: eigenes Fenster aus dem Client-Projekt. Nach einem +## neuen Client-Stand erst importieren (im Hintergrund, kann dauern), sonst fehlen +## dem Tool neue Modelle. +func _on_hand_pose_tool() -> void: + if _hand_pose_thread != null: + _set_status("Hand-Haltungs-Tool wird schon vorbereitet…") + return + var cfg := TestRun.load_cfg() + var client := TestRun.find_client(ProjectSettings.globalize_path("res://"), cfg) + if client.is_empty(): + _set_status("Client-Ordner nicht gefunden: er muss neben dem Editor liegen (scopedvr-client) oder in den Einstellungen stehen.", true) + return + var godot := TestRun.find_godot(cfg) + if godot.is_empty(): + _set_status("Godot nicht gefunden: bitte in den Einstellungen eintragen.", true) + return + _set_status("Hand-Haltungs-Tool wird vorbereitet…") + _hand_pose_thread = Thread.new() + _hand_pose_thread.start(_hand_pose_prepare.bind(godot, client)) + + +func _hand_pose_prepare(godot: String, client: String) -> void: + var head := EditorUpdater.git_run(EditorUpdater.git_exe(TestRun.load_cfg()), client, PackedStringArray(["rev-parse", "HEAD"])) + var stand := str(head.get("output", "")).strip_edges() + var cfg := TestRun.load_cfg() + if stand.is_empty() or str(cfg.get_value("test", "hand_pose_import", "")) != stand: + var out: Array = [] + OS.execute(godot, TestRun.import_args(client), out, true) + _hand_pose_started.call_deferred(godot, client, stand) + + +func _hand_pose_started(godot: String, client: String, stand: String) -> void: + _hand_pose_thread.wait_to_finish() + _hand_pose_thread = null + var cfg := TestRun.load_cfg() + cfg.set_value("test", "hand_pose_import", stand) + cfg.save(TestRun.CFG_PATH) + var pid := OS.create_process(godot, TestRun.hand_pose_args(client)) + if pid <= 0: + _set_status("Hand-Haltungs-Tool ließ sich nicht starten.", true) + return + _set_status("Hand-Haltungs-Tool läuft in einem eigenen Fenster.") + + ## Datei-Menü „🔄 Updates prüfen“ (ID 7): gleicher Check mit Ergebnis-Meldung. func _on_update_check_menu() -> void: if _update_check_busy: diff --git a/src/ui/panels/toolbar.gd b/src/ui/panels/toolbar.gd index 288774a..0d42af8 100644 --- a/src/ui/panels/toolbar.gd +++ b/src/ui/panels/toolbar.gd @@ -56,6 +56,7 @@ func build() -> void: popup.add_separator() popup.add_item("▶ Karte testen", 5) popup.add_separator() + popup.add_item("🖐 Hand-Haltung der Waffen…", 8) popup.add_item("🔄 Updates prüfen", 7) popup.add_item("Beenden", 4) # FIX 20.10. (Sly-Befund „Kartengröße ändern tut nichts“): id_pressed sendet diff --git a/tests/test_testrun.gd b/tests/test_testrun.gd index c77888a..e6c58cd 100644 --- a/tests/test_testrun.gd +++ b/tests/test_testrun.gd @@ -118,3 +118,6 @@ func _run_tests() -> void: if str(args[i]) != want[i]: ok = false _check(ok, "launch_args exakt: --path … -- --testmap … --mock-master") + var hp := TestRun.hand_pose_args("/pfad/client") + _check(Array(hp) == ["--xr-mode", "off", "--path", "/pfad/client", "res://tools/hand_pose_tool/hand_pose_tool.tscn"], + "hand_pose_args exakt: ohne VR, Szene aus dem Client")