# 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/Content` can be audited against it. ## Helpers - `check-lfs.sh` — repository guard: fails if `git-lfs` or the `lfs` filter 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 `.osm` extract into a `.blend`, with a per-building scale report. Exact invocation in `Art/blender/README.md`. - `commons_fetch.py` — Wikimedia Commons reference fetcher. Search or exact `File:` titles, 1600 px thumbnails, provenance `sidecar.json` per folder. Writes only into the gitignored `Art/reference/`; reference images are never committed. ## Planned helpers - Blender export preset runner (named presets, metric scale assertion) - Blender→Unreal scale test (export a known-size cube, verify 100× conversion) - 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