spaceship/tests/_screenshot_tool.gd

53 lines
1.5 KiB
GDScript3
Raw Normal View History

extends SceneTree
# Reusable screenshot tool - NOT run via run_tests.sh (underscore prefix).
# Loads a given scene, waits for a given number of frames to render, then
# saves a PNG and quits. Must be run WITHOUT --headless (that forces
# Godot's dummy/null renderer) - see tests/screenshot.sh for the full
# invocation (Xvfb + Mesa softpipe; llvmpipe's JIT crashes with SIGILL in
# this environment, softpipe's non-JIT rasterizer does not).
#
# Args (after `--`): <scene_res_path> <output_png_path> [wait_frames]
var wait_frames: int = 60
var frames: int = 0
var scene_path: String
var output_path: String
var loaded_scene: Node
func _initialize() -> void:
var args: PackedStringArray = OS.get_cmdline_user_args()
if args.size() < 2:
printerr("usage: -- <scene_res_path> <output_png_path> [wait_frames]")
quit(1)
return
scene_path = args[0]
output_path = args[1]
if args.size() >= 3:
wait_frames = int(args[2])
var packed: PackedScene = load(scene_path)
if packed == null:
printerr("could not load scene: %s" % scene_path)
quit(1)
return
loaded_scene = packed.instantiate()
root.add_child(loaded_scene)
func _process(_delta: float) -> bool:
frames += 1
if frames < wait_frames:
return false
var img: Image = root.get_viewport().get_texture().get_image()
var err: int = img.save_png(output_path)
if err != OK:
printerr("save_png failed with error %d" % err)
quit(1)
return true
print("SCREENSHOT_SAVED: %s (%s)" % [output_path, str(img.get_size())])
quit(0)
return true