The portal detail shot failed for a modelling reason, not a camera reason: the doors were 0.1 m panels on a solid plinth, so they read as shading. The plinth is now four piers plus a lintel band, with a 1.2 m reveal, stone jambs and lintels standing 0.10 m proud and three mullions per opening. review-06 frames them from 8 m at eye height. Two defects fixed while doing it: the jamb boxes hung 0.15 m below the pavement, so the facade imported with min Z -15 cm; and a rebuild run against a read-only .blend silently skipped the save, which is why screenshots kept showing the old geometry.
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.- Geographic tools and their shared helpers live in
Geo/tools/(seeGeo/README.md). - Blender-side builders that turn geo data into meshes live beside their output:
Art/blender/terrain/terrain_from_dem.py,Art/blender/street/street_mesh.py,Art/blender/site/site_assembly.py,Art/blender/blockout/blosm_blockout.py. They import their helpers fromGeo/tools/osm_common.py, which is also the only place that converts metres to Unreal centimetres. sibling_asset_audit.py— reads the sibling project's prop library straight from GLB headers and writesArt/props/reuse-manifest.json; copies nothing.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