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