Packs one view's shadow tail — the 80 bytes after the landed block — into
staging at floatBase, writeLightUniforms' contract continued: every
float is written on every shaded view, zeros when no light casts, so
the uploaded stride is a function of this frame's SceneLights alone and a
frame that stops casting cannot leak the previous frame's matrix into its
transcript (§33). Zeros are also what a fresh staging array holds, which is
what keeps every landed shadowless upload byte-identical.
When a light casts, the values are ShadowUniforms.uploadView's, member
for member; the tap offset divides here once per view — mapSize is a
positive integer whenever hasShadow is true (lights.ts refuses
anything else), so the division cannot be by zero on the path that
reaches it.
Packs one view's shadow tail — the 80 bytes after the landed block — into
stagingatfloatBase,writeLightUniforms' contract continued: every float is written on every shaded view, zeros when no light casts, so the uploaded stride is a function of this frame'sSceneLightsalone and a frame that stops casting cannot leak the previous frame's matrix into its transcript (§33). Zeros are also what a fresh staging array holds, which is what keeps every landed shadowless upload byte-identical.When a light casts, the values are
ShadowUniforms.uploadView's, member for member; the tap offset divides here once per view —mapSizeis a positive integer wheneverhasShadowis true (lights.tsrefuses anything else), so the division cannot be by zero on the path that reaches it.