Drawable Tile Gaussian
Colour-pass drawable for one 3D Tiles Gaussian-splat tile. Holds references to the tile's per-attribute GPU buffers (centres / scales / rotations / rgba) + a static back-to-front index buffer computed once at upload time, and dispatches a single glDrawElements(GL_POINTS) per tile.
The static sort is computed against the tile bounding sphere centre, not the live camera — good enough for tiles roughly viewed from a consistent direction, fast to upload (no per-frame mutation), but produces some visible overlap artifacts when the camera orbits around the tile.
Implements ShadowCaster like DrawableTilePoints: emits one-pixel GL_POINTS into the cascade depth texture when shadowMode.castsShadows. The colour pass does not apply incoming shadows — splats are usually self-shadowed already, the bookkeeping cost outweighs the fidelity gain.
Properties
Live GPU buffer references resolved fresh from the RR cache at enqueue time. Matches the drawable-enqueue resolution pattern used by DrawableTileMesh / Path / Polygon / OSM Buildings — keeping the refs on the drawable instead of on GaussianContent means a cache eviction between frames surfaces as a null slot here (skipping the draw) rather than a stale BufferObject.id bind on a content-cached ref.
Focal length in pixels = viewportHeight / (2 * tan(fov / 2)). Caller sets at enqueue time from rc.viewport.height + rc.camera.fieldOfView.
World-space bounding sphere center used to skip cascades whose AABB doesn't intersect this caster. Default null opts out of culling — the caster is dispatched into every cascade. Implementations populate this from their shape's boundingBox.center to gain per-cascade culling.
World-space bounding sphere radius. Only consulted when shadowCasterCenter is non-null.
Global splat-size multiplier piped into the shader's per-splat sizing. Defaults to 1.
Functions
Cascade depth-pass dispatch. Mirrors DrawableTilePoints.drawShadowDepth: binds the centers VBO + a single position attribute, issues GL_POINTS into the cascade depth texture. One pixel per splat → the receiver's PCF softens them into ground halos.