Files
Bullosseum/tools/preview_crowd.gd
T
richard 7b6a141767 Reorganize the codebase into role-based folders (snake_case)
Move the 40-odd root-level scripts and scenes into a tree that groups by role,
per the approved roadmap (WS2/WS3): actors/{player,matador,bear}, systems/{combat,
fx,input,debug,render,crowd,config}, ui/, props/ (was tscn_s/). Rename the shell
scene.tscn -> levels/game_shell.tscn and every PascalCase scene to snake_case
(Player.tscn -> player.tscn, MainMenu.tscn -> main_menu.tscn, etc.) so the
case-insensitive web/macOS filesystems can't alias two files together.

Done as a scripted move: each file travels with its .uid; every quoted res:// path
across scenes, scripts, .tres, and project.godot's 9 autoloads is rewritten; the
.godot uid/class cache is rebuilt from scratch. Scenes still resolve by uid, so the
rewrite is belt-and-suspenders. Lint globs (run_tests.sh + both CI workflows) now
walk the new dirs; an orphan animation_tree.gd.uid and 7 pre-existing trailing-
whitespace lints (barrel/torch, never covered by the old root-only glob) are cleaned.

Full suite green on both sides. Asset consolidation (Assets/Animations/fonts ->
art/) is deferred — moving imported .glb/.png/.ttf is safer done in the editor.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017KoYBYQgRyY1zDHXMsXY3V
2026-09-06 00:04:41 +03:00

55 lines
1.7 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
extends SceneTree
## Quick visual check for the billboard crowd: builds the generated fallback stand and
## captures two frames a moment apart (so the flipbook visibly advances) from an angle
## (so we can confirm the sprites turn to face the camera).
##
## godot --script tools/preview_crowd.gd
## Output: tools/preview/crowd_a.png, crowd_b.png
const OUT := "res://tools/preview"
func _init() -> void:
_run.call_deferred()
func _run() -> void:
DirAccess.make_dir_recursive_absolute(OUT)
var we := WorldEnvironment.new()
var env := Environment.new()
env.background_mode = Environment.BG_COLOR
env.background_color = Color(0.10, 0.12, 0.16)
we.environment = env
root.add_child(we)
var crowd := MultiMeshInstance3D.new()
crowd.set_script(load("res://systems/crowd/crowd_billboards.gd"))
crowd.set("source_path", NodePath()) # force the generated fallback stand
crowd.set("fallback_count", 90)
root.add_child(crowd)
var cam := Camera3D.new()
cam.fov = 62.0
cam.current = true
root.add_child(cam)
# Outside the ring edge, elevated, looking across the centre: the NEAR arc has its
# back to us (facing inward), the FAR arc faces us — so this shot proves both the
# per-segment inward facing and the front/back sheet selection.
cam.look_at_from_position(Vector3(0.0, 16.0, 44.0), Vector3(0.0, 3.0, 0.0), Vector3.UP)
await create_timer(0.15).timeout
_shot("crowd_a.png")
await create_timer(0.45).timeout # ~4–5 clap frames later
_shot("crowd_b.png")
quit(0)
func _shot(name: String) -> void:
var img := root.get_viewport().get_texture().get_image()
if img == null:
print("capture failed: ", name)
return
img.save_png(OUT + "/" + name)
print("captured ", name, " ", img.get_width(), "x", img.get_height())