The loader walks MATERIALS to swap painted files over the procedural
bakes, and the two ground planes were never added to it — so floor.png
and ceiling.png sat served-but-unread while the renderer kept its own
flagstones. Eight materials in the list now, all eight paintable.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
True floor-casting replaces the gradients and the projected seam lines:
every screen row lies at one depth, walked with a constant world-space
step and sampled from floor.png underfoot and ceiling.png overhead —
each maze cell wearing exactly one tile, so the artist's border IS the
cell seam. Distance shade and fog fold into the same per-pixel pass,
pixel buffers cache per texture (re-read when a painted file lands),
and the whole frame still clears 60fps with room to spare. Flagstones
and dark slabs ship as the starter files beside the other masonry.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The six materials move out of the renderer into public/textures/*.png —
repaint any of them (any size; the sampler reads each file's own scale)
and refresh, exactly as the token SVGs work. fpv/textures.ts keeps the
procedural bake as the shipped default and the stand-in while files
load, and the /?tokens gallery grows a masonry section showing the set
beside the tokens they will someday match.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>