Fused texel writer: one pass over the staged arrays into the
texture's backing store, in the 4-texel layout documented in
./element-texture-layout. Replaces the six per-attribute strided
writes of the interleaved era — fewer passes over the data.
Returns the written count, clamped to the texture's capacity
(capacity clamping warns once at acquire time; this clamp keeps the
write memory-safe if a caller slips past it).
opts.fromSplat (depth-sorting Phase 4 Stage 2, the append fast path):
skip writing texels [0, fromSplat) and register the dirty range for
only the [fromSplat, n) suffix. The prefix texels are already correct
on the texture's CPU mirror from the earlier commit that wrote them
(the commit layer only sets fromSplat > 0 when the projected prefix
is provably byte-identical — same view state + prefix-identical input +
intact GPU buffer), so re-writing and re-uploading them is redundant.
Source arrays are still full-length count; only the loop lower bound
and the dirty-range start move — the length guard below is unchanged.
Fused texel writer: one pass over the staged arrays into the texture's backing store, in the 4-texel layout documented in
./element-texture-layout. Replaces the six per-attribute strided writes of the interleaved era — fewer passes over the data.Returns the written count, clamped to the texture's capacity (capacity clamping warns once at acquire time; this clamp keeps the write memory-safe if a caller slips past it).
opts.fromSplat(depth-sorting Phase 4 Stage 2, the append fast path): skip writing texels[0, fromSplat)and register the dirty range for only the[fromSplat, n)suffix. The prefix texels are already correct on the texture's CPU mirror from the earlier commit that wrote them (the commit layer only setsfromSplat > 0when the projected prefix is provably byte-identical — same view state + prefix-identical input + intact GPU buffer), so re-writing and re-uploading them is redundant. Source arrays are still full-lengthcount; only the loop lower bound and the dirty-range start move — the length guard below is unchanged.