Per-vertex morph-target deltas as a read-only storage buffer, or null when
the primitive has no morph targets. Vertex-major vec4 rows:
base = (vertexIndex × morphTargetCount + target) × 3, where row 0 = ΔPOSITION,
row 1 = ΔNORMAL, row 2 = ΔTANGENT.xyz (zero-filled when a target lacks the
attribute). Owned by the model; released in GltfModel.destroy.
Number of morph targets (0 = none); the vertex shader's loop bound.
Vertex count of this primitive (rows in morphDeltas).
Index into gltf.meshes this primitive came from — maps mesh→primitive run.
OptionalvariantKHR_materials_variants: variant index → the material to use for this primitive under that variant, or undefined when the primitive defines no variant mapping. Switch the active variant via GltfModel.setVariant (which reassigns GltfMeshData.material); unmapped variants fall back to the default.
OptionalcpuDecoded CPU geometry (bind-pose, object space), retained only when
GltfLoader.load is called with keepData: true. Lets callers build
shadow proxies / merged meshes / bounds without re-parsing the GLB — and
works uniformly for compressed geometry (Draco / meshopt / quantization),
which the loader has already decoded. tangents are the authored or
loader-computed vec4s; indices is the triangle list.
One renderable primitive parsed from a glTF mesh.
Pairs a GPU-resident skinned mesh with the resolved PBR material.