scopedvr-map-editor/tests/probe_u3_groups_render.gd
slyphax 491a47d3f1 Editor-Bibliothek auf das Military-Desert-Pack umgestellt
- 423 Objekte in 19 deutschen Kategorien (Panzer, Radfahrzeuge, Flugzeuge, Gebaeude,
  Zelte, Tuerme, Mauern, Sperren, Kisten, Technik, Felsen, Boden, Decals ...);
  Gruppen "Bauwerke" und "Kisten & Barrieren" samt Test-Asset-Namenslisten entfernt
- LibraryBrowser: Gruppen/Namen aus dem Manifest (kategorie, name_de), unbekannte
  Kategorien bekommen automatisch eine eigene Gruppe
- Thumbs neu, library/ synchronisiert (inkl. neuer Kollision)
- Neue Identitaetsprobe: Kollision ALLER Objekte Editor = Client = Server
- Tests auf Pack-Objekte umgestellt

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-25 16:31:28 +01:00

97 lines
3.8 KiB
GDScript

extends SceneTree
## Render-Probe U3 (Karte t_a4bf9b8c): Gruppen im Szenen-Baum.
## Legt 4 Objekte an, gruppiert 2 davon über den BAUM-WEG (tree_mod.group_selected),
## benennt die Gruppe „Lager“, hängt Objekt 3 per Drag-Kern in die Gruppe und
## rendert die echte Main-UI: links muss die Gruppe mit Namen + 3 Mitgliedern im
## Baum stehen und in 3D markiert sein.
## Start (BRAUCHT Rendering — NICHT --headless):
## xvfb-run godot --path . --rendering-driver opengl3 -s res://tests/probe_u3_groups_render.gd
var out_dir := "/opt/data/profiles/scopedvr-dev/cache/scratch"
func _initialize() -> void:
if OS.get_cmdline_user_args().size() > 0:
out_dir = OS.get_cmdline_user_args()[0]
# Feste Fenstergröße (sonst fallen die Docks im xvfb-Default zusammen).
root.size = Vector2i(1440, 900)
root.mode = Window.MODE_WINDOWED
await process_frame
await process_frame
var scene: PackedScene = load("res://scenes/main.tscn")
var main = scene.instantiate()
root.add_child(main)
await process_frame
await process_frame
await process_frame
# Vier Objekte nah an der Kartenmitte (sichtbar aus der Startansicht).
(main.doc["objects"] as Array).append({
"id": "barrel_001", "pos": [0.0, 0.0, 0.0], "scale": 3.0, "rot_y_deg": 0.0})
(main.doc["objects"] as Array).append({
"id": "box_001", "pos": [9.0, 0.0, 5.0], "scale": 20.0, "rot_y_deg": 25.0})
(main.doc["objects"] as Array).append({
"id": "barrel_001", "pos": [-9.0, 0.0, -5.0], "scale": 3.0, "rot_y_deg": 0.0})
(main.doc["objects"] as Array).append({
"id": "box_001", "pos": [-6.0, 0.0, 9.0], "scale": 8.0, "rot_y_deg": 0.0})
main.call("_after_structure_change")
await process_frame
await process_frame
# U3-Pfade benutzen — nicht GroupOps direkt:
# 1) Mehrfachauswahl im Baum-Weg → group_selected() (nutzt interaction).
var tree_mod = main.get("tree_mod")
main.interaction.call("select_many", [0, 1])
tree_mod.call("group_selected")
await process_frame
# 2) Gruppe umbenennen (Kern-Funktion, wie der Dialog es ruft).
tree_mod.call("rename_group", 0, "Lager")
# 3) Objekt 2 per Drag-Kern in die Gruppe ziehen.
tree_mod.call("_apply_membership_drop", [2], 0)
# 4) Gruppe auswählen (Klick auf den Gruppen-Knoten simulieren).
var g_node: TreeItem = _find_group_node(tree_mod, "Lager")
if g_node != null:
g_node.select(0)
(tree_mod.get("content_tree") as Tree).item_selected.emit()
main.call("_focus_selection")
await process_frame
await process_frame
await process_frame
# Hinweis-Dialoge (z. B. „Modelle fehlen“ im Klon ohne GLB-Quellen) schließen —
# REKURSIV über den ganzen Fensterbaum und direkt vor dem Screenshot nochmal
# (das Banner erscheint lazy nach dem View-Rebuild, nicht beim Setup).
_windows_zu(root)
await process_frame
await RenderingServer.frame_post_draw
var img := root.get_texture().get_image()
var out_path := out_dir + "/u3_gruppen_im_baum_beweis.png"
img.save_png(out_path)
var members: Array = GroupOps.members_of(main.doc, 0)
print("PROBE_PNG: ", out_path)
print("PROBE_FERTIG: Gruppe=", GroupState.display_name(main.doc, 0),
" Mitglieder=", members,
" Baumzeile=", str(g_node.get_text(0)) if g_node != null else "FEHLT",
" Auswahl=", main.interaction.get("selected_indices"))
quit(0)
func _find_group_node(tree_mod, name_prefix: String) -> TreeItem:
var tree: Tree = tree_mod.get("content_tree")
var root_item: TreeItem = tree.get_root()
for child in root_item.get_children():
if str(child.get_text(0)).begins_with("Gruppen ("):
for g in child.get_children():
if str(g.get_text(0)).begins_with(name_prefix):
return g
return null
## Alle Fenster/Dialoge im Unterbaum zu-klappen (Beweis-Bild frei räumen).
func _windows_zu(node: Node) -> void:
if node is Window:
(node as Window).hide()
return # Fenster-Inhalte brauchen nicht weiter durchlaufen zu werden
for child in node.get_children():
_windows_zu(child)