feat(tools): rephrase the concept studies as frontal building views

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).
This commit is contained in:
zwitschi committed 2026-11-08 17:35:20 +01:00
1 parent bbb373ec06
commit fe8a23e5ee
3 files changed
+71 -62

No files matched your search

+1 -1
View File
@@ -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.
+1 -1
View File
@@ -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 <name>` 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 <name>` 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
+69 -60
View File
@@ -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.",
),
}