Files
Papay-Shooter/debug/sakura_ground_band_audit.gd
T
2026-08-09 01:31:44 -04:00

66 lines
2.1 KiB
GDScript

extends SceneTree
## Regression audit for the grazing-angle dark band that the ink post-process
## used to paint across flat roads and walls. The sampled view reproduces the
## original report exactly; both distant road samples must remain close to an
## unobstructed road sample nearer the camera.
const MAP := "res://scenes/maps/sakura_crossing/sakura_crossing.tscn"
const FAR_ROAD_UVS := [Vector2(0.46875, 0.52778), Vector2(0.4948, 0.537)]
const REFERENCE_ROAD_UV := Vector2(0.5, 0.62)
const MIN_LUMINANCE_RATIO := 0.75
func _sample(image: Image, uv: Vector2) -> Color:
var x := clampi(roundi(uv.x * image.get_width()), 0, image.get_width() - 1)
var y := clampi(roundi(uv.y * image.get_height()), 0, image.get_height() - 1)
return image.get_pixel(x, y)
func _initialize() -> void:
_run()
func _run() -> void:
var level := (load(MAP) as PackedScene).instantiate()
root.add_child(level)
for _i in 120:
await process_frame
var camera := Camera3D.new()
camera.fov = 70.0
camera.far = 1200.0
level.add_child(camera)
camera.current = true
camera.global_position = Vector3(-4.0, 1.7, -30.0)
camera.look_at(Vector3(80.0, 1.7, -30.0), Vector3.UP)
for _i in 6:
await process_frame
var image := root.get_texture().get_image()
var reference_luma := _sample(image, REFERENCE_ROAD_UV).get_luminance()
var minimum_far_luma := 1.0
for uv in FAR_ROAD_UVS:
minimum_far_luma = minf(minimum_far_luma, _sample(image, uv).get_luminance())
var ratio := minimum_far_luma / maxf(reference_luma, 0.001)
var failed := ratio < MIN_LUMINANCE_RATIO
if failed:
push_error("GROUND_BAND_AUDIT dark distant road: far/reference=%.3f (minimum %.3f)" % [
ratio, MIN_LUMINANCE_RATIO])
else:
print("GROUND_BAND_AUDIT PASS far/reference=%.3f" % ratio)
var args := OS.get_cmdline_user_args()
if not args.is_empty():
var output := args[0]
if not output.is_absolute_path():
output = ProjectSettings.globalize_path(output)
DirAccess.make_dir_recursive_absolute(output.get_base_dir())
image.save_png(output)
print("GROUND_BAND_AUDIT saved ", output)
level.queue_free()
for _i in 6:
await process_frame
quit(1 if failed else 0)