GLSL gsplat projection — ONE source for the visual vertex stage
(./shader-glsl.ts) and the pick vertex stage (picking/gsplat/shaders.ts),
so the two cannot place, size or cull a splat differently: the camera-space
covariance, the screen-coverage fade, the projected 2D covariance (general
projection Jacobian), the sum projection's ray sigma, the Σ_2D eigen-axes and
the max-extent-clamped quad extents. TSL twins: the gsplat*TSL builders in
./shader-tsl.ts. CPU mirror of the projection terms:
../_shared/projection-math.ts.
The 2D Cholesky of Σ_2D is NOT here on purpose: the visual one sanitizes and
floors at 1e-6 (a fragment-stage falloff must never see NaN), the pick one
keeps its historical 1e-8 floors; sharing it would move pick footprints.
REQUIRED GLOBALS — include AFTER them (GLSL resolves names top-down):
uResolution, uMaxExtentFactor, modelViewMatrix, projectionMatrix,
luxarProjectionSizeScale() (GLSL_PROJECTION_FUNCTIONS) and
isInvalidFloat (GLSL_SANITIZE_FUNCTIONS).
GLSL gsplat projection — ONE source for the visual vertex stage (
./shader-glsl.ts) and the pick vertex stage (picking/gsplat/shaders.ts), so the two cannot place, size or cull a splat differently: the camera-space covariance, the screen-coverage fade, the projected 2D covariance (general projection Jacobian), the sum projection's ray sigma, the Σ_2D eigen-axes and the max-extent-clamped quad extents. TSL twins: thegsplat*TSLbuilders in./shader-tsl.ts. CPU mirror of the projection terms:../_shared/projection-math.ts.The 2D Cholesky of Σ_2D is NOT here on purpose: the visual one sanitizes and floors at 1e-6 (a fragment-stage falloff must never see NaN), the pick one keeps its historical 1e-8 floors; sharing it would move pick footprints.
REQUIRED GLOBALS — include AFTER them (GLSL resolves names top-down):
uResolution,uMaxExtentFactor,modelViewMatrix,projectionMatrix,luxarProjectionSizeScale()(GLSL_PROJECTION_FUNCTIONS) andisInvalidFloat(GLSL_SANITIZE_FUNCTIONS).