{"version":3,"sources":["jsdelivr-header.js","/npm/three@0.134.0/examples/js/loaders/GLTFLoader.js"],"names":[],"mappings":"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","file":"/npm/three@0.134.0/examples/js/loaders/GLTFLoader.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/three@0.134.0/examples/js/loaders/GLTFLoader.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","( function () {\n\n\tclass GLTFLoader extends THREE.Loader {\n\n\t\tconstructor( manager ) {\n\n\t\t\tsuper( manager );\n\t\t\tthis.dracoLoader = null;\n\t\t\tthis.ktx2Loader = null;\n\t\t\tthis.meshoptDecoder = null;\n\t\t\tthis.pluginCallbacks = [];\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsSheenExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tload( url, onLoad, onProgress, onError ) {\n\n\t\t\tconst scope = this;\n\t\t\tlet resourcePath;\n\n\t\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\t\tresourcePath = this.resourcePath;\n\n\t\t\t} else if ( this.path !== '' ) {\n\n\t\t\t\tresourcePath = this.path;\n\n\t\t\t} else {\n\n\t\t\t\tresourcePath = THREE.LoaderUtils.extractUrlBase( url );\n\n\t\t\t} // Tells the LoadingManager to track an extra item, which resolves after\n\t\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tconst _onError = function ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t};\n\n\t\t\tconst loader = new THREE.FileLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.setRequestHeader( this.requestHeader );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( data ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\t\tonLoad( gltf );\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, _onError );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t_onError( e );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, _onError );\n\n\t\t}\n\n\t\tsetDRACOLoader( dracoLoader ) {\n\n\t\t\tthis.dracoLoader = dracoLoader;\n\t\t\treturn this;\n\n\t\t}\n\n\t\tsetDDSLoader() {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: \"MSFT_texture_dds\" no longer supported. Please update to \"KHR_texture_basisu\".' );\n\n\t\t}\n\n\t\tsetKTX2Loader( ktx2Loader ) {\n\n\t\t\tthis.ktx2Loader = ktx2Loader;\n\t\t\treturn this;\n\n\t\t}\n\n\t\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\t\treturn this;\n\n\t\t}\n\n\t\tregister( callback ) {\n\n\t\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tunregister( callback ) {\n\n\t\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tparse( data, path, onLoad, onError ) {\n\n\t\t\tlet content;\n\t\t\tconst extensions = {};\n\t\t\tconst plugins = {};\n\n\t\t\tif ( typeof data === 'string' ) {\n\n\t\t\t\tcontent = data;\n\n\t\t\t} else {\n\n\t\t\t\tconst magic = THREE.LoaderUtils.decodeText( new Uint8Array( data, 0, 4 ) );\n\n\t\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontent = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcontent = THREE.LoaderUtils.decodeText( new Uint8Array( data ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst json = JSON.parse( content );\n\n\t\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst parser = new GLTFParser( json, {\n\t\t\t\tpath: path || this.resourcePath || '',\n\t\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\t\trequestHeader: this.requestHeader,\n\t\t\t\tmanager: this.manager,\n\t\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\t\tmeshoptDecoder: this.meshoptDecoder\n\t\t\t} );\n\t\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\t\t\t\tplugins[ plugin.name ] = plugin; // Workaround to avoid determining as unknown extension\n\t\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t\t// Remove this workaround if we move all the existing\n\t\t\t\t// extension handlers to plugin system\n\n\t\t\t\textensions[ plugin.name ] = true;\n\n\t\t\t}\n\n\t\t\tif ( json.extensionsUsed ) {\n\n\t\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsPbrSpecularGlossinessExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tparser.setExtensions( extensions );\n\t\t\tparser.setPlugins( plugins );\n\t\t\tparser.parse( onLoad, onError );\n\n\t\t}\n\n\t}\n\t/* GLTFREGISTRY */\n\n\n\tfunction GLTFRegistry() {\n\n\t\tlet objects = {};\n\t\treturn {\n\t\t\tget: function ( key ) {\n\n\t\t\t\treturn objects[ key ];\n\n\t\t\t},\n\t\t\tadd: function ( key, object ) {\n\n\t\t\t\tobjects[ key ] = object;\n\n\t\t\t},\n\t\t\tremove: function ( key ) {\n\n\t\t\t\tdelete objects[ key ];\n\n\t\t\t},\n\t\t\tremoveAll: function () {\n\n\t\t\t\tobjects = {};\n\n\t\t\t}\n\t\t};\n\n\t}\n\t/*********************************/\n\n\t/********** EXTENSIONS ***********/\n\n\t/*********************************/\n\n\n\tconst EXTENSIONS = {\n\t\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\t\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\t\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\t\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\t\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\t\tKHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness',\n\t\tKHR_MATERIALS_SHEEN: 'KHR_materials_sheen',\n\t\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\t\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\t\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\t\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\t\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\t\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\t\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\t\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\t\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression'\n\t};\n\t/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\n\n\tclass GLTFLightsExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL; // THREE.Object3D instance caches\n\n\t\t\tthis.cache = {\n\t\t\t\trefs: {},\n\t\t\t\tuses: {}\n\t\t\t};\n\n\t\t}\n\n\t\t_markDefs() {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\t\tif ( nodeDef.extensions && nodeDef.extensions[ this.name ] && nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_loadLight( lightIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst cacheKey = 'light:' + lightIndex;\n\t\t\tlet dependency = parser.cache.get( cacheKey );\n\t\t\tif ( dependency ) return dependency;\n\t\t\tconst json = parser.json;\n\t\t\tconst extensions = json.extensions && json.extensions[ this.name ] || {};\n\t\t\tconst lightDefs = extensions.lights || [];\n\t\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\t\tlet lightNode;\n\t\t\tconst color = new THREE.Color( 0xffffff );\n\t\t\tif ( lightDef.color !== undefined ) color.fromArray( lightDef.color );\n\t\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\t\tswitch ( lightDef.type ) {\n\n\t\t\t\tcase 'directional':\n\t\t\t\t\tlightNode = new THREE.DirectionalLight( color );\n\t\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'point':\n\t\t\t\t\tlightNode = new THREE.PointLight( color );\n\t\t\t\t\tlightNode.distance = range;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'spot':\n\t\t\t\t\tlightNode = new THREE.SpotLight( color );\n\t\t\t\t\tlightNode.distance = range; // Handle spotlight properties.\n\n\t\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t\t} // Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t\t// here, because node-level parsing will only override position if explicitly specified.\n\n\n\t\t\tlightNode.position.set( 0, 0, 0 );\n\t\t\tlightNode.decay = 2;\n\t\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\t\t\tlightNode.name = parser.createUniqueName( lightDef.name || 'light_' + lightIndex );\n\t\t\tdependency = Promise.resolve( lightNode );\n\t\t\tparser.cache.add( cacheKey, dependency );\n\t\t\treturn dependency;\n\n\t\t}\n\n\t\tcreateNodeAttachment( nodeIndex ) {\n\n\t\t\tconst self = this;\n\t\t\tconst parser = this.parser;\n\t\t\tconst json = parser.json;\n\t\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\t\tconst lightDef = nodeDef.extensions && nodeDef.extensions[ this.name ] || {};\n\t\t\tconst lightIndex = lightDef.light;\n\t\t\tif ( lightIndex === undefined ) return null;\n\t\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\t/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\n\n\n\tclass GLTFMaterialsUnlitExtension {\n\n\t\tconstructor() {\n\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t\t}\n\n\t\tgetMaterialType() {\n\n\t\t\treturn THREE.MeshBasicMaterial;\n\n\t\t}\n\n\t\textendParams( materialParams, materialDef, parser ) {\n\n\t\t\tconst pending = [];\n\t\t\tmaterialParams.color = new THREE.Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\t\tif ( metallicRoughness ) {\n\n\t\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\t\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\n\n\n\tclass GLTFMaterialsClearcoatExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t\t}\n\n\t\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t\t}\n\n\t\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t\t}\n\n\t\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale;\n\t\t\t\t\tmaterialParams.clearcoatNormalScale = new THREE.Vector2( scale, scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\n\n\n\tclass GLTFMaterialsSheenExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SHEEN;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\t\t\tmaterialParams.sheenColor = new THREE.Color( 0, 0, 0 );\n\t\t\tmaterialParams.sheenRoughness = 0;\n\t\t\tmaterialParams.sheen = 1;\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\t\tif ( extension.sheenColorFactor !== undefined ) {\n\n\t\t\t\tmaterialParams.sheenColor.fromArray( extension.sheenColorFactor );\n\n\t\t\t}\n\n\t\t\tif ( extension.sheenRoughnessFactor !== undefined ) {\n\n\t\t\t\tmaterialParams.sheenRoughness = extension.sheenRoughnessFactor;\n\n\t\t\t}\n\n\t\t\tif ( extension.sheenColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture ) );\n\n\t\t\t}\n\n\t\t\tif ( extension.sheenRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n */\n\n\n\tclass GLTFMaterialsTransmissionExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t\t}\n\n\t\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\n\n\n\tclass GLTFMaterialsVolumeExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\t\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || 0;\n\t\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\t\tmaterialParams.attenuationColor = new THREE.Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] );\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\n\n\n\tclass GLTFMaterialsIorExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\t\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t}\n\t/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\n\n\n\tclass GLTFMaterialsSpecularExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\t\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t\t}\n\n\t\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\t\tmaterialParams.specularColor = new THREE.Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] );\n\n\t\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture ).then( function ( texture ) {\n\n\t\t\t\t\ttexture.encoding = THREE.sRGBEncoding;\n\n\t\t\t\t} ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * BasisU THREE.Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\n\n\n\tclass GLTFTextureBasisUExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t\t}\n\n\t\tloadTexture( textureIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst json = parser.json;\n\t\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst extension = textureDef.extensions[ this.name ];\n\t\t\tconst source = json.images[ extension.source ];\n\t\t\tconst loader = parser.options.ktx2Loader;\n\n\t\t\tif ( ! loader ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn parser.loadTextureImage( textureIndex, source, loader );\n\n\t\t}\n\n\t}\n\t/**\n * WebP THREE.Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n */\n\n\n\tclass GLTFTextureWebPExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\t\tthis.isSupported = null;\n\n\t\t}\n\n\t\tloadTexture( textureIndex ) {\n\n\t\t\tconst name = this.name;\n\t\t\tconst parser = this.parser;\n\t\t\tconst json = parser.json;\n\t\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst extension = textureDef.extensions[ name ];\n\t\t\tconst source = json.images[ extension.source ];\n\t\t\tlet loader = parser.textureLoader;\n\n\t\t\tif ( source.uri ) {\n\n\t\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t\t}\n\n\t\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, source, loader );\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t\t} // Fall back to PNG or JPEG.\n\n\n\t\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tdetectSupport() {\n\n\t\t\tif ( ! this.isSupported ) {\n\n\t\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\t\tconst image = new Image(); // Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t\t// WebP images, unfortunately.\n\n\t\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t\t};\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn this.isSupported;\n\n\t\t}\n\n\t}\n\t/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\n\n\n\tclass GLTFMeshoptCompression {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\t\tthis.parser = parser;\n\n\t\t}\n\n\t\tloadBufferView( index ) {\n\n\t\t\tconst json = this.parser.json;\n\t\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\t\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn Promise.all( [ buffer, decoder.ready ] ).then( function ( res ) {\n\n\t\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\t\t\t\t\tconst count = extensionDef.count;\n\t\t\t\t\tconst stride = extensionDef.byteStride;\n\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\tconst source = new Uint8Array( res[ 0 ], byteOffset, byteLength );\n\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\treturn result;\n\n\t\t\t\t} );\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\t/* BINARY EXTENSION */\n\n\n\tconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\n\tconst BINARY_EXTENSION_HEADER_LENGTH = 12;\n\tconst BINARY_EXTENSION_CHUNK_TYPES = {\n\t\tJSON: 0x4E4F534A,\n\t\tBIN: 0x004E4942\n\t};\n\n\tclass GLTFBinaryExtension {\n\n\t\tconstructor( data ) {\n\n\t\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\t\tthis.content = null;\n\t\t\tthis.body = null;\n\t\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\t\tthis.header = {\n\t\t\t\tmagic: THREE.LoaderUtils.decodeText( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\t\tlength: headerView.getUint32( 8, true )\n\t\t\t};\n\n\t\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t\t}\n\n\t\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\t\tlet chunkIndex = 0;\n\n\t\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\t\tchunkIndex += 4;\n\t\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\t\tchunkIndex += 4;\n\n\t\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\t\tthis.content = THREE.LoaderUtils.decodeText( contentArray );\n\n\t\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t\t} // Clients must ignore chunks with unknown types.\n\n\n\t\t\t\tchunkIndex += chunkLength;\n\n\t\t\t}\n\n\t\t\tif ( this.content === null ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\t/**\n * DRACO THREE.Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\n\n\n\tclass GLTFDracoMeshCompressionExtension {\n\n\t\tconstructor( json, dracoLoader ) {\n\n\t\t\tif ( ! dracoLoader ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t\t}\n\n\t\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\t\tthis.json = json;\n\t\t\tthis.dracoLoader = dracoLoader;\n\t\t\tthis.dracoLoader.preload();\n\n\t\t}\n\n\t\tdecodePrimitive( primitive, parser ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst dracoLoader = this.dracoLoader;\n\t\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\t\tconst threeAttributeMap = {};\n\t\t\tconst attributeNormalizedMap = {};\n\t\t\tconst attributeTypeMap = {};\n\n\t\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\t\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t\t}\n\n\t\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType;\n\t\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\t\treturn new Promise( function ( resolve ) {\n\n\t\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\t\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t\t}, threeAttributeMap, attributeTypeMap );\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\t/**\n * THREE.Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\n\n\n\tclass GLTFTextureTransformExtension {\n\n\t\tconstructor() {\n\n\t\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t\t}\n\n\t\textendTexture( texture, transform ) {\n\n\t\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Custom UV sets in \"' + this.name + '\" extension not yet supported.' );\n\n\t\t\t}\n\n\t\t\tif ( transform.offset === undefined && transform.rotation === undefined && transform.scale === undefined ) {\n\n\t\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\t\treturn texture;\n\n\t\t\t}\n\n\t\t\ttexture = texture.clone();\n\n\t\t\tif ( transform.offset !== undefined ) {\n\n\t\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t\t}\n\n\t\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\t\ttexture.rotation = transform.rotation;\n\n\t\t\t}\n\n\t\t\tif ( transform.scale !== undefined ) {\n\n\t\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\t\t\treturn texture;\n\n\t\t}\n\n\t}\n\t/**\n * Specular-Glossiness Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness\n */\n\n\t/**\n * A sub class of StandardMaterial with some of the functionality\n * changed via the `onBeforeCompile` callback\n * @pailhead\n */\n\n\n\tclass GLTFMeshStandardSGMaterial extends THREE.MeshStandardMaterial {\n\n\t\tconstructor( params ) {\n\n\t\t\tsuper();\n\t\t\tthis.isGLTFSpecularGlossinessMaterial = true; //various chunks that need replacing\n\n\t\t\tconst specularMapParsFragmentChunk = [ '#ifdef USE_SPECULARMAP', '\tuniform sampler2D specularMap;', '#endif' ].join( '\\n' );\n\t\t\tconst glossinessMapParsFragmentChunk = [ '#ifdef USE_GLOSSINESSMAP', '\tuniform sampler2D glossinessMap;', '#endif' ].join( '\\n' );\n\t\t\tconst specularMapFragmentChunk = [ 'vec3 specularFactor = specular;', '#ifdef USE_SPECULARMAP', '\tvec4 texelSpecular = texture2D( specularMap, vUv );', '\ttexelSpecular = sRGBToLinear( texelSpecular );', '\t// reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture', '\tspecularFactor *= texelSpecular.rgb;', '#endif' ].join( '\\n' );\n\t\t\tconst glossinessMapFragmentChunk = [ 'float glossinessFactor = glossiness;', '#ifdef USE_GLOSSINESSMAP', '\tvec4 texelGlossiness = texture2D( glossinessMap, vUv );', '\t// reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture', '\tglossinessFactor *= texelGlossiness.a;', '#endif' ].join( '\\n' );\n\t\t\tconst lightPhysicalFragmentChunk = [ 'PhysicalMaterial material;', 'material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );', 'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );', 'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );', 'material.roughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.', 'material.roughness += geometryRoughness;', 'material.roughness = min( material.roughness, 1.0 );', 'material.specularColor = specularFactor;' ].join( '\\n' );\n\t\t\tconst uniforms = {\n\t\t\t\tspecular: {\n\t\t\t\t\tvalue: new THREE.Color().setHex( 0xffffff )\n\t\t\t\t},\n\t\t\t\tglossiness: {\n\t\t\t\t\tvalue: 1\n\t\t\t\t},\n\t\t\t\tspecularMap: {\n\t\t\t\t\tvalue: null\n\t\t\t\t},\n\t\t\t\tglossinessMap: {\n\t\t\t\t\tvalue: null\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis._extraUniforms = uniforms;\n\n\t\t\tthis.onBeforeCompile = function ( shader ) {\n\n\t\t\t\tfor ( const uniformName in uniforms ) {\n\n\t\t\t\t\tshader.uniforms[ uniformName ] = uniforms[ uniformName ];\n\n\t\t\t\t}\n\n\t\t\t\tshader.fragmentShader = shader.fragmentShader.replace( 'uniform float roughness;', 'uniform vec3 specular;' ).replace( 'uniform float metalness;', 'uniform float glossiness;' ).replace( '#include <roughnessmap_pars_fragment>', specularMapParsFragmentChunk ).replace( '#include <metalnessmap_pars_fragment>', glossinessMapParsFragmentChunk ).replace( '#include <roughnessmap_fragment>', specularMapFragmentChunk ).replace( '#include <metalnessmap_fragment>', glossinessMapFragmentChunk ).replace( '#include <lights_physical_fragment>', lightPhysicalFragmentChunk );\n\n\t\t\t};\n\n\t\t\tObject.defineProperties( this, {\n\t\t\t\tspecular: {\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn uniforms.specular.value;\n\n\t\t\t\t\t},\n\t\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\t\tuniforms.specular.value = v;\n\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tspecularMap: {\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn uniforms.specularMap.value;\n\n\t\t\t\t\t},\n\t\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\t\tuniforms.specularMap.value = v;\n\n\t\t\t\t\t\tif ( v ) {\n\n\t\t\t\t\t\t\tthis.defines.USE_SPECULARMAP = ''; // USE_UV is set by the renderer for specular maps\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tdelete this.defines.USE_SPECULARMAP;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tglossiness: {\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn uniforms.glossiness.value;\n\n\t\t\t\t\t},\n\t\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\t\tuniforms.glossiness.value = v;\n\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tglossinessMap: {\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn uniforms.glossinessMap.value;\n\n\t\t\t\t\t},\n\t\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\t\tuniforms.glossinessMap.value = v;\n\n\t\t\t\t\t\tif ( v ) {\n\n\t\t\t\t\t\t\tthis.defines.USE_GLOSSINESSMAP = '';\n\t\t\t\t\t\t\tthis.defines.USE_UV = '';\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tdelete this.defines.USE_GLOSSINESSMAP;\n\t\t\t\t\t\t\tdelete this.defines.USE_UV;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t\tdelete this.metalness;\n\t\t\tdelete this.roughness;\n\t\t\tdelete this.metalnessMap;\n\t\t\tdelete this.roughnessMap;\n\t\t\tthis.setValues( params );\n\n\t\t}\n\n\t\tcopy( source ) {\n\n\t\t\tsuper.copy( source );\n\t\t\tthis.specularMap = source.specularMap;\n\t\t\tthis.specular.copy( source.specular );\n\t\t\tthis.glossinessMap = source.glossinessMap;\n\t\t\tthis.glossiness = source.glossiness;\n\t\t\tdelete this.metalness;\n\t\t\tdelete this.roughness;\n\t\t\tdelete this.metalnessMap;\n\t\t\tdelete this.roughnessMap;\n\t\t\treturn this;\n\n\t\t}\n\n\t}\n\n\tclass GLTFMaterialsPbrSpecularGlossinessExtension {\n\n\t\tconstructor() {\n\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS;\n\t\t\tthis.specularGlossinessParams = [ 'color', 'map', 'lightMap', 'lightMapIntensity', 'aoMap', 'aoMapIntensity', 'emissive', 'emissiveIntensity', 'emissiveMap', 'bumpMap', 'bumpScale', 'normalMap', 'normalMapType', 'displacementMap', 'displacementScale', 'displacementBias', 'specularMap', 'specular', 'glossinessMap', 'glossiness', 'alphaMap', 'envMap', 'envMapIntensity', 'refractionRatio' ];\n\n\t\t}\n\n\t\tgetMaterialType() {\n\n\t\t\treturn GLTFMeshStandardSGMaterial;\n\n\t\t}\n\n\t\textendParams( materialParams, materialDef, parser ) {\n\n\t\t\tconst pbrSpecularGlossiness = materialDef.extensions[ this.name ];\n\t\t\tmaterialParams.color = new THREE.Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\t\t\tconst pending = [];\n\n\t\t\tif ( Array.isArray( pbrSpecularGlossiness.diffuseFactor ) ) {\n\n\t\t\t\tconst array = pbrSpecularGlossiness.diffuseFactor;\n\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( pbrSpecularGlossiness.diffuseTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', pbrSpecularGlossiness.diffuseTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.emissive = new THREE.Color( 0.0, 0.0, 0.0 );\n\t\t\tmaterialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0;\n\t\t\tmaterialParams.specular = new THREE.Color( 1.0, 1.0, 1.0 );\n\n\t\t\tif ( Array.isArray( pbrSpecularGlossiness.specularFactor ) ) {\n\n\t\t\t\tmaterialParams.specular.fromArray( pbrSpecularGlossiness.specularFactor );\n\n\t\t\t}\n\n\t\t\tif ( pbrSpecularGlossiness.specularGlossinessTexture !== undefined ) {\n\n\t\t\t\tconst specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture;\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'glossinessMap', specGlossMapDef ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'specularMap', specGlossMapDef ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t\tcreateMaterial( materialParams ) {\n\n\t\t\tconst material = new GLTFMeshStandardSGMaterial( materialParams );\n\t\t\tmaterial.fog = true;\n\t\t\tmaterial.color = materialParams.color;\n\t\t\tmaterial.map = materialParams.map === undefined ? null : materialParams.map;\n\t\t\tmaterial.lightMap = null;\n\t\t\tmaterial.lightMapIntensity = 1.0;\n\t\t\tmaterial.aoMap = materialParams.aoMap === undefined ? null : materialParams.aoMap;\n\t\t\tmaterial.aoMapIntensity = 1.0;\n\t\t\tmaterial.emissive = materialParams.emissive;\n\t\t\tmaterial.emissiveIntensity = 1.0;\n\t\t\tmaterial.emissiveMap = materialParams.emissiveMap === undefined ? null : materialParams.emissiveMap;\n\t\t\tmaterial.bumpMap = materialParams.bumpMap === undefined ? null : materialParams.bumpMap;\n\t\t\tmaterial.bumpScale = 1;\n\t\t\tmaterial.normalMap = materialParams.normalMap === undefined ? null : materialParams.normalMap;\n\t\t\tmaterial.normalMapType = THREE.TangentSpaceNormalMap;\n\t\t\tif ( materialParams.normalScale ) material.normalScale = materialParams.normalScale;\n\t\t\tmaterial.displacementMap = null;\n\t\t\tmaterial.displacementScale = 1;\n\t\t\tmaterial.displacementBias = 0;\n\t\t\tmaterial.specularMap = materialParams.specularMap === undefined ? null : materialParams.specularMap;\n\t\t\tmaterial.specular = materialParams.specular;\n\t\t\tmaterial.glossinessMap = materialParams.glossinessMap === undefined ? null : materialParams.glossinessMap;\n\t\t\tmaterial.glossiness = materialParams.glossiness;\n\t\t\tmaterial.alphaMap = null;\n\t\t\tmaterial.envMap = materialParams.envMap === undefined ? null : materialParams.envMap;\n\t\t\tmaterial.envMapIntensity = 1.0;\n\t\t\tmaterial.refractionRatio = 0.98;\n\t\t\treturn material;\n\n\t\t}\n\n\t}\n\t/**\n * THREE.Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\n\n\n\tclass GLTFMeshQuantizationExtension {\n\n\t\tconstructor() {\n\n\t\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t\t}\n\n\t}\n\t/*********************************/\n\n\t/********** INTERPOLATION ********/\n\n\t/*********************************/\n\t// Spline Interpolation\n\t// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\n\n\n\tclass GLTFCubicSplineInterpolant extends THREE.Interpolant {\n\n\t\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\t}\n\n\t\tcopySampleValue_( index ) {\n\n\t\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\t\t\tconst result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tvalueSize = this.valueSize,\n\t\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t}\n\n\tGLTFCubicSplineInterpolant.prototype.beforeStart_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n\tGLTFCubicSplineInterpolant.prototype.afterEnd_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n\n\tGLTFCubicSplineInterpolant.prototype.interpolate_ = function ( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\t\tconst td = t1 - t0;\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p; // Layout of keyframe output values for CUBICSPLINE animations:\n\t\t//   [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t};\n\n\tconst _q = new THREE.Quaternion();\n\n\tclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\t\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t\t_q.fromArray( result ).normalize().toArray( result );\n\n\t\t\treturn result;\n\n\t\t}\n\n\t}\n\t/*********************************/\n\n\t/********** INTERNALS ************/\n\n\t/*********************************/\n\n\t/* CONSTANTS */\n\n\n\tconst WEBGL_CONSTANTS = {\n\t\tFLOAT: 5126,\n\t\t//FLOAT_MAT2: 35674,\n\t\tFLOAT_MAT3: 35675,\n\t\tFLOAT_MAT4: 35676,\n\t\tFLOAT_VEC2: 35664,\n\t\tFLOAT_VEC3: 35665,\n\t\tFLOAT_VEC4: 35666,\n\t\tLINEAR: 9729,\n\t\tREPEAT: 10497,\n\t\tSAMPLER_2D: 35678,\n\t\tPOINTS: 0,\n\t\tLINES: 1,\n\t\tLINE_LOOP: 2,\n\t\tLINE_STRIP: 3,\n\t\tTRIANGLES: 4,\n\t\tTRIANGLE_STRIP: 5,\n\t\tTRIANGLE_FAN: 6,\n\t\tUNSIGNED_BYTE: 5121,\n\t\tUNSIGNED_SHORT: 5123\n\t};\n\tconst WEBGL_COMPONENT_TYPES = {\n\t\t5120: Int8Array,\n\t\t5121: Uint8Array,\n\t\t5122: Int16Array,\n\t\t5123: Uint16Array,\n\t\t5125: Uint32Array,\n\t\t5126: Float32Array\n\t};\n\tconst WEBGL_FILTERS = {\n\t\t9728: THREE.NearestFilter,\n\t\t9729: THREE.LinearFilter,\n\t\t9984: THREE.NearestMipmapNearestFilter,\n\t\t9985: THREE.LinearMipmapNearestFilter,\n\t\t9986: THREE.NearestMipmapLinearFilter,\n\t\t9987: THREE.LinearMipmapLinearFilter\n\t};\n\tconst WEBGL_WRAPPINGS = {\n\t\t33071: THREE.ClampToEdgeWrapping,\n\t\t33648: THREE.MirroredRepeatWrapping,\n\t\t10497: THREE.RepeatWrapping\n\t};\n\tconst WEBGL_TYPE_SIZES = {\n\t\t'SCALAR': 1,\n\t\t'VEC2': 2,\n\t\t'VEC3': 3,\n\t\t'VEC4': 4,\n\t\t'MAT2': 4,\n\t\t'MAT3': 9,\n\t\t'MAT4': 16\n\t};\n\tconst ATTRIBUTES = {\n\t\tPOSITION: 'position',\n\t\tNORMAL: 'normal',\n\t\tTANGENT: 'tangent',\n\t\tTEXCOORD_0: 'uv',\n\t\tTEXCOORD_1: 'uv2',\n\t\tCOLOR_0: 'color',\n\t\tWEIGHTS_0: 'skinWeight',\n\t\tJOINTS_0: 'skinIndex'\n\t};\n\tconst PATH_PROPERTIES = {\n\t\tscale: 'scale',\n\t\ttranslation: 'position',\n\t\trotation: 'quaternion',\n\t\tweights: 'morphTargetInfluences'\n\t};\n\tconst INTERPOLATION = {\n\t\tCUBICSPLINE: undefined,\n\t\t// We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t// keyframe track will be initialized with a default interpolation type, then modified.\n\t\tLINEAR: THREE.InterpolateLinear,\n\t\tSTEP: THREE.InterpolateDiscrete\n\t};\n\tconst ALPHA_MODES = {\n\t\tOPAQUE: 'OPAQUE',\n\t\tMASK: 'MASK',\n\t\tBLEND: 'BLEND'\n\t};\n\t/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n */\n\n\tfunction createDefaultMaterial( cache ) {\n\n\t\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\t\tcache[ 'DefaultMaterial' ] = new THREE.MeshStandardMaterial( {\n\t\t\t\tcolor: 0xFFFFFF,\n\t\t\t\temissive: 0x000000,\n\t\t\t\tmetalness: 1,\n\t\t\t\troughness: 1,\n\t\t\t\ttransparent: false,\n\t\t\t\tdepthTest: true,\n\t\t\t\tside: THREE.FrontSide\n\t\t\t} );\n\n\t\t}\n\n\t\treturn cache[ 'DefaultMaterial' ];\n\n\t}\n\n\tfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t\t// Add unknown glTF extensions to an object's userData.\n\t\tfor ( const name in objectDef.extensions ) {\n\n\t\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\t/**\n * @param {Object3D|Material|BufferGeometry} object\n * @param {GLTF.definition} gltfDef\n */\n\n\n\tfunction assignExtrasToUserData( object, gltfDef ) {\n\n\t\tif ( gltfDef.extras !== undefined ) {\n\n\t\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\t/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array<GLTF.Target>} targets\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\n\n\n\tfunction addMorphTargets( geometry, targets, parser ) {\n\n\t\tlet hasMorphPosition = false;\n\t\tlet hasMorphNormal = false;\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\t\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\t\tif ( hasMorphPosition && hasMorphNormal ) break;\n\n\t\t}\n\n\t\tif ( ! hasMorphPosition && ! hasMorphNormal ) return Promise.resolve( geometry );\n\t\tconst pendingPositionAccessors = [];\n\t\tconst pendingNormalAccessors = [];\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( hasMorphPosition ) {\n\n\t\t\t\tconst pendingAccessor = target.POSITION !== undefined ? parser.getDependency( 'accessor', target.POSITION ) : geometry.attributes.position;\n\t\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t\t}\n\n\t\t\tif ( hasMorphNormal ) {\n\n\t\t\t\tconst pendingAccessor = target.NORMAL !== undefined ? parser.getDependency( 'accessor', target.NORMAL ) : geometry.attributes.normal;\n\t\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( [ Promise.all( pendingPositionAccessors ), Promise.all( pendingNormalAccessors ) ] ).then( function ( accessors ) {\n\n\t\t\tconst morphPositions = accessors[ 0 ];\n\t\t\tconst morphNormals = accessors[ 1 ];\n\t\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\t\tgeometry.morphTargetsRelative = true;\n\t\t\treturn geometry;\n\n\t\t} );\n\n\t}\n\t/**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\n\n\n\tfunction updateMorphTargets( mesh, meshDef ) {\n\n\t\tmesh.updateMorphTargets();\n\n\t\tif ( meshDef.weights !== undefined ) {\n\n\t\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t\t}\n\n\t\t} // .extras has user-defined data, so check that .extras.targetNames is an array.\n\n\n\t\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createPrimitiveKey( primitiveDef ) {\n\n\t\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\t\tlet geometryKey;\n\n\t\tif ( dracoExtension ) {\n\n\t\t\tgeometryKey = 'draco:' + dracoExtension.bufferView + ':' + dracoExtension.indices + ':' + createAttributesKey( dracoExtension.attributes );\n\n\t\t} else {\n\n\t\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t\t}\n\n\t\treturn geometryKey;\n\n\t}\n\n\tfunction createAttributesKey( attributes ) {\n\n\t\tlet attributesKey = '';\n\t\tconst keys = Object.keys( attributes ).sort();\n\n\t\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t\t}\n\n\t\treturn attributesKey;\n\n\t}\n\n\tfunction getNormalizedComponentScale( constructor ) {\n\n\t\t// Reference:\n\t\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\t\tswitch ( constructor ) {\n\n\t\t\tcase Int8Array:\n\t\t\t\treturn 1 / 127;\n\n\t\t\tcase Uint8Array:\n\t\t\t\treturn 1 / 255;\n\n\t\t\tcase Int16Array:\n\t\t\t\treturn 1 / 32767;\n\n\t\t\tcase Uint16Array:\n\t\t\t\treturn 1 / 65535;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t\t}\n\n\t}\n\t/* GLTF PARSER */\n\n\n\tclass GLTFParser {\n\n\t\tconstructor( json = {}, options = {} ) {\n\n\t\t\tthis.json = json;\n\t\t\tthis.extensions = {};\n\t\t\tthis.plugins = {};\n\t\t\tthis.options = options; // loader object cache\n\n\t\t\tthis.cache = new GLTFRegistry(); // associations between Three.js objects and glTF elements\n\n\t\t\tthis.associations = new Map(); // THREE.BufferGeometry caching\n\n\t\t\tthis.primitiveCache = {}; // THREE.Object3D instance caches\n\n\t\t\tthis.meshCache = {\n\t\t\t\trefs: {},\n\t\t\t\tuses: {}\n\t\t\t};\n\t\t\tthis.cameraCache = {\n\t\t\t\trefs: {},\n\t\t\t\tuses: {}\n\t\t\t};\n\t\t\tthis.lightCache = {\n\t\t\t\trefs: {},\n\t\t\t\tuses: {}\n\t\t\t};\n\t\t\tthis.textureCache = {}; // Track node names, to ensure no duplicates\n\n\t\t\tthis.nodeNamesUsed = {}; // Use an THREE.ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\t\tif ( typeof createImageBitmap !== 'undefined' && /Firefox/.test( navigator.userAgent ) === false ) {\n\n\t\t\t\tthis.textureLoader = new THREE.ImageBitmapLoader( this.options.manager );\n\n\t\t\t} else {\n\n\t\t\t\tthis.textureLoader = new THREE.TextureLoader( this.options.manager );\n\n\t\t\t}\n\n\t\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\t\t\tthis.fileLoader = new THREE.FileLoader( this.options.manager );\n\t\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t\t}\n\n\t\t}\n\n\t\tsetExtensions( extensions ) {\n\n\t\t\tthis.extensions = extensions;\n\n\t\t}\n\n\t\tsetPlugins( plugins ) {\n\n\t\t\tthis.plugins = plugins;\n\n\t\t}\n\n\t\tparse( onLoad, onError ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst json = this.json;\n\t\t\tconst extensions = this.extensions; // Clear the loader cache\n\n\t\t\tthis.cache.removeAll(); // Mark the special nodes/meshes in json for efficient parse\n\n\t\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t\t} );\n\n\t\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\treturn Promise.all( [ parser.getDependencies( 'scene' ), parser.getDependencies( 'animation' ), parser.getDependencies( 'camera' ) ] );\n\n\t\t\t} ).then( function ( dependencies ) {\n\n\t\t\t\tconst result = {\n\t\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\t\tasset: json.asset,\n\t\t\t\t\tparser: parser,\n\t\t\t\t\tuserData: {}\n\t\t\t\t};\n\t\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\t\t\t\tassignExtrasToUserData( result, json );\n\t\t\t\tPromise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t\t} ) ).then( function () {\n\n\t\t\t\t\tonLoad( result );\n\n\t\t\t\t} );\n\n\t\t\t} ).catch( onError );\n\n\t\t}\n\t\t/**\n   * Marks the special nodes/meshes in json for efficient parse.\n   */\n\n\n\t\t_markDefs() {\n\n\t\t\tconst nodeDefs = this.json.nodes || [];\n\t\t\tconst skinDefs = this.json.skins || [];\n\t\t\tconst meshDefs = this.json.meshes || []; // Nothing in the node definition indicates whether it is a THREE.Bone or an\n\t\t\t// THREE.Object3D. Use the skins' joint references to mark bones.\n\n\t\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t\t}\n\n\t\t\t} // Iterate over all nodes, marking references to shared resources,\n\t\t\t// as well as skeleton joints.\n\n\n\t\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh ); // Nothing in the mesh definition indicates whether it is\n\t\t\t\t\t// a THREE.SkinnedMesh or THREE.Mesh. Use the node's mesh reference\n\t\t\t\t\t// to mark THREE.SkinnedMesh if node has skin.\n\n\n\t\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\t\t/**\n   * Counts references to shared node / THREE.Object3D resources. These resources\n   * can be reused, or \"instantiated\", at multiple nodes in the scene\n   * hierarchy. THREE.Mesh, Camera, and Light instances are instantiated and must\n   * be marked. Non-scenegraph resources (like Materials, Geometries, and\n   * Textures) can be reused directly and are not marked here.\n   *\n   * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n   */\n\n\n\t\t_addNodeRef( cache, index ) {\n\n\t\t\tif ( index === undefined ) return;\n\n\t\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t\t}\n\n\t\t\tcache.refs[ index ] ++;\n\n\t\t}\n\t\t/** Returns a reference to a shared resource, cloning it if necessary. */\n\n\n\t\t_getNodeRef( cache, index, object ) {\n\n\t\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\t\t\tconst ref = object.clone(); // Propagates mappings to the cloned object, prevents mappings on the\n\t\t\t// original object from being lost.\n\n\t\t\tconst updateMappings = ( original, clone ) => {\n\n\t\t\t\tconst mappings = this.associations.get( original );\n\n\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\tthis.associations.set( clone, mappings );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( const [ i, child ] of original.children.entries() ) {\n\n\t\t\t\t\tupdateMappings( child, clone.children[ i ] );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tupdateMappings( object, ref );\n\t\t\tref.name += '_instance_' + cache.uses[ index ] ++;\n\t\t\treturn ref;\n\n\t\t}\n\n\t\t_invokeOne( func ) {\n\n\t\t\tconst extensions = Object.values( this.plugins );\n\t\t\textensions.push( this );\n\n\t\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\t\tconst result = func( extensions[ i ] );\n\t\t\t\tif ( result ) return result;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_invokeAll( func ) {\n\n\t\t\tconst extensions = Object.values( this.plugins );\n\t\t\textensions.unshift( this );\n\t\t\tconst pending = [];\n\n\t\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\t\tconst result = func( extensions[ i ] );\n\t\t\t\tif ( result ) pending.push( result );\n\n\t\t\t}\n\n\t\t\treturn pending;\n\n\t\t}\n\t\t/**\n   * Requests the specified dependency asynchronously, with caching.\n   * @param {string} type\n   * @param {number} index\n   * @return {Promise<Object3D|Material|THREE.Texture|AnimationClip|ArrayBuffer|Object>}\n   */\n\n\n\t\tgetDependency( type, index ) {\n\n\t\t\tconst cacheKey = type + ':' + index;\n\t\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\t\tif ( ! dependency ) {\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'scene':\n\t\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'node':\n\t\t\t\t\t\tdependency = this.loadNode( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'mesh':\n\t\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'accessor':\n\t\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bufferView':\n\t\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'buffer':\n\t\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'material':\n\t\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'texture':\n\t\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'skin':\n\t\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'animation':\n\t\t\t\t\t\tdependency = this.loadAnimation( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'camera':\n\t\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t\t}\n\n\t\t\treturn dependency;\n\n\t\t}\n\t\t/**\n   * Requests all dependencies of the specified type asynchronously, with caching.\n   * @param {string} type\n   * @return {Promise<Array<Object>>}\n   */\n\n\n\t\tgetDependencies( type ) {\n\n\t\t\tlet dependencies = this.cache.get( type );\n\n\t\t\tif ( ! dependencies ) {\n\n\t\t\t\tconst parser = this;\n\t\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\t\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t\t} ) );\n\t\t\t\tthis.cache.add( type, dependencies );\n\n\t\t\t}\n\n\t\t\treturn dependencies;\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n   * @param {number} bufferIndex\n   * @return {Promise<ArrayBuffer>}\n   */\n\n\n\t\tloadBuffer( bufferIndex ) {\n\n\t\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\t\tconst loader = this.fileLoader;\n\n\t\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t\t} // If present, GLB container is required to be the first buffer.\n\n\n\t\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t\t}\n\n\t\t\tconst options = this.options;\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tloader.load( THREE.LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n   * @param {number} bufferViewIndex\n   * @return {Promise<ArrayBuffer>}\n   */\n\n\n\t\tloadBufferView( bufferViewIndex ) {\n\n\t\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\t\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n   * @param {number} accessorIndex\n   * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n   */\n\n\n\t\tloadAccessor( accessorIndex ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst json = this.json;\n\t\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\t\t// Ignore empty accessors, which may be used to declare runtime\n\t\t\t\t// information about attributes coming from another source (e.g. Draco\n\t\t\t\t// compression extension).\n\t\t\t\treturn Promise.resolve( null );\n\n\t\t\t}\n\n\t\t\tconst pendingBufferViews = [];\n\n\t\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t\t} else {\n\n\t\t\t\tpendingBufferViews.push( null );\n\n\t\t\t}\n\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\t\tconst bufferView = bufferViews[ 0 ];\n\t\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\n\t\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\t\tlet array, bufferAttribute; // The buffer is not interleaved if the stride is the item size in bytes.\n\n\t\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own THREE.InterleavedBuffer\n\t\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes ); // Integer parameters to IB/IBA are in array elements, not bytes.\n\n\t\t\t\t\t\tib = new THREE.InterleavedBuffer( array, byteStride / elementBytes );\n\t\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbufferAttribute = new THREE.InterleavedBufferAttribute( ib, itemSize, byteOffset % byteStride / elementBytes, normalized );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbufferAttribute = new THREE.BufferAttribute( array, itemSize, normalized );\n\n\t\t\t\t} // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\n\n\t\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\t\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\t\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\t\tbufferAttribute = new THREE.BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst index = sparseIndices[ i ];\n\t\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse THREE.BufferAttribute.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn bufferAttribute;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n   * @param {number} textureIndex\n   * @return {Promise<THREE.Texture>}\n   */\n\n\n\t\tloadTexture( textureIndex ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst options = this.options;\n\t\t\tconst textureDef = json.textures[ textureIndex ];\n\t\t\tconst source = json.images[ textureDef.source ];\n\t\t\tlet loader = this.textureLoader;\n\n\t\t\tif ( source.uri ) {\n\n\t\t\t\tconst handler = options.manager.getHandler( source.uri );\n\t\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t\t}\n\n\t\t\treturn this.loadTextureImage( textureIndex, source, loader );\n\n\t\t}\n\n\t\tloadTextureImage( textureIndex, source, loader ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst json = this.json;\n\t\t\tconst options = this.options;\n\t\t\tconst textureDef = json.textures[ textureIndex ];\n\t\t\tconst cacheKey = ( source.uri || source.bufferView ) + ':' + textureDef.sampler;\n\n\t\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t\t}\n\n\t\t\tconst URL = self.URL || self.webkitURL;\n\t\t\tlet sourceURI = source.uri || '';\n\t\t\tlet isObjectURL = false;\n\n\t\t\tif ( source.bufferView !== undefined ) {\n\n\t\t\t\t// Load binary image data from bufferView, if provided.\n\t\t\t\tsourceURI = parser.getDependency( 'bufferView', source.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\t\tisObjectURL = true;\n\t\t\t\t\tconst blob = new Blob( [ bufferView ], {\n\t\t\t\t\t\ttype: source.mimeType\n\t\t\t\t\t} );\n\t\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\t\treturn sourceURI;\n\n\t\t\t\t} );\n\n\t\t\t} else if ( source.uri === undefined ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + textureIndex + ' is missing URI and bufferView' );\n\n\t\t\t}\n\n\t\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\t\tconst texture = new THREE.Texture( imageBitmap );\n\t\t\t\t\t\t\ttexture.needsUpdate = true;\n\t\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t\tloader.load( THREE.LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t\t} );\n\n\t\t\t} ).then( function ( texture ) {\n\n\t\t\t\t// Clean up resources and configure THREE.Texture.\n\t\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.flipY = false;\n\t\t\t\tif ( textureDef.name ) texture.name = textureDef.name;\n\t\t\t\tconst samplers = json.samplers || {};\n\t\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\t\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || THREE.LinearFilter;\n\t\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || THREE.LinearMipmapLinearFilter;\n\t\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || THREE.RepeatWrapping;\n\t\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || THREE.RepeatWrapping;\n\t\t\t\tparser.associations.set( texture, {\n\t\t\t\t\ttextures: textureIndex\n\t\t\t\t} );\n\t\t\t\treturn texture;\n\n\t\t\t} ).catch( function () {\n\n\t\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\t\treturn null;\n\n\t\t\t} );\n\t\t\tthis.textureCache[ cacheKey ] = promise;\n\t\t\treturn promise;\n\n\t\t}\n\t\t/**\n   * Asynchronously assigns a texture to the given material parameters.\n   * @param {Object} materialParams\n   * @param {string} mapName\n   * @param {Object} mapDef\n   * @return {Promise<Texture>}\n   */\n\n\n\t\tassignTexture( materialParams, mapName, mapDef ) {\n\n\t\t\tconst parser = this;\n\t\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\t\t// Materials sample aoMap from UV set 1 and other maps from UV set 0 - this can't be configured\n\t\t\t\t// However, we will copy UV set 0 to UV set 1 on demand for aoMap\n\t\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord != 0 && ! ( mapName === 'aoMap' && mapDef.texCoord == 1 ) ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Custom UV set ' + mapDef.texCoord + ' for texture ' + mapName + ' not yet supported.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\t\tif ( transform ) {\n\n\t\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tmaterialParams[ mapName ] = texture;\n\t\t\t\treturn texture;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Assigns final material to a THREE.Mesh, THREE.Line, or THREE.Points instance. The instance\n   * already has a material (generated from the glTF material options alone)\n   * but reuse of the same glTF material may require multiple threejs materials\n   * to accommodate different primitive types, defines, etc. New materials will\n   * be created if necessary, and reused from a cache.\n   * @param  {Object3D} mesh THREE.Mesh, THREE.Line, or THREE.Points instance.\n   */\n\n\n\t\tassignFinalMaterial( mesh ) {\n\n\t\t\tconst geometry = mesh.geometry;\n\t\t\tlet material = mesh.material;\n\t\t\tconst useDerivativeTangents = geometry.attributes.tangent === undefined;\n\t\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\t\tif ( mesh.isPoints ) {\n\n\t\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\t\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\t\tpointsMaterial = new THREE.PointsMaterial();\n\t\t\t\t\tTHREE.Material.prototype.copy.call( pointsMaterial, material );\n\t\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t\t}\n\n\t\t\t\tmaterial = pointsMaterial;\n\n\t\t\t} else if ( mesh.isLine ) {\n\n\t\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\t\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\t\tlineMaterial = new THREE.LineBasicMaterial();\n\t\t\t\t\tTHREE.Material.prototype.copy.call( lineMaterial, material );\n\t\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t\t}\n\n\t\t\t\tmaterial = lineMaterial;\n\n\t\t\t} // Clone the material if it will be modified\n\n\n\t\t\tif ( useDerivativeTangents || useVertexColors || useFlatShading ) {\n\n\t\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\t\t\t\tif ( material.isGLTFSpecularGlossinessMaterial ) cacheKey += 'specular-glossiness:';\n\t\t\t\tif ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';\n\t\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\t\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\t\tcachedMaterial = material.clone();\n\t\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\t\tif ( useDerivativeTangents ) {\n\n\t\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\t\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t\t}\n\n\t\t\t\tmaterial = cachedMaterial;\n\n\t\t\t} // workarounds for mesh and geometry\n\n\n\t\t\tif ( material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined ) {\n\n\t\t\t\tgeometry.setAttribute( 'uv2', geometry.attributes.uv );\n\n\t\t\t}\n\n\t\t\tmesh.material = material;\n\n\t\t}\n\n\t\tgetMaterialType() {\n\n\t\t\treturn THREE.MeshStandardMaterial;\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n   * @param {number} materialIndex\n   * @return {Promise<Material>}\n   */\n\n\n\t\tloadMaterial( materialIndex ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst json = this.json;\n\t\t\tconst extensions = this.extensions;\n\t\t\tconst materialDef = json.materials[ materialIndex ];\n\t\t\tlet materialType;\n\t\t\tconst materialParams = {};\n\t\t\tconst materialExtensions = materialDef.extensions || {};\n\t\t\tconst pending = [];\n\n\t\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ] ) {\n\n\t\t\t\tconst sgExtension = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ];\n\t\t\t\tmaterialType = sgExtension.getMaterialType();\n\t\t\t\tpending.push( sgExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t\t} else if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t\t} else {\n\n\t\t\t\t// Specification:\n\t\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\t\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\t\t\t\tmaterialParams.color = new THREE.Color( 1.0, 1.0, 1.0 );\n\t\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\t\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) );\n\n\t\t\t\t}\n\n\t\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t\t}\n\n\t\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t\t} );\n\t\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t\t} ) ) );\n\n\t\t\t}\n\n\t\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\t\tmaterialParams.side = THREE.DoubleSide;\n\n\t\t\t}\n\n\t\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\t\tmaterialParams.transparent = true; // See: https://github.com/mrdoob/three.js/issues/17706\n\n\t\t\t\tmaterialParams.depthWrite = false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterialParams.format = THREE.RGBFormat;\n\t\t\t\tmaterialParams.transparent = false;\n\n\t\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( materialDef.normalTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\t\t\t\tmaterialParams.normalScale = new THREE.Vector2( 1, 1 );\n\n\t\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\t\tconst scale = materialDef.normalTexture.scale;\n\t\t\t\t\tmaterialParams.normalScale.set( scale, scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\t\tmaterialParams.emissive = new THREE.Color().fromArray( materialDef.emissiveFactor );\n\n\t\t\t}\n\n\t\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\t\tlet material;\n\n\t\t\t\tif ( materialType === GLTFMeshStandardSGMaterial ) {\n\n\t\t\t\t\tmaterial = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterial = new materialType( materialParams );\n\n\t\t\t\t}\n\n\t\t\t\tif ( materialDef.name ) material.name = materialDef.name; // baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding.\n\n\t\t\t\tif ( material.map ) material.map.encoding = THREE.sRGBEncoding;\n\t\t\t\tif ( material.emissiveMap ) material.emissiveMap.encoding = THREE.sRGBEncoding;\n\t\t\t\tassignExtrasToUserData( material, materialDef );\n\t\t\t\tparser.associations.set( material, {\n\t\t\t\t\tmaterials: materialIndex\n\t\t\t\t} );\n\t\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\t\t\t\treturn material;\n\n\t\t\t} );\n\n\t\t}\n\t\t/** When THREE.Object3D instances are targeted by animation, they need unique names. */\n\n\n\t\tcreateUniqueName( originalName ) {\n\n\t\t\tconst sanitizedName = THREE.PropertyBinding.sanitizeNodeName( originalName || '' );\n\t\t\tlet name = sanitizedName;\n\n\t\t\tfor ( let i = 1; this.nodeNamesUsed[ name ]; ++ i ) {\n\n\t\t\t\tname = sanitizedName + '_' + i;\n\n\t\t\t}\n\n\t\t\tthis.nodeNamesUsed[ name ] = true;\n\t\t\treturn name;\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n   *\n   * Creates BufferGeometries from primitives.\n   *\n   * @param {Array<GLTF.Primitive>} primitives\n   * @return {Promise<Array<BufferGeometry>>}\n   */\n\n\n\t\tloadGeometries( primitives ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst extensions = this.extensions;\n\t\t\tconst cache = this.primitiveCache;\n\n\t\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ].decodePrimitive( primitive, parser ).then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\n\t\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\t\tconst primitive = primitives[ i ];\n\t\t\t\tconst cacheKey = createPrimitiveKey( primitive ); // See if we've already created this geometry\n\n\t\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\t\tif ( cached ) {\n\n\t\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\t\tpending.push( cached.promise );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet geometryPromise;\n\n\t\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new THREE.BufferGeometry(), primitive, parser );\n\n\t\t\t\t\t} // Cache this geometry\n\n\n\t\t\t\t\tcache[ cacheKey ] = {\n\t\t\t\t\t\tprimitive: primitive,\n\t\t\t\t\t\tpromise: geometryPromise\n\t\t\t\t\t};\n\t\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n   * @param {number} meshIndex\n   * @return {Promise<Group|Mesh|SkinnedMesh>}\n   */\n\n\n\t\tloadMesh( meshIndex ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst json = this.json;\n\t\t\tconst extensions = this.extensions;\n\t\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\t\tconst primitives = meshDef.primitives;\n\t\t\tconst pending = [];\n\n\t\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\t\tconst material = primitives[ i ].material === undefined ? createDefaultMaterial( this.cache ) : this.getDependency( 'material', primitives[ i ].material );\n\t\t\t\tpending.push( material );\n\n\t\t\t}\n\n\t\t\tpending.push( parser.loadGeometries( primitives ) );\n\t\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\t\tconst geometries = results[ results.length - 1 ];\n\t\t\t\tconst meshes = [];\n\n\t\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\t\tconst primitive = primitives[ i ]; // 1. create THREE.Mesh\n\n\t\t\t\t\tlet mesh;\n\t\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || primitive.mode === undefined ) {\n\n\t\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true ? new THREE.SkinnedMesh( geometry, material ) : new THREE.Mesh( geometry, material );\n\n\t\t\t\t\t\tif ( mesh.isSkinnedMesh === true && ! mesh.geometry.attributes.skinWeight.normalized ) {\n\n\t\t\t\t\t\t\t// we normalize floating point skin weight array to fix malformed assets (see #15319)\n\t\t\t\t\t\t\t// it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs\n\t\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, THREE.TriangleStripDrawMode );\n\n\t\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, THREE.TriangleFanDrawMode );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\t\tmesh = new THREE.LineSegments( geometry, material );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\t\tmesh = new THREE.Line( geometry, material );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\t\tmesh = new THREE.LineLoop( geometry, material );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\t\tmesh = new THREE.Points( geometry, material );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || 'mesh_' + meshIndex );\n\t\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\t\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\t\t\t\t\tparser.assignFinalMaterial( mesh );\n\t\t\t\t\tmeshes.push( mesh );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\t\tparser.associations.set( meshes[ i ], {\n\t\t\t\t\t\tmeshes: meshIndex,\n\t\t\t\t\t\tprimitives: i\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t\t}\n\n\t\t\t\tconst group = new THREE.Group();\n\t\t\t\tparser.associations.set( group, {\n\t\t\t\t\tmeshes: meshIndex\n\t\t\t\t} );\n\n\t\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn group;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n   * @param {number} cameraIndex\n   * @return {Promise<THREE.Camera>}\n   */\n\n\n\t\tloadCamera( cameraIndex ) {\n\n\t\t\tlet camera;\n\t\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\t\tif ( ! params ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\t\tcamera = new THREE.PerspectiveCamera( THREE.MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\t\tcamera = new THREE.OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t\t}\n\n\t\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\t\t\tassignExtrasToUserData( camera, cameraDef );\n\t\t\treturn Promise.resolve( camera );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n   * @param {number} skinIndex\n   * @return {Promise<Object>}\n   */\n\n\n\t\tloadSkin( skinIndex ) {\n\n\t\t\tconst skinDef = this.json.skins[ skinIndex ];\n\t\t\tconst skinEntry = {\n\t\t\t\tjoints: skinDef.joints\n\t\t\t};\n\n\t\t\tif ( skinDef.inverseBindMatrices === undefined ) {\n\n\t\t\t\treturn Promise.resolve( skinEntry );\n\n\t\t\t}\n\n\t\t\treturn this.getDependency( 'accessor', skinDef.inverseBindMatrices ).then( function ( accessor ) {\n\n\t\t\t\tskinEntry.inverseBindMatrices = accessor;\n\t\t\t\treturn skinEntry;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n   * @param {number} animationIndex\n   * @return {Promise<AnimationClip>}\n   */\n\n\n\t\tloadAnimation( animationIndex ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst animationDef = json.animations[ animationIndex ];\n\t\t\tconst pendingNodes = [];\n\t\t\tconst pendingInputAccessors = [];\n\t\t\tconst pendingOutputAccessors = [];\n\t\t\tconst pendingSamplers = [];\n\t\t\tconst pendingTargets = [];\n\n\t\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\t\tconst target = channel.target;\n\t\t\t\tconst name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated.\n\n\t\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\t\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\t\tpendingSamplers.push( sampler );\n\t\t\t\tpendingTargets.push( target );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( [ Promise.all( pendingNodes ), Promise.all( pendingInputAccessors ), Promise.all( pendingOutputAccessors ), Promise.all( pendingSamplers ), Promise.all( pendingTargets ) ] ).then( function ( dependencies ) {\n\n\t\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\t\tconst targets = dependencies[ 4 ];\n\t\t\t\tconst tracks = [];\n\n\t\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst node = nodes[ i ];\n\t\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\t\tconst target = targets[ i ];\n\t\t\t\t\tif ( node === undefined ) continue;\n\t\t\t\t\tnode.updateMatrix();\n\t\t\t\t\tnode.matrixAutoUpdate = true;\n\t\t\t\t\tlet TypedKeyframeTrack;\n\n\t\t\t\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\t\t\t\tcase PATH_PROPERTIES.weights:\n\t\t\t\t\t\t\tTypedKeyframeTrack = THREE.NumberKeyframeTrack;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase PATH_PROPERTIES.rotation:\n\t\t\t\t\t\t\tTypedKeyframeTrack = THREE.QuaternionKeyframeTrack;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase PATH_PROPERTIES.position:\n\t\t\t\t\t\tcase PATH_PROPERTIES.scale:\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tTypedKeyframeTrack = THREE.VectorKeyframeTrack;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst targetName = node.name ? node.name : node.uuid;\n\t\t\t\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : THREE.InterpolateLinear;\n\t\t\t\t\tconst targetNames = [];\n\n\t\t\t\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\t\t\t\t// Node may be a THREE.Group (glTF mesh with several primitives) or a THREE.Mesh.\n\t\t\t\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\t\t\t\tif ( object.isMesh === true && object.morphTargetInfluences ) {\n\n\t\t\t\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetNames.push( targetName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet outputArray = outputAccessor.array;\n\n\t\t\t\t\tif ( outputAccessor.normalized ) {\n\n\t\t\t\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\t\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\toutputArray = scaled;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst track = new TypedKeyframeTrack( targetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ], inputAccessor.array, outputArray, interpolation ); // Override interpolation with custom factory method.\n\n\t\t\t\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\t\t\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t\t\t\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t\t\t\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t\t\t\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\t\t\t\t\t\t\t\tconst interpolantType = this instanceof THREE.QuaternionKeyframeTrack ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\t\t\t\t\t\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t\t\t\t\t\t}; // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\n\n\t\t\t\t\t\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( track );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst name = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\t\t\t\treturn new THREE.AnimationClip( name, undefined, tracks );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tcreateNodeMesh( nodeIndex ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst parser = this;\n\t\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\t\tif ( nodeDef.mesh === undefined ) return null;\n\t\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh ); // if weights are provided on the node, override weights on the mesh.\n\n\n\t\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\treturn node;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n   * @param {number} nodeIndex\n   * @return {Promise<Object3D>}\n   */\n\n\n\t\tloadNode( nodeIndex ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst extensions = this.extensions;\n\t\t\tconst parser = this;\n\t\t\tconst nodeDef = json.nodes[ nodeIndex ]; // reserve node's name before its dependencies, so the root has the intended name.\n\n\t\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\t\t\treturn function () {\n\n\t\t\t\tconst pending = [];\n\n\t\t\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( meshPromise ) {\n\n\t\t\t\t\tpending.push( meshPromise );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t\t\t} ) );\n\n\t\t\t\t}\n\n\t\t\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t\t\t} ).forEach( function ( promise ) {\n\n\t\t\t\t\tpending.push( promise );\n\n\t\t\t\t} );\n\n\t\t\t\treturn Promise.all( pending );\n\n\t\t\t}().then( function ( objects ) {\n\n\t\t\t\tlet node; // .isBone isn't in glTF spec. See ._markDefs\n\n\t\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\t\tnode = new THREE.Bone();\n\n\t\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\t\tnode = new THREE.Group();\n\n\t\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnode = new THREE.Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\t\tnode.name = nodeName;\n\n\t\t\t\t}\n\n\t\t\t\tassignExtrasToUserData( node, nodeDef );\n\t\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\t\tconst matrix = new THREE.Matrix4();\n\t\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! parser.associations.has( node ) ) {\n\n\t\t\t\t\tparser.associations.set( node, {} );\n\n\t\t\t\t}\n\n\t\t\t\tparser.associations.get( node ).nodes = nodeIndex;\n\t\t\t\treturn node;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n   * @param {number} sceneIndex\n   * @return {Promise<Group>}\n   */\n\n\n\t\tloadScene( sceneIndex ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst extensions = this.extensions;\n\t\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\t\tconst parser = this; // THREE.Loader returns THREE.Group, not Scene.\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\n\t\t\tconst scene = new THREE.Group();\n\t\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\t\t\tassignExtrasToUserData( scene, sceneDef );\n\t\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\t\t\tconst nodeIds = sceneDef.nodes || [];\n\t\t\tconst pending = [];\n\n\t\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\t\tpending.push( buildNodeHierarchy( nodeIds[ i ], scene, json, parser ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\t\t// Removes dangling associations, associations that reference a node that\n\t\t\t\t// didn't make it into the scene.\n\t\t\t\tconst reduceAssociations = node => {\n\n\t\t\t\t\tconst reducedAssociations = new Map();\n\n\t\t\t\t\tfor ( const [ key, value ] of parser.associations ) {\n\n\t\t\t\t\t\tif ( key instanceof THREE.Material || key instanceof THREE.Texture ) {\n\n\t\t\t\t\t\t\treducedAssociations.set( key, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnode.traverse( node => {\n\n\t\t\t\t\t\tconst mappings = parser.associations.get( node );\n\n\t\t\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\t\t\treducedAssociations.set( node, mappings );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\t\t\t\t\treturn reducedAssociations;\n\n\t\t\t\t};\n\n\t\t\t\tparser.associations = reduceAssociations( scene );\n\t\t\t\treturn scene;\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\tfunction buildNodeHierarchy( nodeId, parentObject, json, parser ) {\n\n\t\tconst nodeDef = json.nodes[ nodeId ];\n\t\treturn parser.getDependency( 'node', nodeId ).then( function ( node ) {\n\n\t\t\tif ( nodeDef.skin === undefined ) return node; // build skeleton here as well\n\n\t\t\tlet skinEntry;\n\t\t\treturn parser.getDependency( 'skin', nodeDef.skin ).then( function ( skin ) {\n\n\t\t\t\tskinEntry = skin;\n\t\t\t\tconst pendingJoints = [];\n\n\t\t\t\tfor ( let i = 0, il = skinEntry.joints.length; i < il; i ++ ) {\n\n\t\t\t\t\tpendingJoints.push( parser.getDependency( 'node', skinEntry.joints[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\treturn Promise.all( pendingJoints );\n\n\t\t\t} ).then( function ( jointNodes ) {\n\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isMesh ) return;\n\t\t\t\t\tconst bones = [];\n\t\t\t\t\tconst boneInverses = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = jointNodes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst jointNode = jointNodes[ j ];\n\n\t\t\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\t\t\tbones.push( jointNode );\n\t\t\t\t\t\t\tconst mat = new THREE.Matrix4();\n\n\t\t\t\t\t\t\tif ( skinEntry.inverseBindMatrices !== undefined ) {\n\n\t\t\t\t\t\t\t\tmat.fromArray( skinEntry.inverseBindMatrices.array, j * 16 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinEntry.joints[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmesh.bind( new THREE.Skeleton( bones, boneInverses ), mesh.matrixWorld );\n\n\t\t\t\t} );\n\t\t\t\treturn node;\n\n\t\t\t} );\n\n\t\t} ).then( function ( node ) {\n\n\t\t\t// build node hierachy\n\t\t\tparentObject.add( node );\n\t\t\tconst pending = [];\n\n\t\t\tif ( nodeDef.children ) {\n\n\t\t\t\tconst children = nodeDef.children;\n\n\t\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst child = children[ i ];\n\t\t\t\t\tpending.push( buildNodeHierarchy( child, node, json, parser ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t} );\n\n\t}\n\t/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\n\n\n\tfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\t\tconst attributes = primitiveDef.attributes;\n\t\tconst box = new THREE.Box3();\n\n\t\tif ( attributes.POSITION !== undefined ) {\n\n\t\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\t\t\tconst min = accessor.min;\n\t\t\tconst max = accessor.max; // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\tbox.set( new THREE.Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ), new THREE.Vector3( max[ 0 ], max[ 1 ], max[ 2 ] ) );\n\n\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst targets = primitiveDef.targets;\n\n\t\tif ( targets !== undefined ) {\n\n\t\t\tconst maxDisplacement = new THREE.Vector3();\n\t\t\tconst vector = new THREE.Vector3();\n\n\t\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\t\tconst min = accessor.min;\n\t\t\t\t\tconst max = accessor.max; // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\t\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t\t} // Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\n\n\t\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\n\n\t\t\tbox.expandByVector( maxDisplacement );\n\n\t\t}\n\n\t\tgeometry.boundingBox = box;\n\t\tconst sphere = new THREE.Sphere();\n\t\tbox.getCenter( sphere.center );\n\t\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\t\tgeometry.boundingSphere = sphere;\n\n\t}\n\t/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\n\n\n\tfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\t\tconst attributes = primitiveDef.attributes;\n\t\tconst pending = [];\n\n\t\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\t\treturn parser.getDependency( 'accessor', accessorIndex ).then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfor ( const gltfAttributeName in attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase(); // Skip attributes already provided by e.g. Draco extension.\n\n\t\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\t\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t\t}\n\n\t\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\t\tgeometry.setIndex( accessor );\n\n\t\t\t} );\n\t\t\tpending.push( accessor );\n\n\t\t}\n\n\t\tassignExtrasToUserData( geometry, primitiveDef );\n\t\tcomputeBounds( geometry, primitiveDef, parser );\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\treturn primitiveDef.targets !== undefined ? addMorphTargets( geometry, primitiveDef.targets, parser ) : geometry;\n\n\t\t} );\n\n\t}\n\t/**\n * @param {BufferGeometry} geometry\n * @param {Number} drawMode\n * @return {BufferGeometry}\n */\n\n\n\tfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\t\tlet index = geometry.getIndex(); // generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t} //\n\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === THREE.TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( newIndices.length / 3 !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t} // build final geometry\n\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\treturn newGeometry;\n\n\t}\n\n\tTHREE.GLTFLoader = GLTFLoader;\n\n} )();\n"]}