{"mappings":"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","names":["BufferAttribute","BufferGeometry","Color","FileLoader","Loader","LinearSRGBColorSpace","SRGBColorSpace","_taskCache","DRACOLoader","manager","path","config","workerLimit","url","onLoad","onProgress","onError","loader","buffer","callback","attributeIDs","attributeTypes","vertexColorSpace","taskConfig","taskKey","cachedTask","worker","taskID","taskCost","geometryPending","_worker","resolve","reject","message","geometryData","geometry","i","result","name","array","itemSize","attribute","inputColorSpace","_color","il","responseType","useJS","librariesPending","libraries","jsContent","fn","DRACOWorker","body","e","a","b","decoderConfig","decoderPending","draco","module","decoder","decodeGeometry","buffers","attr","error","dracoGeometry","decodingStatus","geometryType","attributeName","attributeType","attributeID","attributeResult","decodeAttribute","decodeIndex","numIndices","byteLength","ptr","index","numComponents","numValues","dataType","getDracoDataType"],"sources":["../esm/npm/three@0.160.1/node_modules/three/examples/jsm/loaders/DRACOLoader.js"],"sourcesContent":["import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tFileLoader,\n\tLoader,\n\tLinearSRGBColorSpace,\n\tSRGBColorSpace\n} from 'three';\n\nconst _taskCache = new WeakMap();\n\nclass DRACOLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.decoderPath = '';\n\t\tthis.decoderConfig = {};\n\t\tthis.decoderBinary = null;\n\t\tthis.decoderPending = null;\n\n\t\tthis.workerLimit = 4;\n\t\tthis.workerPool = [];\n\t\tthis.workerNextTaskID = 1;\n\t\tthis.workerSourceURL = '';\n\n\t\tthis.defaultAttributeIDs = {\n\t\t\tposition: 'POSITION',\n\t\t\tnormal: 'NORMAL',\n\t\t\tcolor: 'COLOR',\n\t\t\tuv: 'TEX_COORD'\n\t\t};\n\t\tthis.defaultAttributeTypes = {\n\t\t\tposition: 'Float32Array',\n\t\t\tnormal: 'Float32Array',\n\t\t\tcolor: 'Float32Array',\n\t\t\tuv: 'Float32Array'\n\t\t};\n\n\t}\n\n\tsetDecoderPath( path ) {\n\n\t\tthis.decoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetDecoderConfig( config ) {\n\n\t\tthis.decoderConfig = config;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( workerLimit ) {\n\n\t\tthis.workerLimit = workerLimit;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) =\u003e {\n\n\t\t\tthis.parse( buffer, onLoad, onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\n\tparse( buffer, onLoad, onError = ()=\u003e{} ) {\n\n\t\tthis.decodeDracoFile( buffer, onLoad, null, null, SRGBColorSpace ).catch( onError );\n\n\t}\n\n\tdecodeDracoFile( buffer, callback, attributeIDs, attributeTypes, vertexColorSpace = LinearSRGBColorSpace, onError = () =\u003e {} ) {\n\n\t\tconst taskConfig = {\n\t\t\tattributeIDs: attributeIDs || this.defaultAttributeIDs,\n\t\t\tattributeTypes: attributeTypes || this.defaultAttributeTypes,\n\t\t\tuseUniqueIDs: !! attributeIDs,\n\t\t\tvertexColorSpace: vertexColorSpace,\n\t\t};\n\n\t\treturn this.decodeGeometry( buffer, taskConfig ).then( callback ).catch( onError );\n\n\t}\n\n\tdecodeGeometry( buffer, taskConfig ) {\n\n\t\tconst taskKey = JSON.stringify( taskConfig );\n\n\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t// again from this thread.\n\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\tif ( cachedTask.key === taskKey ) {\n\n\t\t\t\treturn cachedTask.promise;\n\n\t\t\t} else if ( buffer.byteLength === 0 ) {\n\n\t\t\t\t// Technically, it would be possible to wait for the previous task to complete,\n\t\t\t\t// transfer the buffer back, and decode again with the second configuration. That\n\t\t\t\t// is complex, and I don't know of any reason to decode a Draco buffer twice in\n\t\t\t\t// different ways, so this is left unimplemented.\n\t\t\t\tthrow new Error(\n\n\t\t\t\t\t'THREE.DRACOLoader: Unable to re-decode a buffer with different ' +\n\t\t\t\t\t'settings. Buffer has already been transferred.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet worker;\n\t\tconst taskID = this.workerNextTaskID ++;\n\t\tconst taskCost = buffer.byteLength;\n\n\t\t// Obtain a worker and assign a task, and construct a geometry instance\n\t\t// when the task completes.\n\t\tconst geometryPending = this._getWorker( taskID, taskCost )\n\t\t\t.then( ( _worker ) =\u003e {\n\n\t\t\t\tworker = _worker;\n\n\t\t\t\treturn new Promise( ( resolve, reject ) =\u003e {\n\n\t\t\t\t\tworker._callbacks[ taskID ] = { resolve, reject };\n\n\t\t\t\t\tworker.postMessage( { type: 'decode', id: taskID, taskConfig, buffer }, [ buffer ] );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t} );\n\n\t\t\t} )\n\t\t\t.then( ( message ) =\u003e this._createGeometry( message.geometry ) );\n\n\t\t// Remove task from the task list.\n\t\t// Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)\n\t\tgeometryPending\n\t\t\t.catch( () =\u003e true )\n\t\t\t.then( () =\u003e {\n\n\t\t\t\tif ( worker \u0026\u0026 taskID ) {\n\n\t\t\t\t\tthis._releaseTask( worker, taskID );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, {\n\n\t\t\tkey: taskKey,\n\t\t\tpromise: geometryPending\n\n\t\t} );\n\n\t\treturn geometryPending;\n\n\t}\n\n\t_createGeometry( geometryData ) {\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tif ( geometryData.index ) {\n\n\t\t\tgeometry.setIndex( new BufferAttribute( geometryData.index.array, 1 ) );\n\n\t\t}\n\n\t\tfor ( let i = 0; i \u003c geometryData.attributes.length; i ++ ) {\n\n\t\t\tconst result = geometryData.attributes[ i ];\n\t\t\tconst name = result.name;\n\t\t\tconst array = result.array;\n\t\t\tconst itemSize = result.itemSize;\n\n\t\t\tconst attribute = new BufferAttribute( array, itemSize );\n\n\t\t\tif ( name === 'color' ) {\n\n\t\t\t\tthis._assignVertexColorSpace( attribute, result.vertexColorSpace );\n\n\t\t\t\tattribute.normalized = ( array instanceof Float32Array ) === false;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( name, attribute );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n\t_assignVertexColorSpace( attribute, inputColorSpace ) {\n\n\t\t// While .drc files do not specify colorspace, the only 'official' tooling\n\t\t// is PLY and OBJ converters, which use sRGB. We'll assume sRGB when a .drc\n\t\t// file is passed into .load() or .parse(). GLTFLoader uses internal APIs\n\t\t// to decode geometry, and vertex colors are already Linear-sRGB in there.\n\n\t\tif ( inputColorSpace !== SRGBColorSpace ) return;\n\n\t\tconst _color = new Color();\n\n\t\tfor ( let i = 0, il = attribute.count; i \u003c il; i ++ ) {\n\n\t\t\t_color.fromBufferAttribute( attribute, i ).convertSRGBToLinear();\n\t\t\tattribute.setXYZ( i, _color.r, _color.g, _color.b );\n\n\t\t}\n\n\t}\n\n\t_loadLibrary( url, responseType ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.decoderPath );\n\t\tloader.setResponseType( responseType );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\treturn new Promise( ( resolve, reject ) =\u003e {\n\n\t\t\tloader.load( url, resolve, undefined, reject );\n\n\t\t} );\n\n\t}\n\n\tpreload() {\n\n\t\tthis._initDecoder();\n\n\t\treturn this;\n\n\t}\n\n\t_initDecoder() {\n\n\t\tif ( this.decoderPending ) return this.decoderPending;\n\n\t\tconst useJS = typeof WebAssembly !== 'object' || this.decoderConfig.type === 'js';\n\t\tconst librariesPending = [];\n\n\t\tif ( useJS ) {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.js', 'text' ) );\n\n\t\t} else {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_wasm_wrapper.js', 'text' ) );\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.wasm', 'arraybuffer' ) );\n\n\t\t}\n\n\t\tthis.decoderPending = Promise.all( librariesPending )\n\t\t\t.then( ( libraries ) =\u003e {\n\n\t\t\t\tconst jsContent = libraries[ 0 ];\n\n\t\t\t\tif ( ! useJS ) {\n\n\t\t\t\t\tthis.decoderConfig.wasmBinary = libraries[ 1 ];\n\n\t\t\t\t}\n\n\t\t\t\tconst fn = DRACOWorker.toString();\n\n\t\t\t\tconst body = [\n\t\t\t\t\t'/* draco decoder */',\n\t\t\t\t\tjsContent,\n\t\t\t\t\t'',\n\t\t\t\t\t'/* worker */',\n\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t].join( '\\n' );\n\n\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\n\t\t\t} );\n\n\t\treturn this.decoderPending;\n\n\t}\n\n\t_getWorker( taskID, taskCost ) {\n\n\t\treturn this._initDecoder().then( () =\u003e {\n\n\t\t\tif ( this.workerPool.length \u003c this.workerLimit ) {\n\n\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\n\t\t\t\tworker._callbacks = {};\n\t\t\t\tworker._taskCosts = {};\n\t\t\t\tworker._taskLoad = 0;\n\n\t\t\t\tworker.postMessage( { type: 'init', decoderConfig: this.decoderConfig } );\n\n\t\t\t\tworker.onmessage = function ( e ) {\n\n\t\t\t\t\tconst message = e.data;\n\n\t\t\t\t\tswitch ( message.type ) {\n\n\t\t\t\t\t\tcase 'decode':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].resolve( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'error':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].reject( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.DRACOLoader: Unexpected message, \"' + message.type + '\"' );\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t\tthis.workerPool.push( worker );\n\n\t\t\t} else {\n\n\t\t\t\tthis.workerPool.sort( function ( a, b ) {\n\n\t\t\t\t\treturn a._taskLoad \u003e b._taskLoad ? - 1 : 1;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst worker = this.workerPool[ this.workerPool.length - 1 ];\n\t\t\tworker._taskCosts[ taskID ] = taskCost;\n\t\t\tworker._taskLoad += taskCost;\n\t\t\treturn worker;\n\n\t\t} );\n\n\t}\n\n\t_releaseTask( worker, taskID ) {\n\n\t\tworker._taskLoad -= worker._taskCosts[ taskID ];\n\t\tdelete worker._callbacks[ taskID ];\n\t\tdelete worker._taskCosts[ taskID ];\n\n\t}\n\n\tdebug() {\n\n\t\tconsole.log( 'Task load: ', this.workerPool.map( ( worker ) =\u003e worker._taskLoad ) );\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i \u003c this.workerPool.length; ++ i ) {\n\n\t\t\tthis.workerPool[ i ].terminate();\n\n\t\t}\n\n\t\tthis.workerPool.length = 0;\n\n\t\tif ( this.workerSourceURL !== '' ) {\n\n\t\t\tURL.revokeObjectURL( this.workerSourceURL );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* WEB WORKER */\n\nfunction DRACOWorker() {\n\n\tlet decoderConfig;\n\tlet decoderPending;\n\n\tonmessage = function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tdecoderConfig = message.decoderConfig;\n\t\t\t\tdecoderPending = new Promise( function ( resolve/*, reject*/ ) {\n\n\t\t\t\t\tdecoderConfig.onModuleLoaded = function ( draco ) {\n\n\t\t\t\t\t\t// Module is Promise-like. Wrap before resolving to avoid loop.\n\t\t\t\t\t\tresolve( { draco: draco } );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tDracoDecoderModule( decoderConfig ); // eslint-disable-line no-undef\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t\tcase 'decode':\n\t\t\t\tconst buffer = message.buffer;\n\t\t\t\tconst taskConfig = message.taskConfig;\n\t\t\t\tdecoderPending.then( ( module ) =\u003e {\n\n\t\t\t\t\tconst draco = module.draco;\n\t\t\t\t\tconst decoder = new draco.Decoder();\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst geometry = decodeGeometry( draco, decoder, new Int8Array( buffer ), taskConfig );\n\n\t\t\t\t\t\tconst buffers = geometry.attributes.map( ( attr ) =\u003e attr.array.buffer );\n\n\t\t\t\t\t\tif ( geometry.index ) buffers.push( geometry.index.array.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'decode', id: message.id, geometry }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t} finally {\n\n\t\t\t\t\t\tdraco.destroy( decoder );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tfunction decodeGeometry( draco, decoder, array, taskConfig ) {\n\n\t\tconst attributeIDs = taskConfig.attributeIDs;\n\t\tconst attributeTypes = taskConfig.attributeTypes;\n\n\t\tlet dracoGeometry;\n\t\tlet decodingStatus;\n\n\t\tconst geometryType = decoder.GetEncodedGeometryType( array );\n\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tdracoGeometry = new draco.Mesh();\n\t\t\tdecodingStatus = decoder.DecodeArrayToMesh( array, array.byteLength, dracoGeometry );\n\n\t\t} else if ( geometryType === draco.POINT_CLOUD ) {\n\n\t\t\tdracoGeometry = new draco.PointCloud();\n\t\t\tdecodingStatus = decoder.DecodeArrayToPointCloud( array, array.byteLength, dracoGeometry );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Unexpected geometry type.' );\n\n\t\t}\n\n\t\tif ( ! decodingStatus.ok() || dracoGeometry.ptr === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Decoding failed: ' + decodingStatus.error_msg() );\n\n\t\t}\n\n\t\tconst geometry = { index: null, attributes: [] };\n\n\t\t// Gather all vertex attributes.\n\t\tfor ( const attributeName in attributeIDs ) {\n\n\t\t\tconst attributeType = self[ attributeTypes[ attributeName ] ];\n\n\t\t\tlet attribute;\n\t\t\tlet attributeID;\n\n\t\t\t// A Draco file may be created with default vertex attributes, whose attribute IDs\n\t\t\t// are mapped 1:1 from their semantic name (POSITION, NORMAL, ...). Alternatively,\n\t\t\t// a Draco file may contain a custom set of attributes, identified by known unique\n\t\t\t// IDs. glTF files always do the latter, and `.drc` files typically do the former.\n\t\t\tif ( taskConfig.useUniqueIDs ) {\n\n\t\t\t\tattributeID = attributeIDs[ attributeName ];\n\t\t\t\tattribute = decoder.GetAttributeByUniqueId( dracoGeometry, attributeID );\n\n\t\t\t} else {\n\n\t\t\t\tattributeID = decoder.GetAttributeId( dracoGeometry, draco[ attributeIDs[ attributeName ] ] );\n\n\t\t\t\tif ( attributeID === - 1 ) continue;\n\n\t\t\t\tattribute = decoder.GetAttribute( dracoGeometry, attributeID );\n\n\t\t\t}\n\n\t\t\tconst attributeResult = decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute );\n\n\t\t\tif ( attributeName === 'color' ) {\n\n\t\t\t\tattributeResult.vertexColorSpace = taskConfig.vertexColorSpace;\n\n\t\t\t}\n\n\t\t\tgeometry.attributes.push( attributeResult );\n\n\t\t}\n\n\t\t// Add index.\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tgeometry.index = decodeIndex( draco, decoder, dracoGeometry );\n\n\t\t}\n\n\t\tdraco.destroy( dracoGeometry );\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction decodeIndex( draco, decoder, dracoGeometry ) {\n\n\t\tconst numFaces = dracoGeometry.num_faces();\n\t\tconst numIndices = numFaces * 3;\n\t\tconst byteLength = numIndices * 4;\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetTrianglesUInt32Array( dracoGeometry, byteLength, ptr );\n\t\tconst index = new Uint32Array( draco.HEAPF32.buffer, ptr, numIndices ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn { array: index, itemSize: 1 };\n\n\t}\n\n\tfunction decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute ) {\n\n\t\tconst numComponents = attribute.num_components();\n\t\tconst numPoints = dracoGeometry.num_points();\n\t\tconst numValues = numPoints * numComponents;\n\t\tconst byteLength = numValues * attributeType.BYTES_PER_ELEMENT;\n\t\tconst dataType = getDracoDataType( draco, attributeType );\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetAttributeDataArrayForAllPoints( dracoGeometry, attribute, dataType, byteLength, ptr );\n\t\tconst array = new attributeType( draco.HEAPF32.buffer, ptr, numValues ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn {\n\t\t\tname: attributeName,\n\t\t\tarray: array,\n\t\t\titemSize: numComponents\n\t\t};\n\n\t}\n\n\tfunction getDracoDataType( draco, attributeType ) {\n\n\t\tswitch ( attributeType ) {\n\n\t\t\tcase Float32Array: return draco.DT_FLOAT32;\n\t\t\tcase Int8Array: return draco.DT_INT8;\n\t\t\tcase Int16Array: return draco.DT_INT16;\n\t\t\tcase Int32Array: return draco.DT_INT32;\n\t\t\tcase Uint8Array: return draco.DT_UINT8;\n\t\t\tcase Uint16Array: return draco.DT_UINT16;\n\t\t\tcase Uint32Array: return draco.DT_UINT32;\n\n\t\t}\n\n\t}\n\n}\n\nexport { DRACOLoader };\n"],"version":3}
