feat: give the boards a horizon, a sea that reflects, and a state worth flying over
The wide shot, which is what an anonymous visitor actually lands on. **The sea was `MeshLambertMaterial`** — a material with no specular term at all, by construction — on a board where water is half the frame. It is now a low-roughness dielectric that reads `scene.environment`, with a runtime-generated tiling swell normal map sampled twice per fragment at two scales and two headings, so the sun breaks into a moving glitter path instead of a mirror point. An `onBeforeCompile` patch takes the body colour toward the deep value looking straight down and leaves it to the reflection at grazing, and walks roughness up past 1.6 board spans so the far water cannot shimmer. The swell spectrum is 1/k^2 and not 1/k because the first attempt was photographed: at 1/k every component carries the same slope, the shortest wave wins, and the sea renders as hard diagonal corduroy. A test holds it now. **The board no longer ends in a diamond.** The sea plane went from 1.8 board spans to 18, past the fog's far plane from anywhere the orbit reaches, and the sky is a world-space dome rather than a screen-space gradient. That gradient was wrong in a way dusk made obvious: the sunset band was painted along the *bottom* of the picture, under the board, while the true horizon at the top of frame stayed zenith blue. `daylight.ts` pinning the horizon stop to the fog colour to hide the seam was a symptom of it. **Terrain casts shadows.** Left off before because double-sided terrain against a ~16 m-per-texel shadow map gives acne; `shadowSide = BackSide` is the cure, shot at four sun elevations down to +0.0 degrees to confirm no stippling. The caster is a stride-2 decimation appended to the same index buffer and swapped in by `onBeforeShadow`/`onAfterShadow` via `drawRange`: no extra draw call, a quarter of the depth cost, and indistinguishable from the full-resolution caster in a side-by-side crop. Stride 1 was measured at +65,566 triangles and would have missed the budget by ~47,000, so it was not shipped. **California reads as California.** It was a beige kite: the eastern edge one ruled line for five degrees of latitude, the south closing in a diagonal V, the whole south-east a featureless tan wedge. Now the coast runs to the Mexican border with San Diego on it, the eastern edge follows the Colorado and the Nevada diagonal, and the south-east is the Basin and Range — forty parallel desert ridges throwing shadows east, Death Valley as a white pan between the Panamints and the Black Mountains, the Salton Sea the one cool value for two hundred kilometres. The opening pose is retuned to the bigger board; the old 452/392 stand-off left a slab of empty ocean where the state should be. **The aircraft were six pixels.** Measured, by enlarging a screenshot 200% to find one at all — indistinguishable from a dead pixel, on a board whose entire claim is that the sky is live. They are airliners now, with planform and trail, and clicking one raises its card for a signed-out visitor. **The Model X is off the wall.** It stood at floor level outside a studio 188 m up a Transbay tower, reading as a car balanced on a parapet. The apron is now chosen from `site.elevation`, which the pack already carries — not from an office id, which is the bug class this repo already hit once when a door marker gated on `id === "sf"` and would have pinned the Los Angeles building to San Francisco. Also fixed, and nearly shipped: sea z-fighting dithered every flat piece of ground on the Bay Area and SoCal boards. And one test asserted an exact source line for the water material, so the better multi-line implementation failed it — it now asserts the property (dielectric, metalness 0, low roughness) rather than the author's first guess at formatting. Tests 964 -> 1015. California desktop 562/650 draw calls and 728,744/750,000 triangles — 2.8% of triangle headroom left, which is the number the next person should check first. No budget was raised. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+38
-9
@@ -686,9 +686,22 @@
|
||||
four fifths of which was irrelevant to whatever you were doing.
|
||||
|
||||
It is at most two chips now, chosen for the mode you are actually in by
|
||||
`railHints()` in `src/ui/shortcuts.ts`, with no card around them: keycaps
|
||||
over the scene, a text shadow instead of a fill, and the full reference
|
||||
one press of `?` away. */
|
||||
`railHints()` in `src/ui/shortcuts.ts`, and the full reference is one
|
||||
press of `?` away.
|
||||
|
||||
**The fill came back, and the text shadow went.** The card was dropped
|
||||
for a text shadow over the bare scene, which was measured against the
|
||||
wrong background: on the deployed build the rail sits in the corner of a
|
||||
sky, and the sky at its brightest is `skyHorizon` — 0xe9d8bb on the
|
||||
California board, a pale cream. Fifty-six per cent white on that is
|
||||
about 1.3:1 and a shadow does not save it; what you saw was grey text
|
||||
you had to hunt for. This is now the same glass, hairline and shadow the
|
||||
honesty line in the opposite corner has always carried, which is the
|
||||
part of the original argument that was right — the rail is a corner
|
||||
caption and it should look like the other one — and the ink is at full
|
||||
strength, which puts it past 4.5:1 against the whitest sky the
|
||||
atmosphere can render. It is still two chips and it is still not a
|
||||
paragraph. */
|
||||
.hint {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
@@ -704,8 +717,14 @@
|
||||
/* The rail is a corner, not a column. Without a ceiling it grew to meet
|
||||
the mode pill in the middle of the screen. */
|
||||
max-width: min(30rem, 42vw);
|
||||
color: var(--ink-2);
|
||||
text-shadow: 0 1px 3px rgba(3, 6, 10, 0.8);
|
||||
color: var(--ink);
|
||||
padding: var(--s1) var(--s2);
|
||||
border: 1px solid var(--hairline);
|
||||
border-radius: var(--r-sm);
|
||||
background: var(--glass);
|
||||
backdrop-filter: var(--blur);
|
||||
-webkit-backdrop-filter: var(--blur);
|
||||
box-shadow: var(--shadow);
|
||||
}
|
||||
/* One chip is one line. Wrapping happens *between* chips, which the flex
|
||||
container already does; a chip that wraps inside itself is the thing
|
||||
@@ -716,15 +735,22 @@
|
||||
gap: 5px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.hint__label { color: var(--ink-3); }
|
||||
/* One step down from the keycap it labels, not three. `--ink-3` is 40%
|
||||
white, which is a quiet grey on a panel and invisible in a corner of
|
||||
sky; on the fill above, `--ink-2` is still clearly the subordinate half
|
||||
of the chip and still legible on its own. */
|
||||
.hint__label { color: var(--ink-2); }
|
||||
kbd {
|
||||
font: inherit;
|
||||
font-size: 9px;
|
||||
padding: 1px 4px;
|
||||
border: 1px solid var(--hairline);
|
||||
border-radius: 3px;
|
||||
background: rgba(8, 12, 17, 0.7);
|
||||
color: var(--ink-2);
|
||||
/* Opaque, because a keycap on the rail is now a dark chip on a dark
|
||||
chip: at 0.7 the glass behind it showed through and the two washed
|
||||
into one another over a bright sky. */
|
||||
background: rgb(8, 12, 17);
|
||||
color: var(--ink);
|
||||
}
|
||||
|
||||
.rail-buttons { display: flex; align-items: center; gap: var(--s1); }
|
||||
@@ -740,7 +766,10 @@
|
||||
background: var(--glass);
|
||||
backdrop-filter: var(--blur);
|
||||
-webkit-backdrop-filter: var(--blur);
|
||||
color: var(--ink-2);
|
||||
/* Full ink. This is the one control on the screen that has to be found
|
||||
by somebody who does not yet know what any of this is, and it spends
|
||||
most of its life over sky. */
|
||||
color: var(--ink);
|
||||
transition: background var(--t), color var(--t);
|
||||
}
|
||||
@media (hover: hover) {
|
||||
|
||||
Reference in New Issue
Block a user