- 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.
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).
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.
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.
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.
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.
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/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/hero_facade_build.py builds the north elevation parametrically and writes
a JSON report naming the evidence behind every part: the 25.75 m frontage and
14.5 m height are measured, the 4.96 m column bay comes from the sibling notes
and matches that frontage, the three portal flights follow the photographs (five
risers, overturning the inherited eight-step, 12 m wide claim), and the rest is
labelled assumption.
Tools/ue_hero_facade_import.py imports it with the ue_metric_v1 preset
(2604 x 1257 x 1450 cm, 1892 tris, 4 materials) and places it on the measured
building line of /Game/Hollywood/DemoMap.
Two new review shots at review-04 and review-05, both pending approval. Camera
placement cost four renders: the first two sat inside the facade body, and the
frontage faces Unreal -Y, so a camera has to stand at Y < -1450 cm, not north of
the building line in project terms.