Tools/sibling_asset_audit.py reads the sibling security-game project's prop library straight from the GLB headers: 20 street props, 11.8k triangles, every one with a Blender source. The 50 .blend sources are copied to Art/props/blender_src/ with a manifest; nothing is imported into Unreal yet. Its building meshes are deliberately not taken - they are Godot GLBs built around a 29.6 m facade that this project measured at 25.75 m. The facade proportions were wrong against the photograph: 5.7 m of blank wall above the capitals. Entablature is now 3.4 m, parapet 2.2 m, with architrave and cornice bands and square pedestals, so the elevation reads as layered stone.
Tools
Repeatable import/export and processing helpers. Anything that was done twice by hand belongs here.
Conventions
- One script, one job. No interactive prompts; every input is an argument.
- Each script documents its input format, output format, and the exact tool version it was tested with.
- Blender scripts run headless (
blender --background --python), so they can be re-run for a regression check. - No credentials, no absolute machine paths, no writes outside the project by default.
- A script that produces game content logs what it produced, so
Game/Contentcan be audited against it.
Helpers
render_screenshots.sh— visual-review pipeline: rebuilds/Game/Test/ReviewMapfrom current content (ue_build_review_map.py), runs the game on it in-gamemode, letsAGigLineShotActor(Game/GigLine/Source/GigLine/) capture the fixed camera list, and copies the PNGs into the gitignoredScreenshots/. SeeScreenshots/README.md.check-lfs.sh— repository guard: fails ifgit-lfsor thelfsfilter is missing, or if an LFS-tracked file was committed as a plain blob.site_assembly.py— assembles terrain + street + blockout into one file and raycasts the walking routes for holes and steps.street_mesh.py— road, kerbs, and sidewalks on the DEM, in the project frame; kerbs flush at the three crossings.terrain_from_dem.py— terrain grid from the committed DEM, with building footprints cut out.blosm_blockout.py— headless Blosm import of the committed.osmextract into a.blend, with a per-building scale report. Exact invocation inArt/blender/README.md.page_image_fetch.py— resolves a web page'sog:imageand downloads it, with page URL and hash in a local sidecar. Works for Flickr, Commons file pages, and most photo blogs.commons_fetch.py— Wikimedia Commons reference fetcher. Search, exactFile:titles, or a whole Commons category (--category), thumbnails, provenancesidecar.jsonper folder. Wikimedia throttlesupload.wikimedia.org(HTTP 429), so keep batches to six or fewer files and pass--delay 3; a throttled file is skipped and recorded rather than aborting the run. Writes only into the gitignoredArt/reference/; reference images are never committed.
Planned helpers
- Blender export preset runner (named presets, metric scale assertion)
- OSM extract fetch and manifest writer (records date, bounds, checksum)
- QGIS processing steps as batch scripts, so the geo cleanup is reproducible rather than GUI-only