scopedvr-map-editor/tests/probe_skybox_render.gd

98 lines
3.6 KiB
GDScript

extends SceneTree
## Beweisbild-Probe (Karte t_f72913d4 — Atmosphäre & Skybox): Editor-Vorschau
## MIT Pack-Panorama-Skybox vs. ProceduralSky — Sichtprüfung, dass die
## „Himmel: Pack-Skybox“-Option im Viewport tatsächlich die Wüsten-Panorama-
## Skybox zeigt (und ohne Feld das alte ProceduralSky bleibt).
##
## xvfb-run -a /opt/data/home/bin/godot4 --path . --rendering-driver opengl3 \
## -s res://tests/probe_skybox_render.gd
##
## Ausgabe: PROBE_SKYBOX_OK/_FAIL + PNGs im Beweis-Ordner.
const OUT_DIR := "/opt/data/scopedvr/work/atmos_skybox_bilder"
var fehler: Array = []
func _initialize() -> void:
_run()
func _run() -> void:
DirAccess.make_dir_recursive_absolute(OUT_DIR)
await process_frame
await process_frame
var manifest: Dictionary = JSON.parse_string(
FileAccess.get_file_as_string(SvmapIO.MANIFEST_PATH))
var builder := Node3D.new()
builder.set_script(load("res://src/viewport/map_view_builder.gd"))
root.add_child(builder)
var bscript: Script = builder.get_script()
var sky_pfad: String = bscript.panorama_sky_pfad()
print("Panorama-Pfad: %s (existiert: %s)" % [sky_pfad, str(FileAccess.file_exists(sky_pfad))])
if sky_pfad.is_empty() or not FileAccess.file_exists(sky_pfad):
fehler.append("Pack-Skybox im Nachbar-Klon nicht erreichbar")
var doc: Dictionary = SvmapDocument.create_new("Skybox-Beweis", 64.0, "mittag")
# Kamera AM ROOT (rebuild() freed alle Builder-Kinder — eine Kamera am
# Builder würde bei jedem Rebuild mit sterben). WorldEnvironment wirkt
# viewport-global, die Kamera sieht den Himmel trotzdem.
var cam := Camera3D.new()
root.add_child(cam)
cam.position = Vector3(0.0, 6.0, 20.0)
cam.look_at(Vector3(0.0, 8.0, -100.0))
cam.current = true
# --- 1) Mit Pack-Skybox ---
doc["weather_sky"] = "sky_panorama"
builder.call("rebuild", doc, manifest)
await process_frame
await process_frame
var we := _welt_env(builder)
if we == null or we.environment == null or we.environment.sky == null:
fehler.append("kein WorldEnvironment/Sky im Baum")
else:
var mat = we.environment.sky.sky_material
print("Panorama-Fall: Material = %s" % str(mat))
if not (mat is PanoramaSkyMaterial):
fehler.append("Panorama-Fall zeigt kein PanoramaSkyMaterial")
if we.environment.tonemap_mode != Environment.TONE_MAPPER_ACES:
fehler.append("Tonemap ist nicht ACES")
await RenderingServer.frame_post_draw
var img := root.get_texture().get_image()
var pfad1 := OUT_DIR.path_join("editor_panorama_skybox.png")
img.save_png(pfad1)
print("PROBE_SAVED %s (%dx%d)" % [pfad1, img.get_width(), img.get_height()])
if img.get_width() < 100:
fehler.append("Panorama-Bild verdächtig klein")
# --- 2) Ohne Feld (alte Map) → Procedural ---
doc.erase("weather_sky")
builder.call("rebuild", doc, manifest)
await process_frame
await process_frame
var we2 := _welt_env(builder)
if we2 != null and we2.environment != null and we2.environment.sky != null:
var mat2 = we2.environment.sky.sky_material
print("Prozedural-Fall: Material = %s" % str(mat2))
if not (mat2 is ProceduralSkyMaterial):
fehler.append("Ohne Feld zeigt nicht das ProceduralSky")
await RenderingServer.frame_post_draw
var img2 := root.get_texture().get_image()
var pfad2 := OUT_DIR.path_join("editor_prozedural_sky.png")
img2.save_png(pfad2)
print("PROBE_SAVED %s (%dx%d)" % [pfad2, img2.get_width(), img2.get_height()])
for f in fehler:
print(" FEHLER: %s" % f)
print("PROBE_SKYBOX_%s" % ("FAIL" if not fehler.is_empty() else "OK"))
quit(0 if fehler.is_empty() else 1)
func _welt_env(builder: Node) -> WorldEnvironment:
for child in builder.get_children():
if child is WorldEnvironment:
return child
return null