Skip to content

feat(chatt): Chattanooga Mini — tilt-shift diorama of downtown Chattanooga#217

Merged
TortoiseWolfe merged 4 commits into
mainfrom
feat/chattanooga-mini
Jul 7, 2026
Merged

feat(chatt): Chattanooga Mini — tilt-shift diorama of downtown Chattanooga#217
TortoiseWolfe merged 4 commits into
mainfrom
feat/chattanooga-mini

Conversation

@TortoiseWolfe

Copy link
Copy Markdown
Owner

A miniature tilt-shift diorama of downtown Chattanooga at /chatt, driven by real geodata baked offline.

What this adds

  • Bake pipeline (scripts/bake/, pnpm bake): Overpass → 1544 buildings + 2499 streets, OpenTopoData ned10m → terrain, USGS NAIP → meter-proportional aerial drape, build-scene projects everything into a local ENU frame with a tag-bucketed height heuristic. Output committed to public/chatt/; runtime makes zero third-party calls.
  • Generic 3D stage (src/stage/): StageCore + headless 4-mode Rig (tour/miniature/follow/walk) + Hud + tilt-shift composer (three EffectComposer) + lightRig + materialKit — built to be liftable into any R3F route (import-guard test enforces zero project imports).
  • Chattanooga content (src/world/, src/packs/, src/agents/): buildings/terrain/streets/heroes, palette profiles (true-to-life ⇄ toy), Riverfront tour, trolley.
  • Route at src/app/chatt/ (dynamic ssr:false); provenance shown in HUD (© OpenStreetMap · USGS 3DEP · USGS NAIP).

Verification

  • Renders verified on a real GPU (screenshots). 51 diorama unit tests pass; tsc clean; full pre-push CI + production build passed.

Known follow-ups (tracked)

Notes

  • Forked-then-ported: originally prototyped as a standalone fork, then moved onto ScriptHammer proper (shared history, Supabase, upstream). The generic stage layer is a candidate to extract as a reusable '3D Stage' template later.

🤖 Generated with Claude Code

TurtleWolfe and others added 4 commits July 7, 2026 10:24
A miniature diorama of downtown Chattanooga: real geodata (OSM footprints +
USGS 3DEP terrain + USGS NAIP aerial) baked offline into public/chatt/, rendered
as a stylized tilt-shift toy in R3F. Four camera modes (tour/miniature/follow/
walk), palette toggle, guided Riverfront tour.

Bake pipeline (scripts/bake/, run via pnpm bake): Overpass -> 1544 buildings +
2499 streets, OpenTopoData ned10m -> terrain grid, NAIP -> meter-proportional
drape, build-scene projects to a local ENU frame + tag-bucketed height heuristic.

Generic 3D stage (src/stage/): StageCore + Rig (headless 4-mode camera) + Hud +
tilt-shift composer (three EffectComposer) + lightRig + materialKit — built to
be liftable into any R3F route. Chattanooga-specific layer in src/world/,
src/packs/, src/agents/. Route at src/app/chatt/ (dynamic ssr:false).

Renders verified on a real GPU. 51 diorama unit tests pass; tsc clean.
Known follow-ups tracked as issues: buildings sit on a flat layer below the
topology (terrain coupling), and Miniature mode can not yet pan to the south
(Choo Choo) end.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Buildings floated on a flat Y=0 slab while the terrain sat at raw 194-249m
elevation. Add a shared elevationAt(grid,manifest,x,z) sampler (correct N-S sign
v=0.5-z/groundHm, verified against the terrain rotateX convention) + minElevation.
Normalize terrain down by minElevation so the lowest ground is Y=0, and seat each
building/hero/street vertex on elevationAt-minElevation. Now buildings sit ON the
topology and the NAIP drape reads as rolling terrain. Verified by screenshot.

Closes #215

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…hoo (#216)

Miniature/orbit mode had a fixed pivot — you were stuck at the north end and
could not reach the south. Add WASD focus-panning to _orbit (camera-relative
forward/right, reusing the _driveAvatar basis), clamped to the corridor extent
(panMin/Max X/Z options). Extend RIVERFRONT_TOUR with south-end waypoints
(Republic Centre, Downtown Core, Chattanooga Choo Choo) so the guided tour
traverses the whole 5.8km corridor. Verified by screenshot: WASD pans from the
downtown/river north end to the Choo Choo south end.

Closes #216

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The two buildScene() integration tests read public/chatt/_raw/osm.json, but
_raw/ is gitignored (large, regenerable via pnpm bake) so it is absent in CI /
fresh clones — causing ENOENT failures in the Test and accessibility jobs. Guard
them with describe.skipIf(!hasRaw): they run locally where the cache exists and
skip cleanly in CI. The pure-geometry tests (ringArea/centroid) always run, and
the committed derived artifacts are covered by the runtime component tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@TortoiseWolfe TortoiseWolfe merged commit f31e702 into main Jul 7, 2026
2 checks passed
@TortoiseWolfe TortoiseWolfe deleted the feat/chattanooga-mini branch July 7, 2026 13:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants