diff --git a/TODO.md b/TODO.md index c4e5599..9966973 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). Eight studies generated locally under `Art/reference/facade-details/`: door recess, entrance, column order, entablature/cornice, parapet/motto, window rhythm, street wall, banner. **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. Remaining: use the plates to correct the capital/base profiles and the medallion/cornice detail. - [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/README.md b/Tools/README.md index fc8e18f..414542f 100644 --- a/Tools/README.md +++ b/Tools/README.md @@ -64,7 +64,7 @@ Geographic tools live in [`Geo/tools/`](../Geo/README.md) and the Blender-side b | Tool | Purpose | | --- | --- | -| `facade_detail_concepts.py` | Generates architectural detail plates from a local reference photograph with an image model (OpenRouter). `--list` is free and shows which studies have their reference present; `--all`/`--only ` generates. Never overwrites (writes `-v2`, `-v3`), writes a `.refgen.json` sidecar per image (model, prompt, source photo, SHA-256), and puts everything under `Art/reference/facade-details/` — gitignored, local-only, never shipped. Costs money per image, so it is never automatic. | +| `facade_detail_concepts.py` | Generates **frontal building plates** (whole elevation, entrance in its facade, or building with neighbours) from a local reference photograph with an image model (OpenRouter); close-up detail crops are deliberately not requested because they cannot be measured for proportion. `--list` is free and shows which studies have their reference present; `--all`/`--only ` generates. Never overwrites (writes `-v2`, `-v3`), writes a `.refgen.json` sidecar per image (model, prompt, source photo, SHA-256), and puts everything under `Art/reference/facade-details/` — gitignored, local-only, never shipped. Costs money per image, so it is never automatic. | | `judge_screenshot.py` | (see Visual review) | ## Input injection diff --git a/Tools/facade_detail_concepts.py b/Tools/facade_detail_concepts.py index a6e1c60..90a523f 100644 --- a/Tools/facade_detail_concepts.py +++ b/Tools/facade_detail_concepts.py @@ -1,10 +1,14 @@ #!/usr/bin/env python3 -"""Generate architectural detail studies from the local reference photography. +"""Generate frontal building plates from the local reference photography. Each study takes one photograph we already hold (`Art/reference/`, gitignored) as -the geometric anchor and asks an image model to re-stage it as a clean -architectural detail plate — no crowd, no staging, straight-on, evenly lit — so -the modelling pass has something to measure against instead of a tourist photo. +the geometric anchor and asks an image model to re-stage it as a clean **frontal +view of the building** — the whole elevation, the entrance in its facade, or the +building with its neighbours — evenly lit, no crowd, no staging, so the modelling +pass has something measurable instead of a tourist photo. + +Deliberately **not** close-up detail crops: a doorway or cornice crop cannot be +measured for proportion, which is what the modelling pass actually needs. python3 Tools/facade_detail_concepts.py --list python3 Tools/facade_detail_concepts.py --only door-recess,parapet-motto @@ -51,70 +55,75 @@ DEFAULT_MODEL = "google/gemini-2.5-flash-image" # project's convention so the two sets stay comparable: the photograph fixes the # geometry, the prompt only restages light, weather, people and surface. ANCHOR_SUFFIX = ( - "Use the attached reference photograph as the fixed source of geometry and " - "composition: keep the building's proportions, column rhythm, band heights, " - "signage placement and camera angle exactly as photographed. Only restage " - "lighting, weather, people and surface condition where the request asks for " - "it. Do not invent extra storeys, wings or ornaments that the photo does not " - "show." + "Use the attached reference photograph as the source of the architecture: keep " + "the building's proportions, storey count, column rhythm, band heights and " + "signage placement exactly as photographed. You may REFRAME — step back across " + "the street, zoom out or widen the field of view — so that the whole building " + "fits in the frame from the pavement to the parapet; the reference is often " + "cropped and the plate must not be. Keep the view exterior and frontal (or " + "three-quarter where asked). Restage only lighting, weather, people and surface " + "condition. Do not invent extra storeys, wings or ornaments, and do not change " + "the architecture to fit the frame." ) -# name -> (reference photo relative to Art/reference/, what the study must show) +# name -> (reference photo relative to Art/reference/, what the plate must show) +# +# Verified framing (vision pre-check, 2026-11-09): the model follows the reference +# crop closely, so a plate is only as wide as its source photo. `building-entrance` +# and `building-street-front` come back as full-elevation frontal views; the studies +# anchored on the tightly cropped 2009 facade photo stay cropped, because the model +# will not invent the parapet and sky that the photograph does not contain. A full +# building plate for 6840 needs a full-elevation photograph, which the local set +# does not have (see Docs/reference-notes-hollywood.md). +# +# Every study asks for a *frontal view of a building*, not a crop of one detail: +# the whole elevation, the entrance in its facade, or the building together with +# its neighbours. Close-up framing is deliberately absent — a detail crop cannot +# be measured for proportion, which is what the modelling pass needs. STUDIES: dict[str, tuple[str, str]] = { - "door-recess": ( - "el-capitan-entrance/01-hollywood-el-capitan-entrance-detail.jpg", - "A clean architectural detail plate of exactly the subject in the " - "reference photograph. Render it as an even-daylight stone study: crisp " - "surface carving, readable depth of every recess and moulding, no people, " - "no signage or banners in front of it, no shop clutter, straight-on to the " - "subject.", + "building-front": ( + "hollywood/el-capitan-facade-day-wikimedia-2009-10-27.jpg", + "A frontal view of the complete building shown in the reference " + "photograph: the whole elevation from the pavement to the parapet fits in " + "the frame with clear sky above the roofline and pavement below the ground " + "floor, shot straight on and centred. Nothing may be cut off at the top or " + "bottom. Even daylight, no crowd, no vehicles.", ), - "entrance-wide": ( + "building-entrance": ( "el-capitan-entrance/01-hollywood-el-capitan-entrance.jpg", - "A straight-on architectural study of the street entrance in the " - "reference photograph, the portal group centred and filling the frame, " - "threshold and pavement readable, no pedestrians or vehicles, even " - "overcast daylight, stone surface legible.", + "A frontal view of the building in the reference photograph, framed so its " + "street entrance is clearly visible as part of the facade — the doors and " + "the wall around them in proportion, not a close-up of the doorway. " + "Include the pavement in front. Even daylight, no crowd.", ), - "column-order": ( - "hollywood/el-capitan-facade-day-wikimedia-2009-10-27.jpg", - "A close architectural study of the column order visible in the " - "reference photograph: the base, shaft and capital read clearly, " - "neighbouring columns framing it. Straight-on, evenly lit, stone surface " - "and carving legible, no people or banners.", - ), - "entablature-cornice": ( - "hollywood/el-capitan-facade-day-wikimedia-2009-10-27.jpg", - "An architectural detail study of the horizontal stone bands above the " - "columns in the reference photograph: every band edge and the projecting " - "cornice with its shadow line. The layered depth of the stone must be " - "readable, flat even light, no people.", - ), - "parapet-motto": ( - "hollywood/el-capitan-facade-day-wikimedia-2009-10-27.jpg", - "An architectural study of the parapet above the colonnade in the " - "reference photograph: the inset panel, any round medallions beside it " - "and the coping at the top. Lettering on the panel is blocked out as " - "unreadable texture. Flat even light, no people.", - ), - "window-rhythm": ( - "hollywood/el-capitan-facade-day-wikimedia-2009-10-27.jpg", - "An architectural study of the wall surface behind and between the " - "columns in the reference photograph: the opening or window rhythm and " - "the reveal depth. Straight-on, no people, no banners covering the wall.", - ), - "street-wall": ( + "building-with-neighbours": ( "hollywood/el-capitan-theatre-blade-sign-day-wikimedia-2008-10.jpg", - "A clean street-wall study from the opposite pavement, as framed in the " - "reference photograph: the building line, the parapet heights of the " - "neighbouring buildings, the shopfront line and the pavement depth. No " - "crowd, even daylight.", + "A straight-on view of the street wall in the reference photograph: the " + "building and its neighbouring buildings either side, each at full height " + "from pavement to parapet with sky above, the joins between them visible, " + "nothing cut off. Shot from across the road, parallel to the frontage. " + "Even daylight, no crowd.", ), - "banner-detail": ( - "el-capitan-premiere/02-premiere-of-spielberg-s-west-side-story---el-capitan---holly.jpg", - "An architectural study of the vertical banner in the reference " - "photograph: how it is fixed, its proportions against the column behind " - "it, and how it sits against the stone. Daylight, no crowd.", + "building-street-front": ( + "hollywood/walk-of-fame-terrazzo-ovation-day-cc0-2019-06-20.jpg", + "A frontal view along the pavement of the building in the reference " + "photograph: the building's frontage seen from street level with its " + "neighbours continuing either side and the pavement in the foreground. " + "Straight on, even daylight, no crowd.", + ), + "building-front-oblique": ( + "hollywood/el-capitan-facade-day-wikimedia-2009-10-27.jpg", + "A three-quarter view of the complete building in the reference " + "photograph: the frontal elevation and one side visible together so the " + "building's depth and mass read, with its neighbouring building at one " + "edge. The whole building stays in frame. Even daylight, no crowd.", + ), + "theatre-front-with-neighbours": ( + "el-capitan-theater-detail/01-el-capitan-marquee.jpg", + "A frontal view of the theatre in the reference photograph together with " + "the buildings either side of it, the whole frontage and its full height " + "in frame, shot from across the road. Even daylight, no crowd, marquee " + "lettering blocked out as unreadable texture.", ), }