UNPKG

@gltf-transform/extensions

Version:

Adds extension support to @gltf-transform/core

83 lines (82 loc) 3.46 kB
import { Extension, PropertyType, type ReaderContext, type WriterContext } from '@gltf-transform/core'; import { EXT_MESH_GPU_INSTANCING } from '../constants.js'; import { InstancedMesh } from './instanced-mesh.js'; /** * [`EXT_mesh_gpu_instancing`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing/) * prepares mesh data for efficient GPU instancing. * * GPU instancing allows engines to render many copies of a single mesh at once using a small number * of draw calls. Instancing is particularly useful for things like trees, grass, road signs, etc. * Keep in mind that predefined batches, as used in this extension, may prevent frustum culling * within a batch. Dividing batches into collocated cells may be preferable to using a single large * batch. * * > _**NOTICE:** While this extension stores mesh data optimized for GPU instancing, it * > is important to note that (1) GPU instancing and other optimizations are possible — and * > encouraged — even without this extension, and (2) other common meanings of the term * > "instancing" exist, distinct from this extension. See * > [Appendix: Motivation and Purpose](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing#appendix-motivation-and-purpose) * > of the `EXT_mesh_gpu_instancing` specification._ * * Properties: * - {@link InstancedMesh} * * ### Example * * The `EXTMeshGPUInstancing` class provides a single {@link ExtensionProperty} type, `InstancedMesh`, * which may be attached to any {@link Node} instance. For example: * * ```typescript * import { EXTMeshGPUInstancing } from '@gltf-transform/extensions'; * * // Create standard mesh, node, and scene hierarchy. * // ... * * // Assign positions for each instance. * const batchPositions = doc.createAccessor('instance_positions') * .setArray(new Float32Array([ * 0, 0, 0, * 1, 0, 0, * 2, 0, 0, * ])) * .setType(Accessor.Type.VEC3) * .setBuffer(buffer); * * // Assign IDs for each instance. * const batchIDs = doc.createAccessor('instance_ids') * .setArray(new Uint8Array([0, 1, 2])) * .setType(Accessor.Type.SCALAR) * .setBuffer(buffer); * * // Create an Extension attached to the Document. * const batchExtension = document.createExtension(EXTMeshGPUInstancing) * .setRequired(true); * const batch = batchExtension.createInstancedMesh() * .setAttribute('TRANSLATION', batchPositions) * .setAttribute('_ID', batchIDs); * * node * .setMesh(mesh) * .setExtension('EXT_mesh_gpu_instancing', batch); * ``` * * Standard instance attributes are `TRANSLATION`, `ROTATION`, and `SCALE`, and support the accessor * types allowed by the extension specification. Custom instance attributes are allowed, and should * be prefixed with an underscore (`_*`). */ export declare class EXTMeshGPUInstancing extends Extension { readonly extensionName: typeof EXT_MESH_GPU_INSTANCING; /** @hidden */ readonly provideTypes: PropertyType[]; /** @hidden */ readonly prewriteTypes: PropertyType[]; static readonly EXTENSION_NAME: typeof EXT_MESH_GPU_INSTANCING; /** Creates a new InstancedMesh property for use on a {@link Node}. */ createInstancedMesh(): InstancedMesh; /** @hidden */ read(context: ReaderContext): this; /** @hidden */ prewrite(context: WriterContext): this; /** @hidden */ write(context: WriterContext): this; }