WO-5 T4/T5: WebGPU Gaussian-splat viewport, verified against real hardware
hunt
9ff7b91
T5: buildPlaceholderSplat() in placeholderSplat.ts - a deterministic
(seeded), auditable procedural head-shaped splat cloud (position, scale,
rotation quaternion, color, opacity, per-splat jaw/eyelid skinning
weights) standing in for the not-yet-built GaussianAvatars/FLAME/TetGS
trained asset. Data-shape matches the standard Gaussian-splat attribute set
so a real trained asset drops in as a data change, not a renderer rewrite.
T4: SplatRenderer.ts + shaders.wgsl.ts - the WebGPU pipeline. Two-pass
structure: a deform compute pass turns ARKit-52 weights (jawOpen, blink)
into per-splat position/rotation deltas via quaternion rotation around a
jaw hinge and lid-line compression; a billboard render pass draws each
Gaussian as a camera-facing quad with a soft radial falloff.
DECOUPLED RENDER LOOP (the WO-5 architectural guardrail): startRenderLoop()
calls requestAnimationFrame unconditionally every frame and renders
whatever currentWeights currently holds. SplatViewport's own network-feed
…