1
0
Commit Graph

2 Commits

Author SHA1 Message Date
karti d04a75b9bd Every shot is taken twice, and the site shows you the other one
Each of the seven cameras now fires at two clocks — one daylight frame, one
around sixteen degrees below the horizon — and lumbridgecorp.com loads whichever
is the opposite of the reader's theme. A night render on that site's dark page
is a dark rectangle on a dark page: the edges dissolve and the picture stops
being an object. A daylit one on the white page has the same problem in reverse,
and the hazier frames wash out entirely.

It is also the cheapest demonstration available of the claim those pages lean on
hardest. The sun is computed from a real time rather than themed, and a reader
who doubts it can hit the light/dark toggle and watch the same city change hour
with nothing else about the geometry moving.

Shot ids lose their time of day — `soma-afternoon` is `soma`, `fidi-night` is
`fidi`, `peninsula-morning` is `peninsula` — because none of them names one hour
any more. The manifest gains a `Frame` type: `at`, `src`, `alt` and a `note`
belong to an hour, while `place` and `caption` are true of both, so a caption
cannot end up describing light that is not in the frame under it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 15:33:19 -07:00
karti d71e844703 The engine gets photographed, and the camera stops moving while the shutter is open
`shots.mjs` renders the product imagery for lumbridgecorp.com/simulate: seven
frames of the running `dist/`, at chapters and times chosen rather than
defaulted, written as WebP into the sibling site checkout together with a
generated manifest that carries each picture's caption and alt text. The pages
there had described a renderer in prose for their whole life without ever
showing one, which is a strange way to sell a renderer.

The captions live next to the camera poses in this repo, not on the site, so
re-aiming a camera cannot leave a caption behind describing the old view. The
manifest emits a `ShotId` union, so a page asking for a picture that has been
renamed fails the site's typecheck instead of rendering a hole.

Along the way: the share cards were never reproducible. `scenekit.ts` eases a
chapter change over about two seconds of scene time, `stage.ts` clamps `dt` to
50 ms a frame, and SwiftShader here draws about three frames a second — so the
flight takes twenty seconds of wall clock and `capture.mjs` waited four. Every
run caught the camera at a different point over the bay, and none of them at
the chapter the key press asked for. Both scripts now open the page with
reduced motion, which is the app's own answer to "somebody clicked a name in a
list": `flyTo` sets the pose outright. `og-tera.png` is regenerated and is
Hayes Valley for the first time. The bytes still differ run to run, because
aircraft are crossing and cloud shadow is drifting; the framing no longer does.

`harness.mjs` is the static server, the SwiftShader flags, the two-hostnames-
one-dist trick and the clock shim, extracted because there are two consumers
now and two copies would have drifted apart while both claimed to photograph
the same app.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 15:03:50 -07:00