53 lines
1.5 KiB
GDScript3
53 lines
1.5 KiB
GDScript3
|
|
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
|