scopedvr-map-editor/tests/probe_camo_render.gd

82 lines
2.9 KiB
GDScript

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)