82 lines
2.9 KiB
GDScript
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)
|