feat(hero): v0.1.2 — scale calibration, façade detail, export preset refactor #28

Merged
zwitschi merged 9 commits from hero-proportion-0.1.2 into main 2026-11-08 18:48:34 +01:00
Owner

Summary

0.1.2 hero façade work, now including the AI detail-plate toolchain the owner asked for.

1. Colonnade proportion (measured)

Colonnade (columns 2.00–7.95 m + capitals) was 6.90 m of the 14.50 m elevation = 47.6 %, below the photographed 50–60 %, because entablature (3.40 m) + parapet (2.20 m) used 5.60 m. Thinned both to 3.00 m and 1.80 m (Tools/hero_facade_build.py) → colonnade 7.70 m = 53.1 %, envelope and motto band/medallions unchanged relative to the parapet.

2. New tool — Tools/facade_detail_concepts.py

Generates architectural detail plates from a local reference photograph through OpenRouter image models.

  • Eight spec-driven studies: door recess, entrance, column order, entablature/cornice, parapet/motto, window rhythm, street wall, banner.
  • --list is free and reports which studies have their reference present; --all / --only <names> generates.
  • Never overwrites (-v2, -v3 …), writes a .refgen.json sidecar per image (model, prompt, source photo, SHA-256).
  • Output lives under Art/reference/facade-details/ — gitignored, local only, never shipped, consistent with the reference-photography policy.
  • Stdlib only, HTTP 429/5xx back-off, refuses to write a sidecar containing the token.

Generated locally (8 plates, ~2 MB each): Art/reference/facade-details/*.png + sidecars.

3. Defect found and fixed from the measurement pass

Hero window panes floated 1.44 m in front of the wall (Y −1.98, while the mass front is Y −0.50 and the columns reach −1.02) — glazing sitting ahead of the colonnade instead of reading as openings behind it. Now WINDOW_Y = −0.56: on the wall plane, behind the columns, visibly dark in review-hero-facade-front.

4. Rebuilt and re-rendered

Hero → re-imported (SM_HeroFacade, bounds 2604 × 1257 × 1450 cm) → DemoMap rebuilt → full screenshot set re-rendered (all 14 PNGs in this PR).

Tests and docs

  • 40 tool tests pass (11 new: study table, prompt assembly + anchor suffix, next-free naming, data-URL decoding for both response shapes and the refusal path, local-only output rule).
  • Tools/README.md inventory row; Screenshots/README.md known-issues records the window fix; MEMORY.md records the toolchain, the prompt-refusal gotcha and the LFS chmod u+w reminder.

Review

Hero shots 8–10 and the demo views 11–12 are the ones affected. Approval state in Screenshots/README.md is left pending.

## Summary `0.1.2` hero façade work, now including the AI detail-plate toolchain the owner asked for. ### 1. Colonnade proportion (measured) Colonnade (columns 2.00–7.95 m + capitals) was **6.90 m of the 14.50 m elevation = 47.6 %**, below the photographed **50–60 %**, because entablature (3.40 m) + parapet (2.20 m) used 5.60 m. Thinned both to **3.00 m** and **1.80 m** (`Tools/hero_facade_build.py`) → colonnade **7.70 m = 53.1 %**, envelope and motto band/medallions unchanged relative to the parapet. ### 2. New tool — `Tools/facade_detail_concepts.py` Generates architectural detail plates from a local reference photograph through OpenRouter image models. - Eight spec-driven studies: door recess, entrance, column order, entablature/cornice, parapet/motto, window rhythm, street wall, banner. - `--list` is free and reports which studies have their reference present; `--all` / `--only <names>` generates. - Never overwrites (`-v2`, `-v3` …), writes a `.refgen.json` sidecar per image (model, prompt, source photo, SHA-256). - Output lives under `Art/reference/facade-details/` — **gitignored, local only, never shipped**, consistent with the reference-photography policy. - Stdlib only, HTTP 429/5xx back-off, refuses to write a sidecar containing the token. Generated locally (8 plates, ~2 MB each): `Art/reference/facade-details/*.png` + sidecars. ### 3. Defect found and fixed from the measurement pass Hero **window panes floated 1.44 m in front of the wall** (Y −1.98, while the mass front is Y −0.50 and the columns reach −1.02) — glazing sitting ahead of the colonnade instead of reading as openings behind it. Now `WINDOW_Y = −0.56`: on the wall plane, behind the columns, visibly dark in `review-hero-facade-front`. ### 4. Rebuilt and re-rendered Hero → re-imported (`SM_HeroFacade`, bounds 2604 × 1257 × 1450 cm) → DemoMap rebuilt → **full screenshot set re-rendered** (all 14 PNGs in this PR). ### Tests and docs - **40 tool tests** pass (11 new: study table, prompt assembly + anchor suffix, next-free naming, data-URL decoding for both response shapes and the refusal path, local-only output rule). - `Tools/README.md` inventory row; `Screenshots/README.md` known-issues records the window fix; `MEMORY.md` records the toolchain, the prompt-refusal gotcha and the LFS `chmod u+w` reminder. ### Review Hero shots **8–10** and the demo views **11–12** are the ones affected. Approval state in `Screenshots/README.md` is left pending.
zwitschi added 1 commit 2026-11-08 16:46:37 +01:00
Measured from the built mesh, the colonnade (columns + capitals) was 6.90 m of the
14.50 m elevation = 47.6 %: the entablature (3.40 m) and parapet (2.20 m) were
using 5.60 m of the height. Thinned both to 3.00 m and 1.80 m in
hero_facade_build.py, which lifts the colonnade to 7.70 m = 53.1 % - inside the
50-60 % band - with the envelope, motto band and medallions unchanged relative to
the parapet.

Hero rebuilt, re-imported (bounds 2604 x 1257 x 1450 cm), DemoMap rebuilt and the
screenshot set re-rendered for review. Hero part report updated (columns 7.45 ->
8.25 m, entablature 3.40 -> 3.00 m).

TODO: colonnade item closed. MEMORY records the FBX-vs-blend --out gotcha.
zwitschi added 2 commits 2026-11-08 17:27:34 +01:00
Adds Tools/facade_detail_concepts.py: generates architectural detail plates from a
local reference photograph through OpenRouter's image models. Spec-driven (eight
studies: door recess, entrance, column order, entablature/cornice, parapet/motto,
window rhythm, street wall, banner), never overwrites (writes -vN), writes a
.refgen.json sidecar (model, prompt, source photo, SHA-256) per image, and keeps
all output under the gitignored Art/reference/facade-details/ - local only, never
shipped. Stdlib only; http 429/5xx back-off; refuses to write a sidecar containing
the token. 11 tests cover the study table, prompt assembly, next-free naming,
data-URL decoding (both response shapes plus a refusal) and the local-only rule.

Measurement pass on the plates: the hero window panes were at Y -1.98, i.e. 1.44 m
in FRONT of the wall (Y -0.50) and ahead of the column line, so the glazing floated
in the colonnade instead of reading as openings behind it. Moved to Y -0.56; hero
rebuilt, re-imported, DemoMap rebuilt, full screenshot set re-rendered.

Docs: Tools/README row, Screenshots README known-issues entry now records the fix.
zwitschi added 1 commit 2026-11-08 17:35:20 +01:00
Owner instruction: show the building, its entrance, the neighbouring buildings,
front-on, and drop the close-up detail framing.

- Studies replaced: door-recess / entrance-wide / column-order /
  entablature-cornice / parapet-motto / window-rhythm / street-wall /
  banner-detail -> building-front, building-entrance, building-with-neighbours,
  building-street-front, building-front-oblique, theatre-front-with-neighbours.
- ANCHOR_SUFFIX now permits REFRAMING (step back, zoom out, widen the view) so the
  whole building can fit, while the architecture stays fixed; previously it pinned
  the camera angle to the reference, which forced cropped results.
- Prompts state 'exterior' explicitly (the entrance study otherwise produced an
  interior) and require sky above the roofline and nothing cut off.

Vision pre-check on the regenerated set: building-entrance and building-street-front
read as full-elevation frontal plates; the studies anchored on the tightly cropped
2009 facade photo stay cropped, because the model will not invent the parapet and
sky the photograph does not contain. That limitation is recorded in the study table
comment - a full 6840 plate needs a full-elevation photograph we do not hold.

Tests: 40 pass (study table assertions unchanged).
zwitschi added 1 commit 2026-11-08 17:39:54 +01:00
Detail pass on the hero, all verified by measuring the built mesh:

- Column base moulding: a 1.36 m wide, 0.22 m tall cylinder at each shaft foot
  (2.00-2.22 m). The shaft previously started straight off the square pedestal,
  so the base never read in silhouette.
- Abacus: a 1.30 m square, 0.14 m thick slab over each capital. It takes the top
  of the capital zone, so the colonnade still ends at 9.70 m and the 53.1 %
  proportion is unchanged.
- Medallions fixed: they were built with the Z-axis cylinder helper, so the two
  'discs' were pancakes lying flat on the parapet coping (1.1 x 1.1 x 0.02,
  z 14.02-14.04). New disc_on_wall() helper rotates the cylinder 90 deg about X;
  they now stand 1.1 m across on the parapet face (y -1.32..-1.28,
  z 13.05..14.15).

Hero rebuilt (95 parts, 2420 tris, still 14.50 m), re-imported, DemoMap rebuilt,
screenshot set re-rendered. Part report records the new dims and their assumption
notes. Screenshots README notes the detail pass.
zwitschi added 1 commit 2026-11-08 17:53:32 +01:00
UE export hygiene (unreal-export skill checklist) plus a gameplay defect the new
probe caught:

- FBX export now uses mesh_smooth_type="FACE" (was OFF, which is why every import
  logged "No smoothing group information was found"), and the round parts are
  shaded with shade_smooth_by_angle(35 deg) before export, so columns and
  medallions read round instead of faceted.
- SM_HeroFacade had complex-only collision, so capsule sweeps and line traces
  passed through the wall: the player could walk through the hero facade.
  auto_generate_collision was tried and rejected (coarse hulls bulged into the
  street; the QA wall probe went 0/35 -> 2/35). It now uses UseComplexAsSimple,
  saved on the asset, like the terrain.
- New -qaselftest facade occlusion probe: 40 m traces sideways from the road
  centre at walking height, required only where a building is staged (explicit X
  spans mirroring ue_build_demo_map). Result 0/9 -> PASS, alongside transect
  0 holes and wall probe 0/35.

Docs: release-checks records the probe and both collision attempts; Tools/README
lists the new phase; MEMORY records the smoothing/collision lessons.
zwitschi added 1 commit 2026-11-08 18:01:00 +01:00
The bpy.ops.export_scene.fbx argument block was duplicated in six scripts (hero,
block frontage, north buildings, site, scale test, MPFB character) and all six
carried mesh_smooth_type="OFF", which drops smoothing groups and made every
Unreal import warn and every round part faceted.

Tools/fbx_export_preset.py now owns the presets:
- preset_kwargs(preset, selection, **overrides) is bpy-free and unit-tested;
- export_static()/export_character() are thin wrappers that import bpy lazily;
- ue_metric_v1 and ue_character_v1 keep the recorded scale contract
  (FBX_SCALE_NONE, apply_unit_scale, -Y forward / Z up) and use FACE smoothing.

Callers switched: hero_facade_build, export_block_frontage, export_north_buildings,
scale_test_export, mpfb_character_export, Art/blender/site/export_site_fbx.

Verified by re-exporting every asset through the preset and re-importing all of
them: 0 smoothing warnings on site, frontage and north buildings; packaging and
-qaselftest all PASS (walk, transect 0 holes, wall probe 0/35, facade probe 0/9).
49 tool tests pass (9 new for the preset contract).
zwitschi added 1 commit 2026-11-08 18:06:19 +01:00
- Hero cornice finished: projecting corona over a 52-dentil course (0.18 x 0.30 x
  0.22 m at 0.45 m centres) so the top of the order has a shadow line instead of
  one flat box. Hero 3044 tris / 148 parts, still 14.50 m; rebuilt, re-imported,
  DemoMap rebuilt, packaged -qaselftest all PASS, screenshots re-rendered.
- CHANGELOG: full 0.1.2 entry (added: concept generator, FBX preset, facade probe,
  Ionic detail, tool tests; changed: 3.1 m storey height, 53.1% colonnade, smoothing
  groups; fixed: floating windows, flat medallions, missing facade collision, the
  three non-building heights).
- TODO: 0.1.2 section removed (goal stays in ROADMAP, whose status line is updated).
- MEMORY: release record incl. the recorded ornament assumptions.
zwitschi changed title from fix(hero): lift the colonnade into the photographed 50-60% band to feat(hero): v0.1.2 — scale calibration, façade detail, export preset refactor 2026-11-08 18:06:22 +01:00
zwitschi added 1 commit 2026-11-08 18:48:03 +01:00
archviz rule: an elevation must not lean. hero-facade-front looked up ~4 deg from
4.2 m at a 7.6 m target (columns converged); demo-spawn-view and demo-street-level
were pitched too. All three now sit at the target's height, so pitch and roll are
zero by construction and the verticals stay parallel.

Screenshots re-rendered. A pixel-based verticality check is useless here (banners
and windows break naive edge matching), so the guarantee is geometric and is
recorded that way in the README and MEMORY.
zwitschi merged commit ba68dcfdbc into main 2026-11-08 18:48:34 +01:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: zwitschi/gig-line#28