extends Node3D
## Throwaway render harness for the atmosphere / depth work (2026-10-06). Like
## _cloud_bank_shot: root named "Game", borrows Sky3DExtended out of game.tscn so maps get
## the SHARED sky (and map_core's _scale_atmosphere runs against it).
## SHOT_MAP=map_mountain SHOT_CAM=x,y,z SHOT_LOOK=x,y,z SHOT_TIME=11 SHOT_WAIT=30
## SHOT_SKY='{"fog_model":0}' (SkyDome props, applied AFTER the map set its own)
## SHOT_OUT=/path/prefix
## "$GODOT" --path . --resolution 1600x900 res://scenes/test/_depth_shot.tscn
var _map: Node
var _cam: Camera3D
var _sky: Node
var _t := 0.0
var _wait := 30.0
var _out := "/tmp/depth_shot"
var _applied := false
func _v3(s: String, d: Vector3) -> Vector3:
if s == "":
return d
var p := s.split(",")
return Vector3(float(p[0]), float(p[1]), float(p[2]))
func _ready() -> void:
_out = OS.get_environment("SHOT_OUT") if OS.get_environment("SHOT_OUT") != "" else _out
if OS.get_environment("SHOT_WAIT") != "":
_wait = float(OS.get_environment("SHOT_WAIT"))
var game: Node = (load("res://scenes/game/game.tscn") as PackedScene).instantiate()
_sky = game.get_node("Sky3DExtended")
game.remove_child(_sky)
game.free()
add_child(_sky)
var tod: Node = _sky.get_node_or_null("TimeOfDay")
if tod != null:
tod.current_time = float(OS.get_environment("SHOT_TIME")) if OS.get_environment("SHOT_TIME") != "" else 11.0
if tod.has_method("_update_celestial_coords"):
tod._update_celestial_coords()
_cam = Camera3D.new()
_cam.far = 60000.0
_cam.near = 0.5
add_child(_cam)
_cam.global_position = _v3(OS.get_environment("SHOT_CAM"), Vector3(0, 450, 10000))
_cam.look_at(_v3(OS.get_environment("SHOT_LOOK"), Vector3(0, 300, 0)))
_cam.current = true
var m := OS.get_environment("SHOT_MAP") if OS.get_environment("SHOT_MAP") != "" else "map_mountain"
_map = (load("res://scenes/maps/%s.tscn" % m) as PackedScene).instantiate()
add_child(_map)
func _process(dt: float) -> void:
_t += dt
if not _applied and _t > 2.0:
_applied = true
var js := OS.get_environment("SHOT_SKY")
var dome: Node = _sky.get_node_or_null("SkyDome")
if js != "" and dome != null:
var d: Dictionary = JSON.parse_string(js)
for k in d:
dome.set(String(k), d[k])
if dome != null:
print("[depth-shot] fog_model=%s far %s..%s near %s height %s/%s/%s" % [dome.get("fog_model"),
dome.get("fog_far_begin"), dome.get("fog_far_end"), dome.get("fog_near_density"),
dome.get("fog_height_base"), dome.get("fog_height_falloff"), dome.get("fog_height_density")])
if _t < _wait:
return
var img := get_viewport().get_texture().get_image()
img.save_png(_out + ".png")
print("[depth-shot] -> %s.png" % _out)
get_tree().quit(0)