UNPKG

@loaders.gl/draco

Version:

Framework-independent loader and writer for Draco compressed meshes and point clouds

67 lines (61 loc) 2.05 kB
// loaders.gl // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors import type {Loader, LoaderWithParser, StrictLoaderOptions} from '@loaders.gl/loader-utils'; import {extractLoadLibraryOptions} from '@loaders.gl/worker-utils'; import type {DracoMesh} from './lib/draco-types'; import type {DracoParseOptions} from './lib/draco-parser'; import {VERSION} from './lib/utils/version'; import DracoParser from './lib/draco-parser'; import {loadDracoDecoderModule} from './lib/draco-module-loader'; export type DracoLoaderOptions = StrictLoaderOptions & { draco?: DracoParseOptions & { /** @deprecated WASM decoding is faster but JS is more backwards compatible */ decoderType?: 'wasm' | 'js'; /** Override the URL to the worker bundle (by default loads from unpkg.com) */ workerUrl?: string; }; }; /** * Worker loader for Draco3D compressed geometries */ export const DracoWorkerLoader = { dataType: null as unknown as DracoMesh, batchType: null as never, name: 'Draco', id: 'draco', module: 'draco', // shapes: ['mesh'], version: VERSION, worker: true, extensions: ['drc'], mimeTypes: ['application/octet-stream'], binary: true, tests: ['DRACO'], options: { draco: { decoderType: typeof WebAssembly === 'object' ? 'wasm' : 'js', // 'js' for IE11 extraAttributes: {}, attributeNameEntry: undefined } } } as const satisfies Loader<DracoMesh, never, DracoLoaderOptions>; /** * Loader for Draco3D compressed geometries */ export const DracoLoader = { ...DracoWorkerLoader, parse } as const satisfies LoaderWithParser<DracoMesh, never, DracoLoaderOptions>; async function parse(arrayBuffer: ArrayBuffer, options?: DracoLoaderOptions): Promise<DracoMesh> { const {draco} = await loadDracoDecoderModule( extractLoadLibraryOptions(options), options?.draco?.decoderType || 'wasm' ); const dracoParser = new DracoParser(draco); try { return dracoParser.parseSync(arrayBuffer, options?.draco); } finally { dracoParser.destroy(); } }