{ "version": 3, "sources": ["../../worker-utils/src/lib/env-utils/version.ts", "../../worker-utils/src/lib/env-utils/assert.ts", "../../worker-utils/src/lib/env-utils/globals.ts", "../../worker-utils/src/lib/node/worker_threads-browser.ts", "../../worker-utils/src/lib/worker-utils/get-transfer-list.ts", "../../worker-utils/src/lib/worker-farm/worker-body.ts", "../../worker-utils/src/lib/library-utils/library-utils.ts", "../src/lib/draco-builder.ts", "../src/lib/draco-module-loader.ts", "../src/lib/utils/version.ts", "../src/draco-writer.ts", "../src/workers/draco-writer-worker.ts"], "sourcesContent": ["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Version constant cannot be imported, it needs to correspond to the build version of **this** module.\n\n/**\n * TODO - unpkg.com doesn't seem to have a `latest` specifier for alpha releases...\n * 'beta' on beta branch, 'latest' on prod branch\n */\nexport const NPM_TAG = 'latest';\n\ndeclare let __VERSION__: string;\n\nfunction getVersion() {\n if (!globalThis._loadersgl_?.version) {\n globalThis._loadersgl_ = globalThis._loadersgl_ || {};\n // __VERSION__ is injected by babel-plugin-version-inline\n if (typeof __VERSION__ === 'undefined') {\n // eslint-disable-next-line\n console.warn(\n 'loaders.gl: The __VERSION__ variable is not injected using babel plugin. Latest unstable workers would be fetched from the CDN.'\n );\n globalThis._loadersgl_.version = NPM_TAG;\n } else {\n globalThis._loadersgl_.version = __VERSION__;\n }\n }\n\n return globalThis._loadersgl_.version;\n}\n\nexport const VERSION = getVersion();\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Replacement for the external assert method to reduce bundle size\n// Note: We don't use the second \"message\" argument in calling code,\n// so no need to support it here\n\n/** Throws an `Error` with the optional `message` if `condition` is falsy */\nexport function assert(condition: any, message?: string): void {\n if (!condition) {\n throw new Error(message || 'loaders.gl assertion failed.');\n }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Purpose: include this in your module to avoids adding dependencies on\n// micro modules like 'global' and 'is-browser';\n\n/* eslint-disable no-restricted-globals */\nconst globals = {\n self: typeof self !== 'undefined' && self,\n window: typeof window !== 'undefined' && window,\n global: typeof global !== 'undefined' && global,\n document: typeof document !== 'undefined' && document\n};\n\nconst self_: {[key: string]: any} = globals.self || globals.window || globals.global || {};\nconst window_: {[key: string]: any} = globals.window || globals.self || globals.global || {};\nconst global_: {[key: string]: any} = globals.global || globals.self || globals.window || {};\nconst document_: {[key: string]: any} = globals.document || {};\n\nexport {self_ as self, window_ as window, global_ as global, document_ as document};\n\n/** true if running in the browser, false if running in Node.js */\nexport const isBrowser: boolean =\n // @ts-ignore process.browser\n typeof process !== 'object' || String(process) !== '[object process]' || process.browser;\n\n/** true if running on a worker thread */\nexport const isWorker: boolean = typeof importScripts === 'function';\n\n/** true if running on a mobile device */\nexport const isMobile: boolean =\n typeof window !== 'undefined' && typeof window.orientation !== 'undefined';\n\n// Extract node major version\nconst matches =\n typeof process !== 'undefined' && process.version && /v([0-9]*)/.exec(process.version);\n\n/** Version of Node.js if running under Node, otherwise 0 */\nexport const nodeVersion: number = (matches && parseFloat(matches[1])) || 0;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/** Browser polyfill for Node.js built-in `worker_threads` module.\n * These fills are non-functional, and just intended to ensure that\n * `import 'worker_threads` doesn't break browser builds.\n * The replacement is done in package.json browser field\n */\nexport class NodeWorker {\n terminate() {}\n}\n\nexport type {NodeWorker as NodeWorkerType};\n\nexport const parentPort = null;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// NOTE - there is a copy of this function is both in core and loader-utils\n// core does not need all the utils in loader-utils, just this one.\n\n/**\n * Returns an array of Transferrable objects that can be used with postMessage\n * https://developer.mozilla.org/en-US/docs/Web/API/Worker/postMessage\n * @param object data to be sent via postMessage\n * @param recursive - not for application use\n * @param transfers - not for application use\n * @returns a transfer list that can be passed to postMessage\n */\nexport function getTransferList(\n object: any,\n recursive: boolean = true,\n transfers?: Set\n): Transferable[] {\n // Make sure that items in the transfer list is unique\n const transfersSet = transfers || new Set();\n\n if (!object) {\n // ignore\n } else if (isTransferable(object)) {\n transfersSet.add(object);\n } else if (isTransferable(object.buffer)) {\n // Typed array\n transfersSet.add(object.buffer);\n } else if (ArrayBuffer.isView(object)) {\n // object is a TypeArray viewing into a SharedArrayBuffer (not transferable)\n // Do not iterate through the content in this case\n } else if (recursive && typeof object === 'object') {\n for (const key in object) {\n // Avoid perf hit - only go one level deep\n getTransferList(object[key], recursive, transfersSet);\n }\n }\n\n // If transfers is defined, is internal recursive call\n // Otherwise it's called by the user\n return transfers === undefined ? Array.from(transfersSet) : [];\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Transferable\nfunction isTransferable(object: unknown) {\n if (!object) {\n return false;\n }\n if (object instanceof ArrayBuffer) {\n return true;\n }\n if (typeof MessagePort !== 'undefined' && object instanceof MessagePort) {\n return true;\n }\n if (typeof ImageBitmap !== 'undefined' && object instanceof ImageBitmap) {\n return true;\n }\n // @ts-ignore\n if (typeof OffscreenCanvas !== 'undefined' && object instanceof OffscreenCanvas) {\n return true;\n }\n return false;\n}\n\n/**\n * Recursively drop non serializable values like functions and regexps.\n * @param object\n */\nexport function getTransferListForWriter(object: object | null): object {\n if (object === null) {\n return {};\n }\n const clone = Object.assign({}, object);\n\n Object.keys(clone).forEach((key) => {\n // Typed Arrays and Arrays are passed with no change\n if (\n typeof object[key] === 'object' &&\n !ArrayBuffer.isView(object[key]) &&\n !(object[key] instanceof Array)\n ) {\n clone[key] = getTransferListForWriter(object[key]);\n } else if (typeof clone[key] === 'function' || clone[key] instanceof RegExp) {\n clone[key] = {};\n } else {\n clone[key] = object[key];\n }\n });\n\n return clone;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WorkerMessageData, WorkerMessageType, WorkerMessagePayload} from '../../types';\nimport {getTransferList} from '../worker-utils/get-transfer-list';\n// import type {TransferListItem} from '../node/worker_threads';\nimport {parentPort} from '../node/worker_threads';\n\ntype TransferListItem = any;\n\n/** Vile hack to defeat over-zealous bundlers from stripping out the require */\nasync function getParentPort() {\n // const isNode = globalThis.process;\n // let parentPort;\n // try {\n // // prettier-ignore\n // eval('globalThis.parentPort = require(\\'worker_threads\\').parentPort'); // eslint-disable-line no-eval\n // parentPort = globalThis.parentPort;\n // } catch {\n // try {\n // // prettier-ignore\n // eval('globalThis.workerThreadsPromise = import(\\'worker_threads\\')'); // eslint-disable-line no-eval\n // const workerThreads = await globalThis.workerThreadsPromise;\n // parentPort = workerThreads.parentPort;\n // } catch (error) {\n // console.error((error as Error).message); // eslint-disable-line no-console\n // }\n // }\n return parentPort;\n}\n\nconst onMessageWrapperMap = new Map();\n\n/**\n * Type safe wrapper for worker code\n */\nexport default class WorkerBody {\n /** Check that we are actually in a worker thread */\n static async inWorkerThread(): Promise {\n return typeof self !== 'undefined' || Boolean(await getParentPort());\n }\n\n /*\n * (type: WorkerMessageType, payload: WorkerMessagePayload) => any\n */\n static set onmessage(onMessage: (type: WorkerMessageType, payload: WorkerMessagePayload) => any) {\n async function handleMessage(message) {\n const parentPort = await getParentPort();\n // Confusingly the message itself also has a 'type' field which is always set to 'message'\n const {type, payload} = parentPort ? message : message.data;\n // if (!isKnownMessage(message)) {\n // return;\n // }\n onMessage(type, payload);\n }\n\n getParentPort().then((parentPort) => {\n if (parentPort) {\n parentPort.on('message', (message) => {\n handleMessage(message);\n });\n // if (message == 'exit') { parentPort.unref(); }\n // eslint-disable-next-line\n parentPort.on('exit', () => console.debug('Node worker closing'));\n } else {\n // eslint-disable-next-line no-restricted-globals\n globalThis.onmessage = handleMessage;\n }\n });\n }\n\n static async addEventListener(\n onMessage: (type: WorkerMessageType, payload: WorkerMessagePayload) => any\n ) {\n let onMessageWrapper = onMessageWrapperMap.get(onMessage);\n\n if (!onMessageWrapper) {\n onMessageWrapper = async (message: MessageEvent) => {\n if (!isKnownMessage(message)) {\n return;\n }\n\n const parentPort = await getParentPort();\n // Confusingly in the browser, the message itself also has a 'type' field which is always set to 'message'\n const {type, payload} = parentPort ? message : message.data;\n onMessage(type, payload);\n };\n }\n\n const parentPort = await getParentPort();\n if (parentPort) {\n console.error('not implemented'); // eslint-disable-line\n } else {\n globalThis.addEventListener('message', onMessageWrapper);\n }\n }\n\n static async removeEventListener(\n onMessage: (type: WorkerMessageType, payload: WorkerMessagePayload) => any\n ) {\n const onMessageWrapper = onMessageWrapperMap.get(onMessage);\n onMessageWrapperMap.delete(onMessage);\n const parentPort = await getParentPort();\n if (parentPort) {\n console.error('not implemented'); // eslint-disable-line\n } else {\n globalThis.removeEventListener('message', onMessageWrapper);\n }\n }\n\n /**\n * Send a message from a worker to creating thread (main thread)\n * @param type\n * @param payload\n */\n static async postMessage(type: WorkerMessageType, payload: WorkerMessagePayload): Promise {\n const data: WorkerMessageData = {source: 'loaders.gl', type, payload};\n // console.log('posting message', data);\n\n // Cast to Node compatible transfer list\n const transferList = getTransferList(payload) as TransferListItem[];\n\n const parentPort = await getParentPort();\n if (parentPort) {\n parentPort.postMessage(data, transferList);\n // console.log('posted message', data);\n } else {\n // @ts-expect-error Outside of worker scopes this call has a third parameter\n globalThis.postMessage(data, transferList);\n }\n }\n}\n\n// Filter out noise messages sent to workers\nfunction isKnownMessage(message: MessageEvent) {\n const {type, data} = message;\n return (\n type === 'message' &&\n data &&\n typeof data.source === 'string' &&\n data.source.startsWith('loaders.gl')\n );\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* global importScripts */\nimport {isBrowser, isWorker} from '../env-utils/globals';\nimport {assert} from '../env-utils/assert';\nimport {VERSION} from '../env-utils/version';\n\nconst loadLibraryPromises: Record> = {}; // promises\n\n/**\n * Dynamically loads a library (\"module\")\n *\n * - wasm library: Array buffer is returned\n * - js library: Parse JS is returned\n *\n * Method depends on environment\n * - browser - script element is created and installed on document\n * - worker - eval is called on global context\n * - node - file is required\n *\n * @param libraryUrl\n * @param moduleName\n * @param options\n */\nexport async function loadLibrary(\n libraryUrl: string,\n moduleName: string | null = null,\n options: object = {},\n libraryName: string | null = null\n): Promise {\n if (moduleName) {\n libraryUrl = getLibraryUrl(libraryUrl, moduleName, options, libraryName);\n }\n // Ensure libraries are only loaded once\n\n loadLibraryPromises[libraryUrl] =\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n loadLibraryPromises[libraryUrl] || loadLibraryFromFile(libraryUrl);\n return await loadLibraryPromises[libraryUrl];\n}\n\n// TODO - sort out how to resolve paths for main/worker and dev/prod\nexport function getLibraryUrl(\n library: string,\n moduleName?: string,\n options: any = {},\n libraryName: string | null = null\n): string {\n // Check if already a URL\n if (!options.useLocalLibraries && library.startsWith('http')) {\n return library;\n }\n\n libraryName = libraryName || library;\n\n // Allow application to import and supply libraries through `options.modules`\n // TODO - See js-module-utils in loader-utils\n const modules = options.modules || {};\n if (modules[libraryName]) {\n return modules[libraryName];\n }\n\n // Load from local files, not from CDN scripts in Node.js\n // TODO - needs to locate the modules directory when installed!\n if (!isBrowser) {\n return `modules/${moduleName}/dist/libs/${libraryName}`;\n }\n\n // In browser, load from external scripts\n if (options.CDN) {\n assert(options.CDN.startsWith('http'));\n return `${options.CDN}/${moduleName}@${VERSION}/dist/libs/${libraryName}`;\n }\n\n // TODO - loading inside workers requires paths relative to worker script location...\n if (isWorker) {\n return `../src/libs/${libraryName}`;\n }\n\n return `modules/${moduleName}/src/libs/${libraryName}`;\n}\n\nasync function loadLibraryFromFile(libraryUrl: string): Promise {\n if (libraryUrl.endsWith('wasm')) {\n return await loadAsArrayBuffer(libraryUrl);\n }\n\n if (!isBrowser) {\n // TODO - Node doesn't yet support dynamic import from https URLs\n // try {\n // return await import(libraryUrl);\n // } catch (error) {\n // console.error(error);\n // }\n try {\n const {requireFromFile} = globalThis.loaders || {};\n return await requireFromFile?.(libraryUrl);\n } catch (error) {\n console.error(error); // eslint-disable-line no-console\n return null;\n }\n }\n if (isWorker) {\n return importScripts(libraryUrl);\n }\n // TODO - fix - should be more secure than string parsing since observes CORS\n // if (isBrowser) {\n // return await loadScriptFromFile(libraryUrl);\n // }\n\n const scriptSource = await loadAsText(libraryUrl);\n return loadLibraryFromString(scriptSource, libraryUrl);\n}\n\n/*\nasync function loadScriptFromFile(libraryUrl) {\n const script = document.createElement('script');\n script.src = libraryUrl;\n return await new Promise((resolve, reject) => {\n script.onload = data => {\n resolve(data);\n };\n script.onerror = reject;\n });\n}\n*/\n\n// TODO - Needs security audit...\n// - Raw eval call\n// - Potentially bypasses CORS\n// Upside is that this separates fetching and parsing\n// we could create a`LibraryLoader` or`ModuleLoader`\nfunction loadLibraryFromString(scriptSource: string, id: string): null | any {\n if (!isBrowser) {\n const {requireFromString} = globalThis.loaders || {};\n return requireFromString?.(scriptSource, id);\n }\n\n if (isWorker) {\n // Use lvalue trick to make eval run in global scope\n eval.call(globalThis, scriptSource); // eslint-disable-line no-eval\n // https://stackoverflow.com/questions/9107240/1-evalthis-vs-evalthis-in-javascript\n // http://perfectionkills.com/global-eval-what-are-the-options/\n return null;\n }\n\n const script = document.createElement('script');\n script.id = id;\n // most browsers like a separate text node but some throw an error. The second method covers those.\n try {\n script.appendChild(document.createTextNode(scriptSource));\n } catch (e) {\n script.text = scriptSource;\n }\n document.body.appendChild(script);\n return null;\n}\n\n// TODO - technique for module injection into worker, from THREE.DracoLoader...\n/*\nfunction combineWorkerWithLibrary(worker, jsContent) {\n var fn = wWorker.toString();\n var body = [\n '// injected',\n jsContent,\n '',\n '// worker',\n fn.substring(fn.indexOf('{') + 1, fn.lastIndexOf('}'))\n ].join('\\n');\n this.workerSourceURL = URL.createObjectURL(new Blob([body]));\n}\n*/\n\nasync function loadAsArrayBuffer(url: string): Promise {\n const {readFileAsArrayBuffer} = globalThis.loaders || {};\n if (isBrowser || !readFileAsArrayBuffer || url.startsWith('http')) {\n const response = await fetch(url);\n return await response.arrayBuffer();\n }\n return await readFileAsArrayBuffer(url);\n}\n\n/**\n * Load a file from local file system\n * @param filename\n * @returns\n */\nasync function loadAsText(url: string): Promise {\n const {readFileAsText} = globalThis.loaders || {};\n if (isBrowser || !readFileAsText || url.startsWith('http')) {\n const response = await fetch(url);\n return await response.text();\n }\n return await readFileAsText(url);\n}\n", "/* eslint-disable camelcase */\n// This code is inspired by example code in the DRACO repository\nimport type {\n Draco3D,\n DracoInt8Array,\n Encoder,\n Mesh,\n MeshBuilder,\n PointCloud,\n Metadata,\n MetadataBuilder,\n draco_GeometryAttribute_Type\n} from '../draco3d/draco3d-types';\n\nimport type {TypedArray} from '@loaders.gl/schema';\nimport type {DracoMesh} from './draco-types';\n\nexport type DracoBuildOptions = {\n pointcloud?: boolean;\n metadata?: {[key: string]: string};\n attributesMetadata?: {};\n log?: any;\n\n // draco encoding options\n speed?: [number, number];\n method?: string;\n quantization?: {[attributeName: string]: number};\n};\n\n// Native Draco attribute names to GLTF attribute names.\nconst GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP = {\n POSITION: 'POSITION',\n NORMAL: 'NORMAL',\n COLOR_0: 'COLOR',\n TEXCOORD_0: 'TEX_COORD'\n};\n\nconst noop = () => {};\n\nexport default class DracoBuilder {\n draco: Draco3D;\n dracoEncoder: Encoder;\n dracoMeshBuilder: MeshBuilder;\n dracoMetadataBuilder: MetadataBuilder;\n log: any;\n\n // draco - the draco decoder, either import `draco3d` or load dynamically\n constructor(draco: Draco3D) {\n this.draco = draco;\n this.dracoEncoder = new this.draco.Encoder();\n this.dracoMeshBuilder = new this.draco.MeshBuilder();\n this.dracoMetadataBuilder = new this.draco.MetadataBuilder();\n }\n\n destroy(): void {\n this.destroyEncodedObject(this.dracoMeshBuilder);\n this.destroyEncodedObject(this.dracoEncoder);\n this.destroyEncodedObject(this.dracoMetadataBuilder);\n // @ts-ignore\n this.dracoMeshBuilder = null;\n // @ts-ignore\n this.dracoEncoder = null;\n // @ts-ignore\n this.draco = null;\n }\n\n // TBD - when does this need to be called?\n destroyEncodedObject(object): void {\n if (object) {\n this.draco.destroy(object);\n }\n }\n\n /**\n * Encode mesh or point cloud\n * @param mesh =({})\n * @param options\n */\n encodeSync(mesh: DracoMesh, options: DracoBuildOptions = {}): ArrayBuffer {\n this.log = noop; // TODO\n this._setOptions(options);\n\n return options.pointcloud\n ? this._encodePointCloud(mesh, options)\n : this._encodeMesh(mesh, options);\n }\n\n // PRIVATE\n\n _getAttributesFromMesh(mesh: DracoMesh) {\n // TODO - Change the encodePointCloud interface instead?\n const attributes = {...mesh, ...mesh.attributes};\n // Fold indices into the attributes\n if (mesh.indices) {\n attributes.indices = mesh.indices;\n }\n return attributes;\n }\n\n _encodePointCloud(pointcloud: DracoMesh, options: DracoBuildOptions): ArrayBuffer {\n const dracoPointCloud = new this.draco.PointCloud();\n\n if (options.metadata) {\n this._addGeometryMetadata(dracoPointCloud, options.metadata);\n }\n\n const attributes = this._getAttributesFromMesh(pointcloud);\n\n // Build a `DracoPointCloud` from the input data\n this._createDracoPointCloud(dracoPointCloud, attributes, options);\n\n const dracoData = new this.draco.DracoInt8Array();\n\n try {\n const encodedLen = this.dracoEncoder.EncodePointCloudToDracoBuffer(\n dracoPointCloud,\n false,\n dracoData\n );\n\n if (!(encodedLen > 0)) {\n throw new Error('Draco encoding failed.');\n }\n\n this.log(`DRACO encoded ${dracoPointCloud.num_points()} points\n with ${dracoPointCloud.num_attributes()} attributes into ${encodedLen} bytes`);\n\n return dracoInt8ArrayToArrayBuffer(dracoData);\n } finally {\n this.destroyEncodedObject(dracoData);\n this.destroyEncodedObject(dracoPointCloud);\n }\n }\n\n _encodeMesh(mesh: DracoMesh, options: DracoBuildOptions): ArrayBuffer {\n const dracoMesh = new this.draco.Mesh();\n\n if (options.metadata) {\n this._addGeometryMetadata(dracoMesh, options.metadata);\n }\n\n const attributes = this._getAttributesFromMesh(mesh);\n\n // Build a `DracoMesh` from the input data\n this._createDracoMesh(dracoMesh, attributes, options);\n\n const dracoData = new this.draco.DracoInt8Array();\n\n try {\n const encodedLen = this.dracoEncoder.EncodeMeshToDracoBuffer(dracoMesh, dracoData);\n if (encodedLen <= 0) {\n throw new Error('Draco encoding failed.');\n }\n\n this.log(`DRACO encoded ${dracoMesh.num_points()} points\n with ${dracoMesh.num_attributes()} attributes into ${encodedLen} bytes`);\n\n return dracoInt8ArrayToArrayBuffer(dracoData);\n } finally {\n this.destroyEncodedObject(dracoData);\n this.destroyEncodedObject(dracoMesh);\n }\n }\n\n /**\n * Set encoding options.\n * @param {{speed?: any; method?: any; quantization?: any;}} options\n */\n _setOptions(options: DracoBuildOptions): void {\n if ('speed' in options) {\n // @ts-ignore\n this.dracoEncoder.SetSpeedOptions(...options.speed);\n }\n if ('method' in options) {\n const dracoMethod = this.draco[options.method || 'MESH_SEQUENTIAL_ENCODING'];\n // assert(dracoMethod)\n this.dracoEncoder.SetEncodingMethod(dracoMethod);\n }\n if ('quantization' in options) {\n for (const attribute in options.quantization) {\n const bits = options.quantization[attribute];\n const dracoPosition = this.draco[attribute];\n this.dracoEncoder.SetAttributeQuantization(dracoPosition, bits);\n }\n }\n }\n\n /**\n * @param {Mesh} dracoMesh\n * @param {object} attributes\n * @returns {Mesh}\n */\n _createDracoMesh(dracoMesh: Mesh, attributes, options: DracoBuildOptions): Mesh {\n const optionalMetadata = options.attributesMetadata || {};\n\n try {\n const positions = this._getPositionAttribute(attributes);\n if (!positions) {\n throw new Error('positions');\n }\n const vertexCount = positions.length / 3;\n\n for (let attributeName in attributes) {\n const attribute = attributes[attributeName];\n attributeName = GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP[attributeName] || attributeName;\n const uniqueId = this._addAttributeToMesh(dracoMesh, attributeName, attribute, vertexCount);\n\n if (uniqueId !== -1) {\n this._addAttributeMetadata(dracoMesh, uniqueId, {\n name: attributeName,\n ...(optionalMetadata[attributeName] || {})\n });\n }\n }\n } catch (error) {\n this.destroyEncodedObject(dracoMesh);\n throw error;\n }\n\n return dracoMesh;\n }\n\n /**\n * @param {} dracoPointCloud\n * @param {object} attributes\n */\n _createDracoPointCloud(\n dracoPointCloud: PointCloud,\n attributes: object,\n options: DracoBuildOptions\n ): PointCloud {\n const optionalMetadata = options.attributesMetadata || {};\n\n try {\n const positions = this._getPositionAttribute(attributes);\n if (!positions) {\n throw new Error('positions');\n }\n const vertexCount = positions.length / 3;\n\n for (let attributeName in attributes) {\n const attribute = attributes[attributeName];\n attributeName = GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP[attributeName] || attributeName;\n const uniqueId = this._addAttributeToMesh(\n dracoPointCloud,\n attributeName,\n attribute,\n vertexCount\n );\n if (uniqueId !== -1) {\n this._addAttributeMetadata(dracoPointCloud, uniqueId, {\n name: attributeName,\n ...(optionalMetadata[attributeName] || {})\n });\n }\n }\n } catch (error) {\n this.destroyEncodedObject(dracoPointCloud);\n throw error;\n }\n\n return dracoPointCloud;\n }\n\n /**\n * @param mesh\n * @param attributeName\n * @param attribute\n * @param vertexCount\n */\n _addAttributeToMesh(\n mesh: PointCloud,\n attributeName: string,\n attribute: TypedArray,\n vertexCount: number\n ): number {\n if (!ArrayBuffer.isView(attribute)) {\n return -1;\n }\n\n const type = this._getDracoAttributeType(attributeName);\n // @ts-ignore TODO/fix types\n const size = attribute.length / vertexCount;\n\n if (type === 'indices') {\n // @ts-ignore TODO/fix types\n const numFaces = attribute.length / 3;\n this.log(`Adding attribute ${attributeName}, size ${numFaces}`);\n\n // @ts-ignore assumes mesh is a Mesh, not a point cloud\n this.dracoMeshBuilder.AddFacesToMesh(mesh, numFaces, attribute);\n return -1;\n }\n\n this.log(`Adding attribute ${attributeName}, size ${size}`);\n\n const builder = this.dracoMeshBuilder;\n const {buffer} = attribute;\n\n switch (attribute.constructor) {\n case Int8Array:\n return builder.AddInt8Attribute(mesh, type, vertexCount, size, new Int8Array(buffer));\n\n case Int16Array:\n return builder.AddInt16Attribute(mesh, type, vertexCount, size, new Int16Array(buffer));\n\n case Int32Array:\n return builder.AddInt32Attribute(mesh, type, vertexCount, size, new Int32Array(buffer));\n case Uint8Array:\n case Uint8ClampedArray:\n return builder.AddUInt8Attribute(mesh, type, vertexCount, size, new Uint8Array(buffer));\n\n case Uint16Array:\n return builder.AddUInt16Attribute(mesh, type, vertexCount, size, new Uint16Array(buffer));\n\n case Uint32Array:\n return builder.AddUInt32Attribute(mesh, type, vertexCount, size, new Uint32Array(buffer));\n\n case Float32Array:\n return builder.AddFloatAttribute(mesh, type, vertexCount, size, new Float32Array(buffer));\n\n default:\n // eslint-disable-next-line no-console\n console.warn('Unsupported attribute type', attribute);\n return -1;\n }\n\n // case Float64Array:\n // Add attribute does not seem to be exposed\n // return builder.AddAttribute(mesh, type, vertexCount, size, new Float32Array(buffer));\n }\n\n /**\n * DRACO can compress attributes of know type better\n * TODO - expose an attribute type map?\n * @param attributeName\n */\n _getDracoAttributeType(attributeName: string): draco_GeometryAttribute_Type | 'indices' {\n switch (attributeName.toLowerCase()) {\n case 'indices':\n return 'indices';\n case 'position':\n case 'positions':\n case 'vertices':\n return this.draco.POSITION;\n case 'normal':\n case 'normals':\n return this.draco.NORMAL;\n case 'color':\n case 'colors':\n return this.draco.COLOR;\n case 'texcoord':\n case 'texcoords':\n return this.draco.TEX_COORD;\n default:\n return this.draco.GENERIC;\n }\n }\n\n _getPositionAttribute(attributes) {\n for (const attributeName in attributes) {\n const attribute = attributes[attributeName];\n const dracoType = this._getDracoAttributeType(attributeName);\n if (dracoType === this.draco.POSITION) {\n return attribute;\n }\n }\n return null;\n }\n\n /**\n * Add metadata for the geometry.\n * @param dracoGeometry - WASM Draco Object\n * @param metadata\n */\n _addGeometryMetadata(dracoGeometry: PointCloud, metadata: {[key: string]: string}) {\n const dracoMetadata = new this.draco.Metadata();\n this._populateDracoMetadata(dracoMetadata, metadata);\n this.dracoMeshBuilder.AddMetadata(dracoGeometry, dracoMetadata);\n }\n\n /**\n * Add metadata for an attribute to geometry.\n * @param dracoGeometry - WASM Draco Object\n * @param uniqueAttributeId\n * @param metadata\n */\n _addAttributeMetadata(\n dracoGeometry: PointCloud,\n uniqueAttributeId: number,\n metadata: Map | {[key: string]: string}\n ) {\n // Note: Draco JS IDL doesn't seem to expose draco.AttributeMetadata, however it seems to\n // create such objects automatically from draco.Metadata object.\n const dracoAttributeMetadata = new this.draco.Metadata();\n this._populateDracoMetadata(dracoAttributeMetadata, metadata);\n // Draco3d doc note: Directly add attribute metadata to geometry.\n // You can do this without explicitly adding |GeometryMetadata| to mesh.\n this.dracoMeshBuilder.SetMetadataForAttribute(\n dracoGeometry,\n uniqueAttributeId,\n dracoAttributeMetadata\n );\n }\n\n /**\n * Add contents of object or map to a WASM Draco Metadata Object\n * @param dracoMetadata - WASM Draco Object\n * @param metadata\n */\n _populateDracoMetadata(\n dracoMetadata: Metadata,\n metadata: Map | {[key: string]: string}\n ) {\n for (const [key, value] of getEntries(metadata)) {\n switch (typeof value) {\n case 'number':\n if (Math.trunc(value) === value) {\n this.dracoMetadataBuilder.AddIntEntry(dracoMetadata, key, value);\n } else {\n this.dracoMetadataBuilder.AddDoubleEntry(dracoMetadata, key, value);\n }\n break;\n case 'object':\n if (value instanceof Int32Array) {\n this.dracoMetadataBuilder.AddIntEntryArray(dracoMetadata, key, value, value.length);\n }\n break;\n case 'string':\n default:\n this.dracoMetadataBuilder.AddStringEntry(dracoMetadata, key, value);\n }\n }\n }\n}\n\n// HELPER FUNCTIONS\n\n/**\n * Copy encoded data to buffer\n * @param dracoData\n */\nfunction dracoInt8ArrayToArrayBuffer(dracoData: DracoInt8Array) {\n const byteLength = dracoData.size();\n const outputBuffer = new ArrayBuffer(byteLength);\n const outputData = new Int8Array(outputBuffer);\n for (let i = 0; i < byteLength; ++i) {\n outputData[i] = dracoData.GetValue(i);\n }\n return outputBuffer;\n}\n\n/** Enable iteration over either an object or a map */\nfunction getEntries(container) {\n const hasEntriesFunc = container.entries && !container.hasOwnProperty('entries');\n return hasEntriesFunc ? container.entries() : Object.entries(container);\n}\n", "// Dynamic DRACO module loading inspired by THREE.DRACOLoader\n// https://github.com/mrdoob/three.js/blob/398c4f39ebdb8b23eefd4a7a5ec49ec0c96c7462/examples/jsm/loaders/DRACOLoader.js\n// by Don McCurdy / https://www.donmccurdy.com / MIT license\n\nimport {loadLibrary} from '@loaders.gl/worker-utils';\n\nconst DRACO_DECODER_VERSION = '1.5.6';\nconst DRACO_ENCODER_VERSION = '1.4.1';\n\nconst STATIC_DECODER_URL = `https://www.gstatic.com/draco/versioned/decoders/${DRACO_DECODER_VERSION}`;\n\nexport const DRACO_EXTERNAL_LIBRARIES = {\n /** The primary Draco3D encoder, javascript wrapper part */\n DECODER: 'draco_wasm_wrapper.js',\n /** The primary draco decoder, compiled web assembly part */\n DECODER_WASM: 'draco_decoder.wasm',\n /** Fallback decoder for non-webassebly environments. Very big bundle, lower performance */\n FALLBACK_DECODER: 'draco_decoder.js',\n /** Draco encoder */\n ENCODER: 'draco_encoder.js'\n};\n\nexport const DRACO_EXTERNAL_LIBRARY_URLS = {\n [DRACO_EXTERNAL_LIBRARIES.DECODER]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.DECODER}`,\n [DRACO_EXTERNAL_LIBRARIES.DECODER_WASM]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.DECODER_WASM}`,\n [DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER}`,\n [DRACO_EXTERNAL_LIBRARIES.ENCODER]: `https://raw.githubusercontent.com/google/draco/${DRACO_ENCODER_VERSION}/javascript/${DRACO_EXTERNAL_LIBRARIES.ENCODER}`\n};\n\nlet loadDecoderPromise;\nlet loadEncoderPromise;\n\nexport async function loadDracoDecoderModule(options) {\n const modules = options.modules || {};\n\n // Check if a bundled draco3d library has been supplied by application\n if (modules.draco3d) {\n loadDecoderPromise ||= modules.draco3d.createDecoderModule({}).then((draco) => {\n return {draco};\n });\n } else {\n // If not, dynamically load the WASM script from our CDN\n loadDecoderPromise ||= loadDracoDecoder(options);\n }\n return await loadDecoderPromise;\n}\n\nexport async function loadDracoEncoderModule(options) {\n const modules = options.modules || {};\n\n // Check if a bundled draco3d library has been supplied by application\n if (modules.draco3d) {\n loadEncoderPromise ||= modules.draco3d.createEncoderModule({}).then((draco) => {\n return {draco};\n });\n } else {\n // If not, dynamically load the WASM script from our CDN\n loadEncoderPromise ||= loadDracoEncoder(options);\n }\n return await loadEncoderPromise;\n}\n\n// DRACO DECODER LOADING\n\nasync function loadDracoDecoder(options) {\n let DracoDecoderModule;\n let wasmBinary;\n switch (options.draco && options.draco.decoderType) {\n case 'js':\n DracoDecoderModule = await loadLibrary(\n DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER],\n 'draco',\n options,\n DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER\n );\n break;\n\n case 'wasm':\n default:\n [DracoDecoderModule, wasmBinary] = await Promise.all([\n await loadLibrary(\n DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER],\n 'draco',\n options,\n DRACO_EXTERNAL_LIBRARIES.DECODER\n ),\n await loadLibrary(\n DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM],\n 'draco',\n options,\n DRACO_EXTERNAL_LIBRARIES.DECODER_WASM\n )\n ]);\n }\n // Depends on how import happened...\n // @ts-ignore\n DracoDecoderModule = DracoDecoderModule || globalThis.DracoDecoderModule;\n return await initializeDracoDecoder(DracoDecoderModule, wasmBinary);\n}\n\nfunction initializeDracoDecoder(DracoDecoderModule, wasmBinary) {\n const options: {wasmBinary?: any} = {};\n if (wasmBinary) {\n options.wasmBinary = wasmBinary;\n }\n\n return new Promise((resolve) => {\n DracoDecoderModule({\n ...options,\n onModuleLoaded: (draco) => resolve({draco}) // Module is Promise-like. Wrap in object to avoid loop.\n });\n });\n}\n\n// ENCODER\n\nasync function loadDracoEncoder(options) {\n let DracoEncoderModule = await loadLibrary(\n DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.ENCODER],\n 'draco',\n options,\n DRACO_EXTERNAL_LIBRARIES.ENCODER\n );\n // @ts-ignore\n DracoEncoderModule = DracoEncoderModule || globalThis.DracoEncoderModule;\n\n return new Promise((resolve) => {\n DracoEncoderModule({\n onModuleLoaded: (draco) => resolve({draco}) // Module is Promise-like. Wrap in object to avoid loop.\n });\n });\n}\n", "// Version constant cannot be imported, it needs to correspond to the build version of **this** module.\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n", "import type {WriterWithEncoder, WriterOptions} from '@loaders.gl/loader-utils';\nimport type {DracoMesh} from './lib/draco-types';\nimport type {DracoBuildOptions} from './lib/draco-builder';\nimport DRACOBuilder from './lib/draco-builder';\nimport {loadDracoEncoderModule} from './lib/draco-module-loader';\nimport {VERSION} from './lib/utils/version';\n\n/** Writer Options for draco */\nexport type DracoWriterOptions = WriterOptions & {\n draco?: DracoBuildOptions & {\n method?: 'MESH_EDGEBREAKER_ENCODING' | 'MESH_SEQUENTIAL_ENCODING';\n speed?: [number, number];\n quantization?: Record;\n attributeNameEntry?: string;\n };\n};\n\nconst DEFAULT_DRACO_WRITER_OPTIONS = {\n pointcloud: false, // Set to true if pointcloud (mode: 0, no indices)\n attributeNameEntry: 'name'\n // Draco Compression Parameters\n // method: 'MESH_EDGEBREAKER_ENCODING', // Use draco defaults\n // speed: [5, 5], // Use draco defaults\n // quantization: { // Use draco defaults\n // POSITION: 10\n // }\n};\n\n/**\n * Exporter for Draco3D compressed geometries\n */\nexport const DracoWriter = {\n name: 'DRACO',\n id: 'draco',\n module: 'draco',\n version: VERSION,\n extensions: ['drc'],\n options: {\n draco: DEFAULT_DRACO_WRITER_OPTIONS\n },\n encode\n} as const satisfies WriterWithEncoder;\n\nasync function encode(data: DracoMesh, options: DracoWriterOptions = {}): Promise {\n // Dynamically load draco\n const {draco} = await loadDracoEncoderModule(options);\n const dracoBuilder = new DRACOBuilder(draco);\n\n try {\n return dracoBuilder.encodeSync(data, options.draco);\n } finally {\n dracoBuilder.destroy();\n }\n}\n", "import {WorkerBody, WorkerMessagePayload} from '@loaders.gl/worker-utils';\nimport {DracoWriter} from '../draco-writer';\n\n(async () => {\n // Check that we are actually in a worker thread\n if (!(await WorkerBody.inWorkerThread())) {\n return;\n }\n\n WorkerBody.onmessage = async (type, payload: WorkerMessagePayload) => {\n switch (type) {\n case 'process':\n try {\n const {input, options} = payload;\n const result = await DracoWriter.encode(input, options);\n WorkerBody.postMessage('done', {result});\n } catch (error) {\n const message = error instanceof Error ? error.message : '';\n WorkerBody.postMessage('error', {error: message});\n }\n break;\n default:\n }\n };\n})();\n"], "mappings": "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", "names": ["parentPort", "VERSION", "VERSION"] }