Compiles the §69 skinned caster on first call and returns it. Subsequent calls reuse the pipeline for the same descriptor. Throws on compile failure — the renderer latches that and skips skinned casters on this device. A bind-pose shadow is never drawn.
Drops pipelines and destroys the palette buffer. Live device only.
Drops everything without destroying — the §61 device-loss path.
Packs palette into the next slot of the frame's palette buffer and
returns the dynamic offset the draw binds at. The skeleton's own
Float32Array is copied — no scratch beyond the slot — and a short
palette leaves the slot's dead tail zeroed.
The palette bind group, or null before SkinnedPrograms.prepare.
Bind-group index the palette occupies for this variant: group 1 on untextured unlit, group 2 on textured unlit and untextured lit, group 3 on textured lit — always the slot after the family's existing groups.
Grows the palette buffer to hold draws palettes. Call before the
pass is recorded (sized-before-recording); a mid-pass grow would orphan
the bound group. 0 is a no-op.
Uploads packed palettes after the pass, before submit — the draw uniforms' one-upload-per-frame shape. Absent to the byte when nothing packed.
One device's compiled skinned colour pair — created lazily on the first skinned draw, dropped on device loss, disposed with the renderer.
The palette is a separate bind group: 48 × 64-byte matrices are 3072 bytes, which will not fit in the 256-byte
DrawUniformsstride, and widening that block would move every landed unskinned transcript.