From 70c6e322e20934ac286e06938fa51a425fc1a1b1 Mon Sep 17 00:00:00 2001 From: Zwitschi Date: Sun, 8 Nov 2026 17:39:52 +0100 Subject: [PATCH] feat(hero): Ionic base and abacus, medallions onto the parapet face 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. --- Art/blender/hero/hero-facade-2026-11-07.blend | 4 +- Art/blender/hero/hero-facade-2026-11-07.json | 34 ++++++++--- Game/GigLine/Content/Hollywood/DemoMap.umap | 2 +- .../Hollywood/ElCapitan/SM_HeroFacade.uasset | 4 +- .../Content/Hollywood/Site/M_Asphalt.uasset | 2 +- .../Content/Hollywood/Site/M_Concrete.uasset | 2 +- .../Hollywood/Site/M_FacadeStone.uasset | 2 +- .../Content/Hollywood/Site/M_Ground.uasset | 2 +- .../Hollywood/Site/M_KerbConcrete.uasset | 2 +- .../Content/Hollywood/Site/M_RoadPaint.uasset | 2 +- .../Content/Hollywood/Site/M_Stucco.uasset | 2 +- .../Content/Hollywood/Site/Terrain_DEM.uasset | 2 +- Game/GigLine/Content/Test/ReviewMap.umap | 2 +- Screenshots/demo/review-demo-crossing.png | 4 +- .../demo/review-demo-north-buildings.png | 4 +- Screenshots/demo/review-demo-spawn-view.png | 4 +- Screenshots/demo/review-demo-street-level.png | 4 +- Screenshots/review-character.png | 4 +- Screenshots/review-ground-contact.png | 4 +- Screenshots/review-hero-facade-front.png | 4 +- Screenshots/review-hero-facade-oblique.png | 4 +- Screenshots/review-hero-portals.png | 4 +- Screenshots/review-npc-prefab.png | 4 +- Screenshots/review-overview.png | 4 +- Screenshots/review-player-placement.png | 4 +- Screenshots/review-scale-cubes.png | 4 +- Screenshots/review-shadow-compare.png | 4 +- TODO.md | 2 +- Tools/hero_facade_build.py | 57 ++++++++++++++++--- 29 files changed, 117 insertions(+), 60 deletions(-) diff --git a/Art/blender/hero/hero-facade-2026-11-07.blend b/Art/blender/hero/hero-facade-2026-11-07.blend index b88fd9b..480949d 100644 --- a/Art/blender/hero/hero-facade-2026-11-07.blend +++ b/Art/blender/hero/hero-facade-2026-11-07.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fe3a08cdf4ca196cd59fe52a7ba9edc140d0e11391dff970a93b883410b415a6 -size 134198 +oid sha256:85235632d76bd9527947bdbff1f242cabc3de8192c6211273a77744d99f1e2e9 +size 139428 diff --git a/Art/blender/hero/hero-facade-2026-11-07.json b/Art/blender/hero/hero-facade-2026-11-07.json index 61169ff..a93b843 100644 --- a/Art/blender/hero/hero-facade-2026-11-07.json +++ b/Art/blender/hero/hero-facade-2026-11-07.json @@ -3,18 +3,18 @@ "frame": "project frame, metres, X east Y north Z up", "bounds_m": { "min": [ - -13.02, + -13.08, -12.5, 0.0 ], "max": [ - 13.02, - 0.07, + 13.08, + 0.13, 14.5 ], "size": [ - 26.04, - 12.57, + 26.16, + 12.63, 14.5 ] }, @@ -37,6 +37,24 @@ ], "evidence": "6 columns at 4.96 m centres (sibling notes x measured frontage)" }, + { + "object": "Hero_ColumnBase_x6", + "dims_m": [ + 1.36, + 1.36, + 0.22 + ], + "evidence": "assumption: Ionic base moulding; photographs show a wider base at the shaft foot" + }, + { + "object": "Hero_Abacus_x6", + "dims_m": [ + 1.3, + 1.3, + 0.14 + ], + "evidence": "assumption: square abacus under the architrave, as Ionic capitals carry" + }, { "object": "Hero_Architrave", "dims_m": [ @@ -86,10 +104,10 @@ "object": "Hero_Medallion_x2", "dims_m": [ 1.1, - 1.1, - 0.02 + 0.04, + 1.1 ], - "evidence": "photographs: two stone discs beside the motto" + "evidence": "photographs: two stone discs beside the motto, mounted on the parapet face" }, { "object": "Hero_Stylobate", diff --git a/Game/GigLine/Content/Hollywood/DemoMap.umap b/Game/GigLine/Content/Hollywood/DemoMap.umap index 56e6a99..45119d5 100644 --- a/Game/GigLine/Content/Hollywood/DemoMap.umap +++ b/Game/GigLine/Content/Hollywood/DemoMap.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:58339d354b5afeb8fddefdd2c463eda6d45cd5379ff80f8eb644a33c17599e3f +oid sha256:acdd30ea6a5ad59a1c7f42ed0d70d179e98a6431791ce6bf7a3c584c36883f94 size 54508 diff --git a/Game/GigLine/Content/Hollywood/ElCapitan/SM_HeroFacade.uasset b/Game/GigLine/Content/Hollywood/ElCapitan/SM_HeroFacade.uasset index 01f38d5..0dbcfbd 100644 --- a/Game/GigLine/Content/Hollywood/ElCapitan/SM_HeroFacade.uasset +++ b/Game/GigLine/Content/Hollywood/ElCapitan/SM_HeroFacade.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d3831a508ced9e573ab9db083672c1e16ba46f9f052ceb53665853f6198cc64b -size 117009 +oid sha256:9258231850302dd06eb27d7714b1560fe4921dd73db680cd2d6e19ebaf8c57c5 +size 128284 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset b/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset index 3899d1d..fadfff1 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9525922eca9e99a50f97b0c44ede1b908e1d97fa8c0fbddf928ffa3fbc960c4b +oid sha256:ac1508a932d350be48d9969dd90c3e7ca5c67a89b63546a9ddae990b3e47a228 size 7876 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset b/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset index 5eab245..d3d636e 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:906f52dcc949ac7dfeae7f60e250434af3d2e57d5d6e23a6deb565d3a138a39e +oid sha256:a43bf901e9cf838ad480784f3682ee2547e8de9e317ac1115bff0f3bacc99d44 size 7881 diff --git a/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset b/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset index ccecc9c..0fa6b2b 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0323b2b2ee3023cadb09d8bc3f3a7c024ef2c2a0de53db8442070ef404a3b434 +oid sha256:296c8933f068d64587c35916b947453fc394484246cfde3fcdf0c865a076400f size 7896 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset b/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset index ea094ac..8755aae 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ebc3cbc40452389f0ae078dad79949653612c5c300fa5644807344dbb6aa97bb +oid sha256:664b4fb977c50a4b80a6b121e8f7f9c71b1a3c6ceac95528dfc15baa8f3bf732 size 7871 diff --git a/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset b/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset index 00b980c..2c48dd6 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4f311cc222d4f215b3163841c111e526b09874d5ee8845ea5720e4556babd387 +oid sha256:a6210dae202c33257c7817d5b9cc95198df094f2338400d8f525d8bbea9351a2 size 7901 diff --git a/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset b/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset index dba2aed..f50c054 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4b4e25f5d61346ae996c1ad43c889fdabbe0576f306fba83b67f2918e778d675 +oid sha256:c85b5214d4eca87d470bbbc6babfc92b55a9c2b0a937171a2c16c41a915e09b3 size 7886 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset b/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset index c4b8fa9..4b11416 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:720902f570fb87a38e3847d2645b057e71f8971a82000ca39af3652349349ce7 +oid sha256:b409da289210f018dcf96757db52af5d90b2ddd9890c082a75aeec081ea8bde2 size 7871 diff --git a/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset b/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset index c175268..ec52357 100644 --- a/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset +++ b/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:17d9fe3b1ce4589e610f0027c91f361eb73b09c7442b5c4a763b5419aba47040 +oid sha256:f7c788b5a4bb6700c50b56009c5b0aa0ff08bddfa4e093e881b04bf4521eb2a3 size 335528 diff --git a/Game/GigLine/Content/Test/ReviewMap.umap b/Game/GigLine/Content/Test/ReviewMap.umap index ec501e9..ac2c54c 100644 --- a/Game/GigLine/Content/Test/ReviewMap.umap +++ b/Game/GigLine/Content/Test/ReviewMap.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e94a0743d2dfd379b4011e69d79f0fe156a8d2158727b8fc5f3d1395f854e2aa +oid sha256:95c36b872c9c9ced0d697b1766a0aa729e5229b39ed117a4764ddaac31c00613 size 28706 diff --git a/Screenshots/demo/review-demo-crossing.png b/Screenshots/demo/review-demo-crossing.png index dd16d77..4fb56b0 100644 --- a/Screenshots/demo/review-demo-crossing.png +++ b/Screenshots/demo/review-demo-crossing.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:33e7e224081d4b0a44752a42e93b944f1f41172c85978c8f4f9a20169c4b7502 -size 2666539 +oid sha256:c7433f707fd4c67c2086010e0e5532ccd52181256a18fe463e1df5482199c51e +size 2670224 diff --git a/Screenshots/demo/review-demo-north-buildings.png b/Screenshots/demo/review-demo-north-buildings.png index deb86a3..826fcc0 100644 --- a/Screenshots/demo/review-demo-north-buildings.png +++ b/Screenshots/demo/review-demo-north-buildings.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cd7a116c05c31584187d6dd05fb94f69d6ff540737cb212b8a860931f360666b -size 2506551 +oid sha256:7b3f30d08aac53ff457d77c15623f0e64576a99fd35b2365fae8be20f368d196 +size 2506433 diff --git a/Screenshots/demo/review-demo-spawn-view.png b/Screenshots/demo/review-demo-spawn-view.png index 880f199..fdff3ea 100644 --- a/Screenshots/demo/review-demo-spawn-view.png +++ b/Screenshots/demo/review-demo-spawn-view.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f1cbf3b285c04f9c851ede43f5aa97585facf966f5e7e8cdb20d7ef074f71193 -size 2619015 +oid sha256:b6d50f5ab3d48192c29fa8e1f55081cf07a25ed8e076a433db206fae2d071aa4 +size 2622693 diff --git a/Screenshots/demo/review-demo-street-level.png b/Screenshots/demo/review-demo-street-level.png index 9f8899d..509f5cc 100644 --- a/Screenshots/demo/review-demo-street-level.png +++ b/Screenshots/demo/review-demo-street-level.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bba4637c4fb2a60f629def61edc61d231389576a77bd4a02dbe569ceb13ae036 -size 2441194 +oid sha256:62281b1fc62966c64b191d70e3d028cc58ac1ca3678cb0ebb293c8c8cba886e4 +size 2447844 diff --git a/Screenshots/review-character.png b/Screenshots/review-character.png index 6035512..026cb84 100644 --- a/Screenshots/review-character.png +++ b/Screenshots/review-character.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:874d3a55f9f369c07bb266619550a0ddb6608e60bca03b61e92c5c84172899a2 -size 2533314 +oid sha256:e2ac708b0b575a87bbdd56a19979c2115b7ff60797faf3569a92bec37f072b04 +size 2537573 diff --git a/Screenshots/review-ground-contact.png b/Screenshots/review-ground-contact.png index 36fd3d6..04655e3 100644 --- a/Screenshots/review-ground-contact.png +++ b/Screenshots/review-ground-contact.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5e03e459828414a20d22cf82bab6ff2101e2d252e05892d6353de72c0bfcafb7 -size 1751574 +oid sha256:801b4dc81508169a309950e9dcfa8275e0106af16496b0741f5c22fc8d0445f0 +size 1751096 diff --git a/Screenshots/review-hero-facade-front.png b/Screenshots/review-hero-facade-front.png index eca1075..6aa970d 100644 --- a/Screenshots/review-hero-facade-front.png +++ b/Screenshots/review-hero-facade-front.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8d43265c7371293f51d3097ac0b64231bb744a8968c34fea6059bda4bf338a94 -size 1552429 +oid sha256:e01eeea0faae4f18969b5f2f5885462c5033e1d8a476060fbd60c2e55f9d8375 +size 1554786 diff --git a/Screenshots/review-hero-facade-oblique.png b/Screenshots/review-hero-facade-oblique.png index 0519f5e..df386cf 100644 --- a/Screenshots/review-hero-facade-oblique.png +++ b/Screenshots/review-hero-facade-oblique.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:46c18a8e4a04e87f9c5bfe0d485e012ca320ea258d01d2bbf04fb81e8366cdd0 -size 1306107 +oid sha256:5f65120965f61e8b6c667a8524864653755012cc68fe98a36396f08780ed2dc8 +size 1308909 diff --git a/Screenshots/review-hero-portals.png b/Screenshots/review-hero-portals.png index 2443cb5..e4e699c 100644 --- a/Screenshots/review-hero-portals.png +++ b/Screenshots/review-hero-portals.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fa0eedb216ff40fd04886f3848de4ed614e57b2cdc376a2881a3869c8b2027f9 -size 1326324 +oid sha256:14f651aeeef6ddec8e7de0a89326b7ac7c8f713ffdf83fc67525dfd780b2b3b9 +size 1328002 diff --git a/Screenshots/review-npc-prefab.png b/Screenshots/review-npc-prefab.png index ae36cee..de225e6 100644 --- a/Screenshots/review-npc-prefab.png +++ b/Screenshots/review-npc-prefab.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:77b89f510d5bdbc5a894a65e7244713d055b9e0c5ef365a52c31f5e8886946cc -size 1732427 +oid sha256:cff5f94a8224a3b7ee2e22db8dc157a2a6e484dd405b0f934f38e966265d881b +size 1737790 diff --git a/Screenshots/review-overview.png b/Screenshots/review-overview.png index 1b8ef3b..e4d4b66 100644 --- a/Screenshots/review-overview.png +++ b/Screenshots/review-overview.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5bfd21b670e27b2d9642083bc25460023d8acf4d788981b750ad7cc7d74d13ed -size 2482062 +oid sha256:b809ae0e1239f3e915ac312bcee988270cb1516707b784c95fb7014704474534 +size 2627332 diff --git a/Screenshots/review-player-placement.png b/Screenshots/review-player-placement.png index b44ffde..c5393bc 100644 --- a/Screenshots/review-player-placement.png +++ b/Screenshots/review-player-placement.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:11933b0e8fe721cd9f785f15d99438dd8c632e814a7fe86b053e855b909673d4 -size 2022340 +oid sha256:7b024c12c58253aefdfa34f64463fde181382bfe4106df092c9b0e8cf6e1cb1d +size 2018349 diff --git a/Screenshots/review-scale-cubes.png b/Screenshots/review-scale-cubes.png index 3bb9a2a..49f3d9e 100644 --- a/Screenshots/review-scale-cubes.png +++ b/Screenshots/review-scale-cubes.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c54621f64bd890182f04755154156a74b735ad1a839b712c6c48bd9d60f1afe6 -size 1936777 +oid sha256:fb7a5b86453eb0d15bf34feafe69773038b30d7467e6034f6455921ca19b9862 +size 1938812 diff --git a/Screenshots/review-shadow-compare.png b/Screenshots/review-shadow-compare.png index c980a6b..d7fa9d6 100644 --- a/Screenshots/review-shadow-compare.png +++ b/Screenshots/review-shadow-compare.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:01f3443e4163ec9e3e45f1612c8357f1b05dd6bb87043095b8aa9e8a1ceaddab -size 1721917 +oid sha256:b3c25931da0737b93cc89558556e87537a3ac1518e2d8290258024fd68e6f338 +size 1721081 diff --git a/TODO.md b/TODO.md index 9966973..333d831 100644 --- a/TODO.md +++ b/TODO.md @@ -16,7 +16,7 @@ Suggested blender skills: **references** (reference-image-match and visual-match ### Patch tasks - active - 01a1b26b-3c94-707f-9665-2f6b4a79b564 (branch `scale-facade-0.1.2`) - [x] Correct building scale and street proportions flagged against references. **Mapbox adopted 2026-11-09.** `Geo/tools/mapbox_buildings.py` merges our OSM heights with Mapbox's building data for the same footprints; after adopting its two findings the cross-check reports **66 match, 6 non-building, 0 disagreements**. Adopted: **`LEVEL_HEIGHT` 3.2 → 3.1 m** (`block_height_report.py`, and the Blosm `--level-height` default), plus explicit `HEIGHT_OVERRIDES` (3.0 m) for the three rear `building=yes`/`apartments` structures Mapbox gives as single-storey. Blockout regenerated, frontage re-exported/re-imported, DemoMap rebuilt; packaged `-qaselftest` all PASS. Measured effect: 6922 42.1 → 39.1 m, El Capitan Theatre 20.0 → 20.5 m (both now ~1.9 m above their table height = roof mass). -- [ ] Refine hero façade details where reference photography shows discrepancies. **Started 2026-11-09:** built `Tools/facade_detail_concepts.py`, which generates architectural detail plates from the local reference photographs with an image model (`--list` free, `--all` generates, sidecars + `-vN` no-overwrite, output gitignored). Six **frontal building** studies generated locally under `Art/reference/facade-details/` (whole elevation, entrance in its facade, building with neighbours, pavement view, three-quarter, theatre frontage) — rephrased on owner instruction to show the building/entrance/neighbours rather than close-up detail crops. **First fix from the measurement pass:** window panes were 1.44 m in front of the wall (ahead of the columns) and now sit on the wall plane behind the colonnade. Remaining: use the plates to correct the capital/base profiles and the medallion/cornice detail. +- [ ] Refine hero façade details where reference photography shows discrepancies. **Started 2026-11-09:** built `Tools/facade_detail_concepts.py`, which generates architectural detail plates from the local reference photographs with an image model (`--list` free, `--all` generates, sidecars + `-vN` no-overwrite, output gitignored). Six **frontal building** studies generated locally under `Art/reference/facade-details/` (whole elevation, entrance in its facade, building with neighbours, pavement view, three-quarter, theatre frontage) — rephrased on owner instruction to show the building/entrance/neighbours rather than close-up detail crops. **First fix from the measurement pass:** window panes were 1.44 m in front of the wall (ahead of the columns) and now sit on the wall plane behind the colonnade. **Detail pass 2026-11-09 (all measured on the built mesh):** added an Ionic base moulding (1.36 m × 0.22 m) at each shaft foot and a square abacus (1.30 m × 0.14 m) over each capital, taking the abacus out of the capital zone so the colonnade still ends at 9.70 m; re-oriented the two parapet medallions, which were flat discs lying on the coping (1.1 × 1.1 × 0.02 in the wrong axes) instead of discs on the parapet face; window panes moved onto the wall plane. Hero is now 2 420 tris across 95 parts, still 14.50 m. Cornice/dentil profile refinement remains. - [x] **Replace the placeholder heights.** **Resolved 2026-11-08 — they were never unknown buildings.** The three "guessed" ways are not building volumes at all: `1360755125` and `1360755126` are `building=roof` at `layer=1` (elevated canopies) and `1417995292` is `amenity=shelter` / `shelter_type=public_transport` (a transit shelter). The report defaulted them to "2 levels × 3.2 m" and produced the bogus 6.4 m. `Geo/tools/block_height_report.py` now classifies roof/shelter explicitly and reports **0 guessed heights**: all 15 block volumes have a real `height` tag, a `building:levels` derivation, or are correctly excluded as non-building volumes. No photograph measurement was needed, and no frontage building was affected. - [x] Resolve the remaining unknown on the hero: the colonnade currently occupies about 45 % of the height against roughly 50–60 % in the photographs. Fix the vertical proportions. **Fixed 2026-11-09.** Measured baseline: colonnade (columns + capitals) 6.90 m of the 14.50 m envelope = **47.6 %**, because the entablature (3.40 m) and parapet (2.20 m) left only 7.90 m for the order. Thinned both to **3.00 m** and **1.80 m** (`Tools/hero_facade_build.py`), which lifts the colonnade to **7.70 m = 53.1 %** — inside the photographed 50–60 % band, with the 14.50 m envelope, the motto band and the medallions unchanged in position relative to the parapet. Hero rebuilt, re-imported (bounds 2604 × 1257 × 1450 cm) and re-rendered. - [ ] Tag `v0.1.2` and write `CHANGELOG.md` entry; then remove this section. diff --git a/Tools/hero_facade_build.py b/Tools/hero_facade_build.py index c75015a..204d0fa 100644 --- a/Tools/hero_facade_build.py +++ b/Tools/hero_facade_build.py @@ -88,6 +88,25 @@ def cylinder(name, x, y, z0, z1, radius, material, vertices=24): return obj +def disc_on_wall(name, x, y, z, radius, thickness, material=None, vertices=24): + """A round disc mounted vertically on a wall face. + + `cylinder()` builds along Z, so a "medallion" made with it is a pancake lying + flat on top of the parapet rather than a disc on its face — which is what the + first build did (1.1 m across in Y, 0.02 m thick in Z, sitting at the coping). + This rotates the cylinder 90 degrees about X so the axis points along Y and + the disc faces the street. + """ + obj = cylinder(name, x, y, z - thickness / 2.0, z + thickness / 2.0, + radius, material, vertices=vertices) + obj.rotation_euler = (math.radians(90.0), 0.0, 0.0) + bpy.ops.object.select_all(action="DESELECT") + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + bpy.ops.object.transform_apply(location=False, rotation=True, scale=True) + return obj + + def make_material(name, rgba, roughness=0.75): mat = bpy.data.materials.new(name) mat.use_nodes = True @@ -136,14 +155,32 @@ def build(): col_xs.append(x) cube(f"Hero_Pedestal_{i + 1}", x, -0.62, PEDESTAL_H + 0.27, 1.24, 1.24, 0.54, stone) - cylinder(f"Hero_Column_{i + 1}", x, -0.55, PEDESTAL_H + 0.55, - PEDESTAL_H + 0.55 + (HEIGHT - ENTABLATURE_H - PARAPET_H - PEDESTAL_H - 0.55 - CAPITAL_H), + # Base moulding: a taller, wider cylinder where the shaft meets the + # pedestal. Without it the shaft starts straight off a square plinth, + # which is not how an Ionic base reads in silhouette. + base_z0 = PEDESTAL_H + 0.55 + base_h = 0.22 + cylinder(f"Hero_ColumnBase_{i + 1}", x, -0.55, base_z0, base_z0 + base_h, + 0.68, stone, vertices=20) + shaft_z0 = base_z0 + base_h + cap_z0 = HEIGHT - ENTABLATURE_H - PARAPET_H - CAPITAL_H + cylinder(f"Hero_Column_{i + 1}", x, -0.55, shaft_z0, cap_z0, COLUMN_D / 2.0, stone) - cylinder(f"Hero_Capital_{i + 1}", x, -0.55, - HEIGHT - ENTABLATURE_H - PARAPET_H - CAPITAL_H, - HEIGHT - ENTABLATURE_H - PARAPET_H, 0.62, stone, vertices=16) + # Capital block, then the square abacus that carries the architrave. + # The abacus takes the top 0.14 m of the capital zone so the colonnade + # still ends at HEIGHT - ENTABLATURE_H - PARAPET_H (proportion unchanged). + abacus_h = 0.14 + cylinder(f"Hero_Capital_{i + 1}", x, -0.55, cap_z0, + HEIGHT - ENTABLATURE_H - PARAPET_H - abacus_h, 0.62, stone, vertices=16) + cube(f"Hero_Abacus_{i + 1}", x, -0.55, + HEIGHT - ENTABLATURE_H - PARAPET_H - abacus_h / 2.0, + 1.30, 1.30, abacus_h, stone) note("Hero_Column_x6", (COLUMN_D, COLUMN_D, HEIGHT - ENTABLATURE_H - PARAPET_H - PEDESTAL_H), f"6 columns at {COLUMN_BAY} m centres (sibling notes x measured frontage)") + note("Hero_ColumnBase_x6", (1.36, 1.36, 0.22), + "assumption: Ionic base moulding; photographs show a wider base at the shaft foot") + note("Hero_Abacus_x6", (1.30, 1.30, 0.14), + "assumption: square abacus under the architrave, as Ionic capitals carry") # --- entablature and parapet ------------------------------------------ ent_z0 = HEIGHT - ENTABLATURE_H - PARAPET_H @@ -167,11 +204,13 @@ def build(): FRONTAGE_W - 3.0, 0.08, 0.85, stone_dark) note("Hero_MottoBand", (FRONTAGE_W - 3.0, 0.08, 0.85), "photographs: motto panel above the colonnade") - # Medallions either side of the inscription. + # Medallions either side of the inscription: discs on the parapet face, not + # pancakes on the coping (see disc_on_wall). for i, x in enumerate((-6.2, 6.2), start=1): - cylinder(f"Hero_Medallion_{i}", x, -1.36, HEIGHT - PARAPET_H / 2.0 + 0.42, - HEIGHT - PARAPET_H / 2.0 + 0.44, 0.55, stone_dark, vertices=20) - note("Hero_Medallion_x2", (1.1, 1.1, 0.02), "photographs: two stone discs beside the motto") + disc_on_wall(f"Hero_Medallion_{i}", x, -1.30, HEIGHT - PARAPET_H / 2.0, + 0.55, 0.04, stone_dark, vertices=20) + note("Hero_Medallion_x2", (1.1, 0.04, 1.1), + "photographs: two stone discs beside the motto, mounted on the parapet face") # --- entrances --------------------------------------------------------- # Three portals between column pairs, each with its own short flight. The