Adds the five remaining verified south-side buildings to the demo block (6922, 6902, 6838 El Capitan Theatre, 6822 Budget, 6806-6820, 6800 Lee Drug), exported in place from the OSM blockout by Tools/export_block_frontage.py, imported to /Game/Hollywood/Frontage/ and staged by the demo builder with the look material set (stone for the theatres, stucco for the retail run). Adding neighbours exposed a pre-existing placement bug that was invisible while the hero facade stood alone in an empty field: - UE south is +Y here (south sidewalk Y +718..+1447), but the hero sat at Y -1450 on the NORTH side of the street. - It was also at X -12024..-9420, 26 m east of the 6840 footprint; the frontage gap between 6902 and 6838 is X -14591..-12082. - The two north-side buildings were on the SOUTH side, because their exporter mirrored Y. Fixes: hero moved to X -13336 / Y +1307, inside its frontage gap; the frontage and north-building exporters no longer apply a Y mirror (the FBX preset already lands Blender -Y south on UE +Y south); player start and demo cameras moved to the north sidewalk looking south; sun raised to pitch -62 so both frontages read instead of the north side silhouetting. Result: the demo is a street - continuous south frontage with the hero in it, both sidewalks, the road with the designated crossing, and the north-side buildings across the road. Screenshots re-rendered and approved by the owner. Squash of branch frontage-block-0.1.0 (PR #6).
Tools
Repeatable helpers that drive Blender, Unreal, and the reference/asset sources. Nothing here is hand-run twice: every step that produced committed content has a script.
Geographic tools live in Geo/tools/ and the Blender-side builders live next to their output in Art/blender/*/; this folder holds everything that talks to Unreal, the network, or the repository.
Conventions
- One script, one job. Every input is an argument; no interactive prompts.
- Absolute paths where a tool crosses into a sandbox (Blender Flatpak, the Unreal commandlet). Those processes do not share the repo's working directory.
- Unreal commandlets swallow
print(), so each writes a result file under/tmp/gigline/. Read the file; do not trust the exit code alone. - No credentials, no writes outside the project by default.
Repository and assets
| Tool | Purpose |
|---|---|
check-lfs.sh |
Fails if the lfs filter is missing or an LFS-tracked file was committed as a plain blob |
sibling_asset_audit.py |
Reads the sibling project's prop library from GLB headers into Art/props/reuse-manifest.json; copies nothing |
scale_test_export.py / ue_scale_test_import.py |
The 1 m = 100 uu scale test; the named presets ue_metric_v1 live in these two files |
Reference gathering
| Tool | Purpose |
|---|---|
commons_fetch.py |
Wikimedia Commons: search, exact File: titles, or a whole category; writes a provenance sidecar.json |
page_image_fetch.py |
Resolves a web page's og:image and downloads it (Flickr, Commons file pages, photo blogs) |
addon_compat_probe.py |
Verifies MPFB/Blosm can load and generate headless on the pinned Blender |
Blender content
| Tool | Purpose |
|---|---|
hero_facade_build.py |
Parametric hero façade; emits a JSON report naming the evidence behind every part |
mpfb_character_export.py |
MPFB human, standard rig, baked skin, FBX export |
Unreal import and level building
| Tool | Purpose |
|---|---|
ue_import_site.py |
Imports the six site FBXs into /Game/Hollywood/Site, setting collision complexity per mesh |
ue_hero_facade_import.py |
Imports the façade and places it on the measured building line |
ue_build_demo_map.py |
Builds /Game/Hollywood/DemoMap: lighting, façade, site meshes, player start |
ue_build_review_map.py |
Rebuilds Test/ReviewMap, stages the shot camera list, and stages the demo-map views |
ue_create_input_assets.py |
Creates /Game/Input actions and the mapping context headlessly |
ue_character_import.py |
Skeletal import plus the material/texture chain Interchange skips |
Visual review
| Tool | Purpose |
|---|---|
render_screenshots.py / render_screenshots.sh |
Rebuilds the review map, runs the game, captures the shot list into Screenshots/ |
judge_screenshot.py |
Vision-model pre-check: judges a screenshot against an expected-scene description (--image + --expect, or --shots for every shot in the README). Reads OPENROUTER_API_KEY from .env (ignored). Optional helper — a human must still approve. |