diff --git a/Art/blender/README.md b/Art/blender/README.md index 8b032c3..6cb4ba0 100644 --- a/Art/blender/README.md +++ b/Art/blender/README.md @@ -80,10 +80,7 @@ LD_LIBRARY_PATH="$B/blender/lib" "$B/blender/blender" -b --factory-startup \ ``` - `Road_Hollywood`: 8 120 verts, 7 812 faces, carriageway −10.5…+10.5 m, DEM elevations plus a 2 cm lift so it does not z-fight the terrain. -- `Sidewalk_South` 4.0 m wide, `Sidewalk_North` 5.3 m wide. The kerb upstand is - **full at the road-side edge and tapers to zero at the building-side edge**, so - the walk surface meets the terrain flush (before `0.1.1` the outer lip stood the - full kerb height above the DEM — a 15.8 cm ledge). +- `Sidewalk_South` 4.0 m wide, `Sidewalk_North` 5.3 m wide. The kerb upstand is **full at the road-side edge and tapers to zero at the building-side edge**, so the walk surface meets the terrain flush (before `0.1.1` the outer lip stood the full kerb height above the DEM — a 15.8 cm ledge). - `Kerb_South`, `Kerb_North`: vertical faces, mostly **0.13 m** — the 0.15 m assumption minus nothing on the road side — and flushed to 0 within ±2.5 m of each signalised crossing with a 1.5 m blend. Measured from the built mesh: 256 steps at 0.13 m, 15 flush, a few in transition. Crown check on the built mesh at mid-block: gutter −10.5 m → +0.99, −5 m → +1.38, centre → +1.52, +5 m → +1.58, +10.5 m → +1.52. The crown sits just north of the centreline, as the cross-sections said. @@ -106,32 +103,20 @@ Objects are appended from the source files, not regenerated, and grouped into `S A downward raycast on a 1 m grid along both sidewalks and the designated crossing, ignoring blockout meshes so marquees and canopies overhead do not count as ground: -| Route | Samples | Holes | Z range | Worst step | -| ----------------- | ------: | ----: | ------------- | ---------: | -| South sidewalk | 279 | 0 | −0.48 … +3.06 | 13.4 cm (s=198) | +| Route | Samples | Holes | Z range | Worst step | +| ----------------- | ------: | ----: | ------------- | ----------------: | +| South sidewalk | 279 | 0 | −0.48 … +3.06 | 13.4 cm (s=198) | | North sidewalk | 279 | 0 | +0.06 … +3.76 | 6.9 cm (s=33) | -| Crossing at 130 m | 26 | 0 | +1.14 … +1.80 | 9.0 cm (off −8.5) | +| Crossing at 130 m | 26 | 0 | +1.14 … +1.80 | 9.0 cm (off −8.5) | -At `--sample 0.25` the same routes measure 11.6 cm / 8.0 cm / 3.4 cm. The -pre-check now prints the grade and the **location** of the worst step, and its -coverage no longer shrinks with `--sample`. +At `--sample 0.25` the same routes measure 11.6 cm / 8.0 cm / 3.4 cm. The pre-check now prints the grade and the **location** of the worst step, and its coverage no longer shrinks with `--sample`. No holes anywhere, so nothing drops the player on either side. The two flagged steps: -- ~~15.8 cm at s≈207, the sidewalk's outer edge~~ — **fixed in `0.1.1`**: the - sidewalk upstand now tapers to zero at the building side, so the outer edge is - flush with the terrain (north route 15.1 → 6.9 cm). -- ~~10–13 cm steps at the crossings, ~10 % ramp over 1.5 m~~ — **fixed in `0.1.1`**: - the ramp run is now derived from a target grade (`--max-ramp-grade`, default 8 %), - giving 1.63 m instead of the fixed 1.5 m (8.7 %). Measured at 0.25 m sampling the - crossing now steps 3.4 cm (~1.4 % of the route) at the kerb line. +- ~~15.8 cm at s≈207, the sidewalk's outer edge~~ — **fixed in `0.1.1`**: the sidewalk upstand now tapers to zero at the building side, so the outer edge is flush with the terrain (north route 15.1 → 6.9 cm). +- ~~10–13 cm steps at the crossings, ~10 % ramp over 1.5 m~~ — **fixed in `0.1.1`**: the ramp run is now derived from a target grade (`--max-ramp-grade`, default 8 %), giving 1.63 m instead of the fixed 1.5 m (8.7 %). Measured at 0.25 m sampling the crossing now steps 3.4 cm (~1.4 % of the route) at the kerb line. -**Remaining finding (not a crossing, not the outer edge):** the south route still -measures a **13.4 cm step at s≈198 m** (11.6 cm at 0.25 m sampling) and the north -route 8.0 cm at s≈251 m. Neither is at a crossing and neither is the outer lip, so -this is a local discontinuity in the sidewalk strip — most likely the DEM sampling -or a centreline vertex near the block ends. Tracked under the `0.1.1` "audit any -collision gaps" item rather than left undocumented. +**Remaining finding (not a crossing, not the outer edge):** the south route still measures a **13.4 cm step at s≈198 m** (11.6 cm at 0.25 m sampling) and the north route 8.0 cm at s≈251 m. Neither is at a crossing and neither is the outer lip, so this is a local discontinuity in the sidewalk strip — most likely the DEM sampling or a centreline vertex near the block ends. Tracked under the `0.1.1` "audit any collision gaps" item rather than left undocumented. This is a pre-check, not the `0.1.0` release check: the release check is traversal in the engine. @@ -146,13 +131,15 @@ Blender works in metres, and the imported meshes match the OSM geometry, so the | Building | Blender dimensions | OSM way outline | Height source | | --- | --- | --- | --- | | El Capitan Entertainment Centre | 25.72 × 54.47 × 14.50 m | 25.75 × 54.88 m | `height` tag 14.5 | -| El Capitan Theatre | 38.66 × 54.46 × 20.96 m | 38.59 × 54.87 m | `building:levels=6` × 3.2 m, plus roof | +| El Capitan Theatre | 38.66 × 54.46 × 20.55 m | 38.59 × 54.87 m | `building:levels=6` × **3.1 m**, plus ~1.9 m roof | | Madame Tussaud's | 42.48 × 56.77 × 15.90 m | 42.0 m frontage | `height` tag 15.9 | | TCL Chinese Theatre | 43.78 × 75.90 × 18.10 m | 44.0 m frontage | `height` tag 18.1 | Widths agree to a few centimetres; depths differ by up to 0.4 m because Blosm assembles **multipolygon relations**, not the raw way I measured. Placement after the frame correction agrees with the UTM control points to 0.1–0.5 m per building — the residual is relation assembly and Blosm's edge straightening, not projection. -Buildings **without** a `height` tag get levels × 3.2 m, which is a placeholder, not evidence. Every such height is a modelling decision to be replaced from the reference photography. +Buildings **without** a `height` tag get levels × **3.1 m**. The storey height was 3.2 m until 2026-11-09, when a cross-check of every block building against Mapbox's building data (`Geo/tools/mapbox_buildings.py`) showed our figure running 0.6 m high per six levels — i.e. 3.1 m per level — and that calibration was adopted. The few buildings where Mapbox disagreed with a pure `levels × 3.1 m` fallback carry an explicit override in `Geo/tools/block_height_report.py::HEIGHT_OVERRIDES`. + +Blosm adds roof mass on top of `levels × levelHeight`: the two `levels`-derived frontage buildings both land ~1.9 m above their table height (6922 39.1 m against 37.2 m, El Capitan Theatre 20.5 m against 18.6 m). That offset is the roof, not a height error — the table records the tagged height, the mesh records the storey plus its roof. ## Relation completeness diff --git a/Art/blender/blockout/blockout-2026-11-06.blend b/Art/blender/blockout/blockout-2026-11-06.blend index b9c1496..6a53c85 100644 --- a/Art/blender/blockout/blockout-2026-11-06.blend +++ b/Art/blender/blockout/blockout-2026-11-06.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2de637944c86dc656593ace2af0d3275f69174cc63133b7e80bbf81a0f55cc0c -size 250220 +oid sha256:9056f0f302ad12b882f2416d2d500aab679ea65ccc56f8bb127f79d257e63aa2 +size 250060 diff --git a/Art/blender/blockout/blosm_blockout.py b/Art/blender/blockout/blosm_blockout.py index bf01ab8..e0b4d5e 100644 --- a/Art/blender/blockout/blosm_blockout.py +++ b/Art/blender/blockout/blosm_blockout.py @@ -40,7 +40,9 @@ def parse_args(): ap.add_argument("--osm", required=True, help="local .osm file to import") ap.add_argument("--bounds", required=True, help="south,west,north,east in WGS84 degrees") ap.add_argument("--out", required=True, help="output .blend path") - ap.add_argument("--level-height", type=float, default=3.2, help="metres per building level") + # 3.1 m, not 3.2: calibrated against Mapbox building data on 2026-11-09 + # (see Geo/tools/mapbox_buildings.py and Geo/tools/block_height_report.py). + ap.add_argument("--level-height", type=float, default=3.1, help="metres per building level") ap.add_argument("--origin", default=None, help="lat,lon to use as the Blender origin (project origin). Default: Blosm centres on the extract") ap.add_argument("--no-subdivide", action="store_true", help="skip OSM area subdivision") diff --git a/Game/GigLine/Content/Hollywood/DemoMap.umap b/Game/GigLine/Content/Hollywood/DemoMap.umap index 708a127..67d2a35 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:93f0d165a3e78e7e2fb5c20a74fcb9a94000312557a27552ae39d4dade281e88 -size 54516 +oid sha256:efbb73adf8e6193b5650b59604cfe127b552641f6803b4ae12d2db46eb04d804 +size 54508 diff --git a/Game/GigLine/Content/Hollywood/Frontage/SM_Budget_6822.uasset b/Game/GigLine/Content/Hollywood/Frontage/SM_Budget_6822.uasset index 9661c46..29c9048 100644 --- a/Game/GigLine/Content/Hollywood/Frontage/SM_Budget_6822.uasset +++ b/Game/GigLine/Content/Hollywood/Frontage/SM_Budget_6822.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1bb6098774accc3e36af4181af7ec06d410eb37be9364a41d4e97d9d5a83ff84 -size 78275 +oid sha256:6cc532260823c0b6dfd943744300fb5cbeff8ab87f63ceb092717641759b014a +size 78278 diff --git a/Game/GigLine/Content/Hollywood/Frontage/SM_ElCapitanTheatre.uasset b/Game/GigLine/Content/Hollywood/Frontage/SM_ElCapitanTheatre.uasset index 0c38133..c93c236 100644 --- a/Game/GigLine/Content/Hollywood/Frontage/SM_ElCapitanTheatre.uasset +++ b/Game/GigLine/Content/Hollywood/Frontage/SM_ElCapitanTheatre.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:67a085ec074462ed795dfe72de148920fe38964e1306d3ad11b6e7750b16b979 -size 79379 +oid sha256:97b279689536abc54f2dae5f78b9a82a1fe2bd138ee76557de279e9c7a48d7f3 +size 79377 diff --git a/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6806.uasset b/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6806.uasset index f22cfdf..7fcfeb4 100644 --- a/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6806.uasset +++ b/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6806.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:db77df53b738d2b6baa8b599264ccbae54eff2325c4571d1ca3cf5b825bd37cc -size 79009 +oid sha256:c4b522b03d10b7c5c98627f199c426143122f6c0e1d1d6d82938174152ca42d6 +size 79018 diff --git a/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6902.uasset b/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6902.uasset index 7191936..6799faf 100644 --- a/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6902.uasset +++ b/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6902.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3260ec732add81c7204779c970782d183d187c4bf57ae6b8c4e9d98d1ea895bc -size 78338 +oid sha256:60f3a08ac1493fe918da2e38ad7b4355763a39cf90c7e9e6016911cd3505c46c +size 78339 diff --git a/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6922.uasset b/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6922.uasset index b947d66..324bac4 100644 --- a/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6922.uasset +++ b/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6922.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:40a625b37f9d70cb1f0810664536c3aa6ea70cb75feb036e5e983b3b7ccf0d40 -size 78904 +oid sha256:a1704908dd0d66a25672fdf6b1c8f3b8b731e361e38b33077b67dce3e6dd747e +size 78896 diff --git a/Game/GigLine/Content/Hollywood/Frontage/SM_LeeDrug_6800.uasset b/Game/GigLine/Content/Hollywood/Frontage/SM_LeeDrug_6800.uasset index b2a6acc..f683ef8 100644 --- a/Game/GigLine/Content/Hollywood/Frontage/SM_LeeDrug_6800.uasset +++ b/Game/GigLine/Content/Hollywood/Frontage/SM_LeeDrug_6800.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3fa537e3f28b642345d376b4049e43e9aaa6b1bff88adc7ce9557e51295b9338 -size 78097 +oid sha256:4c3c8df33dd9aee5d6175c9f3ad50e4b453461750bdb3ea5543f61e4a63fa19c +size 78091 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset b/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset index c794ac2..9c2c426 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:d9c10664cd917028d145af9e1da3647a3c0b0b06344c57c73bbcec89c51429ee +oid sha256:188cf5bd1547c1bec869a194b79ba60548ac28e8414289bf9ea32b827f8eaecc size 7876 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset b/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset index 4805588..77fa9fc 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:be1818dd7fa16a16694c96ae58043381b0f5ef591c2f8e7056fa0523b05a86c4 +oid sha256:d2313642be9c8dfcdd0439527b0b6f031887d61598f34511be1bd75182a9e855 size 7881 diff --git a/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset b/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset index 48907e8..7ba9917 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:e4686c8ac1854d278b5552de934427522834381d9ca93b23746c42716140b7bc +oid sha256:e9385d8c1460375dd52aee6106a8802457c9c8e6bab63277229c0b094d2528a0 size 7896 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset b/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset index b7e5377..5a7a5f0 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:c8c257b7c97763c16112d3cf3a4ea0b5bd6e2d52ca28c28f9aec0bd543900243 +oid sha256:22ef2675f4979297f9cf77f75ab1d94ddf064fa51d89af2006686b154802b8be size 7871 diff --git a/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset b/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset index 798f450..9bea9fe 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:f82b75f57da5e2453ea0c6121ec437f884a04a032bb6d830dbc515884c79d043 +oid sha256:ff080d67c3e222453f879666e18a8ae74f1332f4f5f34159c58d61c06f09c1d5 size 7901 diff --git a/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset b/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset index 93f7ffc..7e06e1f 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:b5d72661ee468a131791e7f0d963f53cbfb6e139a42365876200830e757a18b9 +oid sha256:9ea19c5e9e2399de65497b46afc2b0d0453e85e230e719f4c3b134a3254e01b7 size 7886 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset b/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset index f87684a..b586dd8 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:3d0e9c42fab8148e2166e458900f80213786d4a54e6a4a28e648cfdf78442e27 +oid sha256:01438cb78cf286d3a097fbcdb5406c8a37c872d9eafe5211d9755fb420371fad size 7871 diff --git a/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset b/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset index 61b4e1a..5e04895 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:0da94b77abe826e9a68b477a1f5faef5ac42c2681a13eacbb1376bdbccafb06e +oid sha256:d12a66df59e4d32dc19240ff025aa156569c6c6c7290f4a076211c1728044ad6 size 335528 diff --git a/Game/GigLine/Content/Test/ReviewMap.umap b/Game/GigLine/Content/Test/ReviewMap.umap index ff0d60f..5394613 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:4be3f848ed504bdcb68420263f852de263a93ad0bff0fb557c25e8a063d8a63b +oid sha256:f6ccf0277d30f80a5bc2b155d98fb7f97503e54bbd70993cc4b373bfecf35533 size 28706 diff --git a/Geo/tools/block_height_report.py b/Geo/tools/block_height_report.py index 5637820..496da68 100755 --- a/Geo/tools/block_height_report.py +++ b/Geo/tools/block_height_report.py @@ -4,9 +4,21 @@ Usage: Geo/tools/block_height_report.py Geo/raw/osm-api-map-2026-11-06.osm -`height` and `building:levels` are the only height evidence OSM carries. Where -neither exists, Blosm falls back to `defaultLevels * levelHeight`, which is a -placeholder: the demo renders a constant-height block instead of a real skyline. +Height evidence, in priority order: + +1. the OSM `height` tag (a direct measurement); +2. an explicit override in `HEIGHT_OVERRIDES` (currently Mapbox-derived — see below); +3. `building:levels` x `LEVEL_HEIGHT`; +4. a flagged placeholder guess. + +`LEVEL_HEIGHT` is 3.1 m, not the 3.2 m first assumed: cross-checking every block +building against Mapbox's building data (`Geo/tools/mapbox_buildings.py`) showed +our `levels x 3.2 m` figure running 0.6 m high per six levels, i.e. 3.1 m per +level. That calibration was adopted on 2026-11-09. + +`HEIGHT_OVERRIDES` carries the few buildings where Mapbox disagrees with a guess; +each entry records why, so the number is not orphaned from its evidence. + This tool lists every building in the demo bounds with its height source, so the substitutions are visible and measurable rather than buried in the model. @@ -19,10 +31,22 @@ import sys import osm_common as oc -LEVEL_HEIGHT = 3.2 +LEVEL_HEIGHT = 3.1 + +# Per-way height overrides, applied after the OSM height tag and before the +# levels/guess derivation. Keep `reason` short but specific: a height without its +# evidence is a guess wearing a costume. +HEIGHT_OVERRIDES = { + # Rear outbuildings tagged only `building=yes`/`apartments`; the two-level + # fallback rendered them as 6.4 m blocks. Mapbox's building layer gives 3.0 m + # for the same footprints (single storey plus parapet), adopted 2026-11-09. + 1490910971: (3.0, "Mapbox building layer: 3.0 m (single storey)"), + 1492058875: (3.0, "Mapbox building layer: 3.0 m (single storey)"), + 1492747608: (3.0, "Mapbox building layer: 3.0 m (single storey)"), +} -def classify_height(tags, level_height=LEVEL_HEIGHT): +def classify_height(tags, level_height=LEVEL_HEIGHT, way_id=None): """Return (height_m, source) for one OSM way's tags. Extracted from `main()` so the classification is testable: the roof/shelter @@ -39,6 +63,9 @@ def classify_height(tags, level_height=LEVEL_HEIGHT): return 0.0, f"not a building volume ({kind})" if tags.get("height"): return float(tags["height"]), "height tag" + if way_id is not None and int(way_id) in HEIGHT_OVERRIDES: + height, reason = HEIGHT_OVERRIDES[int(way_id)] + return height, f"override: {reason}" if tags.get("building:levels"): return (float(tags["building:levels"]) * level_height, f"levels x {level_height} m") @@ -66,7 +93,7 @@ def main(): pts = oc.way_points(nodes, refs) if not pts or not in_block(pts): continue - height, source = classify_height(tags) + height, source = classify_height(tags, way_id=wid) nearest = min(oc.project(p, line, lat0, lon0, lengths)[0] for p in pts) side = "S" if oc.project(pts[0], line, lat0, lon0, lengths)[2] < 0 else "N" rows.append((side, nearest, wid, tags.get("name", "") or tags.get("addr:housenumber", ""), diff --git a/Geo/tools/mapbox_buildings.py b/Geo/tools/mapbox_buildings.py index 05e9dc9..10ac86c 100644 --- a/Geo/tools/mapbox_buildings.py +++ b/Geo/tools/mapbox_buildings.py @@ -184,7 +184,7 @@ def build_rows(nodes, ways, token, radius, max_distance, delay) -> list[dict]: lat, lon = centroid_lat_lon(points) payload, cached = tilequery(lat, lon, token, radius, delay) feature = nearest_building(payload, max_distance) - ours_height, ours_source = bhr.classify_height(tags) + ours_height, ours_source = bhr.classify_height(tags, way_id=wid) theirs = None if feature is None else feature.get("height") verdict, delta = compare(ours_height, ours_source, theirs) rows.append({ diff --git a/MEMORY.md b/MEMORY.md index 0ad03cc..a890e0f 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -379,3 +379,24 @@ Scope: facts and traps that cost time to establish. Planned work lives in [TODO. **0.6 m lower per 6 levels** → Mapbox implies **3.1 m per level**, not 3.2. Worth revisiting `LEVEL_HEIGHT` if a measured storey height ever lands. - Its query API surface: `height`, `min_height`, `type`, `extrude` per polygon. + +## 2026-11-09 — Mapbox calibration adopted into the blockout + +- Owner decision: adopt Mapbox. Applied: + - `LEVEL_HEIGHT` 3.2 → **3.1 m** in `Geo/tools/block_height_report.py`, and the + Blosm `--level-height` default in `Art/blender/blockout/blosm_blockout.py`. + - `HEIGHT_OVERRIDES` in block_height_report: ways 1490910971, 1492058875, + 1492747608 → 3.0 m (Mapbox single-storey; the 2-level guess gave 6.4 m). + - `classify_height(tags, level_height, way_id)` now takes the way id so + overrides apply; `mapbox_buildings.py` passes it, so the cross-check agrees + with the height table. +- Re-running the cross-check: **66 match, 6 non-building, 0 close/disagree**. +- Geometry: blockout regenerated at 3.1 (object names preserved — the frontage + exporter maps `element.020`/`element`/`element.019`/named buildings, all still + present, 6/6 exported), frontage re-imported, DemoMap rebuilt, packaged build + `-qaselftest` all PASS. +- **Blosm adds roof mass** on top of `levels × levelHeight`: 6922 39.1 m vs table + 37.2, El Capitan Theatre 20.5 m vs 18.6 — both ~+1.9 m. That is a roof, not a + height error; the table is the tagged height, the mesh is storey + roof. +- Gotcha: regenerating the blockout is safe for names, but any future change to + the import must re-verify the 6/6 frontage export and the `element.*` mapping. diff --git a/Screenshots/demo/review-demo-crossing.png b/Screenshots/demo/review-demo-crossing.png index d697ea0..d4a95d2 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:422771e50e7141d66c770ce1595d25fa74a2225beafc0a184c56e90e1e57fcc5 -size 2781122 +oid sha256:e586658dc59ad2963202d562c428e3efad2149234548592cb2292905661bd6d4 +size 2628047 diff --git a/Screenshots/demo/review-demo-north-buildings.png b/Screenshots/demo/review-demo-north-buildings.png index 11b84fa..bc512e0 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:1468f8e10fddc8cb370b7e60cf129f08561e9d47cf67d82d02d476532c4aa995 -size 2475380 +oid sha256:287713c5991e579dae1c7a01dc8df48f7e0e77fd6ee2046cedb8f46846bbf04f +size 2476385 diff --git a/Screenshots/demo/review-demo-spawn-view.png b/Screenshots/demo/review-demo-spawn-view.png index 2cc42f1..59d4675 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:d431042fd44751f2ed823c39377498bbb3367fdd77e83383b530188810d557a2 -size 2558780 +oid sha256:e3dea97c4a2b1e5055585f5d185ad3726a45009c98bb17c04a11734222015570 +size 2583278 diff --git a/Screenshots/demo/review-demo-street-level.png b/Screenshots/demo/review-demo-street-level.png index 3220cfc..fc6b0da 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:f0115bc4b8ba80dc1c9f2ad8b6a4d6a53eff1a12f570ab6103621cf7faeaa0e6 -size 2446779 +oid sha256:30d2432eb2dbe611761ecf756c819fc03d56a9b672dd2ef937cc395b0446688f +size 2406661 diff --git a/Screenshots/review-character.png b/Screenshots/review-character.png index 02d1bd5..dfd0e1c 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:1e8b0baf2bb0551c82fb682c85c069dfcb3b74c01078ece3400f4716e5664ccd -size 2756262 +oid sha256:3f1867e1cb01bc98f1c26f96d83e1419d93d5a105c3db39210ec3c2fec54ab50 +size 2768518 diff --git a/Screenshots/review-ground-contact.png b/Screenshots/review-ground-contact.png index 1f9d880..0494c2e 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:1f1721248bbb228591599481432e7bcbb799c485bdc8d3a7861e41323908af17 -size 1803653 +oid sha256:00db5dbbef727517526f5ea9472ad69177149bdecf32ebdda972383f9ecd58ad +size 1814918 diff --git a/Screenshots/review-hero-facade-front.png b/Screenshots/review-hero-facade-front.png index d5f1278..0903ee5 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:d68636a3ed721b0e9c93d34cccf99de6cdb9880eaa551794caabe9712197f41c -size 1745589 +oid sha256:eeaf6155bf6959fb5a7ea6fbc76dddb3ec443ab4eab17461e2213ae24c07de03 +size 1746386 diff --git a/Screenshots/review-hero-facade-oblique.png b/Screenshots/review-hero-facade-oblique.png index fea731f..89f8442 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:a84db5bf77036f63d4169bfe9fca4fc21291fca7ab6a79077fb8da0333b43509 -size 1402487 +oid sha256:09bbc9925b08d51140c89c1e1620f8ac080126b729d115fb71b8a06b022a8f9a +size 1400702 diff --git a/Screenshots/review-hero-portals.png b/Screenshots/review-hero-portals.png index ba4f986..01f1663 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:d20825c305689de62ff8295652834f99029710d3c0b274bc0959a7835330e713 -size 1370767 +oid sha256:560d4dd17efeefdfb90f449b3dd056d7ed3c5b3fac3e26967a3d46951463010c +size 1351455 diff --git a/Screenshots/review-npc-prefab.png b/Screenshots/review-npc-prefab.png index adecf2e..7f08a63 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:9e9129de770ff22d30d344e6c5f54b74e1c4f6d988bb966414013633d38a9180 -size 1796259 +oid sha256:fd9aff8a7ff463c494308688a8d1fb64082daef1ef4a3bed93ae3c36a3d2ee5f +size 1806919 diff --git a/Screenshots/review-overview.png b/Screenshots/review-overview.png index effde60..4c41457 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:aab4c3197b202db47d939157e97abe89d328913ed3a302d57460014eeeb9429c -size 2408412 +oid sha256:e0880b1ef6ad08af0fdecde0c067638be260019e0b3eaf772c08109c39ef1c1a +size 2424039 diff --git a/Screenshots/review-player-placement.png b/Screenshots/review-player-placement.png index 204c6bf..bc6b185 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:49269cdb99e7603fe578df3203f7552e3a04efc9abcfc57081a4745ad0512903 -size 2209377 +oid sha256:1ba28ea815489d8665e3239a5e8391130e90e9aa31325d4b5963b1045118d04e +size 2209436 diff --git a/Screenshots/review-scale-cubes.png b/Screenshots/review-scale-cubes.png index 0922d89..18777d0 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:6fe2c1001dcc56d29d4ed0aa0664373ebc52f8d1fae21579d965b5d93dc2aa2e -size 2143163 +oid sha256:1d87ae49b9ae5f2cda4a65984511e0c056cf8d740184a485699a74e0515573e3 +size 2130029 diff --git a/Screenshots/review-shadow-compare.png b/Screenshots/review-shadow-compare.png index 54e1bf0..44fddf3 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:da4f07c32eb287998716bb19c3a5cfb2b36b61913efa12418944a8a56bc102bb -size 1854856 +oid sha256:c00fbf082517d7f84a99108770d75ea2360ab8d849e6f921d5b9d05d7bc37ce4 +size 1853001 diff --git a/TODO.md b/TODO.md index acabb7e..64a68eb 100644 --- a/TODO.md +++ b/TODO.md @@ -15,7 +15,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`) -- [ ] Correct building scale and street proportions flagged against references. **Cross-check available:** `Geo/tools/mapbox_buildings.py` merges our OSM heights with Mapbox's building data for the same footprints (72 buildings: 58 match, 5 close, 3 disagree, 6 non-building). Three rear `building=yes`/`apartments` structures still render at our 2-level guess (6.4 m) against Mapbox's 3.0 m; and every `levels × 3.2 m` building is 0.6 m taller per 6 levels than Mapbox implies, i.e. **Mapbox suggests 3.1 m per level**. Neither is applied yet — decide from the reference photography. +- [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. - [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. - [ ] 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. **Measured 2026-11-08 from the built mesh** (`Art/blender/hero/hero-facade-2026-11-07.blend`): envelope 0–14.50 m; stylobate 0–2.00; columns 2.00–7.95; capitals 7.95–8.90; entablature 8.90–12.30; parapet 12.30–14.50. So the colonnade (columns + capitals) is **6.90 m = 47.6 %** of the height — inside the range only at the low end. Bringing it to ~55 % needs ~+1.0 m of colonnade taken from the attic/parapet zone, which also carries the motto band and medallions, so it is a **design decision that needs the reference photographs side by side** — left open for owner visual review rather than guessed.