Optional Readonlyclip§67's clip, shared by every merged item, or null where none of them is
clipped (R-23, 2026-08-21).
A run breaks where the record changes, so this is one value for the whole batch exactly as the material is: the same material under two different clips is two different draws, and merging them would let one scroll view's content escape into another's. A backend applies it exactly as it applies a single item's.
Never a mask pass: every clip owns its own bit plane and emits exactly one mask draw, so two consecutive mask items never share a record and a run of them never forms.
Optional for RenderItem.clip's reason — a hand-built batch predating §67
must still typecheck, and undefined reads as "unclipped" — but the
batcher itself always writes it.
ReadonlycolorThe RGBA the whole batch is tinted by — an unlit material's color or a
sprite material's tint, the same live array the material owns (copy it if
you need to keep it).
One value for the batch because "same material instance" is the batching rule: §55's tint and §57's colour are material state, so merging never needs them per vertex. That is also why a sprite batch carries no colour stream (see RenderBatch.hasColors).
Optional ReadonlycontentChange-detection stamp for §65 / §86's idle batch cache (R-8 follow-up).
A non-zero value is an FNV-1a mix of each merged item's geometry version,
transform version, and world-matrix elements. The WebGL uploader skips
bufferSubData when this stamp and the vertex/index counts match the
last upload into the same layout slot.
0 means "versions unavailable — always re-upload." That is today's
default: a hand-built item with no transformVersion, or any run that
includes one, keeps the pre-cache upload path so a scene that never
opted into versioning is bit-identical.
ReadonlyfloatsFloats per vertex in the interleaved stream: position (3), then uv (2) when RenderBatch.hasUvs, then colour (4) when RenderBatch.hasColors, in that order.
ReadonlyhasWhether the stream carries per-vertex colour, i.e. whether the material
declares §53's vertexColors (R-19). Always false for a sprite batch:
§55's tint is material state, shared by the run by construction.
ReadonlyhasWhether the stream carries uv, i.e. whether the material samples a texture. Always true for a sprite batch (§55's quad is a texture map by definition).
ReadonlyindexIndices in RenderBatch.indices; the draw's element count.
ReadonlyindicesIndices into RenderBatch.vertices, already offset per item.
ReadonlyitemsHow many consecutive render items this batch consumed. Always ≥ 2 — a run of one is not a batch (see the module header).
ReadonlykindWhich pipeline draws it (§64, §66 key 3) — the merged items' kind.
ReadonlymaterialThe one material every merged item carries — the same object, not an equal one. Every piece of §57 render state the draw needs is read off it.
ReadonlymodeThe merged items' shared draw mode (§53).
Readonlyopacity§57's opacity for the shared material, multiplying the alpha above.
Optional Readonlyscissor§67 rectangular scissor, shared by every merged item, or null where
none of them names one (2026-09-06).
A run breaks where the rectangle changes, so this is one value for the
whole batch: two same-material draws under different scissors are two
different draws. undefined reads as "no per-item scissor", matching
RenderItem.scissor.
ReadonlytextureThe texture the batch samples — a sprite material's texture (§55) or an
unlit material's map (§57, R-19) — or null when it samples none.
Resolved here rather than by the backend so the draw path reads one
field instead of asking which kind of material this is; the same reason
RenderItem snapshots transparent and materialId rather than chasing
the material per comparison. A backend still resolves it to a GPU handle
through its own cache, and a batch whose texture resolves to nothing is
skipped or drawn untextured by exactly the rule that backend applies to a
single item.
ReadonlyvertexVertices in RenderBatch.vertices.
ReadonlyverticesInterleaved vertex data, world-space positions. See the interface note.
One merged draw:
itemsconsecutive render items, concatenated into one interleaved vertex stream and one index stream.Pooled and rewritten. The record and both typed arrays belong to the RenderBatcher that produced them and are overwritten by its next RenderBatcher.next call.
verticesandindicesare the batcher's whole staging arrays, which may be longer than this batch needs — readvertexCount × floatsPerVertexfloats andindexCountindices, and upload with the five-argumentbufferSubDatarather than taking asubarray(which would allocate a view per frame).