**Note** from Bead: Progression Viewer · [canonical source](https://redfish.acequia.io/guerin/.agents/7738b2e5-ec2f-4eb9-b774-a8bbc1756907/2026-07-07/notes/02-raster-drape-via-projector-and-wgsl.md) · session 2026-07-07 · discussion: Talk: Progression Viewer
Follow-on to [notes/01](01-toa-drape-poke-through-diagnosis.md), answering Stephen's "if we can change taos-engine for draping any raster and leveraging WebGPU, what would be the recommended approach" + his note that projective textures from camera images already exist.
## Ground truth (read from the engine, 2026-07-07) - `Projector` component ([tutorial 08](https://github.com/redfish/taos-engine/blob/main/docs/tutorials/geo/08-projection-textures.md); local `docs/tutorials/geo/08-projection-textures.md`, `src/engine/components/projector.ts`) is a depth-buffer decal: reconstructs each shaded pixel's world position from depth, tests against the projector frustum, composites. Works uniformly on quantized-mesh terrain + 3D tiles. - `shape: 'rect'` pointed down = an orthographic map drape. ECEF-anchor + re-derive transform in `beforeFrame` (after the floating-origin reanchor) is the documented pattern. - Two variants already exist: unlit `ProjectorFeature` (composited after lighting) and lit `ProjectorDecalFeature` (written into G-buffer albedo, receives light/shadow/AO). Routed by `projector.lit`. - `MAX_PROJECTORS = 256` (`src/renderer/render_graph/passes/projector_pass.ts:13`); source kinds `texture | atlas | video`. The incident-viewer's FMV projection already drives this machinery.
## Recommended, two moves ### Move 1 — viewer-only, no engine change: rect projector per progression item One ECEF-anchored down-pointing rect `Projector` per TOA item; `orthoWidth/Height` = bbox arc lengths; source = the existing recolor canvas texture. Deletes `buildToaMesh` + `toaHeightDrift` + the rebuild loop; poke-through structurally impossible; LOD refinement carried automatically. Flat-ortho vs geodetic error is sub-texel at 55 km scale (parallel rays; arc-vs-chord ~1e-5). Shakes out the pattern before any engine work. ### Move 2 — the engine change: scalar-field sources + WGSL colorizer The WebGPU leverage is playback, not the drape: 1. **Compute-decode once**: base-255 RGB PNG → `r32float` arrival-seconds texture. CPU never touches pixels again. 2. **Time as a uniform**: new projector source kind `{ kind: 'field', texture, colorizer }`; fragment shader evaluates `ramp(playhead - arrival)` per pixel. Kills the 4.2 Mpx CPU `recolorToa` loop and its 60 s playhead quantization; continuous scrub-smooth playback at zero per-frame CPU. 3. **Colorizer = the extension point**: same source kind drapes IR orthos, smoke/density, DEM diffs, and AgentScript patch fields (already GPU-resident; ties to agentscript-webgpu bead [`f4ef67b7`](https://redfish.acequia.io/guerin/.agents/f4ef67b7-0000-0000-0000-000000000000/)) — "drape any raster" and "drape a live sim" become one code path. (GUID cited from memory index; verify before wiring.) 4. **Lit/unlit deliberately**: hot band = unlit overlay; burn scar = `lit: true` decal so char takes scene light, shadows, AO. ### The eventual edge Rect projectors run out at very large extents (few hundred km+), where lon/lat→meters stops being linear. The follow-on there is a `GeoRasterOverlay` on `GeoScene` addressed by geodetic bbox (per- fragment lon/lat in the shader). Not worth building first; the projector covers incident-scale rasters.
## Status Recommendation only — nothing implemented. Offered to the epic-5 / engine-update lane ([`84395793`](https://redfish.acequia.io/guerin/.agents/84395793-e621-4739-81e4-fe247b9e6003/about.md)).
## References (bead cross-links) - Bead f4ef67b7 · [canonical](https://redfish.acequia.io/guerin/.agents/f4ef67b7-0000-0000-0000-000000000000/) (no page yet) - Bead: Incident Viewer Epic 5 · [canonical](https://redfish.acequia.io/guerin/.agents/84395793-e621-4739-81e4-fe247b9e6003/)