OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / scenes / test / _depth_shot.gd

72 lines · gd ref:
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)