extends SceneTree ## WEGWERF-Beweis-Probe (Karte t_50a07d4b): Editor-Ansicht mit echten ## Camo-GLBs — WYSIWYG-Check. 4 Objekte (Wall, Ground, Barrel, Cactus) ## im echten Map Builder, CAMO-Zuordnung wie im Spiel. Screenshot nach ## PROBE_PNG-Umgebungsvariable. Zahlen-Beweis zusätzlich auf stdout. ## Aufruf: xvfb-run -a godot4 --path . --rendering-driver opengl3 \ ## -s res://tests/probe_camo_render.gd const OBJEKTE := [ {"id": "wall_001", "pos": [4.0, 0.0, 4.0], "scale": 1.0}, {"id": "ground_001", "pos": [10.0, 0.0, 4.0], "scale": 1.0}, {"id": "barrel_001", "pos": [16.0, 0.0, 4.0], "scale": 1.0}, {"id": "cactus_001", "pos": [22.0, 0.0, 4.0], "scale": 1.0}, ] func _initialize() -> void: _run.call_deferred() func _run() -> void: # GLB-Quelle = Client-Repo (wie im Spiel-Stand, t_c8748efc-Beweis). ProjectSettings.set_setting("scopedvr/editor/glb_quellen", ["../scopedvr-client/assets/objekte"]) load("res://src/viewport/glb_mesh_store.gd").call("cache_leeren") var scene: PackedScene = load("res://scenes/main.tscn") var main = scene.instantiate() root.add_child(main) await process_frame await process_frame DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) DisplayServer.window_set_size(Vector2i(1600, 900)) for p in OBJEKTE: (main.doc["objects"] as Array).append(p.duplicate(true)) main.call("_after_structure_change") await process_frame await process_frame var cam = main.get("camera") if cam != null: cam.set("distance", 32.0) cam.call("focus_on", Vector3(12.0, 0.0, 4.0)) await process_frame await process_frame await process_frame # Zahlen-Beweis: JEDE GLB-Fläche trägt die GEMEINSAME Camo-Textur-Instanz. var builder = main.get("view_builder") var store = load("res://src/viewport/glb_mesh_store.gd") var cache: Dictionary = store.get("_camo_tex_cache") print("EINE-QUELLE-CHECK: Cache-Größe=%d (soll 2: Objekt _1 + Boden _2)" % cache.size()) var alle_ok := true for i in OBJEKTE.size(): var marker = builder.object_markers[i] var mi := marker.get_child(0) as MeshInstance3D var oid: String = OBJEKTE[i]["id"] if mi.mesh == null: print(" FAIL: %s mesh null" % oid) alle_ok = false continue var n := mi.mesh.get_surface_count() var tex_iids := [] for s in n: var mat := mi.mesh.surface_get_material(s) if mat is BaseMaterial3D: var t := (mat as BaseMaterial3D).albedo_texture tex_iids.append(t.get_instance_id() if t != null else -1) print(" %s: %d Flächen, Textur-iids=%s" % [oid, n, str(tex_iids)]) for iid in tex_iids: if int(iid) == -1: alle_ok = false print(" FAIL: %s Fläche OHNE albedo_texture" % oid) print("EINE-QUELLE-RESULT: %s" % ("ALLE GETEXTURED" if alle_ok else "FEHLER")) # Screenshot var img := root.get_viewport().get_texture().get_image() var pfad := OS.get_environment("PROBE_PNG") if pfad == "": pfad = "/tmp/probe_camo.png" img.save_png(pfad) print("PROBE_PNG=%s" % pfad) quit(0 if alle_ok else 1)