ShitboxInfinity/tests/screenshot.gd
type-two d9b69e688e Brisbane: Queen Street Mall crash-run level from OpenStreetMap
tools/build_level_osm.py extrudes OSM buildings (-col), lays road strips,
Spawn + RacePath empties; osm_level_args.py computes a building-clear spawn on
a named way and race-loop corners from street intersection nodes. game.gd
builds Path3D from GLB RacePath empties, sanitizes spawn bases, and places
bodies BEFORE add_child. Three real bugs fixed: mall canopies (building=roof)
extruded as solid blocks, underground busways rendered at surface, and the
km-wide ground trimesh breaking suspension raycasts (now -convcol). Cars get
continuous_cd for thin building shells. tests/probe.gd is the physics
raycast debugger that found it.

Data (c) OpenStreetMap contributors, ODbL.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-27 23:33:51 +10:00

44 lines
1.7 KiB
GDScript

extends SceneTree
## Boot straight into the game and save a viewport screenshot (needs a window, not --headless):
## Godot --path . --script tests/screenshot.gd -- car=datto_120y mode=cruise out=shot.png frames=90 throttle=1
## Defaults: first car, cruise, screenshot.png, 90 physics frames, throttle held.
func _initialize() -> void:
_run()
func _run() -> void:
var opts := {}
for a in OS.get_cmdline_user_args():
var kv := a.split("=")
if kv.size() == 2:
opts[kv[0]] = kv[1]
var cars := Registry.cars()
Game.car_path = cars.get(opts.get("car", ""), cars.values()[0])
var levels := Registry.levels()
Game.level_path = levels.get(opts.get("level", ""), levels.values()[0])
Game.mode = opts.get("mode", "cruise")
var game: Game = (load("res://src/game.tscn") as PackedScene).instantiate()
root.add_child(game)
await process_frame
if opts.get("throttle", "1") == "1":
Input.action_press("throttle")
for i in int(opts.get("frames", "90")):
await physics_frame
if opts.get("cam", "") == "front":
game.set_process(false) # stop the chase cam fighting us
game.cam.global_position = game.car.global_position + game.car.global_basis * Vector3(2.6, 1.6, -6.5)
game.cam.look_at(game.car.global_position + Vector3.UP * 0.4)
await process_frame
await process_frame
elif opts.get("cam", "") == "top":
game.set_process(false)
var alt := float(opts.get("alt", "150"))
game.cam.far = 4000.0
game.cam.global_position = game.car.global_position + Vector3(0, alt, 0)
game.cam.look_at(game.car.global_position, Vector3.FORWARD)
await process_frame
await process_frame
root.get_texture().get_image().save_png("res://" + opts.get("out", "screenshot.png"))
print("screenshot saved")
quit(0)