diff --git a/fleet/web/README.md b/fleet/web/README.md index abaf314e9..05fc18a87 100644 --- a/fleet/web/README.md +++ b/fleet/web/README.md @@ -4,8 +4,9 @@ The page for `docs/fleet/ARCHITECTURE.md`: one image tiled across every GPU, fcv left and EC2 on the right, each side as wide as the GPUs it has live, live from each tile's own renderer. The render is the page: the image fills the screen (contain-fit, centred), with a row of controls over its top and a strip over its bottom (the one button, "Restart all N GPUs", the last race in one line, the next scheduled restart, and what draws the -image: resolution, GPUs, frame rate). The controls fade when the pointer rests. While a race runs, its two bars, -fcvm against EC2, sit over the bottom of the image. Each tile asks its renderer for at most `MAX_TILE_PX` (0.5 M) +image: resolution, GPUs, frame rate). The controls fade when the pointer rests. A race is drawn on the picture: every +dark tile counts, each half has one large clock (fcvm freezes when its last tile is back, EC2 keeps counting), each tile +shows its own time as it relights, and a card gives the result for 8 s before the strip's line takes it over. Each tile asks its renderer for at most `MAX_TILE_PX` (0.5 M) pixels, so one viewer on a large screen cannot push a GPU under one sample per pixel. Everything else (the camera's next stop, words, lights, how the streams arrive, stream stats, the counters and recent actions) is in the drawer, where the sender of a word also picks how it is drawn: Lockup (type above the clock), Skywriting (smoke in the sky) or Landmark (big letters diff --git a/fleet/web/app/_wall/Overlays.tsx b/fleet/web/app/_wall/Overlays.tsx index 13db13d52..7d2395c07 100644 --- a/fleet/web/app/_wall/Overlays.tsx +++ b/fleet/web/app/_wall/Overlays.tsx @@ -1,12 +1,13 @@ "use client"; // Everything drawn over the frames: the line between the halves, each half's -// tag, dark tiles' glyphs and phases, +// tag, dark tiles' clocks, glyphs and phases, the race's clocks and result, +// the wake's progress, // the stats switch's per-tile lines, the seams and the hovered tile's outline // and label, banners and notices. import type { CSSProperties } from "react"; -import type { Glyph, TileView, WallView } from "../../core/index.ts"; +import type { Glyph, HalfClock, SleepView, TileView, WallView } from "../../core/index.ts"; function accent(color: string): CSSProperties { return { ["--accent" as string]: color }; @@ -66,7 +67,7 @@ export function GlyphMark({ g, size }: { g: Glyph; size: number }) { function DarkTile({ t }: { t: TileView }) { const b = t.box!; const big = b.h >= 64 && b.w >= 110; - const size = Math.max(14, Math.min(34, b.h / 3.2)); + const size = Math.max(14, Math.min(34, b.h / (t.clock ? 5 : 3.2))); return (
+ {view.race.end} +
+ ) : null} {info}{view.rotateHint} @@ -769,7 +782,6 @@ export function Wall({ coordUrl, mediaUrl }: { coordUrl: string; mediaUrl: strin