Stores per-slot dash / gap patterns for the thick-line draw technique.

The renderer routes each line-mesh's per-material SceneMaterial.linePattern into one slot in this table (per batch, allocated on demand by GPUMemoryBatch). A 16-bit slot index lands in MeshAttributeTexture's alpha slot; the thick-line vertex shader reads that index and, when non-zero, fetches the slot's two texels here to recover the pattern.

Slot 0 is reserved as the "no per-mesh pattern" sentinel — meshes whose materials carry no pattern leave the slot index at 0, and the shader falls back to the View-level linesMaterial.linePattern uniform.

Two texels per slot, eight u32 elements (linearised — base is slotIndex * elementsPerItem):

  • base + 0..3 pattern entries [0..3] — Float32 bit patterns (line-width units, recovered via uintBitsToFloat in the shader).
  • base + 4..6 pattern entries [4..6].
  • base + 7 pattern entry [7] in the high bits… and pattern length [0..8] in the low byte of the eighth slot? No — keep it simple and store len in a third half-texel.

In practice we use two full texels for the 8 entries and put the length in the unused channel of the second texel's last slot. The shader unpacks the length from the same u32 bit pattern's high byte before reinterpreting the rest as a Float32. Avoids a third texel for a single byte.

Concrete layout adopted here — eight slots wide:

  • base + 0 entry[0] (Float32 bits)
  • base + 1 entry[1]
  • base + 2 entry[2]
  • base + 3 entry[3]
  • base + 4 entry[4]
  • base + 5 entry[5]
  • base + 6 entry[6]
  • base + 7 entry[7]

Pattern length is not stored here — it's reconstructed in the shader by counting trailing-zero entries (zero-padded by the CPU encoder). That keeps the texel-per-slot count to exactly two RGBA32UI texels.

Hierarchy (View Summary)

Constructors

Properties

buffer: any

CPU-side backing buffer used to populate this texture.

The concrete type depends on the implementation (e.g., Uint32Array, Float32Array, or a view over an ArrayBuffer). This buffer is uploaded to the GPU when updated.

bufferClass: any

The ArrayBufferView class used for the CPU-side buffer.

bytesPerTexel: number

Size in bytes of a single texel in the data texture.

debugging: boolean = true

Enables internal event emission for this data texture.

description: string = ""

Human-readable description of the data stored in this texture.

Intended for debugging UIs and diagnostics (e.g., displayed above inspectors). Subclasses or owners should populate this with a concise explanation of the layout and semantic meaning (e.g., “mesh matrices (Mat4, row-major), indexed by meshId”).

elementsPerItem: number

Number of individual elements (e.g., floats, uint32s) stored per logical item in this data texture.

elementsPerTexel: number

Number of individual elements (e.g., floats, uint32s) stored per texel in the data texture.

format: number

Texture format (e.g., gl.RGBA, gl.RGBA_INTEGER).

gl: WebGL2RenderingContext

The WebGL2 rendering context.

height: number

Texture height in texels.

internalFormat: number

Texture internal format (e.g., gl.RGBA8, gl.RGBA32UI, gl.RGBA32F).

itemSizeInBytes: number

Size in bytes of a single logical item stored in the data texture.

lastUploadTimeMS: number = 0

Duration (in milliseconds) of the last upload to GPU.

This value is 0 until the first upload occurs.

maxItems: number

Maximum number of logical items that can be stored in this texture.

The value of numItems never exceeds this limit.

onUpdated: EventEmitter<DataTexture, undefined> = ...

Emitted when the CPU-side buffer for this texture has changed and been uploaded to the GPU.

This event is intended for debugging tools and monitoring UIs; it is only emitted when debugging is enabled.

texelsPerItem: number

Number of texels occupied by a single logical item in the data texture.

texture: WebGLTexture

The underlying WebGL texture object.

This is the GPU resource that is bound and sampled/loaded by shaders.

type: number

Texture data type (e.g., gl.UNSIGNED_BYTE, gl.UNSIGNED_INT, gl.FLOAT).

useBuffer: boolean

Whether to use a CPU-side buffer for staging data before uploading to the GPU.

width: number

Texture width in texels.

itemSizeInBytes: 32

Accessors

Methods

  • Writes the eight pattern entries for slotIndex as raw Float32 bit patterns. Trailing entries past entries.length (or past index 7) are zero-padded so the shader can sum the full 8-entry array to recover the period without consulting a separate length.

    Slot 0 is the "no pattern" sentinel and should not be written — callers allocate slots starting at index 1.

    Parameters

    • slotIndex: number
    • entries: Float32Array

    Returns void

  • Uploads all dirty items to the GPU as efficiently as possible.

    Internal algorithm:

    • Dirty items are indices of items whose data has changed and needs to be uploaded to the GPU.
    • The method sorts all dirty indices and finds contiguous runs (sequences of adjacent indices).
    • For each run, it uploads the run in chunks, where each chunk fits within a row of the texture.
    • This minimizes the number of WebGL texSubImage2D calls by uploading as large a block as possible per call.
    • After all dirty items are uploaded, the dirty set is cleared, the texture is unbound, and update notifications are sent.

    Returns boolean

    True if any uploads occurred, false otherwise.