@loaders.gl/draco
Version:
Framework-independent loader and writer for Draco compressed meshes and point clouds
67 lines (61 loc) • 2.05 kB
text/typescript
// 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();
}
}