Generate multi-model anchored concepts, drop old Comedy Store refs, and trim the concept gallery
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped

This commit is contained in:
zwitschi committed 2026-11-03 17:49:48 +01:00
1 parent 87e1c9e7a5
commit 988d431da8
40 files changed
+110 -329

No files matched your search

-3
View File
@@ -58,9 +58,6 @@ their folder sidecar:
- `docs/screens/refs/hollywood/premiere-staging-street-day-wikimedia-2006-02-12.jpg` — John - `docs/screens/refs/hollywood/premiere-staging-street-day-wikimedia-2006-02-12.jpg` — John
Barreiros, CC BY 2.0, via Wikimedia Commons. Barreiros, CC BY 2.0, via Wikimedia Commons.
- Public-domain files in the same folder: Charles W. Beam (1922) and Gary Minnaert (2006). - Public-domain files in the same folder: Charles W. Beam (1922) and Gary Minnaert (2006).
- `docs/screens/refs/joke-shop/comedy-store-signature-band-day-wikimedia-2020-04-09.jpg` — Tony
Mariotti, CC BY 2.0, via Wikimedia Commons (<https://www.rubyhome.com/> as requested).
- Public-domain files in the Joke Shop folder: Gary Minnaert (2006).
- `docs/screens/refs/hollywood/el-capitan-theatre-marquee-neighbour-day-wikimedia-2009-07-11.jpg` — - `docs/screens/refs/hollywood/el-capitan-theatre-marquee-neighbour-day-wikimedia-2009-07-11.jpg` —
Alan Light, CC BY 2.0, via Wikimedia Commons. Alan Light, CC BY 2.0, via Wikimedia Commons.
- `docs/screens/refs/hollywood/hollywood-boulevard-night-context-ccbysa.jpg` — Downtowngal, - `docs/screens/refs/hollywood/hollywood-boulevard-night-context-ccbysa.jpg` — Downtowngal,
+1 -72
View File
@@ -84,78 +84,7 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
street context CC BY-SA 3.0). The CC BY-SA frame is redistributed unmodified for study only with street context CC BY-SA 3.0). The CC BY-SA frame is redistributed unmodified for study only with
no derived asset, and that review is written into the sidecar; a licensed night photo of the hero no derived asset, and that review is written into the sidecar; a licensed night photo of the hero
facade is still the top missing reference. facade is still the top missing reference.
- **Joke Shop reference board (2026-11-03):** three photos in `docs/screens/refs/joke-shop/` (PD x2 - **Joke Shop reference board removed (2026-11-03):** the committed Comedy Store photo board was removed in favour of the local-only `tmp/research/comedy-store/` research set (owner override: development reference, no licence gate, never committed). The three-up board's photo panel remains a historical public-domain frame; the block's current reference lives in the gitignored research folder.
by Gary Minnaert 2006, CC BY 2.0 by Tony Mariotti 2020) covering the hillside/canopy block, the
frontage with palms and the signature-band/curtain detail. `The Comedy Store.jpg` (CC BY-SA 3.0)
from the old link list was deliberately skipped: the PD frames cover the same evidence and no
share-alike review was needed. The CC BY file requests a dofollow link, recorded in its sidecar
and CREDITS.
- **Imagery evidence model (2026-11-03):** `TODO.md` now separates three image sources that must
not be mixed: licensed real-location photos (evidence of what a place looks like), generated
concept boards (art-direction proposals with model/prompt/spend provenance), and build captures
(proof the build matches). Per-venue boards go under `docs/screens/refs/<venue|block>/` with a
`SIDECAR.md` per folder (photo table: file, subject, view, URL, author, licence, date, purpose,
shipped; plus redactions, derived-decision log and a table referencing the generated boards used
in the three-up). Generated frames stay in `docs/screens/concepts/`, never in `refs/`, and stay
out of `assets/` until picked, cropped, credited and audited. Every workstream now
ends with a capture step that updates `README.md` plus the matching docs page, verified with
`tools/check_screenshots.sh` and `python3 tools/check_docs.py`.
- **Collider coverage gate (2026-11-03):** `WorldBuilder` sets `library_prop` metadata on every
node in `library_nodes`, and `NON_BLOCKING_LIBRARY` (`marquee`, `wall_lantern`, `handrail`,
`double_door`) documents the mounted/decorative pieces that intentionally publish no
walk-blocking body. `test_world.gd` verifies placed props have `Collision` + `Shape` +
`Avoidance` in all three venues, and that library dressing has a body unless exempt. Both
were mutation-checked (removing `_add_prop_collision` fails 3 tests; dropping `handrail` from
the exemption list fails with the node name). Suite is 275/275. Add the metadata when adding a
new library placement, or the coverage test will report it.
- **3D review gates (2026-11-03):** `tools/test_blender_assets.py` now gates texel density
(all five character slots present, 40–400 px/m authored, ≥250 px/m effective fabric), and
`tools/test_model_review.py` gates scorecard coverage (every `CHARACTERS`/`GEAR`/`PROPS` entry
needs a row in `docs/3d-model-review.md`, characters need a verdict). Python tooling is 116
tests. Collider-proxy coverage is still an open gate. Remember CI only runs the Godot suite;
the Python tests are local (`cd tools && python3 -m unittest discover -p 'test_*.py'`).
- **Pose capture is blocked (2026-11-03):** `src/test/capture_npc_pose.gd` stages idle/walk/sit
poses for the pose/weight review, but the saved frames show the rest pose while the same run
logs `rig_y=-0.339`, `leg0=-1.357` and a rotated `HipL` bone quaternion at capture time.
Verified meanwhile: one skinned mesh bound to one `Skeleton3D`; hiding it removes the body;
direct `set_bone_pose_rotation` on HipL/KneeL/Spine/ShoulderL/ElbowL/Head changes rendered
pixels; a bone *position* offset moves the head; a standalone probe running the same
`_animate()` sequence renders the crouch. A staged in-game `film` frame also showed the arms
Standalone SceneTree probes (avatar under `root`, under a `Node3D` stage, created
mid-`_process`) all render the seated crouch, and a `SubViewport` + `RenderingServer.force_draw()`
probe does too (window probes diff ~2,200-2,360; offscreen 602 at +2/+6/+12 frames, including a
re-created avatar). So the rig, the animation math and the offscreen path are sound; only
`capture_npc_pose.gd` still saves rest frames, which makes its phase/camera/force-draw ordering
the defect. A headless test locks the proxy→bone contract
(`test_pose_reaches_the_skeleton_bones`, suite 273). Rebuild the harness from the verified
recipe in `docs/3d-model-review.md` instead of iterating on the current phase machine.
- **3D review baseline (2026-11-03):** `docs/3d-model-review.md` records the first skill-guided
measurements: 46/46 assets clean, library 59,012 tris, characters 4,482–5,474 tris (68–69% of
the 8,000 caps), `npc_base` only 1,204/2,488, 24-NPC 6.94 ms, and authored texel density
64–122 px/m (fabric effective 287–440 after the 4× repeat). That is below the skill's 128–256
background tier but the slot maps are neutral and tinted at runtime, so it is a recorded decision
point, not a defect. Added `blender_assets.py texels` (stdlib, per-slot px/m from GLB UV/world
area, fabric reported twice) and `inspect --json --out` (the glTF importer's INFO log is captured
in `stats.import_log`; Blender's startup banner still pollutes stdout). Baseline/review captures
run fine under `xvfb-run` into `tmp/`.
- **3D model re-evaluation first (2026-11-03):** `TODO.md` is re-planned around a new unversioned
`3D model re-evaluation` track, ahead of character and local-map work, because the crowd-variant
roster would otherwise multiply whatever the existing models get wrong. It scores all 8
characters, 18 gear, 20+6 props and the three venues in `docs/3d-model-review.md`, fixes ranked
P0/P1 only, and must not change the `npc_base` contract, renderer or 0.10.0 candidate. The MIT
Blender skill pack is now routed through `AGENTS.md` §Local Blender skills; skill advice loses
to the project contract, and there is no Blender MCP here (headless flatpak scripts instead).
MEMORY was trimmed to ~800 lines on 2026-11-03 (historical handoffs and release anecdotes
dropped; gotchas kept); further trimming is tracked in `TODO.md`.
- **GLB intake inspection (`blender_assets.py inspect`, 2026-11-03):** runs inside Blender, clears
parents and applies object transforms, then reports tris/budget, raw and seam-split verts,
Godot-space bounds (height/feet for characters), bones, materials, UVs, skinning and
animations as `issues` (contract failures, exit 1) or `warnings`. `--json`/`--category` exist
for intake scripts. Gotchas: the glTF importer creates an `Icosphere` mesh used as
`pose_bone.custom_shape`, which must be excluded or it dominates bounds; a parented import
needs `parent_clear(CLEAR_KEEP_TRANSFORM)` before `transform_apply`; Blender is Z-up so bounds
and bone rests are converted to `(x, z, -y)`. On project assets its counts match `audit`
exactly, but `audit` stays the stdlib/CI release gate and `inspect` never adapts a file.
- **Blender Skills Pack installed locally (2026-11-03):** the MIT `blender-skills` pack - **Blender Skills Pack installed locally (2026-11-03):** the MIT `blender-skills` pack
(v1.3.0, 94 skills + a shared `references/` folder) is installed at (v1.3.0, 94 skills + a shared `references/` folder) is installed at
+2
View File
@@ -199,6 +199,8 @@ and never ship a generated or downloaded image without provenance.
canopy signature band) with a sidecar, linked from `docs/joke-shop-map.md` and credited in canopy signature band) with a sidecar, linked from `docs/joke-shop-map.md` and credited in
`CREDITS.md`. The CC BY-SA `The Comedy Store.jpg` from the old link list was deliberately not `CREDITS.md`. The CC BY-SA `The Comedy Store.jpg` from the old link list was deliberately not
used; the public-domain frames cover the same evidence. (`docs/screens/refs/joke-shop/`.) used; the public-domain frames cover the same evidence. (`docs/screens/refs/joke-shop/`.)
**Removed 2026-11-03:** the committed Comedy Store photo board was replaced by the local-only
`tmp/research/comedy-store/` research set (owner override; see §3D model re-evaluation → A).
- [ ] Find more pictures from the Comedy Store, the Sunset Boulevard block, collect at least five additional shots for reference; do not care about licensing, these images are only stored locally for reference and inference during development. Find pictures from the neighboring hotel building and the street surroundings. - [ ] Find more pictures from the Comedy Store, the Sunset Boulevard block, collect at least five additional shots for reference; do not care about licensing, these images are only stored locally for reference and inference during development. Find pictures from the neighboring hotel building and the street surroundings.
- [ ] Fill the Joke Shop gaps: better visual representation of actual facade, parking lot to the side, neighboring hotel parking ramp and building, night canopy/sign, entrance recess, south-side neighbours, buildings across the street, hillside behind the building, hill detail. - [ ] Fill the Joke Shop gaps: better visual representation of actual facade, parking lot to the side, neighboring hotel parking ramp and building, night canopy/sign, entrance recess, south-side neighbours, buildings across the street, hillside behind the building, hill detail.
house detail, neighbouring buildings, and any relevant street-level context. house detail, neighbouring buildings, and any relevant street-level context.
+5 -10
View File
@@ -79,18 +79,13 @@ just as with the Hollywood day/night rows.
## References ## References
The committed, license-cleared photo board for this block — with the provenance sidecar and the The old committed Comedy Store photo board was removed on 2026-11-03 in favour of a local-only
decisions each photo informed — is in research set under `tmp/research/comedy-store/` (owner override: development reference, never
[`screens/refs/joke-shop/README.md`](screens/refs/joke-shop/README.md), and the three-up board committed, no licence gate). The three-up board (real photo | generated concept | current capture)
(real photo | generated concept | current capture) is in is in [`screens/boards/README.md`](screens/boards/README.md); its photo panel is a historical
[`screens/boards/README.md`](screens/boards/README.md). public-domain frame, and the current block reference now lives in the gitignored research folder.
- OpenStreetMap way 428854155: <https://www.openstreetmap.org/way/428854155> - OpenStreetMap way 428854155: <https://www.openstreetmap.org/way/428854155>
- Wikimedia Commons photographs used for proportion and material study:
- <https://commons.wikimedia.org/wiki/File:ComedyStore_01.jpg>
- <https://commons.wikimedia.org/wiki/File:ComedyStore_02.jpg>
- <https://commons.wikimedia.org/wiki/File:The_Comedy_Store.jpg>
- <https://commons.wikimedia.org/wiki/File:The_Comedy_Store_West_Hollywood_(51017780551).jpg>
- AI art-direction frames: [`screens/concepts/joke_shop/`](screens/concepts/joke_shop/README.md) - AI art-direction frames: [`screens/concepts/joke_shop/`](screens/concepts/joke_shop/README.md)
- The hall wall uses the `dark_stucco` pick (1024 px, matte charcoal grain) instead of the grey - The hall wall uses the `dark_stucco` pick (1024 px, matte charcoal grain) instead of the grey
paver tile, so the black stucco reads as the real club's flat plaster rather than masonry. paver tile, so the black stucco reads as the real club's flat plaster rather than masonry.
+1 -1
View File
@@ -15,4 +15,4 @@ attribution lives in the caption and the [refs sidecars](../refs/README.md)).
| --- | --- | | --- | --- |
| ![three-up board: elcapitan day](elcapitan-day-board.jpg) | El Capitan facade, day. Photo: [CC BY 2.0, woo, 2009](https://commons.wikimedia.org/wiki/File:El_Capitan_Theater_frontal_fachade-The_Masonic_Temple.jpg) via `refs/hollywood`. Concept: photo-anchored generation. Capture: current build with the ashlar limestone field (`limestone_ashlar`, anchored on the same photo). | | ![three-up board: elcapitan day](elcapitan-day-board.jpg) | El Capitan facade, day. Photo: [CC BY 2.0, woo, 2009](https://commons.wikimedia.org/wiki/File:El_Capitan_Theater_frontal_fachade-The_Masonic_Temple.jpg) via `refs/hollywood`. Concept: photo-anchored generation. Capture: current build with the ashlar limestone field (`limestone_ashlar`, anchored on the same photo). |
| ![three-up board: elcapitan night](elcapitan-night-board.jpg) | El Capitan block, night. Photo: CC BY-SA 3.0 (reviewed; redistribution only, no derived assets) via `refs/hollywood`. Concept: photo-anchored night restage. Capture: current build. | | ![three-up board: elcapitan night](elcapitan-night-board.jpg) | El Capitan block, night. Photo: CC BY-SA 3.0 (reviewed; redistribution only, no derived assets) via `refs/hollywood`. Concept: photo-anchored night restage. Capture: current build. |
| ![three-up board: jokeshop day](jokeshop-day-board.jpg) | Joke Shop frontage, day. Photo: public domain (2006) via `refs/joke-shop`. Concept: photo-anchored (hillside frame; the branded frontage trips the model's recitation filter). Capture: current build with the `dark_stucco` wall tile. | | ![three-up board: jokeshop day](jokeshop-day-board.jpg) | Joke Shop frontage, day. Photo: local-only research frame (`tmp/research/comedy-store`, gitignored). Concept: photo-anchored (gemini + gpt). Capture: current build with the `dark_stucco` wall tile. |
+2 -2
View File
@@ -1,7 +1,7 @@
{ {
"board": "jokeshop-day-board.jpg", "board": "jokeshop-day-board.jpg",
"caption": "Joke Shop frontage, day. Photo: public domain 2006. Concept: photo-anchored (hillside frame). Capture: dark stucco wall tile.", "caption": "Joke Shop frontage, day. Photo: local-only research frame (tmp/research/comedy-store). Concept: photo-anchored (gemini + gpt). Capture: dark stucco wall tile.",
"photo": "docs/screens/refs/joke-shop/comedy-store-frontage-palms-day-pd-2006-12-29.jpg", "photo": "tmp/research/comedy-store/01.jpg (local-only, gitignored)",
"concept": "docs/screens/concepts/joke_shop/joke_shop_entrance_day-v2.png", "concept": "docs/screens/concepts/joke_shop/joke_shop_entrance_day-v2.png",
"capture": "docs/screenshots/12-joke-shop.png" "capture": "docs/screenshots/12-joke-shop.png"
} }
+20 -81
View File
@@ -1,6 +1,13 @@
# Scene concepts: the realistic target look # Scene concepts: the realistic target look
These are AI-generated example frames (`python3 tools/scene_concepts.py generate --group scene`, `openai/gpt-5-image-mini`, 1280×720) for the realism pass. They are art direction, not assets. `tools/scene_concepts.py realism` pairs them with the in-game shots from `src/test/capture_realism.gd` (see `SHOTS` in the tool). New generations never overwrite a file here; they are saved as `<name>-vN.png`. These are AI-generated example frames for the realism pass. They are art direction, not assets.
`tools/scene_concepts.py realism` pairs them with the in-game shots from `src/test/capture_realism.gd`
(see `SHOTS` in the tool). New generations never overwrite a file here; they are saved as
`<name>-vN.png`.
Concepts are organised per venue in the two subfolders below. The older top-level single-frame
concepts were removed on 2026-11-03 in favour of the per-venue boards, which carry photo-anchored
generations with a `.refgen.json` provenance sidecar each (source photo, licence, model).
## Real-world Hollywood block ## Real-world Hollywood block
@@ -10,37 +17,10 @@ The map-optimization references for the El Capitan Entertainment Centre block
facts and game mapping are documented in facts and game mapping are documented in
[`../../hollywood-boulevard-map.md`](../../hollywood-boulevard-map.md). [`../../hollywood-boulevard-map.md`](../../hollywood-boulevard-map.md).
## Concept list ## The Joke Shop — Sunset Strip
### Hollywood Entrance
![hollywood entrance morning](hollywood_entrance_morning.png)
warm low sun, long soft shadows, brick with visible mortar and wear, stone plinth, potted topiary, haze that fades the far street to beige
### Hollywood Entrance Golden Hour
![hollywood entrance golden hour](hollywood_entrance_golden_hour.png)
strong back light and rim light on people, marquee bulbs reading even in daylight
### Hollywood Entrance Rain Night
![hollywood entrance rain night](hollywood_entrance_rain_night.png)
dark scene lit by practical lights only (marquee, sodium lamps), wet glossy ground with reflections, fog
### Boulevard Skyline
![boulevard skyline day](boulevard_skyline_day.png)
deep layered skyline with real towers and haze, palms lining the road, red curb paint, believable asphalt
### Boulevard Skyline Dusk
![boulevard skyline dusk](boulevard_skyline_dusk.png)
purple/orange gradient sky, neon signs, lit windows, car light trails
### The Joke Shop — Sunset Strip
The current Joke Shop map is based on The Comedy Store at 8433 Sunset Blvd. The current Joke Shop map is based on The Comedy Store at 8433 Sunset Blvd.
The real-site mapping, simplifications and reference photographs are in The real-site mapping and simplifications are in
[`../../joke-shop-map.md`](../../joke-shop-map.md); the frames are in [`../../joke-shop-map.md`](../../joke-shop-map.md); the frames are in
[`joke_shop/README.md`](joke_shop/README.md). [`joke_shop/README.md`](joke_shop/README.md).
@@ -48,56 +28,15 @@ The real-site mapping, simplifications and reference photographs are in
![Joke Shop entrance at night](joke_shop/joke_shop_entrance_night.png) ![Joke Shop entrance at night](joke_shop/joke_shop_entrance_night.png)
### Legacy Joke Shop Alley (pre-map optimization) ## Cross-cutting targets
![joke shop alley evening](joke_shop_alley_evening.png) For comparison with locally generated realism runs (`docs/screens/realism/`, gitignored):
narrow brick alley, one warm wall lantern as key light, deep shadows, people in dark jackets
![joke shop door closeup](joke_shop_door_closeup.png) - **Exposure.** The concepts keep the ground mid-grey; the game's sidewalk reads lighter, so it
close material detail: brick, mortar, aged wood door, brass overexposes against the reference.
- **Night means dark.** The night/dusk concepts are lit by practical lights only (marquee,
These two frames describe the old alley layout and are retained for comparison; signage, street lamps), with wet pavement reflections.
they are no longer the target for the Joke Shop map. - **Depth.** The concepts show a layered skyline fading into haze; the v2 skyline strips supply
this at the boulevard boundary.
### Studio Stage Door Night - **Geometry and foliage.** The facades have plinths, cornices and deep window reveals, and the
trees and shrubs are organic; the venue-realism passes close these gaps incrementally.
![studio stage door night](studio_stage_door_night.png)
granite facade, a bright bulb canopy as the main light, a glossy black car, stanchions and a barrier
### Sidewalk Material Closeup
![sidewalk material closeup](sidewalk_material_closeup.png)
paver joints, stains, granite curb, aggregate asphalt and a tree grate at grazing light
### Entrance Steps Podium
![entrance steps podium](entrance_steps_podium.png)
granite steps, handrails, glass doors, the check-in podium
### Crowd Barrier Line
![crowd barrier line](crowd_barrier_line.png)
steel barriers, a red carpet, a crowd with depth-of-field haze
### Responder Arrival Wide
![responder arrival wide](responder_arrival_wide.png)
fire engine, turnout gear, red/blue light spill on wet pavement
### NPC Portrait Day
![npc portrait day](npc_portrait_day.png)
close portrait of a pedestrian: skin with visible pores and stubble, fabric weave, shallow depth of field. The bar for an avatar close-up, not for the crowd shots
The `npc_portrait` capture in `capture_realism.gd` is staged, not posed by the crowd: it freezes one NPC on an open patch of sidewalk, parks the rest of the crowd out of frame, turns the subject into the camera and stands the guard on the sunlit side. It is the only shot where a face fills the frame, so it is the one to eyeball after an avatar change (generate a local run under `docs/screens/realism/`).
Cross-cutting targets, for comparison with locally generated realism runs:
- **Exposure.** The concepts keep the ground mid-grey. The game's sidewalk is close to white, so it is overexposed.
- **Night means dark.** The night/dusk concepts are lit by practical lights. The game's "Evening" phase is a bright pink-orange frame.
- **Depth.** The concepts show a layered skyline fading into haze. The new v2 skyline strips supply this; the old box skyline did not.
- **Geometry and foliage.** The facades have plinths, cornices and deep window reveals, and the trees and shrubs are organic. The game uses flat walls and blob trees.
## Additional previews
![npc_portrait_day-v2.png](npc_portrait_day-v2.png)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

@@ -44,3 +44,15 @@ mild — treat this as the overcast target, not a decay reference.
## Across the boulevard ## Across the boulevard
![Ovation Hollywood frontage across the boulevard](hollywood_boulevard_across_street.png) ![Ovation Hollywood frontage across the boulevard](hollywood_boulevard_across_street.png)
## Facade — local-reference anchored, two models
![El Capitan facade anchored on a local research frame, Gemini](el_capitan_facade_gemini_day.png)
![El Capitan facade anchored on a local research frame, GPT image](el_capitan_facade_gpt_day.png)
Both frames are anchored on the same local-only research photo
(`tmp/research/elcapitan/01.jpg`, gitignored) with `--reference-unchecked`, one with
`google/gemini-2.5-flash-image` and one with `openai/gpt-5-image-mini`. Provenance and model are
in each frame's `.refgen.json` sidecar. Local reference only; the photo never enters the repo and
these frames are art direction, not assets.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

@@ -0,0 +1,12 @@
{
"concept": "el_capitan_facade_gemini_day",
"generated": "el_capitan_facade_gemini_day.png",
"model": "google/gemini-2.5-flash-image",
"reference": {
"file": "tmp/research/elcapitan/01.jpg",
"licence": "unchecked",
"page": "",
"licence_checked": false
},
"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 prompt asks for it. Do not invent extra storeys, wings or ornaments that the photo does not show."
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

@@ -0,0 +1,12 @@
{
"concept": "el_capitan_facade_gpt_day",
"generated": "el_capitan_facade_gpt_day.png",
"model": "openai/gpt-5-image-mini",
"reference": {
"file": "tmp/research/elcapitan/01.jpg",
"licence": "unchecked",
"page": "",
"licence_checked": false
},
"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 prompt asks for it. Do not invent extra storeys, wings or ornaments that the photo does not show."
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

+15 -9
View File
@@ -10,12 +10,9 @@ game textures. The geometry mapping and source links are in
![The black comedy club under its signature canopy, anchored on the hillside block photo](joke_shop_entrance_day-v2.png) ![The black comedy club under its signature canopy, anchored on the hillside block photo](joke_shop_entrance_day-v2.png)
Generated with `generate --reference`, anchored on the licence-cleared Generated with `generate --reference`, anchored on a Comedy Store board photo that has since
[`comedy-store-hillside-canopy-day-pd-2006-12-29.jpg`](../../refs/joke-shop/comedy-store-hillside-canopy-day-pd-2006-12-29.jpg) been removed from the committed refs (the block now uses the local-only `tmp/research/comedy-store/`
board photo (public domain); provenance in set); provenance in [`joke_shop_entrance_day-v2.refgen.json`](joke_shop_entrance_day-v2.refgen.json).
[`joke_shop_entrance_day-v2.refgen.json`](joke_shop_entrance_day-v2.refgen.json).
The frontage photo itself triggers the model's image-recitation filter, so the
hillside block frame anchors the facade; shape follows the frontage photo.
## Entrance — day ## Entrance — day
@@ -29,6 +26,15 @@ hillside block frame anchors the facade; shape follows the frontage photo.
![The club seen from across Sunset Boulevard](joke_shop_across_street.png) ![The club seen from across Sunset Boulevard](joke_shop_across_street.png)
The older top-level concepts `joke_shop_alley_evening.png` and ## Facade — local-reference anchored, two models
`joke_shop_door_closeup.png` are kept as a record of the pre-map-optimization
alley design. They no longer describe the current Joke Shop map. ![Comedy Store facade anchored on a local research frame, Gemini](comedy_store_facade_gemini_day.png)
![Comedy Store facade anchored on a local research frame, GPT image](comedy_store_facade_gpt_day.png)
Both frames are anchored on the same local-only research photo
(`tmp/research/comedy-store/01.jpg`, gitignored) with `--reference-unchecked`, one with
`google/gemini-2.5-flash-image` and one with `openai/gpt-5-image-mini`. Provenance and model are
in each frame's `.refgen.json` sidecar. Local reference only; the photo never enters the repo and
these frames are art direction, not assets.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

@@ -0,0 +1,12 @@
{
"concept": "comedy_store_facade_gemini_day",
"generated": "comedy_store_facade_gemini_day.png",
"model": "google/gemini-2.5-flash-image",
"reference": {
"file": "tmp/research/comedy-store/01.jpg",
"licence": "unchecked",
"page": "",
"licence_checked": false
},
"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 prompt asks for it. Do not invent extra storeys, wings or ornaments that the photo does not show."
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

@@ -0,0 +1,12 @@
{
"concept": "comedy_store_facade_gpt_day",
"generated": "comedy_store_facade_gpt_day.png",
"model": "openai/gpt-5-image-mini",
"reference": {
"file": "tmp/research/comedy-store/01.jpg",
"licence": "unchecked",
"page": "",
"licence_checked": false
},
"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 prompt asks for it. Do not invent extra storeys, wings or ornaments that the photo does not show."
}
@@ -3,10 +3,11 @@
"generated": "joke_shop_entrance_day-v2.png", "generated": "joke_shop_entrance_day-v2.png",
"model": "google/gemini-2.5-flash-image", "model": "google/gemini-2.5-flash-image",
"reference": { "reference": {
"file": "docs/screens/refs/joke-shop/comedy-store-hillside-canopy-day-pd-2006-12-29.jpg", "file": "tmp/research/comedy-store/01.jpg (local-only; original board photo removed 2026-11-03)",
"licence": "Public domain", "licence": "Public domain",
"page": "https://commons.wikimedia.org/wiki/File:ComedyStore_01.jpg", "page": "https://commons.wikimedia.org/wiki/File:ComedyStore_01.jpg",
"licence_checked": true "licence_checked": true,
"removed_from_refs": true
}, },
"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 prompt asks for it. Do not invent extra storeys, wings or ornaments that the photo does not show." "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 prompt asks for it. Do not invent extra storeys, wings or ornaments that the photo does not show."
} }
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

-3
View File
@@ -21,9 +21,6 @@ docs/screens/refs/
README.md # board overview and image gallery README.md # board overview and image gallery
SIDECAR.md # provenance table SIDECAR.md # provenance table
*.jpg|png *.jpg|png
joke-shop/ # 8433 Sunset Blvd block
README.md
SIDECAR.md
tv-studio/ # studio entrance reference set tv-studio/ # studio entrance reference set
README.md README.md
SIDECAR.md SIDECAR.md
-26
View File
@@ -1,26 +0,0 @@
# Joke Shop / Sunset Strip reference board
Licensed photographs of the real Comedy Store block at 8433 Sunset Boulevard, used as evidence for
the game's second venue: the low black hall, the deep signature canopy, the circular blade sign, the
red curtain bays and the dry hillside that rises directly behind the roofline.
Development reference only; not shipped with the game. Provenance and licences are in
[`SIDECAR.md`](SIDECAR.md). Folder rules: [`../README.md`](../README.md). Generated art-direction
frames: [`../../concepts/joke_shop/`](../../concepts/joke_shop/README.md).
| Photo | What it is evidence for |
| --- | --- |
| ![The Comedy Store from across Sunset, hillside and houses behind the roof](comedy-store-hillside-canopy-day-pd-2006-12-29.jpg) | **Block and hillside.** The hall's height against the boulevard, the canopy depth from the street, and the dry slope with houses and palms rising behind the roofline. |
| ![The Comedy Store frontage with palms and the wall sign](comedy-store-frontage-palms-day-pd-2006-12-29.jpg) | **Frontage rhythm.** Blade sign height and diameter, the flat black wall, palm placement, kerb setback and where the entrance sits in the run. |
| ![Canopy fascia covered in white signatures with red curtains below](comedy-store-signature-band-day-wikimedia-2020-04-09.jpg) | **Canopy and curtain detail.** Signature density on the fascia, the white band width, the red curtain bays and the warm interior spill at dusk. |
## Gaps to fill
- A night photograph of the canopy, blade sign and red curtain wash (the current night evidence is
the generated concept frame and the game capture).
- A closer view of the entrance recess and door hardware.
- An across-street frame showing the neighbouring frontages on the south side of Sunset.
- A hillside detail showing the house rooflines above the club.
Add new files with the naming convention in [`../README.md`](../README.md) and list them in the
sidecar in the same commit.
-60
View File
@@ -1,60 +0,0 @@
# Sidecar — The Comedy Store block, 8433 Sunset Blvd
| Field | Value |
| --- | --- |
| Venue / block | The Comedy Store (game: The Joke Shop), Sunset Boulevard, West Hollywood |
| Folder | `docs/screens/refs/joke-shop/` |
| Collected by | project (agent session, 2026-11-03) |
| Date range | 2006–2020 (original captures); downloaded 2026-11-03 |
| Intended use | venue three-up board, canopy/frontage proportions, hillside silhouette |
| Shipped? | no — development reference only; not bundled with the game or releases |
## Photographs
| File | Subject | View | Source | Author | Licence | Captured | Purpose | Shipped |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `comedy-store-hillside-canopy-day-pd-2006-12-29.jpg` | Comedy Store and the hillside behind it | day, across Sunset | <https://commons.wikimedia.org/wiki/File:ComedyStore_01.jpg> | Gary Minnaert | Public domain | 2006-12-29 | street wall height, canopy depth, hillside houses and palms | no |
| `comedy-store-frontage-palms-day-pd-2006-12-29.jpg` | Frontage with palms and the wall sign | day, straight on | <https://commons.wikimedia.org/wiki/File:ComedyStore_02.jpg> | Gary Minnaert | Public domain | 2006-12-29 | blade sign size/height, wall length, palm rhythm, entrance position | no |
| `comedy-store-signature-band-day-wikimedia-2020-04-09.jpg` | Canopy signatures and red curtains | day, three-quarter | <https://commons.wikimedia.org/wiki/File:The_Comedy_Store_West_Hollywood_(51017780551).jpg> | Tony Mariotti (Los Angeles; [rubyhome.com](https://www.rubyhome.com/)) | CC BY 2.0 | 2020-04-09 | signature density, fascia band width, curtain bays, interior spill | no |
Licence text: [CC BY 2.0](https://creativecommons.org/licenses/by/2.0/). The CC BY file is also
credited in [`../../../CREDITS.md`](../../../CREDITS.md) under "Development-only reference images".
Not used: `File:The Comedy Store.jpg` (CC BY-SA 3.0) from the map document's original link list.
The two public-domain frames above cover the same evidence, so the share-alike review was not
needed for this board.
## Redactions and permissions
- No identifiable faces, licence plates or interiors in the committed crops; the plate area of the
parked car in the first photo is already unreadable at this resolution.
- Exterior public frontage only. The interior signature wall photo found in the Commons search was
**not** downloaded or committed.
## What was derived from this set
| Decision | Evidence | Where it landed |
| --- | --- | --- |
| 27 m frontage, 8.4 m street wall, 12.2 m OSM height | frontage photo measured against the door width | `docs/joke-shop-map.md`, `WorldBuilder` `comedy_store` spec |
| 4.9 m sloped canopy with a signature fascia | block and canopy photos | canopy slab geometry and the `Label3D` signature bands |
| 3.9 m circular blade sign on a roof pole | frontage photo | blade sign mesh and its night emissive |
| Hillside houses and palms above the roofline | block photo | `SunsetHillside` backdrop geometry |
| Red curtain bays between entrance and east end | signature-band photo | curtain bays and the entrance curtain |
## Generated boards used with this set
Generated frames are kept in [`../../concepts/joke_shop/`](../../concepts/joke_shop/README.md) and
are used for palette and night mood only; shape follows the photographs.
| Board | Path | Model | Generated | Spend |
| --- | --- | --- | --- | --- |
| Joke Shop entrance, day | `docs/screens/concepts/joke_shop/joke_shop_entrance_day.png` | `openai/gpt-5-image-mini` | 2026-11-02 | ~$0.01 |
| Joke Shop entrance, night | `docs/screens/concepts/joke_shop/joke_shop_entrance_night.png` | `openai/gpt-5-image-mini` | 2026-11-02 | ~$0.01 |
| Joke Shop across the street | `docs/screens/concepts/joke_shop/joke_shop_across_street.png` | `openai/gpt-5-image-mini` | 2026-11-02 | ~$0.01 |
## Notes
- Images re-encoded as JPEG q85 with EXIF removed (no GPS or camera metadata committed); the
untouched downloads stay outside the repository.
- `File:The Comedy Store West Hollywood (51017780551).jpg` asks for a dofollow attribution link;
the link is included above and in `CREDITS.md`.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 KiB

-59
View File
@@ -87,31 +87,6 @@ TEXTURE_STYLE = (
# name -> (group, prompt). Scene names describe venue + time of day. # name -> (group, prompt). Scene names describe venue + time of day.
CATALOGUE = { CATALOGUE = {
# -- Example 3D game scenes (art direction) ------------------------------ # -- Example 3D game scenes (art direction) ------------------------------
"hollywood_entrance_morning": ("scene", (
"Hollywood Boulevard brick building entrance in early morning sun, short "
"concrete steps up to a dark glazed double door under a bulb-lit marquee, "
"black bollards, a green litter bin, potted shrubs, palm trees and hazy "
"mid-rise buildings down the boulevard")),
"hollywood_entrance_golden_hour": ("scene", (
"the same Hollywood brick venue entrance at golden hour, long warm shadows "
"across worn concrete sidewalk pavers, marquee bulbs starting to glow, a few "
"pedestrians, palm silhouettes against an orange sky")),
"hollywood_entrance_rain_night": ("scene", (
"Hollywood brick venue entrance late at night in light rain, wet asphalt "
"reflecting the marquee and sodium street lamps, puddles on the sidewalk, "
"lit windows in the distant skyline, a lone security guard post by the door")),
"boulevard_skyline_day": ("scene", (
"view from a Hollywood Boulevard sidewalk across a four-lane street toward a "
"layered Los Angeles skyline of mid-rise and high-rise buildings, palm trees "
"lining the street, the Hollywood hills hazy on the horizon, clear blue sky")),
"boulevard_skyline_dusk": ("scene", (
"Hollywood Boulevard at dusk looking down the street, street lamps switching "
"on, purple and orange sky, distant skyline windows lighting up, car light "
"trails, palm trees in silhouette")),
"joke_shop_alley_evening": ("scene", (
"a narrow brick side street outside a small comedy club in the evening, a red "
"scalloped awning over a wooden door, a warm wall lantern, a chalkboard "
"A-frame sign on the sidewalk, a short queue of people in jackets")),
"joke_shop_entrance_day": ("scene", ( "joke_shop_entrance_day": ("scene", (
"the Comedy Store comedy club on the Sunset Strip in West Hollywood, a low " "the Comedy Store comedy club on the Sunset Strip in West Hollywood, a low "
"black building with a deep sloped black canopy covered in white celebrity " "black building with a deep sloped black canopy covered in white celebrity "
@@ -131,34 +106,6 @@ CATALOGUE = {
"circular THE JOKE SHOP sign and signature-covered canopy, red curtains and " "circular THE JOKE SHOP sign and signature-covered canopy, red curtains and "
"warm entrance, palm trees, traffic and billboards on the Sunset Strip, dry " "warm entrance, palm trees, traffic and billboards on the Sunset Strip, dry "
"hillside houses rising behind the club, late afternoon haze")), "hillside houses rising behind the club, late afternoon haze")),
"joke_shop_door_closeup": ("scene", (
"close view of a comedy club door: aged dark-red brick with mortar detail, a "
"brass door handle, a glowing wall lantern, a chalkboard sign, evening light")),
"studio_stage_door_night": ("scene", (
"a TV studio stage door at night: granite facade, a large bulb-lit marquee "
"canopy, a black sedan at the curb, chrome stanchions with a red velvet rope, "
"fans with phones behind a steel crowd barrier")),
"sidewalk_material_closeup": ("scene", (
"low camera close-up along a city sidewalk: weathered concrete pavers with "
"expansion joints and stains, a granite curb, asphalt with aggregate and lane "
"paint, a cast-iron tree grate, morning sun")),
"entrance_steps_podium": ("scene", (
"a security check-in podium at the foot of three granite entrance steps with "
"black metal handrails, glass double doors with a card reader, a bulb marquee "
"above, daylight")),
"crowd_barrier_line": ("scene", (
"a row of steel bike-rack crowd barriers along a Hollywood sidewalk before a "
"premiere, people waiting behind them, a red carpet, palm trees and a hazy "
"skyline, late afternoon")),
"npc_portrait_day": ("scene", (
"eye-level close portrait of an ordinary adult pedestrian standing on a "
"sunlit Hollywood sidewalk, upper body and face filling the frame, plain "
"casual jacket, natural skin detail, shallow depth of field, blurred brick "
"facade and palm trees behind")),
"responder_arrival_wide": ("scene", (
"wide shot of a fire engine and firefighters in dark turnout gear arriving at "
"a brick venue entrance at night, red and blue light reflections on wet "
"pavement, onlookers kept back by a guard")),
# -- Real-world Hollywood block (map optimization) ---------------------- # -- Real-world Hollywood block (map optimization) ----------------------
"hollywood_boulevard_entrance_day": ("scene", ( "hollywood_boulevard_entrance_day": ("scene", (
"photorealistic eye-level view of the El Capitan Entertainment Centre at " "photorealistic eye-level view of the El Capitan Entertainment Centre at "
@@ -241,9 +188,7 @@ PICKS = {
# Realism trial: capture shot -> concept it is judged against. # Realism trial: capture shot -> concept it is judged against.
SHOTS = { SHOTS = {
"entrance_day": "hollywood_boulevard_entrance_day", "entrance_day": "hollywood_boulevard_entrance_day",
"boulevard_day": "boulevard_skyline_day",
"street_day": "hollywood_boulevard_across_street", "street_day": "hollywood_boulevard_across_street",
"boulevard_night": "hollywood_entrance_rain_night",
"street_night": "hollywood_boulevard_entrance_night", "street_night": "hollywood_boulevard_entrance_night",
"entrance_late": "hollywood_boulevard_entrance_night", "entrance_late": "hollywood_boulevard_entrance_night",
"street_late": "hollywood_boulevard_across_street", "street_late": "hollywood_boulevard_across_street",
@@ -251,10 +196,6 @@ SHOTS = {
# the Hollywood layout. # the Hollywood layout.
"joke_shop_door": "joke_shop_entrance_night", "joke_shop_door": "joke_shop_entrance_night",
"12-joke-shop": "joke_shop_entrance_night", "12-joke-shop": "joke_shop_entrance_night",
"studio_door": "studio_stage_door_night",
"studio_stage_door_night": "studio_stage_door_night",
"13-studio-arrival": "studio_stage_door_night",
"npc_portrait": "npc_portrait_day",
} }
+1 -1
View File
@@ -25,7 +25,7 @@ class CatalogueTests(unittest.TestCase):
self.assertEqual(sc.CATALOGUE[concept][0], "scene", shot) self.assertEqual(sc.CATALOGUE[concept][0], "scene", shot)
def test_paths_stay_in_their_folders(self): def test_paths_stay_in_their_folders(self):
self.assertTrue(sc.raw_path("boulevard_skyline_day").is_relative_to(sc.CONCEPT_DIR)) self.assertTrue(sc.raw_path("hollywood_boulevard_entrance_day").is_relative_to(sc.CONCEPT_DIR))
self.assertTrue(sc.raw_path("hollywood_boulevard_entrance_day").is_relative_to( self.assertTrue(sc.raw_path("hollywood_boulevard_entrance_day").is_relative_to(
sc.CONCEPT_DIR / "hollywood_boulevard")) sc.CONCEPT_DIR / "hollywood_boulevard"))
self.assertTrue(sc.raw_path("joke_shop_entrance_day").is_relative_to( self.assertTrue(sc.raw_path("joke_shop_entrance_day").is_relative_to(