Atmosphaere & Skybox (t_f72913d4): Render-Probe Editor-Vorschau (Panorama vs. Prozedural, xvfb/opengl3)
This commit is contained in:
parent
0505463ace
commit
78d311c75f
1 changed files with 98 additions and 0 deletions
98
tests/probe_skybox_render.gd
Normal file
98
tests/probe_skybox_render.gd
Normal file
|
|
@ -0,0 +1,98 @@
|
||||||
|
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
|
||||||
Loading…
Reference in a new issue