Skip to main content

Geometry

Geometry is the CPU-side geometry container used by engine classes. It stores typed-array attributes, optional indices, and a bufferLayout. When a layout is not supplied, Geometry creates a one-buffer-per-attribute layout automatically. Use makeInterleavedGeometry() to pack multiple CPU attributes into one vertex buffer while still representing the result as a normal Geometry.

Usage​

import {Geometry} from '@luma.gl/engine';

const geometry = new Geometry({
topology: 'triangle-list',
attributes: {
POSITION: {size: 3, value: new Float32Array([0, 0, 0, 1, 0, 0, 0, 1, 0])}
}
});

Types​

GeometryProps​

export type GeometryProps = {
id?: string;
topology: 'point-list' | 'line-list' | 'line-strip' | 'triangle-list' | 'triangle-strip';
vertexCount?: number;
attributes: Record<string, GeometryAttributeInput>;
bufferLayout?: BufferLayout[];
indices?: GeometryAttribute | TypedArray;
};

GeometryAttributeInput​

export type GeometryAttributeInput = GeometryAttribute | TypedArray;

GeometryAttribute​

export type GeometryAttribute = {
size?: number;
value: TypedArray;
[key: string]: any;
};

Properties​

id​

Application-provided identifier.

topology​

Primitive topology used by consumers of the geometry.

vertexCount​

Explicit or auto-calculated vertex count.

indices​

Optional index attribute.

attributes​

Named CPU geometry attributes. Geometry preserves the keys supplied to the constructor. Built-in geometries and @luma.gl/gltf use glTF mesh attribute semantics such as POSITION, NORMAL, and TEXCOORD_0; glTF calls these mesh attribute semantics, while each semantic points to accessor data in mesh.primitive.attributes. See the official glTF 2.0 specification.

Shader-facing names are separate. Synthesized buffer layouts map supported semantic names at the render boundary: POSITION becomes positions, NORMAL becomes normals, TEXCOORD_0 becomes texCoords, TEXCOORD_1 becomes texCoords1, and COLOR_0 becomes colors. Caller-provided non-glTF names such as positions, clipSpacePositions, and faceIndex are preserved as-is. When writing glTF custom semantics, use the spec's _NAME convention. If constructor input contains both a semantic key and its supported shader-facing name, the later key wins so built-in geometry attribute overrides keep their legacy behavior without storing duplicate CPU aliases.

For non-interleaved geometry, each attribute key normally names one typed-array attribute. For interleaved geometry, the attribute key names the packed buffer, and bufferLayout maps that buffer back to shader attributes.

bufferLayout​

The buffer layout for the geometry attributes. It is always populated on constructed Geometry instances. If omitted, the constructor creates one shader-facing layout entry for each attribute. Explicit bufferLayout entries are preserved unchanged.

userData​

Application-owned metadata.

Methods​

constructor(props: GeometryProps)​

Creates a geometry object and wraps raw typed arrays into GeometryAttribute records.

getVertexCount(): number​

Returns the resolved vertex count.

getAttributes(): GeometryAttributes​

Returns the geometry attributes, including indices when present.

makeInterleavedGeometry(geometry, options?): Geometry​

Packs non-index geometry attributes into one typed-array-backed buffer and returns a normal Geometry. The returned geometry has one attribute, named geometry by default, and a multi-attribute bufferLayout.

import {Geometry, makeInterleavedGeometry} from '@luma.gl/engine';

const geometry = new Geometry({
topology: 'triangle-list',
attributes: {
POSITION: {size: 3, value: new Float32Array([0, 0, 0, 1, 0, 0, 0, 1, 0])},
TEXCOORD_0: {size: 2, value: new Float32Array([0, 0, 1, 0, 0, 1])}
}
});

const interleavedGeometry = makeInterleavedGeometry(geometry);

interleavedGeometry.attributes.geometry; // packed Uint8Array
interleavedGeometry.bufferLayout; // maps positions and texCoords into the packed buffer

Calling makeInterleavedGeometry() on an already interleaved geometry with the same buffer name is idempotent and returns the original instance.

Remarks​

  • POSITION or positions defaults to size: 3 when the size is omitted.
  • bufferLayout is synthesized when omitted.
  • makeGPUGeometry() interleaves CPU Geometry before uploading it to GPU buffers.
  • Use GPUGeometry when geometry data is already uploaded into GPU buffers.