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://core/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