@deck.gl/mesh-layers provides specialized deck.gl layers for rendering 3D meshes and scene graphs in WebGL-based data visualizations. It includes two main layer types for different 3D rendering needs: SimpleMeshLayer for individual 3D meshes and ScenegraphLayer for complete glTF scene graphs with animations.
npm install @deck.gl/mesh-layersimport { SimpleMeshLayer, ScenegraphLayer } from "@deck.gl/mesh-layers";
import type { SimpleMeshLayerProps, ScenegraphLayerProps } from "@deck.gl/mesh-layers";For CommonJS:
const { SimpleMeshLayer, ScenegraphLayer } = require("@deck.gl/mesh-layers");import { SimpleMeshLayer, ScenegraphLayer } from "@deck.gl/mesh-layers";
import { CubeGeometry } from "@luma.gl/engine";
// Simple mesh rendering
const meshLayer = new SimpleMeshLayer({
id: 'mesh-layer',
data: [{position: [0, 0, 0], color: [255, 0, 0]}],
mesh: new CubeGeometry(),
getPosition: d => d.position,
getColor: d => d.color,
sizeScale: 100
});
// glTF scene graph rendering with animations
const scenegraphLayer = new ScenegraphLayer({
id: 'scenegraph-layer',
data: [{coordinates: [-122.4, 37.8, 0]}],
scenegraph: 'https://example.com/model.gltf',
getPosition: d => d.coordinates,
_lighting: 'pbr',
_animations: {'*': {speed: 1}}
});@deck.gl/mesh-layers is built around deck.gl's layering system with WebGL rendering:
Renders multiple instances of a single 3D mesh with per-instance transformations, colors, and materials. Supports custom geometries, textures, and lighting effects.
class SimpleMeshLayer<DataT = any, ExtraPropsT extends {} = {}> extends Layer<
ExtraPropsT & Required<SimpleMeshLayerProps<DataT>>
> {
constructor(props: SimpleMeshLayerProps<DataT> & ExtraPropsT);
static readonly layerName: "SimpleMeshLayer";
static readonly defaultProps: DefaultProps<SimpleMeshLayerProps>;
}Renders complete glTF scene graphs with support for hierarchical node structures, animations, and PBR materials. Ideal for complex 3D models with multiple components.
class ScenegraphLayer<DataT = any, ExtraPropsT extends {} = {}> extends Layer<
ExtraPropsT & Required<ScenegraphLayerProps<DataT>>
> {
constructor(props: ScenegraphLayerProps<DataT> & ExtraPropsT);
static readonly layerName: "ScenegraphLayer";
static readonly defaultProps: DefaultProps<ScenegraphLayerProps>;
}type Position = [number, number, number];
type Color = [number, number, number, number];
type Orientation = [number, number, number]; // [pitch, yaw, roll] in degrees
type Scale = [number, number, number];
type Translation = [number, number, number];
interface LayerDataSource<DataT> extends Array<DataT> {}
type Accessor<DataT, ValueT> =
| ValueT
| ((d: DataT, info?: {index: number; target: any[]}) => ValueT);
interface DefaultProps<PropsT> {
[key: string]: {
type?: string;
value?: any;
min?: number;
max?: number;
async?: boolean;
ignore?: boolean;
};
}type Mesh =
| Geometry
| {
attributes: MeshAttributes;
indices?: MeshAttribute;
}
| MeshAttributes;
interface MeshAttributes {
positions?: MeshAttribute;
POSITION?: MeshAttribute;
colors?: MeshAttribute;
COLOR_0?: MeshAttribute;
normals?: MeshAttribute;
NORMAL?: MeshAttribute;
texCoords?: MeshAttribute;
TEXCOORD_0?: MeshAttribute;
}
interface MeshAttribute {
size: number;
value: Float32Array | Uint16Array | Uint32Array;
}// From @luma.gl/engine
interface Geometry {
attributes: MeshAttributes;
indices?: MeshAttribute;
topology?: string;
}
interface GroupNode {
children: ScenegraphNode[];
destroy(): void;
}
interface ScenegraphNode {
children?: ScenegraphNode[];
modelNode?: ModelNode;
}
interface ModelNode {
model: Model;
}
interface Model {
destroy(): void;
draw(options?: any): void;
}// From @deck.gl/core
interface Material {
ambient?: number;
diffuse?: number;
shininess?: number;
specularColor?: [number, number, number];
}
// From @luma.gl/gltf
interface GLTFAnimator {
setTime(time: number): void;
getAnimations(): any[];
}
interface PBREnvironment {
brdfLutTexture?: any;
diffuseEnvSampler?: any;
specularEnvSampler?: any;
}
// From @luma.gl/core
interface Device {
gl: WebGL2RenderingContext;
}
interface SamplerProps {
[key: string]: any;
}
type TextureSource = string | HTMLImageElement | HTMLCanvasElement | ImageData | any;// From @loaders.gl/gltf
interface GLTFLoader {
name: string;
id: string;
module: string;
version: string;
extensions: string[];
mimeTypes: string[];
binary: boolean;
parse: (arrayBuffer: ArrayBuffer, options?: any) => Promise<any>;
}
// Layer system types from @deck.gl/core
interface LayerContext {
device: Device;
gl: WebGL2RenderingContext;
viewport: any;
}
interface UpdateParameters<LayerT> {
props: any;
oldProps: any;
context: LayerContext;
changeFlags: any;
}
interface ShaderModule {
name: string;
vs?: string;
fs?: string;
defines?: Record<string, any>;
dependencies?: ShaderModule[];
}