98 lines
3.6 KiB
GDScript
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://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
|