From be02a54d6e192007f00252654628ba2ff8d5f55b Mon Sep 17 00:00:00 2001 From: mrdoob Date: Sun, 18 Jan 2026 23:35:50 -0800 Subject: [PATCH 1/7] WebGLRenderer: Unify cubemaps and cubeuvmaps into WebGLEnvironments (#32792) Co-authored-by: Claude Opus 4.5 --- src/renderers/WebGLRenderer.js | 19 +- src/renderers/webgl/WebGLBackground.js | 4 +- src/renderers/webgl/WebGLCubeMaps.js | 99 ---------- src/renderers/webgl/WebGLCubeUVMaps.js | 134 ------------- src/renderers/webgl/WebGLEnvironments.js | 228 +++++++++++++++++++++++ src/renderers/webgl/WebGLPrograms.js | 4 +- 6 files changed, 240 insertions(+), 248 deletions(-) delete mode 100644 src/renderers/webgl/WebGLCubeMaps.js delete mode 100644 src/renderers/webgl/WebGLCubeUVMaps.js create mode 100644 src/renderers/webgl/WebGLEnvironments.js diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 7de6972f275867..45215d3a8c3840 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -31,8 +31,7 @@ import { WebGLBindingStates } from './webgl/WebGLBindingStates.js'; import { WebGLBufferRenderer } from './webgl/WebGLBufferRenderer.js'; import { WebGLCapabilities } from './webgl/WebGLCapabilities.js'; import { WebGLClipping } from './webgl/WebGLClipping.js'; -import { WebGLCubeMaps } from './webgl/WebGLCubeMaps.js'; -import { WebGLCubeUVMaps } from './webgl/WebGLCubeUVMaps.js'; +import { WebGLEnvironments } from './webgl/WebGLEnvironments.js'; import { WebGLExtensions } from './webgl/WebGLExtensions.js'; import { WebGLGeometries } from './webgl/WebGLGeometries.js'; import { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer.js'; @@ -414,7 +413,7 @@ class WebGLRenderer { } let extensions, capabilities, state, info; - let properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects; + let properties, textures, environments, attributes, geometries, objects; let programCache, materials, renderLists, renderStates, clipping, shadowMap; let background, morphtargets, bufferRenderer, indexedBufferRenderer; @@ -441,19 +440,18 @@ class WebGLRenderer { info = new WebGLInfo( _gl ); properties = new WebGLProperties(); textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ); - cubemaps = new WebGLCubeMaps( _this ); - cubeuvmaps = new WebGLCubeUVMaps( _this ); + environments = new WebGLEnvironments( _this ); attributes = new WebGLAttributes( _gl ); bindingStates = new WebGLBindingStates( _gl, attributes ); geometries = new WebGLGeometries( _gl, attributes, info, bindingStates ); objects = new WebGLObjects( _gl, geometries, attributes, bindingStates, info ); morphtargets = new WebGLMorphtargets( _gl, capabilities, textures ); clipping = new WebGLClipping( properties ); - programCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ); + programCache = new WebGLPrograms( _this, environments, extensions, capabilities, bindingStates, clipping ); materials = new WebGLMaterials( _this, properties ); renderLists = new WebGLRenderLists(); renderStates = new WebGLRenderStates( extensions ); - background = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha ); + background = new WebGLBackground( _this, environments, state, objects, _alpha, premultipliedAlpha ); shadowMap = new WebGLShadowMap( _this, objects, capabilities ); uniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state ); @@ -1055,8 +1053,7 @@ class WebGLRenderer { renderLists.dispose(); renderStates.dispose(); properties.dispose(); - cubemaps.dispose(); - cubeuvmaps.dispose(); + environments.dispose(); objects.dispose(); bindingStates.dispose(); uniformsGroups.dispose(); @@ -2137,7 +2134,7 @@ class WebGLRenderer { materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null; materialProperties.fog = scene.fog; - materialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment ); + materialProperties.envMap = environments.get( material.envMap || materialProperties.environment, material.isMeshStandardMaterial ); materialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation; if ( programs === undefined ) { @@ -2270,7 +2267,7 @@ class WebGLRenderer { const fog = scene.fog; const environment = material.isMeshStandardMaterial ? scene.environment : null; const colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ); - const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment ); + const envMap = environments.get( material.envMap || environment, material.isMeshStandardMaterial ); const vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4; const vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 ); const morphTargets = !! geometry.morphAttributes.position; diff --git a/src/renderers/webgl/WebGLBackground.js b/src/renderers/webgl/WebGLBackground.js index 6d3babdebc9fdb..90344e86834203 100644 --- a/src/renderers/webgl/WebGLBackground.js +++ b/src/renderers/webgl/WebGLBackground.js @@ -14,7 +14,7 @@ const _rgb = { r: 0, b: 0, g: 0 }; const _e1 = /*@__PURE__*/ new Euler(); const _m1 = /*@__PURE__*/ new Matrix4(); -function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) { +function WebGLBackground( renderer, environments, state, objects, alpha, premultipliedAlpha ) { const clearColor = new Color( 0x000000 ); let clearAlpha = alpha === true ? 0 : 1; @@ -33,7 +33,7 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, if ( background && background.isTexture ) { const usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background - background = ( usePMREM ? cubeuvmaps : cubemaps ).get( background ); + background = environments.get( background, usePMREM ); } diff --git a/src/renderers/webgl/WebGLCubeMaps.js b/src/renderers/webgl/WebGLCubeMaps.js deleted file mode 100644 index 38b26dff2f3a9a..00000000000000 --- a/src/renderers/webgl/WebGLCubeMaps.js +++ /dev/null @@ -1,99 +0,0 @@ -import { CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../constants.js'; -import { WebGLCubeRenderTarget } from '../WebGLCubeRenderTarget.js'; - -function WebGLCubeMaps( renderer ) { - - let cubemaps = new WeakMap(); - - function mapTextureMapping( texture, mapping ) { - - if ( mapping === EquirectangularReflectionMapping ) { - - texture.mapping = CubeReflectionMapping; - - } else if ( mapping === EquirectangularRefractionMapping ) { - - texture.mapping = CubeRefractionMapping; - - } - - return texture; - - } - - function get( texture ) { - - if ( texture && texture.isTexture ) { - - const mapping = texture.mapping; - - if ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) { - - if ( cubemaps.has( texture ) ) { - - const cubemap = cubemaps.get( texture ).texture; - return mapTextureMapping( cubemap, texture.mapping ); - - } else { - - const image = texture.image; - - if ( image && image.height > 0 ) { - - const renderTarget = new WebGLCubeRenderTarget( image.height ); - renderTarget.fromEquirectangularTexture( renderer, texture ); - cubemaps.set( texture, renderTarget ); - - texture.addEventListener( 'dispose', onTextureDispose ); - - return mapTextureMapping( renderTarget.texture, texture.mapping ); - - } else { - - // image not yet ready. try the conversion next frame - - return null; - - } - - } - - } - - } - - return texture; - - } - - function onTextureDispose( event ) { - - const texture = event.target; - - texture.removeEventListener( 'dispose', onTextureDispose ); - - const cubemap = cubemaps.get( texture ); - - if ( cubemap !== undefined ) { - - cubemaps.delete( texture ); - cubemap.dispose(); - - } - - } - - function dispose() { - - cubemaps = new WeakMap(); - - } - - return { - get: get, - dispose: dispose - }; - -} - -export { WebGLCubeMaps }; diff --git a/src/renderers/webgl/WebGLCubeUVMaps.js b/src/renderers/webgl/WebGLCubeUVMaps.js deleted file mode 100644 index 0c7e9472f5343b..00000000000000 --- a/src/renderers/webgl/WebGLCubeUVMaps.js +++ /dev/null @@ -1,134 +0,0 @@ -import { CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../constants.js'; -import { PMREMGenerator } from '../../extras/PMREMGenerator.js'; - -function WebGLCubeUVMaps( renderer ) { - - let cubeUVmaps = new WeakMap(); - - let pmremGenerator = null; - - function get( texture ) { - - if ( texture && texture.isTexture ) { - - const mapping = texture.mapping; - - const isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ); - const isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping ); - - // equirect/cube map to cubeUV conversion - - if ( isEquirectMap || isCubeMap ) { - - let renderTarget = cubeUVmaps.get( texture ); - - const currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0; - - if ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) { - - if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer ); - - renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget ); - renderTarget.texture.pmremVersion = texture.pmremVersion; - - cubeUVmaps.set( texture, renderTarget ); - - return renderTarget.texture; - - } else { - - if ( renderTarget !== undefined ) { - - return renderTarget.texture; - - } else { - - const image = texture.image; - - if ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) { - - if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer ); - - renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture ); - renderTarget.texture.pmremVersion = texture.pmremVersion; - - cubeUVmaps.set( texture, renderTarget ); - - texture.addEventListener( 'dispose', onTextureDispose ); - - return renderTarget.texture; - - } else { - - // image not yet ready. try the conversion next frame - - return null; - - } - - } - - } - - } - - } - - return texture; - - } - - function isCubeTextureComplete( image ) { - - let count = 0; - const length = 6; - - for ( let i = 0; i < length; i ++ ) { - - if ( image[ i ] !== undefined ) count ++; - - } - - return count === length; - - - } - - function onTextureDispose( event ) { - - const texture = event.target; - - texture.removeEventListener( 'dispose', onTextureDispose ); - - const cubemapUV = cubeUVmaps.get( texture ); - - if ( cubemapUV !== undefined ) { - - cubeUVmaps.delete( texture ); - cubemapUV.dispose(); - - } - - } - - function dispose() { - - cubeUVmaps = new WeakMap(); - - if ( pmremGenerator !== null ) { - - pmremGenerator.dispose(); - pmremGenerator = null; - - } - - } - - return { - get: get, - dispose: dispose - }; - -} - -export { WebGLCubeUVMaps }; diff --git a/src/renderers/webgl/WebGLEnvironments.js b/src/renderers/webgl/WebGLEnvironments.js new file mode 100644 index 00000000000000..390b0480ae5e8c --- /dev/null +++ b/src/renderers/webgl/WebGLEnvironments.js @@ -0,0 +1,228 @@ +import { CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../constants.js'; +import { PMREMGenerator } from '../../extras/PMREMGenerator.js'; +import { WebGLCubeRenderTarget } from '../WebGLCubeRenderTarget.js'; + +function WebGLEnvironments( renderer ) { + + let cubeMaps = new WeakMap(); + let pmremMaps = new WeakMap(); + + let pmremGenerator = null; + + function get( texture, usePMREM = false ) { + + if ( texture === null || texture === undefined ) return null; + + if ( usePMREM ) { + + return getPMREM( texture ); + + } + + return getCube( texture ); + + } + + function getCube( texture ) { + + if ( texture && texture.isTexture ) { + + const mapping = texture.mapping; + + if ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) { + + if ( cubeMaps.has( texture ) ) { + + const cubemap = cubeMaps.get( texture ).texture; + return mapTextureMapping( cubemap, texture.mapping ); + + } else { + + const image = texture.image; + + if ( image && image.height > 0 ) { + + const renderTarget = new WebGLCubeRenderTarget( image.height ); + renderTarget.fromEquirectangularTexture( renderer, texture ); + cubeMaps.set( texture, renderTarget ); + + texture.addEventListener( 'dispose', onCubemapDispose ); + + return mapTextureMapping( renderTarget.texture, texture.mapping ); + + } else { + + // image not yet ready. try the conversion next frame + + return null; + + } + + } + + } + + } + + return texture; + + } + + function getPMREM( texture ) { + + if ( texture && texture.isTexture ) { + + const mapping = texture.mapping; + + const isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ); + const isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping ); + + // equirect/cube map to cubeUV conversion + + if ( isEquirectMap || isCubeMap ) { + + let renderTarget = pmremMaps.get( texture ); + + const currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0; + + if ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) { + + if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer ); + + renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget ); + renderTarget.texture.pmremVersion = texture.pmremVersion; + + pmremMaps.set( texture, renderTarget ); + + return renderTarget.texture; + + } else { + + if ( renderTarget !== undefined ) { + + return renderTarget.texture; + + } else { + + const image = texture.image; + + if ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) { + + if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer ); + + renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture ); + renderTarget.texture.pmremVersion = texture.pmremVersion; + + pmremMaps.set( texture, renderTarget ); + + texture.addEventListener( 'dispose', onPMREMDispose ); + + return renderTarget.texture; + + } else { + + // image not yet ready. try the conversion next frame + + return null; + + } + + } + + } + + } + + } + + return texture; + + } + + function mapTextureMapping( texture, mapping ) { + + if ( mapping === EquirectangularReflectionMapping ) { + + texture.mapping = CubeReflectionMapping; + + } else if ( mapping === EquirectangularRefractionMapping ) { + + texture.mapping = CubeRefractionMapping; + + } + + return texture; + + } + + function isCubeTextureComplete( image ) { + + let count = 0; + const length = 6; + + for ( let i = 0; i < length; i ++ ) { + + if ( image[ i ] !== undefined ) count ++; + + } + + return count === length; + + } + + function onCubemapDispose( event ) { + + const texture = event.target; + + texture.removeEventListener( 'dispose', onCubemapDispose ); + + const cubemap = cubeMaps.get( texture ); + + if ( cubemap !== undefined ) { + + cubeMaps.delete( texture ); + cubemap.dispose(); + + } + + } + + function onPMREMDispose( event ) { + + const texture = event.target; + + texture.removeEventListener( 'dispose', onPMREMDispose ); + + const pmrem = pmremMaps.get( texture ); + + if ( pmrem !== undefined ) { + + pmremMaps.delete( texture ); + pmrem.dispose(); + + } + + } + + function dispose() { + + cubeMaps = new WeakMap(); + pmremMaps = new WeakMap(); + + if ( pmremGenerator !== null ) { + + pmremGenerator.dispose(); + pmremGenerator = null; + + } + + } + + return { + get: get, + dispose: dispose + }; + +} + +export { WebGLEnvironments }; diff --git a/src/renderers/webgl/WebGLPrograms.js b/src/renderers/webgl/WebGLPrograms.js index af4650388526ca..33eaa60f7ed789 100644 --- a/src/renderers/webgl/WebGLPrograms.js +++ b/src/renderers/webgl/WebGLPrograms.js @@ -7,7 +7,7 @@ import { UniformsUtils } from '../shaders/UniformsUtils.js'; import { ColorManagement } from '../../math/ColorManagement.js'; import { warn } from '../../utils.js'; -function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) { +function WebGLPrograms( renderer, environments, extensions, capabilities, bindingStates, clipping ) { const _programLayers = new Layers(); const _customShaders = new WebGLShaderCache(); @@ -53,7 +53,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities const geometry = object.geometry; const environment = material.isMeshStandardMaterial ? scene.environment : null; - const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment ); + const envMap = environments.get( material.envMap || environment, material.isMeshStandardMaterial ); const envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null; const shaderID = shaderIDs[ material.type ]; From 9d91428d240c59ef40011f49e47d8c5b5aea80aa Mon Sep 17 00:00:00 2001 From: "Raoul v. R." Date: Mon, 19 Jan 2026 09:20:13 +0100 Subject: [PATCH 2/7] BatchedMesh: Enable per-instance opacity (#32725) Co-authored-by: Garrett Johnson --- examples/screenshots/webgl_mesh_batch.jpg | Bin 123292 -> 39711 bytes examples/webgl_mesh_batch.html | 96 +++++++++++++----- src/objects/BatchedMesh.js | 6 +- .../ShaderChunk/batching_pars_vertex.glsl.js | 4 +- .../ShaderChunk/color_fragment.glsl.js | 6 +- .../ShaderChunk/color_pars_fragment.glsl.js | 6 +- .../ShaderChunk/color_pars_vertex.glsl.js | 6 +- .../shaders/ShaderChunk/color_vertex.glsl.js | 18 ++-- src/renderers/webgl/WebGLProgram.js | 4 +- 9 files changed, 90 insertions(+), 56 deletions(-) diff --git a/examples/screenshots/webgl_mesh_batch.jpg b/examples/screenshots/webgl_mesh_batch.jpg index d20358fb5c8792cd9238a9393ff0283605888861..6594f8ef00d925d58e78ebee4b8d714db3b6f50e 100644 GIT binary patch literal 39711 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

8$#CZU? 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 IV)-@kKU8a5xc~qF literal 123292 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π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

7y7Z&nz7sqTAG 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%0AIE#c}34p#&AIz0I#9X?o+k`_xR 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 0.8 ? 0.5 : 1.0; + + } + + function initGeometries() { - if ( ! material ) { + const cone = new THREE.ConeGeometry( 1.0, 2.0 ); + const box = new THREE.BoxGeometry( 2.0, 2.0, 2.0 ); + const sphere = new THREE.SphereGeometry( 1.0, 16, 8 ); - material = new THREE.MeshNormalMaterial(); + geometries = [ cone, box, sphere ]; + + for ( const geometry of geometries ) { + + // add vertex colors for testing + const count = geometry.getAttribute( 'position' ).count; + const attribute = new THREE.BufferAttribute( new Float32Array( count * 3 ), 3 ); + geometry.setAttribute( 'color', attribute ); + + for ( let i = 0, l = attribute.array.length; i < l; ++ i ) { + + attribute.array[ i ] = 1.0; + + } } - return material; + } + + function createMaterial() { + + return new THREE.MeshPhongMaterial( { + vertexColors: true, + transparent: api.transparent, + depthWrite: ! api.transparent + } ); } @@ -129,6 +155,16 @@ if ( mesh ) { + mesh.traverse( node => { + + if ( node instanceof THREE.Mesh ) { + + node.material.dispose(); + + } + + } ); + mesh.parent.remove( mesh ); if ( mesh.dispose ) { @@ -160,10 +196,13 @@ function initRegularMesh() { mesh = new THREE.Group(); - const material = createMaterial(); for ( let i = 0; i < api.count; i ++ ) { + const material = createMaterial(); + randomizeColor( material.color ); + material.opacity = randomizeAlpha(); + const child = new THREE.Mesh( geometries[ i % geometries.length ], material ); randomizeMatrix( child.matrix ); child.matrix.decompose( child.position, child.quaternion, child.scale ); @@ -184,6 +223,8 @@ const euler = new THREE.Euler(); const matrix = new THREE.Matrix4(); + const color = new THREE.Color(); + const colorWithAlpha = new THREE.Vector4(); mesh = new THREE.BatchedMesh( geometryCount, vertexCount, indexCount, createMaterial() ); mesh.userData.rotationSpeeds = []; @@ -200,8 +241,12 @@ for ( let i = 0; i < api.count; i ++ ) { + randomizeColor( color ); + colorWithAlpha.set( color.r, color.g, color.b, randomizeAlpha() ); + const id = mesh.addInstance( geometryIds[ i % geometryIds.length ] ); mesh.setMatrixAt( id, randomizeMatrix( matrix ) ); + mesh.setColorAt( id, colorWithAlpha ); const rotationMatrix = new THREE.Matrix4(); rotationMatrix.makeRotationFromEuler( randomizeRotationSpeed( euler ) ); @@ -244,6 +289,13 @@ controls.autoRotate = true; controls.autoRotateSpeed = 1.0; + // light + + const ambientLight = new THREE.AmbientLight( 0xffffff, 2 ); + const directionalLight = new THREE.DirectionalLight( 0xffffff, 2 ); + directionalLight.position.set( 1, 1, 1 ); + scene.add( directionalLight, ambientLight ); + // stats stats = new Stats(); @@ -255,24 +307,20 @@ gui.add( api, 'count', 1, MAX_GEOMETRY_COUNT ).step( 1 ).onChange( initMesh ); gui.add( api, 'dynamic', 0, MAX_GEOMETRY_COUNT ).step( 1 ); gui.add( api, 'method', Method ).onChange( initMesh ); - gui.add( api, 'opacity', 0, 1 ).onChange( v => { - - if ( v < 1 ) { - material.transparent = true; - material.depthWrite = false; + gui.add( api, 'transparent' ).onChange( v => mesh.traverse( node => { - } else { + if ( node instanceof THREE.Mesh ) { - material.transparent = false; - material.depthWrite = true; + const material = node.material; + material.transparent = v; + material.depthWrite = ! v; + material.needsUpdate = true; } - material.opacity = v; - material.needsUpdate = true; + } ) ); - } ); gui.add( api, 'sortObjects' ); gui.add( api, 'perObjectFrustumCulled' ); gui.add( api, 'useCustomSort' ); diff --git a/src/objects/BatchedMesh.js b/src/objects/BatchedMesh.js index 8e534f41f0dd23..4e33f27754713e 100644 --- a/src/objects/BatchedMesh.js +++ b/src/objects/BatchedMesh.js @@ -1103,7 +1103,7 @@ class BatchedMesh extends Mesh { * Sets the given color to the defined instance. * * @param {number} instanceId - The ID of an instance to set the color of. - * @param {Color} color - The color to set the instance to. + * @param {Color|Vector4} color - The color to set the instance to. Use a `Vector4` to also define alpha. * @return {BatchedMesh} A reference to this batched mesh. */ setColorAt( instanceId, color ) { @@ -1127,8 +1127,8 @@ class BatchedMesh extends Mesh { * Returns the color of the defined instance. * * @param {number} instanceId - The ID of an instance to get the color of. - * @param {Color} color - The target object that is used to store the method's result. - * @return {Color} The instance's color. + * @param {Color|Vector4} color - The target object that is used to store the method's result. + * @return {Color|Vector4} The instance's color. Use a `Vector4` to also retrieve alpha. */ getColorAt( instanceId, color ) { diff --git a/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js b/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js index 5ae4c0ac38d660..06cfbde52ea86f 100644 --- a/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +++ b/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js @@ -35,13 +35,13 @@ export default /* glsl */` #ifdef USE_BATCHING_COLOR uniform sampler2D batchingColorTexture; - vec3 getBatchingColor( const in float i ) { + vec4 getBatchingColor( const in float i ) { int size = textureSize( batchingColorTexture, 0 ).x; int j = int( i ); int x = j % size; int y = j / size; - return texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb; + return texelFetch( batchingColorTexture, ivec2( x, y ), 0 ); } diff --git a/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js index 96d4a3728b3c2f..27f18cc8c65940 100644 --- a/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js @@ -1,11 +1,7 @@ export default /* glsl */` -#if defined( USE_COLOR_ALPHA ) +#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) diffuseColor *= vColor; -#elif defined( USE_COLOR ) - - diffuseColor.rgb *= vColor; - #endif `; diff --git a/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js index 1040a715bb7f64..55ff49732c7bd3 100644 --- a/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js @@ -1,11 +1,7 @@ export default /* glsl */` -#if defined( USE_COLOR_ALPHA ) +#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) varying vec4 vColor; -#elif defined( USE_COLOR ) - - varying vec3 vColor; - #endif `; diff --git a/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js b/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js index 944eedf9bf7c0e..41e1924a49e591 100644 --- a/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +++ b/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js @@ -1,11 +1,7 @@ export default /* glsl */` -#if defined( USE_COLOR_ALPHA ) +#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) varying vec4 vColor; -#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) - - varying vec3 vColor; - #endif `; diff --git a/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js b/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js index 42a26e56b38414..bc96eee016b6e1 100644 --- a/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +++ b/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js @@ -1,31 +1,29 @@ export default /* glsl */` -#if defined( USE_COLOR_ALPHA ) +#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) vColor = vec4( 1.0 ); -#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) - - vColor = vec3( 1.0 ); - #endif -#ifdef USE_COLOR +#ifdef USE_COLOR_ALPHA vColor *= color; +#elif defined( USE_COLOR ) + + vColor.rgb *= color; + #endif #ifdef USE_INSTANCING_COLOR - vColor.xyz *= instanceColor.xyz; + vColor.rgb *= instanceColor.rgb; #endif #ifdef USE_BATCHING_COLOR - vec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) ); - - vColor.xyz *= batchingColor.xyz; + vColor *= getBatchingColor( getIndirectIndex( gl_DrawID ) ); #endif `; diff --git a/src/renderers/webgl/WebGLProgram.js b/src/renderers/webgl/WebGLProgram.js index 21af37a778508c..87c8b1e22cc8bf 100644 --- a/src/renderers/webgl/WebGLProgram.js +++ b/src/renderers/webgl/WebGLProgram.js @@ -732,8 +732,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) { parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '', parameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '', - parameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? '#define USE_COLOR' : '', - parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '', + parameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '', + parameters.vertexAlphas || parameters.batchingColor ? '#define USE_COLOR_ALPHA' : '', parameters.vertexUv1s ? '#define USE_UV1' : '', parameters.vertexUv2s ? '#define USE_UV2' : '', parameters.vertexUv3s ? '#define USE_UV3' : '', From b776aef251fe015c9cee7cdf78a76bb31299b105 Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Mon, 19 Jan 2026 09:56:25 +0100 Subject: [PATCH 3/7] Global: Replace `Clock` with `Timer`. (#32793) --- editor/js/Viewport.js | 6 ++++-- examples/jsm/objects/Water2.js | 8 +++++--- examples/jsm/physics/JoltPhysics.js | 8 +++++--- examples/jsm/physics/RapierPhysics.js | 8 +++++--- examples/jsm/postprocessing/EffectComposer.js | 12 +++++++----- 5 files changed, 26 insertions(+), 16 deletions(-) diff --git a/editor/js/Viewport.js b/editor/js/Viewport.js index 8c5452f8800642..7e50961b2d774b 100644 --- a/editor/js/Viewport.js +++ b/editor/js/Viewport.js @@ -777,12 +777,14 @@ function Viewport( editor ) { let prevActionsInUse = 0; - const clock = new THREE.Clock(); // only used for animations + const timer = new THREE.Timer(); // only used for animations function animate() { + timer.update(); + const mixer = editor.mixer; - const delta = clock.getDelta(); + const delta = timer.getDelta(); let needsUpdate = false; diff --git a/examples/jsm/objects/Water2.js b/examples/jsm/objects/Water2.js index 3ba6894b5f05e4..abc37809e13c6b 100644 --- a/examples/jsm/objects/Water2.js +++ b/examples/jsm/objects/Water2.js @@ -1,5 +1,5 @@ import { - Clock, + Timer, Color, Matrix4, Mesh, @@ -74,7 +74,7 @@ class Water extends Mesh { const cycle = 0.15; // a cycle of a flow map phase const halfCycle = cycle * 0.5; const textureMatrix = new Matrix4(); - const clock = new Clock(); + const timer = new Timer(); // internal components @@ -180,7 +180,7 @@ class Water extends Mesh { function updateFlow() { - const delta = clock.getDelta(); + const delta = timer.getDelta(); const config = scope.material.uniforms[ 'config' ]; config.value.x += flowSpeed * delta; // flowMapOffset0 @@ -207,6 +207,8 @@ class Water extends Mesh { this.onBeforeRender = function ( renderer, scene, camera ) { + timer.update(); + updateTextureMatrix( camera ); updateFlow(); diff --git a/examples/jsm/physics/JoltPhysics.js b/examples/jsm/physics/JoltPhysics.js index d21a5871a3448e..27af0174154323 100644 --- a/examples/jsm/physics/JoltPhysics.js +++ b/examples/jsm/physics/JoltPhysics.js @@ -1,4 +1,4 @@ -import { Clock, Vector3, Quaternion, Matrix4 } from 'three'; +import { Timer, Vector3, Quaternion, Matrix4 } from 'three'; const JOLT_PATH = 'https://cdn.jsdelivr.net/npm/jolt-physics@1.0.0/dist/jolt-physics.wasm-compat.js'; @@ -222,11 +222,13 @@ async function JoltPhysics() { // - const clock = new Clock(); + const timer = new Timer(); function step() { - let deltaTime = clock.getDelta(); + timer.update(); + + let deltaTime = timer.getDelta(); // Don't go below 30 Hz to prevent spiral of death deltaTime = Math.min( deltaTime, 1.0 / 30.0 ); diff --git a/examples/jsm/physics/RapierPhysics.js b/examples/jsm/physics/RapierPhysics.js index dbd6424c4e2a90..f2c7fa3af3d32e 100644 --- a/examples/jsm/physics/RapierPhysics.js +++ b/examples/jsm/physics/RapierPhysics.js @@ -1,4 +1,4 @@ -import { Clock, Vector3, Quaternion, Matrix4 } from 'three'; +import { Timer, Vector3, Quaternion, Matrix4 } from 'three'; const RAPIER_PATH = 'https://cdn.skypack.dev/@dimforge/rapier3d-compat@0.17.3'; @@ -301,11 +301,13 @@ async function RapierPhysics() { // - const clock = new Clock(); + const timer = new Timer(); function step() { - world.timestep = clock.getDelta(); + timer.update(); + + world.timestep = timer.getDelta(); world.step(); // diff --git a/examples/jsm/postprocessing/EffectComposer.js b/examples/jsm/postprocessing/EffectComposer.js index cc807df391d6d0..a16d97eabad399 100644 --- a/examples/jsm/postprocessing/EffectComposer.js +++ b/examples/jsm/postprocessing/EffectComposer.js @@ -1,7 +1,7 @@ import { - Clock, HalfFloatType, NoBlending, + Timer, Vector2, WebGLRenderTarget } from 'three'; @@ -121,12 +121,12 @@ class EffectComposer { this.copyPass.material.blending = NoBlending; /** - * The internal clock for managing time data. + * The internal timer for managing time data. * * @private - * @type {Clock} + * @type {Timer} */ - this.clock = new Clock(); + this.timer = new Timer(); } @@ -215,9 +215,11 @@ class EffectComposer { // deltaTime value is in seconds + this.timer.update(); + if ( deltaTime === undefined ) { - deltaTime = this.clock.getDelta(); + deltaTime = this.timer.getDelta(); } From 77097b78d2796eeb6de81676ec243df842fc6dcf Mon Sep 17 00:00:00 2001 From: mrdoob Date: Mon, 19 Jan 2026 00:58:06 -0800 Subject: [PATCH 4/7] MeshLambertMaterial: Add support for scene.environment IBL. (#32791) Co-authored-by: Claude Opus 4.5 --- src/materials/MeshLambertMaterial.js | 9 +++++++++ src/renderers/WebGLRenderer.js | 13 ++++++++----- .../ShaderChunk/envmap_fragment.glsl.js | 18 +++++++----------- .../ShaderChunk/lights_fragment_end.glsl.js | 6 ++++++ .../ShaderChunk/lights_fragment_maps.glsl.js | 8 ++++++-- src/renderers/shaders/ShaderLib.js | 3 ++- .../shaders/ShaderLib/meshlambert.glsl.js | 2 ++ src/renderers/webgl/WebGLMaterials.js | 6 ++++++ src/renderers/webgl/WebGLPrograms.js | 5 +++-- 9 files changed, 49 insertions(+), 21 deletions(-) diff --git a/src/materials/MeshLambertMaterial.js b/src/materials/MeshLambertMaterial.js index bc27fccc8fbb57..f44e8f1ee84b99 100644 --- a/src/materials/MeshLambertMaterial.js +++ b/src/materials/MeshLambertMaterial.js @@ -267,6 +267,14 @@ class MeshLambertMaterial extends Material { */ this.reflectivity = 1; + /** + * Scales the effect of the environment map by multiplying its color. + * + * @type {number} + * @default 1 + */ + this.envMapIntensity = 1.0; + /** * The index of refraction (IOR) of air (approximately 1) divided by the * index of refraction of the material. It is used with environment mapping @@ -373,6 +381,7 @@ class MeshLambertMaterial extends Material { this.envMapRotation.copy( source.envMapRotation ); this.combine = source.combine; this.reflectivity = source.reflectivity; + this.envMapIntensity = source.envMapIntensity; this.refractionRatio = source.refractionRatio; this.wireframe = source.wireframe; diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 45215d3a8c3840..408cd848a659ab 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -2132,9 +2132,11 @@ class WebGLRenderer { // always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change - materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null; + materialProperties.environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial ) ? scene.environment : null; materialProperties.fog = scene.fog; - materialProperties.envMap = environments.get( material.envMap || materialProperties.environment, material.isMeshStandardMaterial ); + + const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ); + materialProperties.envMap = environments.get( material.envMap || materialProperties.environment, usePMREM ); materialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation; if ( programs === undefined ) { @@ -2265,9 +2267,10 @@ class WebGLRenderer { textures.resetTextureUnits(); const fog = scene.fog; - const environment = material.isMeshStandardMaterial ? scene.environment : null; + const environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial ) ? scene.environment : null; const colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ); - const envMap = environments.get( material.envMap || environment, material.isMeshStandardMaterial ); + const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ); + const envMap = environments.get( material.envMap || environment, usePMREM ); const vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4; const vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 ); const morphTargets = !! geometry.morphAttributes.position; @@ -2592,7 +2595,7 @@ class WebGLRenderer { } - if ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) { + if ( ( material.isMeshStandardMaterial || material.isMeshLambertMaterial ) && material.envMap === null && scene.environment !== null ) { m_uniforms.envMapIntensity.value = scene.environmentIntensity; diff --git a/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js index 96759b88bdb106..843c623796fd4e 100644 --- a/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js @@ -38,23 +38,19 @@ export default /* glsl */` vec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) ); - #else - - vec4 envColor = vec4( 0.0 ); + #ifdef ENVMAP_BLENDING_MULTIPLY - #endif + outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity ); - #ifdef ENVMAP_BLENDING_MULTIPLY + #elif defined( ENVMAP_BLENDING_MIX ) - outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity ); + outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity ); - #elif defined( ENVMAP_BLENDING_MIX ) + #elif defined( ENVMAP_BLENDING_ADD ) - outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity ); + outgoingLight += envColor.xyz * specularStrength * reflectivity; - #elif defined( ENVMAP_BLENDING_ADD ) - - outgoingLight += envColor.xyz * specularStrength * reflectivity; + #endif #endif diff --git a/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js b/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js index ab1042169de3d9..d8476c17027be9 100644 --- a/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +++ b/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js @@ -1,6 +1,12 @@ export default /* glsl */` #if defined( RE_IndirectDiffuse ) + #ifdef LAMBERT + + irradiance += iblIrradiance; + + #endif + RE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); #endif diff --git a/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js b/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js index 96b92f5cd908ae..602b95c2baf7c6 100644 --- a/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +++ b/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js @@ -10,9 +10,13 @@ export default /* glsl */` #endif - #if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV ) + #if defined( USE_ENVMAP ) && defined( ENVMAP_TYPE_CUBE_UV ) - iblIrradiance += getIBLIrradiance( geometryNormal ); + #if defined( STANDARD ) || defined( LAMBERT ) + + iblIrradiance += getIBLIrradiance( geometryNormal ); + + #endif #endif diff --git a/src/renderers/shaders/ShaderLib.js b/src/renderers/shaders/ShaderLib.js index 188f1a52a1fef1..9f425548608c18 100644 --- a/src/renderers/shaders/ShaderLib.js +++ b/src/renderers/shaders/ShaderLib.js @@ -39,7 +39,8 @@ const ShaderLib = { UniformsLib.fog, UniformsLib.lights, { - emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) } + emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }, + envMapIntensity: { value: 1 } } ] ), diff --git a/src/renderers/shaders/ShaderLib/meshlambert.glsl.js b/src/renderers/shaders/ShaderLib/meshlambert.glsl.js index f52ed6e8d58827..d13db893880402 100644 --- a/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +++ b/src/renderers/shaders/ShaderLib/meshlambert.glsl.js @@ -68,8 +68,10 @@ uniform float opacity; #include #include #include +#include #include #include +#include #include #include #include diff --git a/src/renderers/webgl/WebGLMaterials.js b/src/renderers/webgl/WebGLMaterials.js index ae0217d7a79e79..0f122bcc3aaf9e 100644 --- a/src/renderers/webgl/WebGLMaterials.js +++ b/src/renderers/webgl/WebGLMaterials.js @@ -47,6 +47,12 @@ function WebGLMaterials( renderer, properties ) { refreshUniformsCommon( uniforms, material ); + if ( material.envMap ) { + + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + } else if ( material.isMeshToonMaterial ) { refreshUniformsCommon( uniforms, material ); diff --git a/src/renderers/webgl/WebGLPrograms.js b/src/renderers/webgl/WebGLPrograms.js index 33eaa60f7ed789..29369d745d7489 100644 --- a/src/renderers/webgl/WebGLPrograms.js +++ b/src/renderers/webgl/WebGLPrograms.js @@ -51,9 +51,10 @@ function WebGLPrograms( renderer, environments, extensions, capabilities, bindin const fog = scene.fog; const geometry = object.geometry; - const environment = material.isMeshStandardMaterial ? scene.environment : null; + const environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial ) ? scene.environment : null; - const envMap = environments.get( material.envMap || environment, material.isMeshStandardMaterial ); + const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ); + const envMap = environments.get( material.envMap || environment, usePMREM ); const envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null; const shaderID = shaderIDs[ material.type ]; From 5c6374be549a763fc538185a19d31d60b93d242d Mon Sep 17 00:00:00 2001 From: mrdoob Date: Mon, 19 Jan 2026 02:15:04 -0800 Subject: [PATCH 5/7] MeshPhongMaterial: Add support for scene.environment IBL. (#32795) Co-authored-by: Claude Opus 4.5 --- examples/screenshots/webxr_vr_sandbox.jpg | Bin 80331 -> 33186 bytes examples/webxr_vr_sandbox.html | 4 ++-- src/materials/MeshPhongMaterial.js | 9 +++++++++ src/renderers/WebGLRenderer.js | 10 +++++----- .../ShaderChunk/lights_fragment_end.glsl.js | 2 +- .../ShaderChunk/lights_fragment_maps.glsl.js | 2 +- src/renderers/shaders/ShaderLib.js | 3 ++- .../shaders/ShaderLib/meshphong.glsl.js | 2 ++ src/renderers/webgl/WebGLMaterials.js | 6 ++++++ src/renderers/webgl/WebGLPrograms.js | 4 ++-- 10 files changed, 30 insertions(+), 12 deletions(-) diff --git a/examples/screenshots/webxr_vr_sandbox.jpg b/examples/screenshots/webxr_vr_sandbox.jpg index a8ced4ef347ac3cf8b3a60101c9bc2104c5665a4..c3562ffc4be7b869222b9e2c6c81b81d62837ccc 100644 GIT binary patch delta 32959 zcmb4qg;x~c8}}*-N{V#*mF`?R1f;tgl%RpGjrzNIWzP0=Xvh%*^}R29)F_(9zXiu_#b`zzwrd?fAr~-CsZ-9BiEbd;9-`JjTVXPVajJ z+%CYY`#BQ@tDNe$3bcvaDusR!II3v3g>!zQF^xUHW5?4;GR47ojiStTl$~guqi>Bf2D;f=Iq+t+@m8(eypapWr6_UDH!F zbWuCik|c}8+)u04stdPPlezhX&6+v~a*H|ET~icQG2aK?7uySXcbFQP;=s8~?WLL|FYRu)7Ym>1*5|r@#mf$10+ypE_Ja~OvDy`Vz6#7g#-0K$ zWHw^N+&>Mu6rC%gfFNjLLwxXLTSJ)z@4reJ|*xCmRJi_8~-VU-wG2xJ2dq%#wm#6uEG_oFygS?(!~8hrg{`i_d)29Rxy;bFYZJp1`SpM2F zzk8T7{h1ei>JQr3S(YB_z;eOP66}Tja%aIzqip|`L~w&B!{4lVAL6#^W40!F>iMlt zZwQ13iWv&j9woSBdudDH-?AUpeNtnU7z1qWVP34HFXg#&39cNuiQBS2u+q2cR7u1M zyNaK^spzNC3<@X?PR+ow?b3Amqw}I>Tp@q)1)gB$R)IXb<4d!%j}rQ;eLnov^T}h2 zjv_DB_!RkXvPi**j{XdW3c$FC^SX$VF7YS2||OqF!` zs@8}3k+Qy*Qpv4fS}HdYmg0vaL@OoXw)RV`$I(VF2B1$6b;r84ZZ63m>qz+)snxMF z)GtOgeoRrjDZ>>a-^V!@0>3BUFAxtoYdubuwPtDX+ajH=R&i9E>&#a8FA-emS%)3w z=7=*|pYpl);W0@>Tk71_Vr6H83@I#q#Z-0UPeOgCUkub>F}givS)egtH^-k@?Q>R~ zd+Wa&|Bkpkqk=Swh+(m};)?TYAoi+;6^!MUJj-xPlw^ro#UFJyN|CA5qs>M^+w1 zqrA1RCMyhf6SxQcEe8Z84!x~vDuVQOkEGx4yPH%6o|hOg4+4pGa5|^ee!CdQF46bt zB#lI=la$-IlLAy0aDgBn18=jc>c#bq@A~x`$5LD~{-dfzR-3cE4a@j4??rm>V zkboomi?-?`Hp(975O!mE>7iuBusTLle@=DqYZr?=8Yi¿Z|H#DQM_f`Pj&*A=8 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 L)O;oi`VoITevbp;d>px1*P7l zlcdIpz9PE_$PP2@p3cVd^is`S^Z!7JgXz2tYY7n~8MpOg{cPA%Dotn%T_#~aXax`7 z?Wa~)5y~p-Xs)yOvOF!4h(QB()gP)iH$~|@a%))>Os4z<%$!%~PS2r$E5=aZ_q>K5 zY}++hh(XJ8xewHTxB+rHjdPg&rsz{h$w1)+1AzZ`Aw6-^D}VAOw4w8MKl6#XZRj5e zH=R{rte>!8Phi1shOp5IcCToh7KftGX`<_0^Ig%NST&VXlGI5UGe~| z(h#~jVM{FRwGj9UX~=3LmzQ^Emh%zzkD7D*0cV=%p_iwi%@>fL!sFm{~}F zUYa^9N?n+p)Q1il4Nyo?QTrTO$nQ#u9N?S^DXvX=D;ZG*@$Uh(@_p21SmRfI^-?(E z%>$aVzF%2*Px_^Zd;Fxf{q<6XFz3mu+I)nbzBb(ZG1d~p8QvQlvWwi&)Vj5gDCF`R z1e1MeQ@Au9{QXcV_79{5!=|q_WS?Y@^#uwfpEe*0iogVuD=DX0_VlY1GpMu(#Xyq$ zz3Cw;z2gwXt#V*lSF~GhFJ&l_DYfPtbLc}%n)46o26UwEL1rRcz*XmUBY9RkAod_= zFm}UT|6ZnbV2YVq@MBjRu^FQCvb$j;BIzq|D$tZn`a0$Hm{uO$pb{ ztIr?BuZ~NL#3-e^o|57wdw%e6ZMOyY>=qs;)7rx0-2epJP>p@vyfB&Yxz-d<;Pqw` zugKehNcR2}w#FcP$XGn|gdYVjzz+w$;8X9IU|k)ai%$>hz=`f#XKjyK z#$XpWzlhVFFA--rJCx-K&^@7;PQi&fYSWp1Z2Ed(x)nhU5@r-6Y~E7J zN-SzdPn4dEjN|l(oFgP2k1-=qz+@(UX4Y}LVj@ui$(w5)$%cObUtRv?v?I_R@t9Ru zdvN)06r?ljQF8Zzzg)hOW4t`DsVn$a>e9r2*A;{T>?Z zR(!}_T&o*1lrk$_ydTS-v0qe#uUXxpC;Yp@f1n-Cw`%n6p`pUp2qC84doB_zyL%QY zGN}KS!~!{S#CY3l+#B}_v*G1g`vAXKQJ?S)4UU%uo1*p{a#$#dW=#= z!^3K34}E8AK2&V+gKBV%vrNXQ&x~rId=O`$w<4zj`F#Xk`A1?@GmO=bRg)K3X<@9rlP>$jNhd1^B}@8E1y?O zbYHYGn!@GAZ*Qxyzn8Rq7)0K55PoS zl+d)qk^^h)K=*`Pk0(X6${8Nu@SsL*xEPr%Im)_St}AQd5O;O3f%}!q&$!hFwyM%U zfPO8+%6at18)x4~c!%$URw0IuzW3V9c!VRWHY###@27u*)>1S+lt?>-=|t!zSsMlQ zm(oN}rM)r`83Q;~@!Cd$6%NI`;P8;dt5o_a#Iv_pA+Jx9t@`fzo+h$%p1Jj`K zd>iGn)QeTE64FC<#Sqejd8dcY+moZhmTqnDtPkci@-5ctY3lYyl($PES8%9+L+P4$ zF9JOm0k`wu8Y1jfg}F4FC#8$BvUY8Mo7W|y{I7Gg07EM3on=1Hh0CIILk3AmCziXq z54uK}FMw(jc+O9F`ZGQXESBVy>4@2|UoX9jg2g!lCvr=X5sE%gC-*LzneN^pVAnTr z3J{*DUf7S3g0*pI93j(|mu*K}Sws|7R_K~*PHrD2<(b!Dxy2>^OHcK?xfZ2<)sf!H z-Xsw+NT<2=+vKj$HK^XWV3uZ4A*0z~D_f2|4Uis%gET8H9i)`ze!+BAuwqT&&ES5! zVuSNlJ;&$1>BM=+SZ84;!yM^y(W?3fdcw0J5XE22#~F|0-@XrX&Y{8-U$2BK$0qAD ze^m9NyD@26Ji4)4c2aI&BsuG!@eEZmHJH3mIxS&JrZEV8BX>7fpWSZ>R}+s_H)H$x z16U%zqnw+T$5w6?lSnB7e`Ls9Xo2H1Qe*9{M}m15n@fHzKNcQ!E%Sx;KUM7-#Y6G6 zRYLhaUHiHyg>5AjS9WfHrH0aJSD7hC0!$CyJfwT#+6JMc7rOcp?Sy1i*lw<7xg7Rx z`L9_Tq!oQOlsNEJ4yK#igz<|7;b5A3+F+`r;80#i(4g6u|$HQ~St zaK4-a0%Q61Jy~!D^qpbpi@^*58}v`eVpOJ|d36=>D9}sXanOhKj?vxkvOn>o#_C>v z7sUL6i5wRuDz&Qo(=Dr&oz?@hs{N=GYwC|Z$EV2xI#-%Oi7m3w44TUp6irinZXkJo z=Hwva4Kd;6ec9gop{6;9sWa#3uuP0wcJ%h_)uS5YWTxnJf)^gUA+mC_`R}#OISF5O zom&*b-f$&lRvxaFSrONo#Uox>yHth2^LXuhxr z6;0hD#8>eJBZ1QNA7kC9qhD&|v%E3_FDJJYl9~KPV(F9K@ff~OMzoA7oVyo%x*0CE z-E+L736K&PlVlZ2fTuPBo2quL_-9H7p)KLtlrQgjFUI+=LvJCAwPq>DngK+$Mp5m3 zz}?LhX`hw7>;&D!+X!dw@RR^f$dI9}8&dnGkT z8EtKS#y`c@jfo&LSckgdbJ$?i7G~!giNDq_HR~Ehi5yFjKwyb|IhzsEL+)ycvHPuz zetpyM$unL}`HKA>KlX8Fp;TFKNQ{O(r%1!Xie!BBhoX>S!MDgOG=4xAyoPjOa(htE zkGxa6kr7{}jEkHwFmWT;rR>P&uj2F7fXQK&vr9AEdCX6_1=|&OKRyCvp&d6i)FUZk z9Az1BYFXi7yGFl?JJ>L07RP9qyZl?fS1*qirZ{2Tp`54z$0cWX{XpsRdNaB|Gi)~1 zF1QopHqs;r`J!-9AO;vvxL-vp5?u7x8p)$NE57dLFg~f?{uE`Z(4`QESO{T`9gU^}e!Zxe|_x+uh5|b#p!AV_Eik#(4 z648XOB0eri(BFMsz{fQ+pG(Vs_l+AW)zo;K(Z^|wJ?PC9hhWiDt0;6{?J)?d+Xo7D zM`|?41q!GP3L^x^?-}w!V&TDpU?7C9&!SAg1EB3&D_*)K$ zVO0}?hOW-DOnx}`bAR%k-NX1C0a?goe1{N=q`5UhCTbaL(u&G`taD(*v8r+?#UMgh z@wy~f4D*TqGTT9_73~w8EI|_abBy$!<`40;UzGmi>br|U8VoO}VXd(0*dK;^?O%Kt zTtsOA86CULw1dWR<=x%{cBvmJJb@C-7skpdP0f;2$pJR8!ZURt_03on*9pXGdZ_UO zB|_qltuxk14uunxh&WTUh8mWyyZhm|_IC6VNGV*@HN{OoR=y7IXeT&`)jG67vW)ey z#z&3*pb6706LIomP5r?1m&DQZFmLA^sk$lw@b^ySsy30BpA}8&n&`4VZ0&iRy`oOqpC36l^9mPuW*-7{j`>`d*M+ zrXs!FT9k~#K%&o3psxiLLtS5fTs?6(%Iza13wBC3mkeo4`1nSjv$x%K>}x`{UY@JW zjx7uM7C>u|p)gaoPl!-k_uH{I>c)w!F2uafT=Dma>)n2_Ofw!JCNy@*jgp2rt~M(g zd#dX%kx1~zxojEk6#HX};0Z1HroU2g{_H1rsvlaO#tRipSkrP5*<(M{yB2;f9I^6% z2$QkR!(_9=LN&wIlT!q30)UDWL%?J?8`T>x*jC;DKq#kY0sv%Gx^AIO za-?SEh=VS1R>sydA|XR$a7;vva&H*sB%s`l*5cH{M;oLF{X7ogo&2EsBY4n%Wk~;h z0RQ_51LLnwfLO!{bJchT-4)=rFAMut_%lhp(W>gFy~V?36!OL4TvK9>?fJy$PsMRE z+Yn^X43(GJG+)jZoXd4Y=FjWo+!Qhv&SzYMj+dS3Ad-csWflA? zG=F%_)_f=rC9{$;z_Gzh0jT!xo z0tpHY-;F6CUKaj9#SBalF&kvycBl!DkHg)8P45Y>_MZ?kUjI`;2eL0ui4Cfzd^jov zk!nykXT4)gpf%gDo|=U@7)7MI$>SD~11Wp%2M}Ug!iai`Z<({_e z(k1!uzz_n^l?}TCy_8V+v_Jnu9|KtC@6q;FJoc1~68?~9fw+9Olz^q;f6a%Lm2n6x z;U9vX?PP94K7O5XX$nGn}Tze<=czsG= z4sYrRAN92v*+Df~Qgh6()7_rV0?E|MIGX;go)3uaGY@ru_Wk&fh-)~alSN49xvSm} z&DgF>QWh}8y`v;v?4ICI%a)2l5wPYCu+$5qA$1^XeIiuZ^`&@Bd3^D;QD@+zZ4lK%g#g#Rss|1A#(pw63h)pt^#Kg>O0 z>VaPc7-`uh)*kXCEb_J>9o(_$q^{ME`7;MQIlw<_tP`i}*TleflS7>lD&(d=x0tcF z__ik{<5<4#;5kdAw*);5b(z%b-#4b kRWwP7k^^I>!9W>8vydx0m?^|7c0kf0a6Jp--M^*(17BWnB>(^b literal 80331 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

{3upl* z6-6F;9Fgk5B!D<9jnmnkd8X>v;lnr3Ywm+$J)R_98lIjUdx0;O)p5Q*i7v^K9hXB4 z%&0wu`XtOBWf~mnmtj5*_EhBs_weMGBk(w=~gZ2j+3$ZTq!7n{TEv_H=k z`l7+oc?N(fJacen7WrxP_M|PAzT#1o_>9t51L6|J1)y&KC*v8_wy@Wr2%w|(kz~o& zyk}`vB0OwCKo9nlf|g^1fog57`TllnPSHCT1-W!kT#CM9AcKpPTzdl=b~rE|+%5Sr$eW~LvZSoTXNzl?OlY%AI<=%Sx<>D|Vv03Z z^nL<42l!FQOQd%NWPu+HG_c`GxH0>>){W-k;=@HH1FYx(rpNfil7LxiLw7#m6HH)c zK@DbUFXk17VRoNpXNB+MdG#0Q&;~|{SIOA9ugMAG1El|gJ;wZUt!VK34NWiIsziu{ zlgj0ucA}X1iW2RxlNHQWH|kx%qx_n%Q8}b7--!VCjpE9$+VSBlTFiHri%sp?*Mf+s zge5TI^V|oP0w}fIk_+spssTg3A1iIc+l|o8IOU6g_h_nM+8cDY`4Tb*z$eF<#UycP z&Nb~9#xrQ}=m$dwGqDYD=$r5)GJ{VOvoQf)iw<2D+Tfdl(V*wZvXE2)3UG@$L-fxw zNbI1BW#6NOpYj4QQ$_)FPxOh$*kSZae#fS~$glYmjL+d$zv`r)`AL}k^szVk{lhnl z(VJsN)R4&HEB&{k5D`m)T57#b^pB@$6Js#_6FekE1til?t91sj04+dSW-Lj++H(E> zK!E=@9{leotv6cpm#}wzFy+I~FqU`1I)*rY^CN>kD?JuBk|48`?IR+ zdTV(Hi`8kGndZFzqT`6I$v^qbpFP{TJQQyMvP&~|==6~pz1%IP>8%%gm5-J||V$+&%WFW++8|G`BlH9U)`N^6CI9ieASxTCq8_oymMsaejK1@B% z#rkHH-4hu$BY>|zBq25}GpW1=K~-1$93R!pXSuL36V+cEVrUklHi9W^+c$%L8Z#T9 zI)2Z%8Kh-$f1NRjb}@(}OTxiI@+in^wc`#8AoLk{{ z7Z1h>B4jbZP5qa`*!wW$t0Ep}L9Tz{%TU=MypznO$+q`$;53mycau$MgT1!aDMe6l zFLHO%V>mFd{X9u8GvcS<>E_?+*Txc!FL!FTxTPZhD(n>s5@Uz@^#qg7h57U6?8W!E z+$Ip<*_Ad~PXnHedE?~*{h?_oL^nRhk0eMuV_p0Le{}P&7DzK`SklvfSiii4Sxc4A z)eHfFS=2hefBkV4&94!11`wY#bwq1BKsGU#Hp`aY4z`D;8EQ4sQWrm1K|Cb)^hH|G z>EKm9m=f?nsp1}cp_um4=uSn-GJOAWNd0LJXhy8!qg(E4F3Y#}E|0;!i_xlI$^LpG zOr8Y_gxa^{D(qEIeyhbUOZlr1JCQYJYKEP8BF-j(HkQP8h2Ax{|HJ|wP*k?;r}B-6 z-?#^oOEgca7aF|*C>NY|<14p{_qeUVI|cja7=2THjkN|2ok}3;0=li3@T2X8GDKCCelgsgHMazv zKYMxv&O8UJUlo&~pmjYJe*QMQB9m1-^{Y!q%!b-?e!Hdhf#2T03SwjB5wVf{2qzse zfpl0_9F{!_yhZYR-_fAp_*r4y?|EY$%mLN#SHbDzGUh|^UG=dw3`w7l^o=u8Am4CJ z0e8}7S*CAU?lXjaw<&u1`K`OZes5X-Es`#yEe&^$V40`96-MuINIlh*I-OuuZtEKH z#z9-`*U#j;an7H)+_{kbEDCD{cA}&v5$pN@44n5sS$(f2j|nOk9G|xfp0>BD-yD5E b>!$T60o2Fb06#^g+CJvm6vQ^IzXSgRU-BVz diff --git a/examples/webxr_vr_sandbox.html b/examples/webxr_vr_sandbox.html index 66713edb67abc6..2183d01b4a5dff 100644 --- a/examples/webxr_vr_sandbox.html +++ b/examples/webxr_vr_sandbox.html @@ -78,7 +78,7 @@ scene.add( torus ); const cylinderGeometry = new THREE.CylinderGeometry( 1, 1, 0.1, 50 ); - const cylinderMaterial = new THREE.MeshStandardMaterial(); + const cylinderMaterial = new THREE.MeshLambertMaterial(); const cylinder = new THREE.Mesh( cylinderGeometry, cylinderMaterial ); cylinder.position.z = - 2; scene.add( cylinder ); @@ -96,7 +96,7 @@ scene.add( reflector ); const frameGeometry = new THREE.BoxGeometry( 2.1, 2.1, 0.1 ); - const frameMaterial = new THREE.MeshPhongMaterial(); + const frameMaterial = new THREE.MeshLambertMaterial( { color: 0x888888 } ); const frame = new THREE.Mesh( frameGeometry, frameMaterial ); frame.position.z = - 0.07; reflector.add( frame ); diff --git a/src/materials/MeshPhongMaterial.js b/src/materials/MeshPhongMaterial.js index 8687fa342aa49d..8a26209e2d0499 100644 --- a/src/materials/MeshPhongMaterial.js +++ b/src/materials/MeshPhongMaterial.js @@ -284,6 +284,14 @@ class MeshPhongMaterial extends Material { */ this.reflectivity = 1; + /** + * Scales the effect of the environment map by multiplying its color. + * + * @type {number} + * @default 1 + */ + this.envMapIntensity = 1.0; + /** * The index of refraction (IOR) of air (approximately 1) divided by the * index of refraction of the material. It is used with environment mapping @@ -392,6 +400,7 @@ class MeshPhongMaterial extends Material { this.envMapRotation.copy( source.envMapRotation ); this.combine = source.combine; this.reflectivity = source.reflectivity; + this.envMapIntensity = source.envMapIntensity; this.refractionRatio = source.refractionRatio; this.wireframe = source.wireframe; diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 408cd848a659ab..3b70003d882e61 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -2132,10 +2132,10 @@ class WebGLRenderer { // always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change - materialProperties.environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial ) ? scene.environment : null; + materialProperties.environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) ? scene.environment : null; materialProperties.fog = scene.fog; - const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ); + const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ) || ( material.isMeshPhongMaterial && ! material.envMap ); materialProperties.envMap = environments.get( material.envMap || materialProperties.environment, usePMREM ); materialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation; @@ -2267,9 +2267,9 @@ class WebGLRenderer { textures.resetTextureUnits(); const fog = scene.fog; - const environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial ) ? scene.environment : null; + const environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) ? scene.environment : null; const colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ); - const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ); + const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ) || ( material.isMeshPhongMaterial && ! material.envMap ); const envMap = environments.get( material.envMap || environment, usePMREM ); const vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4; const vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 ); @@ -2595,7 +2595,7 @@ class WebGLRenderer { } - if ( ( material.isMeshStandardMaterial || material.isMeshLambertMaterial ) && material.envMap === null && scene.environment !== null ) { + if ( ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) && material.envMap === null && scene.environment !== null ) { m_uniforms.envMapIntensity.value = scene.environmentIntensity; diff --git a/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js b/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js index d8476c17027be9..f428a94ca1d824 100644 --- a/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +++ b/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js @@ -1,7 +1,7 @@ export default /* glsl */` #if defined( RE_IndirectDiffuse ) - #ifdef LAMBERT + #if defined( LAMBERT ) || defined( PHONG ) irradiance += iblIrradiance; diff --git a/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js b/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js index 602b95c2baf7c6..e89c9f69be0064 100644 --- a/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +++ b/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js @@ -12,7 +12,7 @@ export default /* glsl */` #if defined( USE_ENVMAP ) && defined( ENVMAP_TYPE_CUBE_UV ) - #if defined( STANDARD ) || defined( LAMBERT ) + #if defined( STANDARD ) || defined( LAMBERT ) || defined( PHONG ) iblIrradiance += getIBLIrradiance( geometryNormal ); diff --git a/src/renderers/shaders/ShaderLib.js b/src/renderers/shaders/ShaderLib.js index 9f425548608c18..c16b95c8814f88 100644 --- a/src/renderers/shaders/ShaderLib.js +++ b/src/renderers/shaders/ShaderLib.js @@ -66,7 +66,8 @@ const ShaderLib = { { emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }, specular: { value: /*@__PURE__*/ new Color( 0x111111 ) }, - shininess: { value: 30 } + shininess: { value: 30 }, + envMapIntensity: { value: 1 } } ] ), diff --git a/src/renderers/shaders/ShaderLib/meshphong.glsl.js b/src/renderers/shaders/ShaderLib/meshphong.glsl.js index 3b9a59e0a32c1d..7f9136845b88eb 100644 --- a/src/renderers/shaders/ShaderLib/meshphong.glsl.js +++ b/src/renderers/shaders/ShaderLib/meshphong.glsl.js @@ -70,8 +70,10 @@ uniform float opacity; #include #include #include +#include #include #include +#include #include #include #include diff --git a/src/renderers/webgl/WebGLMaterials.js b/src/renderers/webgl/WebGLMaterials.js index 0f122bcc3aaf9e..93a9bbc51b845f 100644 --- a/src/renderers/webgl/WebGLMaterials.js +++ b/src/renderers/webgl/WebGLMaterials.js @@ -63,6 +63,12 @@ function WebGLMaterials( renderer, properties ) { refreshUniformsCommon( uniforms, material ); refreshUniformsPhong( uniforms, material ); + if ( material.envMap ) { + + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + } else if ( material.isMeshStandardMaterial ) { refreshUniformsCommon( uniforms, material ); diff --git a/src/renderers/webgl/WebGLPrograms.js b/src/renderers/webgl/WebGLPrograms.js index 29369d745d7489..b17540e859666b 100644 --- a/src/renderers/webgl/WebGLPrograms.js +++ b/src/renderers/webgl/WebGLPrograms.js @@ -51,9 +51,9 @@ function WebGLPrograms( renderer, environments, extensions, capabilities, bindin const fog = scene.fog; const geometry = object.geometry; - const environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial ) ? scene.environment : null; + const environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) ? scene.environment : null; - const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ); + const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ) || ( material.isMeshPhongMaterial && ! material.envMap ); const envMap = environments.get( material.envMap || environment, usePMREM ); const envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null; From 00babc2167e699b0dd5ff61b4ebbf1609f58e9e3 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Mon, 19 Jan 2026 19:17:03 +0900 Subject: [PATCH 6/7] Updated builds. --- build/three.cjs | 329 ++++++++++++++++------------- build/three.core.js | 24 ++- build/three.core.min.js | 2 +- build/three.module.js | 307 ++++++++++++++------------- build/three.module.min.js | 2 +- build/three.webgpu.js | 364 ++++++++++++++++---------------- build/three.webgpu.min.js | 2 +- build/three.webgpu.nodes.js | 364 ++++++++++++++++---------------- build/three.webgpu.nodes.min.js | 2 +- 9 files changed, 731 insertions(+), 665 deletions(-) diff --git a/build/three.cjs b/build/three.cjs index 06803e0f328e58..c2488840a4c7c5 100644 --- a/build/three.cjs +++ b/build/three.cjs @@ -28364,7 +28364,7 @@ class BatchedMesh extends Mesh { * Sets the given color to the defined instance. * * @param {number} instanceId - The ID of an instance to set the color of. - * @param {Color} color - The color to set the instance to. + * @param {Color|Vector4} color - The color to set the instance to. Use a `Vector4` to also define alpha. * @return {BatchedMesh} A reference to this batched mesh. */ setColorAt( instanceId, color ) { @@ -28388,8 +28388,8 @@ class BatchedMesh extends Mesh { * Returns the color of the defined instance. * * @param {number} instanceId - The ID of an instance to get the color of. - * @param {Color} color - The target object that is used to store the method's result. - * @return {Color} The instance's color. + * @param {Color|Vector4} color - The target object that is used to store the method's result. + * @return {Color|Vector4} The instance's color. Use a `Vector4` to also retrieve alpha. */ getColorAt( instanceId, color ) { @@ -39732,6 +39732,14 @@ class MeshPhongMaterial extends Material { */ this.reflectivity = 1; + /** + * Scales the effect of the environment map by multiplying its color. + * + * @type {number} + * @default 1 + */ + this.envMapIntensity = 1.0; + /** * The index of refraction (IOR) of air (approximately 1) divided by the * index of refraction of the material. It is used with environment mapping @@ -39840,6 +39848,7 @@ class MeshPhongMaterial extends Material { this.envMapRotation.copy( source.envMapRotation ); this.combine = source.combine; this.reflectivity = source.reflectivity; + this.envMapIntensity = source.envMapIntensity; this.refractionRatio = source.refractionRatio; this.wireframe = source.wireframe; @@ -40605,6 +40614,14 @@ class MeshLambertMaterial extends Material { */ this.reflectivity = 1; + /** + * Scales the effect of the environment map by multiplying its color. + * + * @type {number} + * @default 1 + */ + this.envMapIntensity = 1.0; + /** * The index of refraction (IOR) of air (approximately 1) divided by the * index of refraction of the material. It is used with environment mapping @@ -40711,6 +40728,7 @@ class MeshLambertMaterial extends Material { this.envMapRotation.copy( source.envMapRotation ); this.combine = source.combine; this.reflectivity = source.reflectivity; + this.envMapIntensity = source.envMapIntensity; this.refractionRatio = source.refractionRatio; this.wireframe = source.wireframe; @@ -59609,7 +59627,7 @@ var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; -var batching_pars_vertex = "#ifdef USE_BATCHING\n\t#if ! defined( GL_ANGLE_multi_draw )\n\t#define gl_DrawID _gl_DrawID\n\tuniform int _gl_DrawID;\n\t#endif\n\tuniform highp sampler2D batchingTexture;\n\tuniform highp usampler2D batchingIdTexture;\n\tmat4 getBatchingMatrix( const in float i ) {\n\t\tint size = textureSize( batchingTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n\tfloat getIndirectIndex( const in int i ) {\n\t\tint size = textureSize( batchingIdTexture, 0 ).x;\n\t\tint x = i % size;\n\t\tint y = i / size;\n\t\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\n\t}\n#endif\n#ifdef USE_BATCHING_COLOR\n\tuniform sampler2D batchingColorTexture;\n\tvec3 getBatchingColor( const in float i ) {\n\t\tint size = textureSize( batchingColorTexture, 0 ).x;\n\t\tint j = int( i );\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\n\t}\n#endif"; +var batching_pars_vertex = "#ifdef USE_BATCHING\n\t#if ! defined( GL_ANGLE_multi_draw )\n\t#define gl_DrawID _gl_DrawID\n\tuniform int _gl_DrawID;\n\t#endif\n\tuniform highp sampler2D batchingTexture;\n\tuniform highp usampler2D batchingIdTexture;\n\tmat4 getBatchingMatrix( const in float i ) {\n\t\tint size = textureSize( batchingTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n\tfloat getIndirectIndex( const in int i ) {\n\t\tint size = textureSize( batchingIdTexture, 0 ).x;\n\t\tint x = i % size;\n\t\tint y = i / size;\n\t\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\n\t}\n#endif\n#ifdef USE_BATCHING_COLOR\n\tuniform sampler2D batchingColorTexture;\n\tvec4 getBatchingColor( const in float i ) {\n\t\tint size = textureSize( batchingColorTexture, 0 ).x;\n\t\tint j = int( i );\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 );\n\t}\n#endif"; var batching_vertex = "#ifdef USE_BATCHING\n\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\n#endif"; @@ -59631,13 +59649,13 @@ var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 v var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif"; -var color_fragment = "#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif"; +var color_fragment = "#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#endif"; -var color_pars_fragment = "#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif"; +var color_pars_fragment = "#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#endif"; -var color_pars_vertex = "#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec3 vColor;\n#endif"; +var color_pars_vertex = "#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec4 vColor;\n#endif"; -var color_vertex = "#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.xyz;\n#endif"; +var color_vertex = "#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec4( 1.0 );\n#endif\n#ifdef USE_COLOR_ALPHA\n\tvColor *= color;\n#elif defined( USE_COLOR )\n\tvColor.rgb *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.rgb *= instanceColor.rgb;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvColor *= getBatchingColor( getIndirectIndex( gl_DrawID ) );\n#endif"; var common = "#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated"; @@ -59657,7 +59675,7 @@ var colorspace_fragment = "gl_FragColor = linearToOutputTexel( gl_FragColor );"; var colorspace_pars_fragment = "vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}"; -var envmap_fragment = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif"; +var envmap_fragment = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t\t#endif\n\t#endif\n#endif"; var envmap_common_pars_fragment = "#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n#endif"; @@ -59701,9 +59719,9 @@ var lights_physical_pars_fragment = "uniform sampler2D dfgLUT;\nstruct PhysicalM var lights_fragment_begin = "\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\n\t\tmaterial.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif"; -var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif"; +var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\t#if defined( STANDARD ) || defined( LAMBERT ) || defined( PHONG )\n\t\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t\t#endif\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif"; -var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif"; +var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\t#if defined( LAMBERT ) || defined( PHONG )\n\t\tirradiance += iblIrradiance;\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif"; var logdepthbuf_fragment = "#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif"; @@ -59757,7 +59775,7 @@ var iridescence_pars_fragment = "#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D var opaque_fragment = "#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );"; -var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}"; +var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\n\t\treturn depth * ( far - near ) - far;\n\t#else\n\t\treturn depth * ( near - far ) - near;\n\t#endif\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\t\n\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\treturn ( near * far ) / ( ( near - far ) * depth - near );\n\t#else\n\t\treturn ( near * far ) / ( ( far - near ) * depth - far );\n\t#endif\n}"; var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif"; @@ -59771,7 +59789,7 @@ var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUG var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; -var shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat dp = 1.0 - shadowCoord.z;\n\t\t\t\t#else\n\t\t\t\t\tfloat dp = shadowCoord.z;\n\t\t\t\t#endif\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, dp ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tdepth = 1.0 - depth;\n\t\t\t\t#endif\n\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tfloat dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp -= shadowBias;\n\t\t\t#else\n\t\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp += shadowBias;\n\t\t\t#endif\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\tvec2 sample0 = vogelDiskSample( 0, 5, phi );\n\t\t\tvec2 sample1 = vogelDiskSample( 1, 5, phi );\n\t\t\tvec2 sample2 = vogelDiskSample( 2, 5, phi );\n\t\t\tvec2 sample3 = vogelDiskSample( 3, 5, phi );\n\t\t\tvec2 sample4 = vogelDiskSample( 4, 5, phi );\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tshadow = step( dp, depth );\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\n#endif"; +var shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadowCoord.z -= shadowBias;\n\t\t\t#else\n\t\t\t\tshadowCoord.z += shadowBias;\n\t\t\t#endif\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat hard_shadow = step( mean, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\t#endif\n\t\t\t\t\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadowCoord.z -= shadowBias;\n\t\t\t#else\n\t\t\t\tshadowCoord.z += shadowBias;\n\t\t\t#endif\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tshadow = step( depth, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t\t#endif\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tfloat dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp -= shadowBias;\n\t\t\t#else\n\t\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp += shadowBias;\n\t\t\t#endif\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\tvec2 sample0 = vogelDiskSample( 0, 5, phi );\n\t\t\tvec2 sample1 = vogelDiskSample( 1, 5, phi );\n\t\t\tvec2 sample2 = vogelDiskSample( 2, 5, phi );\n\t\t\tvec2 sample3 = vogelDiskSample( 3, 5, phi );\n\t\t\tvec2 sample4 = vogelDiskSample( 4, 5, phi );\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tshadow = step( dp, depth );\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\n#endif"; var shadowmap_pars_vertex = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif"; @@ -59841,7 +59859,7 @@ const fragment$a = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_ const vertex$9 = "#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}"; -const fragment$9 = "#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; +const fragment$9 = "#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; const vertex$8 = "#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}"; @@ -59853,7 +59871,7 @@ const fragment$7 = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SH const vertex$6 = "#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}"; -const fragment$6 = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; +const fragment$6 = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; const vertex$5 = "#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}"; @@ -60277,7 +60295,8 @@ const ShaderLib = { UniformsLib.fog, UniformsLib.lights, { - emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) } + emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }, + envMapIntensity: { value: 1 } } ] ), @@ -60303,7 +60322,8 @@ const ShaderLib = { { emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }, specular: { value: /*@__PURE__*/ new Color( 0x111111 ) }, - shininess: { value: 30 } + shininess: { value: 30 }, + envMapIntensity: { value: 1 } } ] ), @@ -60599,7 +60619,7 @@ const _rgb = { r: 0, b: 0, g: 0 }; const _e1$1 = /*@__PURE__*/ new Euler(); const _m1$1 = /*@__PURE__*/ new Matrix4(); -function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) { +function WebGLBackground( renderer, environments, state, objects, alpha, premultipliedAlpha ) { const clearColor = new Color( 0x000000 ); let clearAlpha = alpha === true ? 0 : 1; @@ -60618,7 +60638,7 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, if ( background && background.isTexture ) { const usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background - background = ( usePMREM ? cubeuvmaps : cubemaps ).get( background ); + background = environments.get( background, usePMREM ); } @@ -61938,101 +61958,6 @@ function WebGLClipping( properties ) { } -function WebGLCubeMaps( renderer ) { - - let cubemaps = new WeakMap(); - - function mapTextureMapping( texture, mapping ) { - - if ( mapping === EquirectangularReflectionMapping ) { - - texture.mapping = CubeReflectionMapping; - - } else if ( mapping === EquirectangularRefractionMapping ) { - - texture.mapping = CubeRefractionMapping; - - } - - return texture; - - } - - function get( texture ) { - - if ( texture && texture.isTexture ) { - - const mapping = texture.mapping; - - if ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) { - - if ( cubemaps.has( texture ) ) { - - const cubemap = cubemaps.get( texture ).texture; - return mapTextureMapping( cubemap, texture.mapping ); - - } else { - - const image = texture.image; - - if ( image && image.height > 0 ) { - - const renderTarget = new WebGLCubeRenderTarget( image.height ); - renderTarget.fromEquirectangularTexture( renderer, texture ); - cubemaps.set( texture, renderTarget ); - - texture.addEventListener( 'dispose', onTextureDispose ); - - return mapTextureMapping( renderTarget.texture, texture.mapping ); - - } else { - - // image not yet ready. try the conversion next frame - - return null; - - } - - } - - } - - } - - return texture; - - } - - function onTextureDispose( event ) { - - const texture = event.target; - - texture.removeEventListener( 'dispose', onTextureDispose ); - - const cubemap = cubemaps.get( texture ); - - if ( cubemap !== undefined ) { - - cubemaps.delete( texture ); - cubemap.dispose(); - - } - - } - - function dispose() { - - cubemaps = new WeakMap(); - - } - - return { - get: get, - dispose: dispose - }; - -} - const LOD_MIN = 4; // The standard deviations (radians) associated with the extra mips. @@ -63173,13 +63098,73 @@ function _getCommonVertexShader() { } -function WebGLCubeUVMaps( renderer ) { +function WebGLEnvironments( renderer ) { - let cubeUVmaps = new WeakMap(); + let cubeMaps = new WeakMap(); + let pmremMaps = new WeakMap(); let pmremGenerator = null; - function get( texture ) { + function get( texture, usePMREM = false ) { + + if ( texture === null || texture === undefined ) return null; + + if ( usePMREM ) { + + return getPMREM( texture ); + + } + + return getCube( texture ); + + } + + function getCube( texture ) { + + if ( texture && texture.isTexture ) { + + const mapping = texture.mapping; + + if ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) { + + if ( cubeMaps.has( texture ) ) { + + const cubemap = cubeMaps.get( texture ).texture; + return mapTextureMapping( cubemap, texture.mapping ); + + } else { + + const image = texture.image; + + if ( image && image.height > 0 ) { + + const renderTarget = new WebGLCubeRenderTarget( image.height ); + renderTarget.fromEquirectangularTexture( renderer, texture ); + cubeMaps.set( texture, renderTarget ); + + texture.addEventListener( 'dispose', onCubemapDispose ); + + return mapTextureMapping( renderTarget.texture, texture.mapping ); + + } else { + + // image not yet ready. try the conversion next frame + + return null; + + } + + } + + } + + } + + return texture; + + } + + function getPMREM( texture ) { if ( texture && texture.isTexture ) { @@ -63192,7 +63177,7 @@ function WebGLCubeUVMaps( renderer ) { if ( isEquirectMap || isCubeMap ) { - let renderTarget = cubeUVmaps.get( texture ); + let renderTarget = pmremMaps.get( texture ); const currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0; @@ -63203,7 +63188,7 @@ function WebGLCubeUVMaps( renderer ) { renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget ); renderTarget.texture.pmremVersion = texture.pmremVersion; - cubeUVmaps.set( texture, renderTarget ); + pmremMaps.set( texture, renderTarget ); return renderTarget.texture; @@ -63224,9 +63209,9 @@ function WebGLCubeUVMaps( renderer ) { renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture ); renderTarget.texture.pmremVersion = texture.pmremVersion; - cubeUVmaps.set( texture, renderTarget ); + pmremMaps.set( texture, renderTarget ); - texture.addEventListener( 'dispose', onTextureDispose ); + texture.addEventListener( 'dispose', onPMREMDispose ); return renderTarget.texture; @@ -63250,6 +63235,22 @@ function WebGLCubeUVMaps( renderer ) { } + function mapTextureMapping( texture, mapping ) { + + if ( mapping === EquirectangularReflectionMapping ) { + + texture.mapping = CubeReflectionMapping; + + } else if ( mapping === EquirectangularRefractionMapping ) { + + texture.mapping = CubeRefractionMapping; + + } + + return texture; + + } + function isCubeTextureComplete( image ) { let count = 0; @@ -63263,21 +63264,37 @@ function WebGLCubeUVMaps( renderer ) { return count === length; + } + + function onCubemapDispose( event ) { + + const texture = event.target; + + texture.removeEventListener( 'dispose', onCubemapDispose ); + + const cubemap = cubeMaps.get( texture ); + + if ( cubemap !== undefined ) { + + cubeMaps.delete( texture ); + cubemap.dispose(); + + } } - function onTextureDispose( event ) { + function onPMREMDispose( event ) { const texture = event.target; - texture.removeEventListener( 'dispose', onTextureDispose ); + texture.removeEventListener( 'dispose', onPMREMDispose ); - const cubemapUV = cubeUVmaps.get( texture ); + const pmrem = pmremMaps.get( texture ); - if ( cubemapUV !== undefined ) { + if ( pmrem !== undefined ) { - cubeUVmaps.delete( texture ); - cubemapUV.dispose(); + pmremMaps.delete( texture ); + pmrem.dispose(); } @@ -63285,7 +63302,8 @@ function WebGLCubeUVMaps( renderer ) { function dispose() { - cubeUVmaps = new WeakMap(); + cubeMaps = new WeakMap(); + pmremMaps = new WeakMap(); if ( pmremGenerator !== null ) { @@ -66136,8 +66154,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) { parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '', parameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '', - parameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? '#define USE_COLOR' : '', - parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '', + parameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '', + parameters.vertexAlphas || parameters.batchingColor ? '#define USE_COLOR_ALPHA' : '', parameters.vertexUv1s ? '#define USE_UV1' : '', parameters.vertexUv2s ? '#define USE_UV2' : '', parameters.vertexUv3s ? '#define USE_UV3' : '', @@ -66551,7 +66569,7 @@ class WebGLShaderStage { } -function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) { +function WebGLPrograms( renderer, environments, extensions, capabilities, bindingStates, clipping ) { const _programLayers = new Layers(); const _customShaders = new WebGLShaderCache(); @@ -66595,9 +66613,10 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities const fog = scene.fog; const geometry = object.geometry; - const environment = material.isMeshStandardMaterial ? scene.environment : null; + const environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) ? scene.environment : null; - const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment ); + const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ) || ( material.isMeshPhongMaterial && ! material.envMap ); + const envMap = environments.get( material.envMap || environment, usePMREM ); const envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null; const shaderID = shaderIDs[ material.type ]; @@ -68188,7 +68207,7 @@ function WebGLRenderStates( extensions ) { const vertex = "void main() {\n\tgl_Position = vec4( position, 1.0 );\n}"; -const fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"; +const fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"; const _cubeDirections = [ /*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( -1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ), @@ -68369,6 +68388,9 @@ function WebGLShadowMap( renderer, objects, capabilities ) { } + const reversedDepthBuffer = renderer.state.buffers.depth.getReversed(); + shadow.camera._reversedDepth = reversedDepthBuffer; + if ( shadow.map === null || typeChanged === true ) { if ( shadow.map !== null ) { @@ -68427,8 +68449,6 @@ function WebGLShadowMap( renderer, objects, capabilities ) { shadow.map.depthTexture.name = light.name + '.shadowMap'; shadow.map.depthTexture.format = DepthFormat; - const reversedDepthBuffer = renderer.state.buffers.depth.getReversed(); - if ( this.type === PCFShadowMap ) { shadow.map.depthTexture.compareFunction = reversedDepthBuffer ? GreaterEqualCompare : LessEqualCompare; @@ -73980,6 +74000,12 @@ function WebGLMaterials( renderer, properties ) { refreshUniformsCommon( uniforms, material ); + if ( material.envMap ) { + + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + } else if ( material.isMeshToonMaterial ) { refreshUniformsCommon( uniforms, material ); @@ -73990,6 +74016,12 @@ function WebGLMaterials( renderer, properties ) { refreshUniformsCommon( uniforms, material ); refreshUniformsPhong( uniforms, material ); + if ( material.envMap ) { + + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + } else if ( material.isMeshStandardMaterial ) { refreshUniformsCommon( uniforms, material ); @@ -75316,7 +75348,7 @@ class WebGLRenderer { } let extensions, capabilities, state, info; - let properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects; + let properties, textures, environments, attributes, geometries, objects; let programCache, materials, renderLists, renderStates, clipping, shadowMap; let background, morphtargets, bufferRenderer, indexedBufferRenderer; @@ -75343,19 +75375,18 @@ class WebGLRenderer { info = new WebGLInfo( _gl ); properties = new WebGLProperties(); textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ); - cubemaps = new WebGLCubeMaps( _this ); - cubeuvmaps = new WebGLCubeUVMaps( _this ); + environments = new WebGLEnvironments( _this ); attributes = new WebGLAttributes( _gl ); bindingStates = new WebGLBindingStates( _gl, attributes ); geometries = new WebGLGeometries( _gl, attributes, info, bindingStates ); objects = new WebGLObjects( _gl, geometries, attributes, bindingStates, info ); morphtargets = new WebGLMorphtargets( _gl, capabilities, textures ); clipping = new WebGLClipping( properties ); - programCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ); + programCache = new WebGLPrograms( _this, environments, extensions, capabilities, bindingStates, clipping ); materials = new WebGLMaterials( _this, properties ); renderLists = new WebGLRenderLists(); renderStates = new WebGLRenderStates( extensions ); - background = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha ); + background = new WebGLBackground( _this, environments, state, objects, _alpha, premultipliedAlpha ); shadowMap = new WebGLShadowMap( _this, objects, capabilities ); uniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state ); @@ -75957,8 +75988,7 @@ class WebGLRenderer { renderLists.dispose(); renderStates.dispose(); properties.dispose(); - cubemaps.dispose(); - cubeuvmaps.dispose(); + environments.dispose(); objects.dispose(); bindingStates.dispose(); uniformsGroups.dispose(); @@ -77037,9 +77067,11 @@ class WebGLRenderer { // always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change - materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null; + materialProperties.environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) ? scene.environment : null; materialProperties.fog = scene.fog; - materialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment ); + + const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ) || ( material.isMeshPhongMaterial && ! material.envMap ); + materialProperties.envMap = environments.get( material.envMap || materialProperties.environment, usePMREM ); materialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation; if ( programs === undefined ) { @@ -77170,9 +77202,10 @@ class WebGLRenderer { textures.resetTextureUnits(); const fog = scene.fog; - const environment = material.isMeshStandardMaterial ? scene.environment : null; + const environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) ? scene.environment : null; const colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ); - const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment ); + const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ) || ( material.isMeshPhongMaterial && ! material.envMap ); + const envMap = environments.get( material.envMap || environment, usePMREM ); const vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4; const vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 ); const morphTargets = !! geometry.morphAttributes.position; @@ -77497,7 +77530,7 @@ class WebGLRenderer { } - if ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) { + if ( ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) && material.envMap === null && scene.environment !== null ) { m_uniforms.envMapIntensity.value = scene.environmentIntensity; diff --git a/build/three.core.js b/build/three.core.js index 17e2c72e88bc30..c7c9a8b19098a0 100644 --- a/build/three.core.js +++ b/build/three.core.js @@ -28362,7 +28362,7 @@ class BatchedMesh extends Mesh { * Sets the given color to the defined instance. * * @param {number} instanceId - The ID of an instance to set the color of. - * @param {Color} color - The color to set the instance to. + * @param {Color|Vector4} color - The color to set the instance to. Use a `Vector4` to also define alpha. * @return {BatchedMesh} A reference to this batched mesh. */ setColorAt( instanceId, color ) { @@ -28386,8 +28386,8 @@ class BatchedMesh extends Mesh { * Returns the color of the defined instance. * * @param {number} instanceId - The ID of an instance to get the color of. - * @param {Color} color - The target object that is used to store the method's result. - * @return {Color} The instance's color. + * @param {Color|Vector4} color - The target object that is used to store the method's result. + * @return {Color|Vector4} The instance's color. Use a `Vector4` to also retrieve alpha. */ getColorAt( instanceId, color ) { @@ -39730,6 +39730,14 @@ class MeshPhongMaterial extends Material { */ this.reflectivity = 1; + /** + * Scales the effect of the environment map by multiplying its color. + * + * @type {number} + * @default 1 + */ + this.envMapIntensity = 1.0; + /** * The index of refraction (IOR) of air (approximately 1) divided by the * index of refraction of the material. It is used with environment mapping @@ -39838,6 +39846,7 @@ class MeshPhongMaterial extends Material { this.envMapRotation.copy( source.envMapRotation ); this.combine = source.combine; this.reflectivity = source.reflectivity; + this.envMapIntensity = source.envMapIntensity; this.refractionRatio = source.refractionRatio; this.wireframe = source.wireframe; @@ -40603,6 +40612,14 @@ class MeshLambertMaterial extends Material { */ this.reflectivity = 1; + /** + * Scales the effect of the environment map by multiplying its color. + * + * @type {number} + * @default 1 + */ + this.envMapIntensity = 1.0; + /** * The index of refraction (IOR) of air (approximately 1) divided by the * index of refraction of the material. It is used with environment mapping @@ -40709,6 +40726,7 @@ class MeshLambertMaterial extends Material { this.envMapRotation.copy( source.envMapRotation ); this.combine = source.combine; this.reflectivity = source.reflectivity; + this.envMapIntensity = source.envMapIntensity; this.refractionRatio = source.refractionRatio; this.wireframe = source.wireframe; diff --git a/build/three.core.min.js b/build/three.core.min.js index 5da4f9958b2159..3ed9d80098cbd8 100644 --- a/build/three.core.min.js +++ b/build/three.core.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2026 Three.js Authors * SPDX-License-Identifier: MIT */ -const t="183dev",e={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},i={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},s=0,r=1,n=2,a=3,o=0,h=1,l=2,c=3,u=0,d=1,p=2,m=0,y=1,g=2,f=3,x=4,b=5,v=6,w=100,M=101,S=102,_=103,A=104,T=200,z=201,C=202,I=203,B=204,k=205,O=206,P=207,R=208,N=209,V=210,F=211,E=212,L=213,j=214,D=0,U=1,W=2,q=3,J=4,X=5,Y=6,Z=7,H=0,G=1,$=2,Q=0,K=1,tt=2,et=3,it=4,st=5,rt=6,nt=7,at="attached",ot="detached",ht=300,lt=301,ct=302,ut=303,dt=304,pt=306,mt=1e3,yt=1001,gt=1002,ft=1003,xt=1004,bt=1004,vt=1005,wt=1005,Mt=1006,St=1007,_t=1007,At=1008,Tt=1008,zt=1009,Ct=1010,It=1011,Bt=1012,kt=1013,Ot=1014,Pt=1015,Rt=1016,Nt=1017,Vt=1018,Ft=1020,Et=35902,Lt=35899,jt=1021,Dt=1022,Ut=1023,Wt=1026,qt=1027,Jt=1028,Xt=1029,Yt=1030,Zt=1031,Ht=1032,Gt=1033,$t=33776,Qt=33777,Kt=33778,te=33779,ee=35840,ie=35841,se=35842,re=35843,ne=36196,ae=37492,oe=37496,he=37488,le=37489,ce=37490,ue=37491,de=37808,pe=37809,me=37810,ye=37811,ge=37812,fe=37813,xe=37814,be=37815,ve=37816,we=37817,Me=37818,Se=37819,_e=37820,Ae=37821,Te=36492,ze=36494,Ce=36495,Ie=36283,Be=36284,ke=36285,Oe=36286,Pe=2200,Re=2201,Ne=2202,Ve=2300,Fe=2301,Ee=2302,Le=2400,je=2401,De=2402,Ue=2500,We=2501,qe=0,Je=1,Xe=2,Ye=3200,Ze=3201,He=3202,Ge=3203,$e=0,Qe=1,Ke="",ti="srgb",ei="srgb-linear",ii="linear",si="srgb",ri="",ni="rg",ai="ga",oi=0,hi=7680,li=7681,ci=7682,ui=7683,di=34055,pi=34056,mi=5386,yi=512,gi=513,fi=514,xi=515,bi=516,vi=517,wi=518,Mi=519,Si=512,_i=513,Ai=514,Ti=515,zi=516,Ci=517,Ii=518,Bi=519,ki=35044,Oi=35048,Pi=35040,Ri=35045,Ni=35049,Vi=35041,Fi=35046,Ei=35050,Li=35042,ji="100",Di="300 es",Ui=2e3,Wi=2001,qi={COMPUTE:"compute",RENDER:"render"},Ji={PERSPECTIVE:"perspective",LINEAR:"linear",FLAT:"flat"},Xi={NORMAL:"normal",CENTROID:"centroid",SAMPLE:"sample",FIRST:"first",EITHER:"either"},Yi={TEXTURE_COMPARE:"depthTextureCompare"};function Zi(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}const Hi={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function Gi(t,e){return new Hi[t](e)}function $i(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function Qi(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function Ki(){const t=Qi("canvas");return t.style.display="block",t}const ts={};let es=null;function is(t){es=t}function ss(){return es}function rs(...t){const e="THREE."+t.shift();es?es("log",e,...t):console.log(e,...t)}function ns(...t){const e="THREE."+t.shift();es?es("warn",e,...t):console.warn(e,...t)}function as(...t){const e="THREE."+t.shift();es?es("error",e,...t):console.error(e,...t)}function os(...t){const e=t.join(" ");e in ts||(ts[e]=!0,ns(...t))}function hs(t,e,i){return new Promise(function(s,r){setTimeout(function n(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:r();break;case t.TIMEOUT_EXPIRED:setTimeout(n,i);break;default:s()}},i)})}class ls{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)}hasEventListener(t,e){const i=this._listeners;return void 0!==i&&(void 0!==i[t]&&-1!==i[t].indexOf(e))}removeEventListener(t,e){const i=this._listeners;if(void 0===i)return;const s=i[t];if(void 0!==s){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}}dispatchEvent(t){const e=this._listeners;if(void 0===e)return;const i=e[t.type];if(void 0!==i){t.target=this;const e=i.slice(0);for(let i=0,s=e.length;i>8&255]+cs[t>>16&255]+cs[t>>24&255]+"-"+cs[255&e]+cs[e>>8&255]+"-"+cs[e>>16&15|64]+cs[e>>24&255]+"-"+cs[63&i|128]+cs[i>>8&255]+"-"+cs[i>>16&255]+cs[i>>24&255]+cs[255&s]+cs[s>>8&255]+cs[s>>16&255]+cs[s>>24&255]).toLowerCase()}function ys(t,e,i){return Math.max(e,Math.min(i,t))}function gs(t,e){return(t%e+e)%e}function fs(t,e,i){return(1-i)*t+i*e}function xs(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function bs(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const vs={DEG2RAD:ds,RAD2DEG:ps,generateUUID:ms,clamp:ys,euclideanModulo:gs,mapLinear:function(t,e,i,s,r){return s+(t-e)*(r-s)/(i-e)},inverseLerp:function(t,e,i){return t!==e?(i-t)/(e-t):0},lerp:fs,damp:function(t,e,i,s){return fs(t,e,1-Math.exp(-i*s))},pingpong:function(t,e=1){return e-Math.abs(gs(t,2*e)-e)},smoothstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){void 0!==t&&(us=t);let e=us+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296},degToRad:function(t){return t*ds},radToDeg:function(t){return t*ps},isPowerOfTwo:function(t){return!(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,i,s,r){const n=Math.cos,a=Math.sin,o=n(i/2),h=a(i/2),l=n((e+s)/2),c=a((e+s)/2),u=n((e-s)/2),d=a((e-s)/2),p=n((s-e)/2),m=a((s-e)/2);switch(r){case"XYX":t.set(o*c,h*u,h*d,o*l);break;case"YZY":t.set(h*d,o*c,h*u,o*l);break;case"ZXZ":t.set(h*u,h*d,o*c,o*l);break;case"XZX":t.set(o*c,h*m,h*p,o*l);break;case"YXY":t.set(h*p,o*c,h*m,o*l);break;case"ZYZ":t.set(h*m,h*p,o*c,o*l);break;default:ns("MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:bs,denormalize:xs};class ws{constructor(t=0,e=0){ws.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,s=t.elements;return this.x=s[0]*e+s[3]*i+s[6],this.y=s[1]*e+s[4]*i+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=ys(this.x,t.x,e.x),this.y=ys(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=ys(this.x,t,e),this.y=ys(this.y,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(ys(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(ys(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),s=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*i-n*s+t.x,this.y=r*s+n*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Ms{constructor(t=0,e=0,i=0,s=1){this.isQuaternion=!0,this._x=t,this._y=e,this._z=i,this._w=s}static slerpFlat(t,e,i,s,r,n,a){let o=i[s+0],h=i[s+1],l=i[s+2],c=i[s+3],u=r[n+0],d=r[n+1],p=r[n+2],m=r[n+3];if(c!==m||o!==u||h!==d||l!==p){let t=o*u+h*d+l*p+c*m;t<0&&(u=-u,d=-d,p=-p,m=-m,t=-t);let e=1-a;if(t<.9995){const i=Math.acos(t),s=Math.sin(i);e=Math.sin(e*i)/s,o=o*e+u*(a=Math.sin(a*i)/s),h=h*e+d*a,l=l*e+p*a,c=c*e+m*a}else{o=o*e+u*a,h=h*e+d*a,l=l*e+p*a,c=c*e+m*a;const t=1/Math.sqrt(o*o+h*h+l*l+c*c);o*=t,h*=t,l*=t,c*=t}}t[e]=o,t[e+1]=h,t[e+2]=l,t[e+3]=c}static multiplyQuaternionsFlat(t,e,i,s,r,n){const a=i[s],o=i[s+1],h=i[s+2],l=i[s+3],c=r[n],u=r[n+1],d=r[n+2],p=r[n+3];return t[e]=a*p+l*c+o*d-h*u,t[e+1]=o*p+l*u+h*c-a*d,t[e+2]=h*p+l*d+a*u-o*c,t[e+3]=l*p-a*c-o*u-h*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,s){return this._x=t,this._y=e,this._z=i,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const i=t._x,s=t._y,r=t._z,n=t._order,a=Math.cos,o=Math.sin,h=a(i/2),l=a(s/2),c=a(r/2),u=o(i/2),d=o(s/2),p=o(r/2);switch(n){case"XYZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"YXZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"ZXY":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"ZYX":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"YZX":this._x=u*l*c+h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c-u*d*p;break;case"XZY":this._x=u*l*c-h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c+u*d*p;break;default:ns("Quaternion: .setFromEuler() encountered an unknown order: "+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,s=Math.sin(i);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],s=e[4],r=e[8],n=e[1],a=e[5],o=e[9],h=e[2],l=e[6],c=e[10],u=i+a+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-o)*t,this._y=(r-h)*t,this._z=(n-s)*t}else if(i>a&&i>c){const t=2*Math.sqrt(1+i-a-c);this._w=(l-o)/t,this._x=.25*t,this._y=(s+n)/t,this._z=(r+h)/t}else if(a>c){const t=2*Math.sqrt(1+a-i-c);this._w=(r-h)/t,this._x=(s+n)/t,this._y=.25*t,this._z=(o+l)/t}else{const t=2*Math.sqrt(1+c-i-a);this._w=(n-s)/t,this._x=(r+h)/t,this._y=(o+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return i<1e-8?(i=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(ys(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const s=Math.min(1,e/i);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,s=t._y,r=t._z,n=t._w,a=e._x,o=e._y,h=e._z,l=e._w;return this._x=i*l+n*a+s*h-r*o,this._y=s*l+n*o+r*a-i*h,this._z=r*l+n*h+i*o-s*a,this._w=n*l-i*a-s*o-r*h,this._onChangeCallback(),this}slerp(t,e){let i=t._x,s=t._y,r=t._z,n=t._w,a=this.dot(t);a<0&&(i=-i,s=-s,r=-r,n=-n,a=-a);let o=1-e;if(a<.9995){const t=Math.acos(a),h=Math.sin(t);o=Math.sin(o*t)/h,e=Math.sin(e*t)/h,this._x=this._x*o+i*e,this._y=this._y*o+s*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this._onChangeCallback()}else this._x=this._x*o+i*e,this._y=this._y*o+s*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this.normalize();return this}slerpQuaternions(t,e,i){return this.copy(t).slerp(e,i)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),i=Math.random(),s=Math.sqrt(1-i),r=Math.sqrt(i);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class Ss{constructor(t=0,e=0,i=0){Ss.prototype.isVector3=!0,this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(As.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(As.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*s,this.y=r[1]*e+r[4]*i+r[7]*s,this.z=r[2]*e+r[5]*i+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=t.elements,n=1/(r[3]*e+r[7]*i+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*s+r[12])*n,this.y=(r[1]*e+r[5]*i+r[9]*s+r[13])*n,this.z=(r[2]*e+r[6]*i+r[10]*s+r[14])*n,this}applyQuaternion(t){const e=this.x,i=this.y,s=this.z,r=t.x,n=t.y,a=t.z,o=t.w,h=2*(n*s-a*i),l=2*(a*e-r*s),c=2*(r*i-n*e);return this.x=e+o*h+n*c-a*l,this.y=i+o*l+a*h-r*c,this.z=s+o*c+r*l-n*h,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*s,this.y=r[1]*e+r[5]*i+r[9]*s,this.z=r[2]*e+r[6]*i+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=ys(this.x,t.x,e.x),this.y=ys(this.y,t.y,e.y),this.z=ys(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=ys(this.x,t,e),this.y=ys(this.y,t,e),this.z=ys(this.z,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(ys(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,s=t.y,r=t.z,n=e.x,a=e.y,o=e.z;return this.x=s*o-r*a,this.y=r*n-i*o,this.z=i*a-s*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return _s.copy(this).projectOnVector(t),this.sub(_s)}reflect(t){return this.sub(_s.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(ys(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,s=this.z-t.z;return e*e+i*i+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const s=Math.sin(e)*t;return this.x=s*Math.sin(i),this.y=Math.cos(e)*t,this.z=s*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=2*Math.random()-1,i=Math.sqrt(1-e*e);return this.x=i*Math.cos(t),this.y=e,this.z=i*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const _s=new Ss,As=new Ms;class Ts{constructor(t,e,i,s,r,n,a,o,h){Ts.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h)}set(t,e,i,s,r,n,a,o,h){const l=this.elements;return l[0]=t,l[1]=s,l[2]=a,l[3]=e,l[4]=r,l[5]=o,l[6]=i,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[3],o=i[6],h=i[1],l=i[4],c=i[7],u=i[2],d=i[5],p=i[8],m=s[0],y=s[3],g=s[6],f=s[1],x=s[4],b=s[7],v=s[2],w=s[5],M=s[8];return r[0]=n*m+a*f+o*v,r[3]=n*y+a*x+o*w,r[6]=n*g+a*b+o*M,r[1]=h*m+l*f+c*v,r[4]=h*y+l*x+c*w,r[7]=h*g+l*b+c*M,r[2]=u*m+d*f+p*v,r[5]=u*y+d*x+p*w,r[8]=u*g+d*b+p*M,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8];return e*n*l-e*a*h-i*r*l+i*a*o+s*r*h-s*n*o}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=l*n-a*h,u=a*o-l*r,d=h*r-n*o,p=e*c+i*u+s*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=c*m,t[1]=(s*h-l*i)*m,t[2]=(a*i-s*n)*m,t[3]=u*m,t[4]=(l*e-s*o)*m,t[5]=(s*r-a*e)*m,t[6]=d*m,t[7]=(i*o-h*e)*m,t[8]=(n*e-i*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,s,r,n,a){const o=Math.cos(r),h=Math.sin(r);return this.set(i*o,i*h,-i*(o*n+h*a)+n+t,-s*h,s*o,-s*(-h*n+o*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(zs.makeScale(t,e)),this}rotate(t){return this.premultiply(zs.makeRotation(-t)),this}translate(t,e){return this.premultiply(zs.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,i,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const zs=new Ts,Cs=(new Ts).set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Is=(new Ts).set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function Bs(){const t={enabled:!0,workingColorSpace:ei,spaces:{},convert:function(t,e,i){return!1!==this.enabled&&e!==i&&e&&i?(this.spaces[e].transfer===si&&(t.r=Os(t.r),t.g=Os(t.g),t.b=Os(t.b)),this.spaces[e].primaries!==this.spaces[i].primaries&&(t.applyMatrix3(this.spaces[e].toXYZ),t.applyMatrix3(this.spaces[i].fromXYZ)),this.spaces[i].transfer===si&&(t.r=Ps(t.r),t.g=Ps(t.g),t.b=Ps(t.b)),t):t},workingToColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},colorSpaceToWorking:function(t,e){return this.convert(t,e,this.workingColorSpace)},getPrimaries:function(t){return this.spaces[t].primaries},getTransfer:function(t){return""===t?ii:this.spaces[t].transfer},getToneMappingMode:function(t){return this.spaces[t].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(t,e=this.workingColorSpace){return t.fromArray(this.spaces[e].luminanceCoefficients)},define:function(t){Object.assign(this.spaces,t)},_getMatrix:function(t,e,i){return t.copy(this.spaces[e].toXYZ).multiply(this.spaces[i].fromXYZ)},_getDrawingBufferColorSpace:function(t){return this.spaces[t].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(t=this.workingColorSpace){return this.spaces[t].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(e,i){return os("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),t.workingToColorSpace(e,i)},toWorkingColorSpace:function(e,i){return os("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),t.colorSpaceToWorking(e,i)}},e=[.64,.33,.3,.6,.15,.06],i=[.2126,.7152,.0722],s=[.3127,.329];return t.define({[ei]:{primaries:e,whitePoint:s,transfer:ii,toXYZ:Cs,fromXYZ:Is,luminanceCoefficients:i,workingColorSpaceConfig:{unpackColorSpace:ti},outputColorSpaceConfig:{drawingBufferColorSpace:ti}},[ti]:{primaries:e,whitePoint:s,transfer:si,toXYZ:Cs,fromXYZ:Is,luminanceCoefficients:i,outputColorSpaceConfig:{drawingBufferColorSpace:ti}}}),t}const ks=Bs();function Os(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function Ps(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}let Rs;class Ns{static getDataURL(t,e="image/png"){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let i;if(t instanceof HTMLCanvasElement)i=t;else{void 0===Rs&&(Rs=Qi("canvas")),Rs.width=t.width,Rs.height=t.height;const e=Rs.getContext("2d");t instanceof ImageData?e.putImageData(t,0,0):e.drawImage(t,0,0,t.width,t.height),i=Rs}return i.toDataURL(e)}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=Qi("canvas");e.width=t.width,e.height=t.height;const i=e.getContext("2d");i.drawImage(t,0,0,t.width,t.height);const s=i.getImageData(0,0,t.width,t.height),r=s.data;for(let t=0;t1),this.pmremVersion=0}get width(){return this.source.getSize(js).x}get height(){return this.source.getSize(js).y}get depth(){return this.source.getSize(js).z}get image(){return this.source.data}set image(t=null){this.source.data=t}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return(new this.constructor).copy(this)}copy(t){return this.name=t.name,this.source=t.source,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.channel=t.channel,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.colorSpace=t.colorSpace,this.renderTarget=t.renderTarget,this.isRenderTargetTexture=t.isRenderTargetTexture,this.isArrayTexture=t.isArrayTexture,this.userData=JSON.parse(JSON.stringify(t.userData)),this.needsUpdate=!0,this}setValues(t){for(const e in t){const i=t[e];if(void 0===i){ns(`Texture.setValues(): parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&i&&s.isVector2&&i.isVector2||s&&i&&s.isVector3&&i.isVector3||s&&i&&s.isMatrix3&&i.isMatrix3?s.copy(i):this[e]=i:ns(`Texture.setValues(): property '${e}' does not exist.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];const i={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(t).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(i.userData=this.userData),e||(t.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==ht)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case mt:t.x=t.x-Math.floor(t.x);break;case yt:t.x=t.x<0?0:1;break;case gt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case mt:t.y=t.y-Math.floor(t.y);break;case yt:t.y=t.y<0?0:1;break;case gt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){!0===t&&this.pmremVersion++}}Ds.DEFAULT_IMAGE=null,Ds.DEFAULT_MAPPING=ht,Ds.DEFAULT_ANISOTROPY=1;class Us{constructor(t=0,e=0,i=0,s=1){Us.prototype.isVector4=!0,this.x=t,this.y=e,this.z=i,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,s){return this.x=t,this.y=e,this.z=i,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*i+n[8]*s+n[12]*r,this.y=n[1]*e+n[5]*i+n[9]*s+n[13]*r,this.z=n[2]*e+n[6]*i+n[10]*s+n[14]*r,this.w=n[3]*e+n[7]*i+n[11]*s+n[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,s,r;const n=.01,a=.1,o=t.elements,h=o[0],l=o[4],c=o[8],u=o[1],d=o[5],p=o[9],m=o[2],y=o[6],g=o[10];if(Math.abs(l-u)o&&t>f?tf?o1);this.dispose()}this.viewport.set(0,0,t,e),this.scissor.set(0,0,t,e)}clone(){return(new this.constructor).copy(this)}copy(t){this.width=t.width,this.height=t.height,this.depth=t.depth,this.scissor.copy(t.scissor),this.scissorTest=t.scissorTest,this.viewport.copy(t.viewport),this.textures.length=0;for(let e=0,i=t.textures.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,$s),$s.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(nr),ar.subVectors(this.max,nr),Ks.subVectors(t.a,nr),tr.subVectors(t.b,nr),er.subVectors(t.c,nr),ir.subVectors(tr,Ks),sr.subVectors(er,tr),rr.subVectors(Ks,er);let e=[0,-ir.z,ir.y,0,-sr.z,sr.y,0,-rr.z,rr.y,ir.z,0,-ir.x,sr.z,0,-sr.x,rr.z,0,-rr.x,-ir.y,ir.x,0,-sr.y,sr.x,0,-rr.y,rr.x,0];return!!lr(e,Ks,tr,er,ar)&&(e=[1,0,0,0,1,0,0,0,1],!!lr(e,Ks,tr,er,ar)&&(or.crossVectors(ir,sr),e=[or.x,or.y,or.z],lr(e,Ks,tr,er,ar)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,$s).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize($s).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(Gs[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Gs[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Gs[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Gs[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Gs[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Gs[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Gs[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Gs[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Gs)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(t){return this.min.fromArray(t.min),this.max.fromArray(t.max),this}}const Gs=[new Ss,new Ss,new Ss,new Ss,new Ss,new Ss,new Ss,new Ss],$s=new Ss,Qs=new Hs,Ks=new Ss,tr=new Ss,er=new Ss,ir=new Ss,sr=new Ss,rr=new Ss,nr=new Ss,ar=new Ss,or=new Ss,hr=new Ss;function lr(t,e,i,s,r){for(let n=0,a=t.length-3;n<=a;n+=3){hr.fromArray(t,n);const a=r.x*Math.abs(hr.x)+r.y*Math.abs(hr.y)+r.z*Math.abs(hr.z),o=e.dot(hr),h=i.dot(hr),l=s.dot(hr);if(Math.max(-Math.max(o,h,l),Math.min(o,h,l))>a)return!1}return!0}const cr=new Hs,ur=new Ss,dr=new Ss;class pr{constructor(t=new Ss,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const i=this.center;void 0!==e?i.copy(e):cr.setFromPoints(t).getCenter(i);let s=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;ur.subVectors(t,this.center);const e=ur.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),i=.5*(t-this.radius);this.center.addScaledVector(ur,i/t),this.radius+=i}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(dr.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(ur.copy(t.center).add(dr)),this.expandByPoint(ur.copy(t.center).sub(dr))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(t){return this.radius=t.radius,this.center.fromArray(t.center),this}}const mr=new Ss,yr=new Ss,gr=new Ss,fr=new Ss,xr=new Ss,br=new Ss,vr=new Ss;class wr{constructor(t=new Ss,e=new Ss(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,mr)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,i)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=mr.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(mr.copy(this.origin).addScaledVector(this.direction,e),mr.distanceToSquared(t))}distanceSqToSegment(t,e,i,s){yr.copy(t).add(e).multiplyScalar(.5),gr.copy(e).sub(t).normalize(),fr.copy(this.origin).sub(yr);const r=.5*t.distanceTo(e),n=-this.direction.dot(gr),a=fr.dot(this.direction),o=-fr.dot(gr),h=fr.lengthSq(),l=Math.abs(1-n*n);let c,u,d,p;if(l>0)if(c=n*o-a,u=n*a-o,p=r*l,c>=0)if(u>=-p)if(u<=p){const t=1/l;c*=t,u*=t,d=c*(c+n*u+2*a)+u*(n*c+u+2*o)+h}else u=r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u=-r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u<=-p?(c=Math.max(0,-(-n*r+a)),u=c>0?-r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h):u<=p?(c=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+h):(c=Math.max(0,-(n*r+a)),u=c>0?r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h);else u=n>0?-r:r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;return i&&i.copy(this.origin).addScaledVector(this.direction,c),s&&s.copy(yr).addScaledVector(gr,u),d}intersectSphere(t,e){mr.subVectors(t.center,this.origin);const i=mr.dot(this.direction),s=mr.dot(mr)-i*i,r=t.radius*t.radius;if(s>r)return null;const n=Math.sqrt(r-s),a=i-n,o=i+n;return o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return!(t.radius<0)&&this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,s,r,n,a,o;const h=1/this.direction.x,l=1/this.direction.y,c=1/this.direction.z,u=this.origin;return h>=0?(i=(t.min.x-u.x)*h,s=(t.max.x-u.x)*h):(i=(t.max.x-u.x)*h,s=(t.min.x-u.x)*h),l>=0?(r=(t.min.y-u.y)*l,n=(t.max.y-u.y)*l):(r=(t.max.y-u.y)*l,n=(t.min.y-u.y)*l),i>n||r>s?null:((r>i||isNaN(i))&&(i=r),(n=0?(a=(t.min.z-u.z)*c,o=(t.max.z-u.z)*c):(a=(t.max.z-u.z)*c,o=(t.min.z-u.z)*c),i>o||a>s?null:((a>i||i!=i)&&(i=a),(o=0?i:s,e)))}intersectsBox(t){return null!==this.intersectBox(t,mr)}intersectTriangle(t,e,i,s,r){xr.subVectors(e,t),br.subVectors(i,t),vr.crossVectors(xr,br);let n,a=this.direction.dot(vr);if(a>0){if(s)return null;n=1}else{if(!(a<0))return null;n=-1,a=-a}fr.subVectors(this.origin,t);const o=n*this.direction.dot(br.crossVectors(fr,br));if(o<0)return null;const h=n*this.direction.dot(xr.cross(fr));if(h<0)return null;if(o+h>a)return null;const l=-n*fr.dot(vr);return l<0?null:this.at(l/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class Mr{constructor(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){Mr.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y)}set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){const g=this.elements;return g[0]=t,g[4]=e,g[8]=i,g[12]=s,g[1]=r,g[5]=n,g[9]=a,g[13]=o,g[2]=h,g[6]=l,g[10]=c,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=y,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new Mr).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return 0===this.determinant()?(t.set(1,0,0),e.set(0,1,0),i.set(0,0,1),this):(t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this)}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){if(0===t.determinant())return this.identity();const e=this.elements,i=t.elements,s=1/Sr.setFromMatrixColumn(t,0).length(),r=1/Sr.setFromMatrixColumn(t,1).length(),n=1/Sr.setFromMatrixColumn(t,2).length();return e[0]=i[0]*s,e[1]=i[1]*s,e[2]=i[2]*s,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*n,e[9]=i[9]*n,e[10]=i[10]*n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,i=t.x,s=t.y,r=t.z,n=Math.cos(i),a=Math.sin(i),o=Math.cos(s),h=Math.sin(s),l=Math.cos(r),c=Math.sin(r);if("XYZ"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=-o*c,e[8]=h,e[1]=i+s*h,e[5]=t-r*h,e[9]=-a*o,e[2]=r-t*h,e[6]=s+i*h,e[10]=n*o}else if("YXZ"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t+r*a,e[4]=s*a-i,e[8]=n*h,e[1]=n*c,e[5]=n*l,e[9]=-a,e[2]=i*a-s,e[6]=r+t*a,e[10]=n*o}else if("ZXY"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t-r*a,e[4]=-n*c,e[8]=s+i*a,e[1]=i+s*a,e[5]=n*l,e[9]=r-t*a,e[2]=-n*h,e[6]=a,e[10]=n*o}else if("ZYX"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=s*h-i,e[8]=t*h+r,e[1]=o*c,e[5]=r*h+t,e[9]=i*h-s,e[2]=-h,e[6]=a*o,e[10]=n*o}else if("YZX"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=r-t*c,e[8]=s*c+i,e[1]=c,e[5]=n*l,e[9]=-a*l,e[2]=-h*l,e[6]=i*c+s,e[10]=t-r*c}else if("XZY"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=-c,e[8]=h*l,e[1]=t*c+r,e[5]=n*l,e[9]=i*c-s,e[2]=s*c-i,e[6]=a*l,e[10]=r*c+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(Ar,t,Tr)}lookAt(t,e,i){const s=this.elements;return Ir.subVectors(t,e),0===Ir.lengthSq()&&(Ir.z=1),Ir.normalize(),zr.crossVectors(i,Ir),0===zr.lengthSq()&&(1===Math.abs(i.z)?Ir.x+=1e-4:Ir.z+=1e-4,Ir.normalize(),zr.crossVectors(i,Ir)),zr.normalize(),Cr.crossVectors(Ir,zr),s[0]=zr.x,s[4]=Cr.x,s[8]=Ir.x,s[1]=zr.y,s[5]=Cr.y,s[9]=Ir.y,s[2]=zr.z,s[6]=Cr.z,s[10]=Ir.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[4],o=i[8],h=i[12],l=i[1],c=i[5],u=i[9],d=i[13],p=i[2],m=i[6],y=i[10],g=i[14],f=i[3],x=i[7],b=i[11],v=i[15],w=s[0],M=s[4],S=s[8],_=s[12],A=s[1],T=s[5],z=s[9],C=s[13],I=s[2],B=s[6],k=s[10],O=s[14],P=s[3],R=s[7],N=s[11],V=s[15];return r[0]=n*w+a*A+o*I+h*P,r[4]=n*M+a*T+o*B+h*R,r[8]=n*S+a*z+o*k+h*N,r[12]=n*_+a*C+o*O+h*V,r[1]=l*w+c*A+u*I+d*P,r[5]=l*M+c*T+u*B+d*R,r[9]=l*S+c*z+u*k+d*N,r[13]=l*_+c*C+u*O+d*V,r[2]=p*w+m*A+y*I+g*P,r[6]=p*M+m*T+y*B+g*R,r[10]=p*S+m*z+y*k+g*N,r[14]=p*_+m*C+y*O+g*V,r[3]=f*w+x*A+b*I+v*P,r[7]=f*M+x*T+b*B+v*R,r[11]=f*S+x*z+b*k+v*N,r[15]=f*_+x*C+b*O+v*V,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],s=t[8],r=t[12],n=t[1],a=t[5],o=t[9],h=t[13],l=t[2],c=t[6],u=t[10],d=t[14],p=t[3],m=t[7],y=t[11],g=t[15],f=o*d-h*u,x=a*d-h*c,b=a*u-o*c,v=n*d-h*l,w=n*u-o*l,M=n*c-a*l;return e*(m*f-y*x+g*b)-i*(p*f-y*v+g*w)+s*(p*x-m*v+g*M)-r*(p*b-m*w+y*M)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=t[9],u=t[10],d=t[11],p=t[12],m=t[13],y=t[14],g=t[15],f=e*a-i*n,x=e*o-s*n,b=e*h-r*n,v=i*o-s*a,w=i*h-r*a,M=s*h-r*o,S=l*m-c*p,_=l*y-u*p,A=l*g-d*p,T=c*y-u*m,z=c*g-d*m,C=u*g-d*y,I=f*C-x*z+b*T+v*A-w*_+M*S;if(0===I)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const B=1/I;return t[0]=(a*C-o*z+h*T)*B,t[1]=(s*z-i*C-r*T)*B,t[2]=(m*M-y*w+g*v)*B,t[3]=(u*w-c*M-d*v)*B,t[4]=(o*A-n*C-h*_)*B,t[5]=(e*C-s*A+r*_)*B,t[6]=(y*b-p*M-g*x)*B,t[7]=(l*M-u*b+d*x)*B,t[8]=(n*z-a*A+h*S)*B,t[9]=(i*A-e*z-r*S)*B,t[10]=(p*w-m*b+g*f)*B,t[11]=(c*b-l*w-d*f)*B,t[12]=(a*_-n*T-o*S)*B,t[13]=(e*T-i*_+s*S)*B,t[14]=(m*x-p*v-y*f)*B,t[15]=(l*v-c*x+u*f)*B,this}scale(t){const e=this.elements,i=t.x,s=t.y,r=t.z;return e[0]*=i,e[4]*=s,e[8]*=r,e[1]*=i,e[5]*=s,e[9]*=r,e[2]*=i,e[6]*=s,e[10]*=r,e[3]*=i,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,s))}makeTranslation(t,e,i){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),s=Math.sin(e),r=1-i,n=t.x,a=t.y,o=t.z,h=r*n,l=r*a;return this.set(h*n+i,h*a-s*o,h*o+s*a,0,h*a+s*o,l*a+i,l*o-s*n,0,h*o-s*a,l*o+s*n,r*o*o+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i,s,r,n){return this.set(1,i,r,0,t,1,n,0,e,s,1,0,0,0,0,1),this}compose(t,e,i){const s=this.elements,r=e._x,n=e._y,a=e._z,o=e._w,h=r+r,l=n+n,c=a+a,u=r*h,d=r*l,p=r*c,m=n*l,y=n*c,g=a*c,f=o*h,x=o*l,b=o*c,v=i.x,w=i.y,M=i.z;return s[0]=(1-(m+g))*v,s[1]=(d+b)*v,s[2]=(p-x)*v,s[3]=0,s[4]=(d-b)*w,s[5]=(1-(u+g))*w,s[6]=(y+f)*w,s[7]=0,s[8]=(p+x)*M,s[9]=(y-f)*M,s[10]=(1-(u+m))*M,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,i){const s=this.elements;t.x=s[12],t.y=s[13],t.z=s[14];const r=this.determinant();if(0===r)return i.set(1,1,1),e.identity(),this;let n=Sr.set(s[0],s[1],s[2]).length();const a=Sr.set(s[4],s[5],s[6]).length(),o=Sr.set(s[8],s[9],s[10]).length();r<0&&(n=-n),_r.copy(this);const h=1/n,l=1/a,c=1/o;return _r.elements[0]*=h,_r.elements[1]*=h,_r.elements[2]*=h,_r.elements[4]*=l,_r.elements[5]*=l,_r.elements[6]*=l,_r.elements[8]*=c,_r.elements[9]*=c,_r.elements[10]*=c,e.setFromRotationMatrix(_r),i.x=n,i.y=a,i.z=o,this}makePerspective(t,e,i,s,r,n,a=2e3,o=!1){const h=this.elements,l=2*r/(e-t),c=2*r/(i-s),u=(e+t)/(e-t),d=(i+s)/(i-s);let p,m;if(o)p=r/(n-r),m=n*r/(n-r);else if(a===Ui)p=-(n+r)/(n-r),m=-2*n*r/(n-r);else{if(a!==Wi)throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+a);p=-n/(n-r),m=-n*r/(n-r)}return h[0]=l,h[4]=0,h[8]=u,h[12]=0,h[1]=0,h[5]=c,h[9]=d,h[13]=0,h[2]=0,h[6]=0,h[10]=p,h[14]=m,h[3]=0,h[7]=0,h[11]=-1,h[15]=0,this}makeOrthographic(t,e,i,s,r,n,a=2e3,o=!1){const h=this.elements,l=2/(e-t),c=2/(i-s),u=-(e+t)/(e-t),d=-(i+s)/(i-s);let p,m;if(o)p=1/(n-r),m=n/(n-r);else if(a===Ui)p=-2/(n-r),m=-(n+r)/(n-r);else{if(a!==Wi)throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+a);p=-1/(n-r),m=-r/(n-r)}return h[0]=l,h[4]=0,h[8]=0,h[12]=u,h[1]=0,h[5]=c,h[9]=0,h[13]=d,h[2]=0,h[6]=0,h[10]=p,h[14]=m,h[3]=0,h[7]=0,h[11]=0,h[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}const Sr=new Ss,_r=new Mr,Ar=new Ss(0,0,0),Tr=new Ss(1,1,1),zr=new Ss,Cr=new Ss,Ir=new Ss,Br=new Mr,kr=new Ms;class Or{constructor(t=0,e=0,i=0,s=Or.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=i,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,s=this._order){return this._x=t,this._y=e,this._z=i,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,i=!0){const s=t.elements,r=s[0],n=s[4],a=s[8],o=s[1],h=s[5],l=s[9],c=s[2],u=s[6],d=s[10];switch(e){case"XYZ":this._y=Math.asin(ys(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,d),this._z=Math.atan2(-n,r)):(this._x=Math.atan2(u,h),this._z=0);break;case"YXZ":this._x=Math.asin(-ys(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,h)):(this._y=Math.atan2(-c,r),this._z=0);break;case"ZXY":this._x=Math.asin(ys(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-c,d),this._z=Math.atan2(-n,h)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-ys(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-n,h));break;case"YZX":this._z=Math.asin(ys(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,h),this._y=Math.atan2(-c,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-ys(n,-1,1)),Math.abs(n)<.9999999?(this._x=Math.atan2(u,h),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-l,d),this._y=0);break;default:ns("Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return Br.makeRotationFromQuaternion(t),this.setFromRotationMatrix(Br,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return kr.setFromEuler(this),this.setFromQuaternion(kr,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}Or.DEFAULT_ORDER="XYZ";class Pr{constructor(){this.mask=1}set(t){this.mask=1<>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),null!==this.pivot&&(s.pivot=this.pivot.toArray()),!1===this.matrixAutoUpdate&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.geometryInfo=this._geometryInfo.map(t=>({...t,boundingBox:t.boundingBox?t.boundingBox.toJSON():void 0,boundingSphere:t.boundingSphere?t.boundingSphere.toJSON():void 0})),s.instanceInfo=this._instanceInfo.map(t=>({...t})),s.availableInstanceIds=this._availableInstanceIds.slice(),s.availableGeometryIds=this._availableGeometryIds.slice(),s.nextIndexStart=this._nextIndexStart,s.nextVertexStart=this._nextVertexStart,s.geometryCount=this._geometryCount,s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.matricesTexture=this._matricesTexture.toJSON(t),s.indirectTexture=this._indirectTexture.toJSON(t),null!==this._colorsTexture&&(s.colorsTexture=this._colorsTexture.toJSON(t)),null!==this.boundingSphere&&(s.boundingSphere=this.boundingSphere.toJSON()),null!==this.boundingBox&&(s.boundingBox=this.boundingBox.toJSON())),this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const i=e.shapes;if(Array.isArray(i))for(let e=0,s=i.length;e0){s.children=[];for(let e=0;e0){s.animations=[];for(let e=0;e0&&(i.geometries=e),s.length>0&&(i.materials=s),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),h.length>0&&(i.skeletons=h),l.length>0&&(i.animations=l),c.length>0&&(i.nodes=c)}return i.object=s,i;function n(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),null!==t.pivot&&(this.pivot=t.pivot.clone()),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.static=t.static,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,i,s,r){Gr.subVectors(s,e),$r.subVectors(i,e),Qr.subVectors(t,e);const n=Gr.dot(Gr),a=Gr.dot($r),o=Gr.dot(Qr),h=$r.dot($r),l=$r.dot(Qr),c=n*h-a*a;if(0===c)return r.set(0,0,0),null;const u=1/c,d=(h*o-a*l)*u,p=(n*l-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,s){return null!==this.getBarycoord(t,e,i,s,Kr)&&(Kr.x>=0&&Kr.y>=0&&Kr.x+Kr.y<=1)}static getInterpolation(t,e,i,s,r,n,a,o){return null===this.getBarycoord(t,e,i,s,Kr)?(o.x=0,o.y=0,"z"in o&&(o.z=0),"w"in o&&(o.w=0),null):(o.setScalar(0),o.addScaledVector(r,Kr.x),o.addScaledVector(n,Kr.y),o.addScaledVector(a,Kr.z),o)}static getInterpolatedAttribute(t,e,i,s,r,n){return on.setScalar(0),hn.setScalar(0),ln.setScalar(0),on.fromBufferAttribute(t,e),hn.fromBufferAttribute(t,i),ln.fromBufferAttribute(t,s),n.setScalar(0),n.addScaledVector(on,r.x),n.addScaledVector(hn,r.y),n.addScaledVector(ln,r.z),n}static isFrontFacing(t,e,i,s){return Gr.subVectors(i,e),$r.subVectors(t,e),Gr.cross($r).dot(s)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,s){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,i,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,i),this.c.fromBufferAttribute(t,s),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Gr.subVectors(this.c,this.b),$r.subVectors(this.a,this.b),.5*Gr.cross($r).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return cn.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return cn.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,i,s,r){return cn.getInterpolation(t,this.a,this.b,this.c,e,i,s,r)}containsPoint(t){return cn.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return cn.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const i=this.a,s=this.b,r=this.c;let n,a;tn.subVectors(s,i),en.subVectors(r,i),rn.subVectors(t,i);const o=tn.dot(rn),h=en.dot(rn);if(o<=0&&h<=0)return e.copy(i);nn.subVectors(t,s);const l=tn.dot(nn),c=en.dot(nn);if(l>=0&&c<=l)return e.copy(s);const u=o*c-l*h;if(u<=0&&o>=0&&l<=0)return n=o/(o-l),e.copy(i).addScaledVector(tn,n);an.subVectors(t,r);const d=tn.dot(an),p=en.dot(an);if(p>=0&&d<=p)return e.copy(r);const m=d*h-o*p;if(m<=0&&h>=0&&p<=0)return a=h/(h-p),e.copy(i).addScaledVector(en,a);const y=l*p-d*c;if(y<=0&&c-l>=0&&d-p>=0)return sn.subVectors(r,s),a=(c-l)/(c-l+(d-p)),e.copy(s).addScaledVector(sn,a);const g=1/(y+m+u);return n=m*g,a=u*g,e.copy(i).addScaledVector(tn,n).addScaledVector(en,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const un={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},dn={h:0,s:0,l:0},pn={h:0,s:0,l:0};function mn(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}class yn{constructor(t,e,i){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,i)}set(t,e,i){if(void 0===e&&void 0===i){const e=t;e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e)}else this.setRGB(t,e,i);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=ti){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,ks.colorSpaceToWorking(this,e),this}setRGB(t,e,i,s=ks.workingColorSpace){return this.r=t,this.g=e,this.b=i,ks.colorSpaceToWorking(this,s),this}setHSL(t,e,i,s=ks.workingColorSpace){if(t=gs(t,1),e=ys(e,0,1),i=ys(i,0,1),0===e)this.r=this.g=this.b=i;else{const s=i<=.5?i*(1+e):i+e-i*e,r=2*i-s;this.r=mn(r,s,t+1/3),this.g=mn(r,s,t),this.b=mn(r,s,t-1/3)}return ks.colorSpaceToWorking(this,s),this}setStyle(t,e=ti){function i(e){void 0!==e&&parseFloat(e)<1&&ns("Color: Alpha component of "+t+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const n=s[1],a=s[2];switch(n){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:ns("Color: Unknown color model "+t)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(t)){const i=s[1],r=i.length;if(3===r)return this.setRGB(parseInt(i.charAt(0),16)/15,parseInt(i.charAt(1),16)/15,parseInt(i.charAt(2),16)/15,e);if(6===r)return this.setHex(parseInt(i,16),e);ns("Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=ti){const i=un[t.toLowerCase()];return void 0!==i?this.setHex(i,e):ns("Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=Os(t.r),this.g=Os(t.g),this.b=Os(t.b),this}copyLinearToSRGB(t){return this.r=Ps(t.r),this.g=Ps(t.g),this.b=Ps(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=ti){return ks.workingToColorSpace(gn.copy(this),t),65536*Math.round(ys(255*gn.r,0,255))+256*Math.round(ys(255*gn.g,0,255))+Math.round(ys(255*gn.b,0,255))}getHexString(t=ti){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=ks.workingColorSpace){ks.workingToColorSpace(gn.copy(this),e);const i=gn.r,s=gn.g,r=gn.b,n=Math.max(i,s,r),a=Math.min(i,s,r);let o,h;const l=(a+n)/2;if(a===n)o=0,h=0;else{const t=n-a;switch(h=l<=.5?t/(n+a):t/(2-n-a),n){case i:o=(s-r)/t+(s0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){ns(`Material: parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&s.isColor?s.set(i):s&&s.isVector3&&i&&i.isVector3?s.copy(i):this[e]=i:ns(`Material: '${e}' is not a property of THREE.${this.type}.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};function s(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),void 0!==this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(i.sheenColorMap=this.sheenColorMap.toJSON(t).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(i.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(t).uuid),void 0!==this.dispersion&&(i.dispersion=this.dispersion),void 0!==this.iridescence&&(i.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(i.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(i.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(i.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(i.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),void 0!==this.anisotropy&&(i.anisotropy=this.anisotropy),void 0!==this.anisotropyRotation&&(i.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(i.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapRotation&&(i.envMapRotation=this.envMapRotation.toArray()),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),0!==this.side&&(i.side=this.side),!0===this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=!0),204!==this.blendSrc&&(i.blendSrc=this.blendSrc),205!==this.blendDst&&(i.blendDst=this.blendDst),100!==this.blendEquation&&(i.blendEquation=this.blendEquation),null!==this.blendSrcAlpha&&(i.blendSrcAlpha=this.blendSrcAlpha),null!==this.blendDstAlpha&&(i.blendDstAlpha=this.blendDstAlpha),null!==this.blendEquationAlpha&&(i.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(i.blendColor=this.blendColor.getHex()),0!==this.blendAlpha&&(i.blendAlpha=this.blendAlpha),3!==this.depthFunc&&(i.depthFunc=this.depthFunc),!1===this.depthTest&&(i.depthTest=this.depthTest),!1===this.depthWrite&&(i.depthWrite=this.depthWrite),!1===this.colorWrite&&(i.colorWrite=this.colorWrite),255!==this.stencilWriteMask&&(i.stencilWriteMask=this.stencilWriteMask),519!==this.stencilFunc&&(i.stencilFunc=this.stencilFunc),0!==this.stencilRef&&(i.stencilRef=this.stencilRef),255!==this.stencilFuncMask&&(i.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==hi&&(i.stencilFail=this.stencilFail),this.stencilZFail!==hi&&(i.stencilZFail=this.stencilZFail),this.stencilZPass!==hi&&(i.stencilZPass=this.stencilZPass),!0===this.stencilWrite&&(i.stencilWrite=this.stencilWrite),void 0!==this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaHash&&(i.alphaHash=!0),!0===this.alphaToCoverage&&(i.alphaToCoverage=!0),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=!0),!0===this.forceSinglePass&&(i.forceSinglePass=!0),!1===this.allowOverride&&(i.allowOverride=!1),!0===this.wireframe&&(i.wireframe=!0),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=!0),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),!1===this.fog&&(i.fog=!1),Object.keys(this.userData).length>0&&(i.userData=this.userData),e){const e=s(t.textures),r=s(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let s=0;s!==t;++s)i[s]=e[s].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.allowOverride=t.allowOverride,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}}class bn extends xn{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new yn(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Or,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const vn=wn();function wn(){const t=new ArrayBuffer(4),e=new Float32Array(t),i=new Uint32Array(t),s=new Uint32Array(512),r=new Uint32Array(512);for(let t=0;t<256;++t){const e=t-127;e<-27?(s[t]=0,s[256|t]=32768,r[t]=24,r[256|t]=24):e<-14?(s[t]=1024>>-e-14,s[256|t]=1024>>-e-14|32768,r[t]=-e-1,r[256|t]=-e-1):e<=15?(s[t]=e+15<<10,s[256|t]=e+15<<10|32768,r[t]=13,r[256|t]=13):e<128?(s[t]=31744,s[256|t]=64512,r[t]=24,r[256|t]=24):(s[t]=31744,s[256|t]=64512,r[t]=13,r[256|t]=13)}const n=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,i=0;for(;!(8388608&e);)e<<=1,i-=8388608;e&=-8388609,i+=947912704,n[t]=e|i}for(let t=1024;t<2048;++t)n[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)a[t]=t<<23;a[31]=1199570944,a[32]=2147483648;for(let t=33;t<63;++t)a[t]=2147483648+(t-32<<23);a[63]=3347054592;for(let t=1;t<64;++t)32!==t&&(o[t]=1024);return{floatView:e,uint32View:i,baseTable:s,shiftTable:r,mantissaTable:n,exponentTable:a,offsetTable:o}}function Mn(t){Math.abs(t)>65504&&ns("DataUtils.toHalfFloat(): Value out of range."),t=ys(t,-65504,65504),vn.floatView[0]=t;const e=vn.uint32View[0],i=e>>23&511;return vn.baseTable[i]+((8388607&e)>>vn.shiftTable[i])}function Sn(t){const e=t>>10;return vn.uint32View[0]=vn.mantissaTable[vn.offsetTable[e]+(1023&t)]+vn.exponentTable[e],vn.floatView[0]}class _n{static toHalfFloat(t){return Mn(t)}static fromHalfFloat(t){return Sn(t)}}const An=new Ss,Tn=new ws;let zn=0;class Cn{constructor(t,e,i=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:zn++}),this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=i,this.usage=ki,this.updateRanges=[],this.gpuType=Pt,this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,i){t*=this.itemSize,i*=e.itemSize;for(let s=0,r=this.itemSize;se.count&&ns("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Hs);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return as("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),void this.boundingBox.set(new Ss(-1/0,-1/0,-1/0),new Ss(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(let t=0,i=e.length;t0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const s=i[e];t.data.attributes[e]=s.toJSON(t.data)}const s={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],n=[];for(let e=0,s=i.length;e0&&(s[e]=n,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);const n=this.groups;n.length>0&&(t.data.groups=JSON.parse(JSON.stringify(n)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere=a.toJSON()),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone());const s=t.attributes;for(const t in s){const i=s[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],s=r[t];for(let t=0,r=s.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;t(t.far-t.near)**2)return}Xn.copy(r).invert(),Yn.copy(t.ray).applyMatrix4(Xn),null!==i.boundingBox&&!1===Yn.intersectsBox(i.boundingBox)||this._computeIntersections(t,e,Yn)}}_computeIntersections(t,e,i){let s;const r=this.geometry,n=this.material,a=r.index,o=r.attributes.position,h=r.attributes.uv,l=r.attributes.uv1,c=r.attributes.normal,u=r.groups,d=r.drawRange;if(null!==a)if(Array.isArray(n))for(let r=0,o=u.length;ri.far?null:{distance:l,point:ia.clone(),object:t}}(t,e,i,s,Gn,$n,Qn,ea);if(c){const t=new Ss;cn.getBarycoord(ea,Gn,$n,Qn,t),r&&(c.uv=cn.getInterpolatedAttribute(r,o,h,l,t,new ws)),n&&(c.uv1=cn.getInterpolatedAttribute(n,o,h,l,t,new ws)),a&&(c.normal=cn.getInterpolatedAttribute(a,o,h,l,t,new Ss),c.normal.dot(s.direction)>0&&c.normal.multiplyScalar(-1));const e={a:o,b:h,c:l,normal:new Ss,materialIndex:0};cn.getNormal(Gn,$n,Qn,e.normal),c.face=e,c.barycoord=t}return c}class na extends Jn{constructor(t=1,e=1,i=1,s=1,r=1,n=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:s,heightSegments:r,depthSegments:n};const a=this;s=Math.floor(s),r=Math.floor(r),n=Math.floor(n);const o=[],h=[],l=[],c=[];let u=0,d=0;function p(t,e,i,s,r,n,p,m,y,g,f){const x=n/y,b=p/g,v=n/2,w=p/2,M=m/2,S=y+1,_=g+1;let A=0,T=0;const z=new Ss;for(let n=0;n<_;n++){const a=n*b-w;for(let o=0;o0?1:-1,l.push(z.x,z.y,z.z),c.push(o/y),c.push(1-n/g),A+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e}}class ua extends Hr{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new Mr,this.projectionMatrix=new Mr,this.projectionMatrixInverse=new Mr,this.coordinateSystem=Ui,this._reversedDepth=!1}get reversedDepth(){return this._reversedDepth}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}const da=new Ss,pa=new ws,ma=new ws;class ya extends ua{constructor(t=50,e=1,i=.1,s=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=i,this.far=s,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*ps*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*ds*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*ps*Math.atan(Math.tan(.5*ds*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(t,e,i){da.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),e.set(da.x,da.y).multiplyScalar(-t/da.z),da.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),i.set(da.x,da.y).multiplyScalar(-t/da.z)}getViewSize(t,e){return this.getViewBounds(t,pa,ma),e.subVectors(ma,pa)}setViewOffset(t,e,i,s,r,n){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=s,this.view.width=r,this.view.height=n,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*ds*this.fov)/this.zoom,i=2*e,s=this.aspect*i,r=-.5*s;const n=this.view;if(null!==this.view&&this.view.enabled){const t=n.fullWidth,a=n.fullHeight;r+=n.offsetX*s/t,e-=n.offsetY*i/a,s*=n.width/t,i*=n.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,e,e-i,t,this.far,this.coordinateSystem,this.reversedDepth),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const ga=-90;class fa extends Hr{constructor(t,e,i){super(),this.type="CubeCamera",this.renderTarget=i,this.coordinateSystem=null,this.activeMipmapLevel=0;const s=new ya(ga,1,t,e);s.layers=this.layers,this.add(s);const r=new ya(ga,1,t,e);r.layers=this.layers,this.add(r);const n=new ya(ga,1,t,e);n.layers=this.layers,this.add(n);const a=new ya(ga,1,t,e);a.layers=this.layers,this.add(a);const o=new ya(ga,1,t,e);o.layers=this.layers,this.add(o);const h=new ya(ga,1,t,e);h.layers=this.layers,this.add(h)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[i,s,r,n,a,o]=e;for(const t of e)this.remove(t);if(t===Ui)i.up.set(0,1,0),i.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),n.up.set(0,0,1),n.lookAt(0,-1,0),a.up.set(0,1,0),a.lookAt(0,0,1),o.up.set(0,1,0),o.lookAt(0,0,-1);else{if(t!==Wi)throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);i.up.set(0,-1,0),i.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),n.up.set(0,0,-1),n.lookAt(0,-1,0),a.up.set(0,-1,0),a.lookAt(0,0,1),o.up.set(0,-1,0),o.lookAt(0,0,-1)}for(const t of e)this.add(t),t.updateMatrixWorld()}update(t,e){null===this.parent&&this.updateMatrixWorld();const{renderTarget:i,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,n,a,o,h,l]=this.children,c=t.getRenderTarget(),u=t.getActiveCubeFace(),d=t.getActiveMipmapLevel(),p=t.xr.enabled;t.xr.enabled=!1;const m=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,t.setRenderTarget(i,0,s),t.render(e,r),t.setRenderTarget(i,1,s),t.render(e,n),t.setRenderTarget(i,2,s),t.render(e,a),t.setRenderTarget(i,3,s),t.render(e,o),t.setRenderTarget(i,4,s),t.render(e,h),i.texture.generateMipmaps=m,t.setRenderTarget(i,5,s),t.render(e,l),t.setRenderTarget(c,u,d),t.xr.enabled=p,i.texture.needsPMREMUpdate=!0}}class xa extends Ds{constructor(t=[],e=301,i,s,r,n,a,o,h,l){super(t,e,i,s,r,n,a,o,h,l),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class ba extends qs{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const i={width:t,height:t,depth:1},s=[i,i,i,i,i,i];this.texture=new xa(s),this._setTextureOptions(e),this.texture.isRenderTargetTexture=!0}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const i={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},s=new na(5,5,5),r=new ca({name:"CubemapFromEquirect",uniforms:aa(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const n=new sa(s,r),a=e.minFilter;e.minFilter===At&&(e.minFilter=Mt);return new fa(1,10,this).update(t,n),e.minFilter=a,n.geometry.dispose(),n.material.dispose(),this}clear(t,e=!0,i=!0,s=!0){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,i,s);t.setRenderTarget(r)}}class va extends Hr{constructor(){super(),this.isGroup=!0,this.type="Group"}}const wa={type:"move"};class Ma{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return null===this._hand&&(this._hand=new va,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return null===this._targetRay&&(this._targetRay=new va,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new Ss,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new Ss),this._targetRay}getGripSpace(){return null===this._grip&&(this._grip=new va,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new Ss,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new Ss),this._grip}dispatchEvent(t){return null!==this._targetRay&&this._targetRay.dispatchEvent(t),null!==this._grip&&this._grip.dispatchEvent(t),null!==this._hand&&this._hand.dispatchEvent(t),this}connect(t){if(t&&t.hand){const e=this._hand;if(e)for(const i of t.hand.values())this._getHandJoint(e,i)}return this.dispatchEvent({type:"connected",data:t}),this}disconnect(t){return this.dispatchEvent({type:"disconnected",data:t}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this}update(t,e,i){let s=null,r=null,n=null;const a=this._targetRay,o=this._grip,h=this._hand;if(t&&"visible-blurred"!==e.session.visibilityState){if(h&&t.hand){n=!0;for(const s of t.hand.values()){const t=e.getJointPose(s,i),r=this._getHandJoint(h,s);null!==t&&(r.matrix.fromArray(t.transform.matrix),r.matrix.decompose(r.position,r.rotation,r.scale),r.matrixWorldNeedsUpdate=!0,r.jointRadius=t.radius),r.visible=null!==t}const s=h.joints["index-finger-tip"],r=h.joints["thumb-tip"],a=s.position.distanceTo(r.position),o=.02,l=.005;h.inputState.pinching&&a>o+l?(h.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!h.inputState.pinching&&a<=o-l&&(h.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));null!==a&&(s=e.getPose(t.targetRaySpace,i),null===s&&null!==r&&(s=r),null!==s&&(a.matrix.fromArray(s.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,s.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(s.linearVelocity)):a.hasLinearVelocity=!1,s.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(s.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(wa)))}return null!==a&&(a.visible=null!==s),null!==o&&(o.visible=null!==r),null!==h&&(h.visible=null!==n),this}_getHandJoint(t,e){if(void 0===t.joints[e.jointName]){const i=new va;i.matrixAutoUpdate=!1,i.visible=!1,t.joints[e.jointName]=i,t.add(i)}return t.joints[e.jointName]}}class Sa{constructor(t,e=25e-5){this.isFogExp2=!0,this.name="",this.color=new yn(t),this.density=e}clone(){return new Sa(this.color,this.density)}toJSON(){return{type:"FogExp2",name:this.name,color:this.color.getHex(),density:this.density}}}class _a{constructor(t,e=1,i=1e3){this.isFog=!0,this.name="",this.color=new yn(t),this.near=e,this.far=i}clone(){return new _a(this.color,this.near,this.far)}toJSON(){return{type:"Fog",name:this.name,color:this.color.getHex(),near:this.near,far:this.far}}}class Aa extends Hr{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new Or,this.environmentIntensity=1,this.environmentRotation=new Or,this.overrideMaterial=null,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,this.backgroundRotation.copy(t.backgroundRotation),this.environmentIntensity=t.environmentIntensity,this.environmentRotation.copy(t.environmentRotation),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.fog&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),1!==this.environmentIntensity&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}class Ta{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=ki,this.updateRanges=[],this.version=0,this.uuid=ms()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,i){t*=this.stride,i*=e.stride;for(let s=0,r=this.stride;st.far||e.push({distance:o,point:ka.clone(),uv:cn.getInterpolation(ka,Fa,Ea,La,ja,Da,Ua,new ws),face:null,object:this})}copy(t,e){return super.copy(t,e),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function qa(t,e,i,s,r,n){Ra.subVectors(t,i).addScalar(.5).multiply(s),void 0!==r?(Na.x=n*Ra.x-r*Ra.y,Na.y=r*Ra.x+n*Ra.y):Na.copy(Ra),t.copy(e),t.x+=Na.x,t.y+=Na.y,t.applyMatrix4(Va)}const Ja=new Ss,Xa=new Ss;class Ya extends Hr{constructor(){super(),this.isLOD=!0,this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,i=e.length;t0){let i,s;for(i=1,s=e.length;i0){Ja.setFromMatrixPosition(this.matrixWorld);const i=t.ray.origin.distanceTo(Ja);this.getObjectForDistance(i).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){Ja.setFromMatrixPosition(t.matrixWorld),Xa.setFromMatrixPosition(this.matrixWorld);const i=Ja.distanceTo(Xa)/t.zoom;let s,r;for(e[0].object.visible=!0,s=1,r=e.length;s=t))break;e[s-1].object.visible=!1,e[s].object.visible=!0}for(this._currentLevel=s-1;s1?null:e.copy(t.start).addScaledVector(i,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||wo.getNormalMatrix(t),s=this.coplanarPoint(bo).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const So=new pr,_o=new ws(.5,.5),Ao=new Ss;class To{constructor(t=new Mo,e=new Mo,i=new Mo,s=new Mo,r=new Mo,n=new Mo){this.planes=[t,e,i,s,r,n]}set(t,e,i,s,r,n){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(s),a[4].copy(r),a[5].copy(n),this}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t,e=2e3,i=!1){const s=this.planes,r=t.elements,n=r[0],a=r[1],o=r[2],h=r[3],l=r[4],c=r[5],u=r[6],d=r[7],p=r[8],m=r[9],y=r[10],g=r[11],f=r[12],x=r[13],b=r[14],v=r[15];if(s[0].setComponents(h-n,d-l,g-p,v-f).normalize(),s[1].setComponents(h+n,d+l,g+p,v+f).normalize(),s[2].setComponents(h+a,d+c,g+m,v+x).normalize(),s[3].setComponents(h-a,d-c,g-m,v-x).normalize(),i)s[4].setComponents(o,u,y,b).normalize(),s[5].setComponents(h-o,d-u,g-y,v-b).normalize();else if(s[4].setComponents(h-o,d-u,g-y,v-b).normalize(),e===Ui)s[5].setComponents(h+o,d+u,g+y,v+b).normalize();else{if(e!==Wi)throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);s[5].setComponents(o,u,y,b).normalize()}return this}intersectsObject(t){if(void 0!==t.boundingSphere)null===t.boundingSphere&&t.computeBoundingSphere(),So.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;null===e.boundingSphere&&e.computeBoundingSphere(),So.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(So)}intersectsSprite(t){So.center.set(0,0,0);const e=_o.distanceTo(t.center);return So.radius=.7071067811865476+e,So.applyMatrix4(t.matrixWorld),this.intersectsSphere(So)}intersectsSphere(t){const e=this.planes,i=t.center,s=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(i)0?t.max.x:t.min.x,Ao.y=s.normal.y>0?t.max.y:t.min.y,Ao.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(Ao)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}const zo=new Mr,Co=new To;class Io{constructor(){this.coordinateSystem=Ui}intersectsObject(t,e){if(!e.isArrayCamera||0===e.cameras.length)return!1;for(let i=0;i=r.length&&r.push({start:-1,count:-1,z:-1,index:-1});const a=r[this.index];n.push(a),this.index++,a.start=t,a.count=e,a.z=i,a.index=s}reset(){this.list.length=0,this.index=0}}const Ro=new Mr,No=new yn(1,1,1),Vo=new To,Fo=new Io,Eo=new Hs,Lo=new pr,jo=new Ss,Do=new Ss,Uo=new Ss,Wo=new Po,qo=new sa,Jo=[];function Xo(t,e,i=0){const s=e.itemSize;if(t.isInterleavedBufferAttribute||t.array.constructor!==e.array.constructor){const r=t.count;for(let n=0;n65535?new Uint32Array(s):new Uint16Array(s);e.setIndex(new Cn(t,1))}this._geometryInitialized=!0}}_validateGeometry(t){const e=this.geometry;if(Boolean(t.getIndex())!==Boolean(e.getIndex()))throw new Error('THREE.BatchedMesh: All geometries must consistently have "index".');for(const i in e.attributes){if(!t.hasAttribute(i))throw new Error(`THREE.BatchedMesh: Added geometry missing "${i}". All geometries must have consistent attributes.`);const s=t.getAttribute(i),r=e.getAttribute(i);if(s.itemSize!==r.itemSize||s.normalized!==r.normalized)throw new Error("THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.")}}validateInstanceId(t){const e=this._instanceInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid instanceId ${t}. Instance is either out of range or has been deleted.`)}validateGeometryId(t){const e=this._geometryInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid geometryId ${t}. Geometry is either out of range or has been deleted.`)}setCustomSort(t){return this.customSort=t,this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Hs);const t=this.boundingBox,e=this._instanceInfo;t.makeEmpty();for(let i=0,s=e.length;i=this.maxInstanceCount&&0===this._availableInstanceIds.length)throw new Error("THREE.BatchedMesh: Maximum item count reached.");const e={visible:!0,active:!0,geometryIndex:t};let i=null;this._availableInstanceIds.length>0?(this._availableInstanceIds.sort(Bo),i=this._availableInstanceIds.shift(),this._instanceInfo[i]=e):(i=this._instanceInfo.length,this._instanceInfo.push(e));const s=this._matricesTexture;Ro.identity().toArray(s.image.data,16*i),s.needsUpdate=!0;const r=this._colorsTexture;return r&&(No.toArray(r.image.data,4*i),r.needsUpdate=!0),this._visibilityChanged=!0,i}addGeometry(t,e=-1,i=-1){this._initializeGeometry(t),this._validateGeometry(t);const s={vertexStart:-1,vertexCount:-1,reservedVertexCount:-1,indexStart:-1,indexCount:-1,reservedIndexCount:-1,start:-1,count:-1,boundingBox:null,boundingSphere:null,active:!0},r=this._geometryInfo;s.vertexStart=this._nextVertexStart,s.reservedVertexCount=-1===e?t.getAttribute("position").count:e;const n=t.getIndex();if(null!==n&&(s.indexStart=this._nextIndexStart,s.reservedIndexCount=-1===i?n.count:i),-1!==s.indexStart&&s.indexStart+s.reservedIndexCount>this._maxIndexCount||s.vertexStart+s.reservedVertexCount>this._maxVertexCount)throw new Error("THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.");let a;return this._availableGeometryIds.length>0?(this._availableGeometryIds.sort(Bo),a=this._availableGeometryIds.shift(),r[a]=s):(a=this._geometryCount,this._geometryCount++,r.push(s)),this.setGeometryAt(a,t),this._nextIndexStart=s.indexStart+s.reservedIndexCount,this._nextVertexStart=s.vertexStart+s.reservedVertexCount,a}setGeometryAt(t,e){if(t>=this._geometryCount)throw new Error("THREE.BatchedMesh: Maximum geometry count reached.");this._validateGeometry(e);const i=this.geometry,s=null!==i.getIndex(),r=i.getIndex(),n=e.getIndex(),a=this._geometryInfo[t];if(s&&n.count>a.reservedIndexCount||e.attributes.position.count>a.reservedVertexCount)throw new Error("THREE.BatchedMesh: Reserved space not large enough for provided geometry.");const o=a.vertexStart,h=a.reservedVertexCount;a.vertexCount=e.getAttribute("position").count;for(const t in i.attributes){const s=e.getAttribute(t),r=i.getAttribute(t);Xo(s,r,o);const n=s.itemSize;for(let t=s.count,e=h;t=e.length||!1===e[t].active)return this;const i=this._instanceInfo;for(let e=0,s=i.length;ee).sort((t,e)=>i[t].vertexStart-i[e].vertexStart),r=this.geometry;for(let n=0,a=i.length;n=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingBox){const t=new Hs,e=i.index,r=i.attributes.position;for(let i=s.start,n=s.start+s.count;i=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingSphere){const e=new pr;this.getBoundingBoxAt(t,Eo),Eo.getCenter(e.center);const r=i.index,n=i.attributes.position;let a=0;for(let t=s.start,i=s.start+s.count;tt.active);if(Math.max(...i.map(t=>t.vertexStart+t.reservedVertexCount))>t)throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${e}. Cannot shrink further.`);if(this.geometry.index){if(Math.max(...i.map(t=>t.indexStart+t.reservedIndexCount))>e)throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${e}. Cannot shrink further.`)}const s=this.geometry;s.dispose(),this._maxVertexCount=t,this._maxIndexCount=e,this._geometryInitialized&&(this._geometryInitialized=!1,this.geometry=new Jn,this._initializeGeometry(s));const r=this.geometry;s.index&&Yo(s.index.array,r.index.array);for(const t in s.attributes)Yo(s.attributes[t].array,r.attributes[t].array)}raycast(t,e){const i=this._instanceInfo,s=this._geometryInfo,r=this.matrixWorld,n=this.geometry;qo.material=this.material,qo.geometry.index=n.index,qo.geometry.attributes=n.attributes,null===qo.geometry.boundingBox&&(qo.geometry.boundingBox=new Hs),null===qo.geometry.boundingSphere&&(qo.geometry.boundingSphere=new pr);for(let n=0,a=i.length;n({...t,boundingBox:null!==t.boundingBox?t.boundingBox.clone():null,boundingSphere:null!==t.boundingSphere?t.boundingSphere.clone():null})),this._instanceInfo=t._instanceInfo.map(t=>({...t})),this._availableInstanceIds=t._availableInstanceIds.slice(),this._availableGeometryIds=t._availableGeometryIds.slice(),this._nextIndexStart=t._nextIndexStart,this._nextVertexStart=t._nextVertexStart,this._geometryCount=t._geometryCount,this._maxInstanceCount=t._maxInstanceCount,this._maxVertexCount=t._maxVertexCount,this._maxIndexCount=t._maxIndexCount,this._geometryInitialized=t._geometryInitialized,this._multiDrawCounts=t._multiDrawCounts.slice(),this._multiDrawStarts=t._multiDrawStarts.slice(),this._indirectTexture=t._indirectTexture.clone(),this._indirectTexture.image.data=this._indirectTexture.image.data.slice(),this._matricesTexture=t._matricesTexture.clone(),this._matricesTexture.image.data=this._matricesTexture.image.data.slice(),null!==this._colorsTexture&&(this._colorsTexture=t._colorsTexture.clone(),this._colorsTexture.image.data=this._colorsTexture.image.data.slice()),this}dispose(){this.geometry.dispose(),this._matricesTexture.dispose(),this._matricesTexture=null,this._indirectTexture.dispose(),this._indirectTexture=null,null!==this._colorsTexture&&(this._colorsTexture.dispose(),this._colorsTexture=null)}onBeforeRender(t,e,i,s,r){if(!this._visibilityChanged&&!this.perObjectFrustumCulled&&!this.sortObjects)return;const n=s.getIndex(),a=null===n?1:n.array.BYTES_PER_ELEMENT,o=this._instanceInfo,h=this._multiDrawStarts,l=this._multiDrawCounts,c=this._geometryInfo,u=this.perObjectFrustumCulled,d=this._indirectTexture,p=d.image.data,m=i.isArrayCamera?Fo:Vo;u&&!i.isArrayCamera&&(Ro.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse).multiply(this.matrixWorld),Vo.setFromProjectionMatrix(Ro,i.coordinateSystem,i.reversedDepth));let y=0;if(this.sortObjects){Ro.copy(this.matrixWorld).invert(),jo.setFromMatrixPosition(i.matrixWorld).applyMatrix4(Ro),Do.set(0,0,-1).transformDirection(i.matrixWorld).transformDirection(Ro);for(let t=0,e=o.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;ts)return;eh.applyMatrix4(t.matrixWorld);const h=e.ray.origin.distanceTo(eh);return he.far?void 0:{distance:h,point:ih.clone().applyMatrix4(t.matrixWorld),index:a,face:null,faceIndex:null,barycoord:null,object:t}}const nh=new Ss,ah=new Ss;class oh extends sh{constructor(t,e){super(t,e),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(null===t.index){const e=t.attributes.position,i=[];for(let t=0,s=e.count;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;tr.far)return;n.push({distance:h,distanceToRay:Math.sqrt(o),point:i,index:e,face:null,faceIndex:null,barycoord:null,object:a})}}class gh extends Ds{constructor(t,e,i,s,r=1006,n=1006,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isVideoTexture=!0,this.generateMipmaps=!1,this._requestVideoFrameCallbackId=0;const l=this;"requestVideoFrameCallback"in t&&(this._requestVideoFrameCallbackId=t.requestVideoFrameCallback(function e(){l.needsUpdate=!0,l._requestVideoFrameCallbackId=t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}dispose(){0!==this._requestVideoFrameCallbackId&&(this.source.data.cancelVideoFrameCallback(this._requestVideoFrameCallbackId),this._requestVideoFrameCallbackId=0),super.dispose()}}class fh extends gh{constructor(t,e,i,s,r,n,a,o){super({},t,e,i,s,r,n,a,o),this.isVideoFrameTexture=!0}update(){}clone(){return(new this.constructor).copy(this)}setFrame(t){this.image=t,this.needsUpdate=!0}}class xh extends Ds{constructor(t,e){super({width:t,height:e}),this.isFramebufferTexture=!0,this.magFilter=ft,this.minFilter=ft,this.generateMipmaps=!1,this.needsUpdate=!0}}class bh extends Ds{constructor(t,e,i,s,r,n,a,o,h,l,c,u){super(null,n,a,o,h,l,s,r,c,u),this.isCompressedTexture=!0,this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}class vh extends bh{constructor(t,e,i,s,r,n){super(t,e,i,r,n),this.isCompressedArrayTexture=!0,this.image.depth=s,this.wrapR=yt,this.layerUpdates=new Set}addLayerUpdate(t){this.layerUpdates.add(t)}clearLayerUpdates(){this.layerUpdates.clear()}}class wh extends bh{constructor(t,e,i){super(void 0,t[0].width,t[0].height,e,i,lt),this.isCompressedCubeTexture=!0,this.isCubeTexture=!0,this.image=t}}class Mh extends Ds{constructor(t,e,i,s,r,n,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isCanvasTexture=!0,this.needsUpdate=!0}}class Sh extends Ds{constructor(t,e,i=1014,s,r,n,a=1003,o=1003,h,l=1026,c=1){if(l!==Wt&&1027!==l)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");super({width:t,height:e,depth:c},s,r,n,a,o,l,i,h),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.source=new Fs(Object.assign({},t.image)),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return null!==this.compareFunction&&(e.compareFunction=this.compareFunction),e}}class _h extends Sh{constructor(t,e=1014,i=301,s,r,n=1003,a=1003,o,h=1026){const l={width:t,height:t,depth:1},c=[l,l,l,l,l,l];super(t,t,e,i,s,r,n,a,o,h),this.image=c,this.isCubeDepthTexture=!0,this.isCubeTexture=!0}get images(){return this.image}set images(t){this.image=t}}class Ah extends Ds{constructor(t=null){super(),this.sourceTexture=t,this.isExternalTexture=!0}copy(t){return super.copy(t),this.sourceTexture=t.sourceTexture,this}}class Th extends Jn{constructor(t=1,e=1,i=4,s=8,r=1){super(),this.type="CapsuleGeometry",this.parameters={radius:t,height:e,capSegments:i,radialSegments:s,heightSegments:r},e=Math.max(0,e),i=Math.max(1,Math.floor(i)),s=Math.max(3,Math.floor(s)),r=Math.max(1,Math.floor(r));const n=[],a=[],o=[],h=[],l=e/2,c=Math.PI/2*t,u=e,d=2*c+u,p=2*i+r,m=s+1,y=new Ss,g=new Ss;for(let f=0;f<=p;f++){let x=0,b=0,v=0,w=0;if(f<=i){const e=f/i,s=e*Math.PI/2;b=-l-t*Math.cos(s),v=t*Math.sin(s),w=-t*Math.cos(s),x=e*c}else if(f<=i+r){const s=(f-i)/r;b=s*e-l,v=t,w=0,x=c+s*u}else{const e=(f-i-r)/i,s=e*Math.PI/2;b=l+t*Math.sin(s),v=t*Math.cos(s),w=t*Math.sin(s),x=c+u+e*c}const M=Math.max(0,Math.min(1,x/d));let S=0;0===f?S=.5/s:f===p&&(S=-.5/s);for(let t=0;t<=s;t++){const e=t/s,i=e*Math.PI*2,r=Math.sin(i),n=Math.cos(i);g.x=-v*n,g.y=b,g.z=v*r,a.push(g.x,g.y,g.z),y.set(-v*n,w,v*r),y.normalize(),o.push(y.x,y.y,y.z),h.push(e+S,M)}if(f>0){const t=(f-1)*m;for(let e=0;e0||0!==s)&&(l.push(n,a,h),x+=3),(e>0||s!==r-1)&&(l.push(a,o,h),x+=3)}h.addGroup(g,x,0),g+=x}(),!1===n&&(t>0&&f(!0),e>0&&f(!1)),this.setIndex(l),this.setAttribute("position",new Fn(c,3)),this.setAttribute("normal",new Fn(u,3)),this.setAttribute("uv",new Fn(d,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Ch(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Ih extends Ch{constructor(t=1,e=1,i=32,s=1,r=!1,n=0,a=2*Math.PI){super(0,t,e,i,s,r,n,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:s,openEnded:r,thetaStart:n,thetaLength:a}}static fromJSON(t){return new Ih(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Bh extends Jn{constructor(t=[],e=[],i=1,s=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:s};const r=[],n=[];function a(t,e,i,s){const r=s+1,n=[];for(let s=0;s<=r;s++){n[s]=[];const a=t.clone().lerp(i,s/r),o=e.clone().lerp(i,s/r),h=r-s;for(let t=0;t<=h;t++)n[s][t]=0===t&&s===r?a:a.clone().lerp(o,t/h)}for(let t=0;t.9&&a<.1&&(e<.2&&(n[t+0]+=1),i<.2&&(n[t+2]+=1),s<.2&&(n[t+4]+=1))}}()}(),this.setAttribute("position",new Fn(r,3)),this.setAttribute("normal",new Fn(r.slice(),3)),this.setAttribute("uv",new Fn(n,2)),0===s?this.computeVertexNormals():this.normalizeNormals()}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Bh(t.vertices,t.indices,t.radius,t.detail)}}class kh extends Bh{constructor(t=1,e=0){const i=(1+Math.sqrt(5))/2,s=1/i;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-s,-i,0,-s,i,0,s,-i,0,s,i,-s,-i,0,-s,i,0,s,-i,0,s,i,0,-i,0,-s,i,0,-s,-i,0,s,i,0,s],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}static fromJSON(t){return new kh(t.radius,t.detail)}}const Oh=new Ss,Ph=new Ss,Rh=new Ss,Nh=new cn;class Vh extends Jn{constructor(t=null,e=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:t,thresholdAngle:e},null!==t){const i=4,s=Math.pow(10,i),r=Math.cos(ds*e),n=t.getIndex(),a=t.getAttribute("position"),o=n?n.count:a.count,h=[0,0,0],l=["a","b","c"],c=new Array(3),u={},d=[];for(let t=0;t0)){h=s;break}h=s-1}if(s=h,i[s]===n)return s/(r-1);const l=i[s];return(s+(n-l)/(i[s+1]-l))/(r-1)}getTangent(t,e){const i=1e-4;let s=t-i,r=t+i;s<0&&(s=0),r>1&&(r=1);const n=this.getPoint(s),a=this.getPoint(r),o=e||(n.isVector2?new ws:new Ss);return o.copy(a).sub(n).normalize(),o}getTangentAt(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)}computeFrenetFrames(t,e=!1){const i=new Ss,s=[],r=[],n=[],a=new Ss,o=new Mr;for(let e=0;e<=t;e++){const i=e/t;s[e]=this.getTangentAt(i,new Ss)}r[0]=new Ss,n[0]=new Ss;let h=Number.MAX_VALUE;const l=Math.abs(s[0].x),c=Math.abs(s[0].y),u=Math.abs(s[0].z);l<=h&&(h=l,i.set(1,0,0)),c<=h&&(h=c,i.set(0,1,0)),u<=h&&i.set(0,0,1),a.crossVectors(s[0],i).normalize(),r[0].crossVectors(s[0],a),n[0].crossVectors(s[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),n[e]=n[e-1].clone(),a.crossVectors(s[e-1],s[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(ys(s[e-1].dot(s[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}n[e].crossVectors(s[e],r[e])}if(!0===e){let e=Math.acos(ys(r[0].dot(r[t]),-1,1));e/=t,s[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(o.makeRotationAxis(s[i],e*i)),n[i].crossVectors(s[i],r[i])}return{tangents:s,normals:r,binormals:n}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.7,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class Eh extends Fh{constructor(t=0,e=0,i=1,s=1,r=0,n=2*Math.PI,a=!1,o=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=i,this.yRadius=s,this.aStartAngle=r,this.aEndAngle=n,this.aClockwise=a,this.aRotation=o}getPoint(t,e=new ws){const i=e,s=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const n=Math.abs(r)s;)r-=s;r0?0:(Math.floor(Math.abs(h)/r)+1)*r:0===l&&h===r-1&&(h=r-2,l=1),this.closed||h>0?a=s[(h-1)%r]:(Dh.subVectors(s[0],s[1]).add(s[0]),a=Dh);const c=s[h%r],u=s[(h+1)%r];if(this.closed||h+2s.length-2?s.length-1:n+1],c=s[n>s.length-3?s.length-1:n+2];return i.set(Xh(a,o.x,h.x,l.x,c.x),Xh(a,o.y,h.y,l.y,c.y)),i}copy(t){super.copy(t),this.points=[];for(let e=0,i=t.points.length;e=i){const t=s[r]-i,n=this.curves[r],a=n.getLength(),o=0===a?0:1-t/a;return n.getPointAt(o,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,s=this.curves.length;i1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,i=t.curves.length;e0){const t=h.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(h);const l=h.getPoint(1);return this.currentPoint.copy(l),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class nl extends rl{constructor(t){super(t),this.uuid=ms(),this.type="Shape",this.holes=[]}getPointsHoles(t){const e=[];for(let i=0,s=this.holes.length;i80*i){o=t[0],h=t[1];let e=o,s=h;for(let n=i;ne&&(e=i),r>s&&(s=r)}l=Math.max(e-o,s-h),l=0!==l?32767/l:0}return ll(n,a,i,o,h,l,0),a}function ol(t,e,i,s,r){let n;if(r===function(t,e,i,s){let r=0;for(let n=e,a=i-s;n0)for(let r=e;r=e;r-=s)n=Il(r/s|0,t[r],t[r+1],n);return n&&Sl(n,n.next)&&(Bl(n),n=n.next),n}function hl(t,e){if(!t)return t;e||(e=t);let i,s=t;do{if(i=!1,s.steiner||!Sl(s,s.next)&&0!==Ml(s.prev,s,s.next))s=s.next;else{if(Bl(s),s=e=s.prev,s===s.next)break;i=!0}}while(i||s!==e);return e}function ll(t,e,i,s,r,n,a){if(!t)return;!a&&n&&function(t,e,i,s){let r=t;do{0===r.z&&(r.z=fl(r.x,r.y,e,i,s)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i=1;do{let s,r=t;t=null;let n=null;for(e=0;r;){e++;let a=r,o=0;for(let t=0;t0||h>0&&a;)0!==o&&(0===h||!a||r.z<=a.z)?(s=r,r=r.nextZ,o--):(s=a,a=a.nextZ,h--),n?n.nextZ=s:t=s,s.prevZ=n,n=s;r=a}n.nextZ=null,i*=2}while(e>1)}(r)}(t,s,r,n);let o=t;for(;t.prev!==t.next;){const h=t.prev,l=t.next;if(n?ul(t,s,r,n):cl(t))e.push(h.i,t.i,l.i),Bl(t),t=l.next,o=l.next;else if((t=l)===o){a?1===a?ll(t=dl(hl(t),e),e,i,s,r,n,2):2===a&&pl(t,e,i,s,r,n):ll(hl(t),e,i,s,r,n,1);break}}}function cl(t){const e=t.prev,i=t,s=t.next;if(Ml(e,i,s)>=0)return!1;const r=e.x,n=i.x,a=s.x,o=e.y,h=i.y,l=s.y,c=Math.min(r,n,a),u=Math.min(o,h,l),d=Math.max(r,n,a),p=Math.max(o,h,l);let m=s.next;for(;m!==e;){if(m.x>=c&&m.x<=d&&m.y>=u&&m.y<=p&&vl(r,o,n,h,a,l,m.x,m.y)&&Ml(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function ul(t,e,i,s){const r=t.prev,n=t,a=t.next;if(Ml(r,n,a)>=0)return!1;const o=r.x,h=n.x,l=a.x,c=r.y,u=n.y,d=a.y,p=Math.min(o,h,l),m=Math.min(c,u,d),y=Math.max(o,h,l),g=Math.max(c,u,d),f=fl(p,m,e,i,s),x=fl(y,g,e,i,s);let b=t.prevZ,v=t.nextZ;for(;b&&b.z>=f&&v&&v.z<=x;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&vl(o,c,h,u,l,d,b.x,b.y)&&Ml(b.prev,b,b.next)>=0)return!1;if(b=b.prevZ,v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&vl(o,c,h,u,l,d,v.x,v.y)&&Ml(v.prev,v,v.next)>=0)return!1;v=v.nextZ}for(;b&&b.z>=f;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&vl(o,c,h,u,l,d,b.x,b.y)&&Ml(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;v&&v.z<=x;){if(v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&vl(o,c,h,u,l,d,v.x,v.y)&&Ml(v.prev,v,v.next)>=0)return!1;v=v.nextZ}return!0}function dl(t,e){let i=t;do{const s=i.prev,r=i.next.next;!Sl(s,r)&&_l(s,i,i.next,r)&&zl(s,r)&&zl(r,s)&&(e.push(s.i,i.i,r.i),Bl(i),Bl(i.next),i=t=r),i=i.next}while(i!==t);return hl(i)}function pl(t,e,i,s,r,n){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&wl(a,t)){let o=Cl(a,t);return a=hl(a,a.next),o=hl(o,o.next),ll(a,e,i,s,r,n,0),void ll(o,e,i,s,r,n,0)}t=t.next}a=a.next}while(a!==t)}function ml(t,e){let i=t.x-e.x;if(0===i&&(i=t.y-e.y,0===i)){i=(t.next.y-t.y)/(t.next.x-t.x)-(e.next.y-e.y)/(e.next.x-e.x)}return i}function yl(t,e){const i=function(t,e){let i=e;const s=t.x,r=t.y;let n,a=-1/0;if(Sl(t,i))return i;do{if(Sl(t,i.next))return i.next;if(r<=i.y&&r>=i.next.y&&i.next.y!==i.y){const t=i.x+(r-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(t<=s&&t>a&&(a=t,n=i.x=i.x&&i.x>=h&&s!==i.x&&bl(rn.x||i.x===n.x&&gl(n,i)))&&(n=i,c=e)}i=i.next}while(i!==o);return n}(t,e);if(!i)return e;const s=Cl(i,t);return hl(s,s.next),hl(i,i.next)}function gl(t,e){return Ml(t.prev,t,e.prev)<0&&Ml(e.next,t,t.next)<0}function fl(t,e,i,s,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-s)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function xl(t){let e=t,i=t;do{(e.x=(t-a)*(n-o)&&(t-a)*(s-o)>=(i-a)*(e-o)&&(i-a)*(n-o)>=(r-a)*(s-o)}function vl(t,e,i,s,r,n,a,o){return!(t===a&&e===o)&&bl(t,e,i,s,r,n,a,o)}function wl(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&_l(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(zl(t,e)&&zl(e,t)&&function(t,e){let i=t,s=!1;const r=(t.x+e.x)/2,n=(t.y+e.y)/2;do{i.y>n!=i.next.y>n&&i.next.y!==i.y&&r<(i.next.x-i.x)*(n-i.y)/(i.next.y-i.y)+i.x&&(s=!s),i=i.next}while(i!==t);return s}(t,e)&&(Ml(t.prev,t,e.prev)||Ml(t,e.prev,e))||Sl(t,e)&&Ml(t.prev,t,t.next)>0&&Ml(e.prev,e,e.next)>0)}function Ml(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function Sl(t,e){return t.x===e.x&&t.y===e.y}function _l(t,e,i,s){const r=Tl(Ml(t,e,i)),n=Tl(Ml(t,e,s)),a=Tl(Ml(i,s,t)),o=Tl(Ml(i,s,e));return r!==n&&a!==o||(!(0!==r||!Al(t,i,e))||(!(0!==n||!Al(t,s,e))||(!(0!==a||!Al(i,t,s))||!(0!==o||!Al(i,e,s)))))}function Al(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function Tl(t){return t>0?1:t<0?-1:0}function zl(t,e){return Ml(t.prev,t,t.next)<0?Ml(t,e,t.next)>=0&&Ml(t,t.prev,e)>=0:Ml(t,e,t.prev)<0||Ml(t,t.next,e)<0}function Cl(t,e){const i=kl(t.i,t.x,t.y),s=kl(e.i,e.x,e.y),r=t.next,n=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,s.next=i,i.prev=s,n.next=s,s.prev=n,s}function Il(t,e,i,s){const r=kl(t,e,i);return s?(r.next=s.next,r.prev=s,s.next.prev=r,s.next=r):(r.prev=r,r.next=r),r}function Bl(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function kl(t,e,i){return{i:t,x:e,y:i,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}class Ol{static triangulate(t,e,i=2){return al(t,e,i)}}class Pl{static area(t){const e=t.length;let i=0;for(let s=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function Nl(t,e){for(let i=0;iNumber.EPSILON){const u=Math.sqrt(c),d=Math.sqrt(h*h+l*l),p=e.x-o/u,m=e.y+a/u,y=((i.x-l/d-p)*l-(i.y+h/d-m)*h)/(a*l-o*h);s=p+a*y-t.x,r=m+o*y-t.y;const g=s*s+r*r;if(g<=2)return new ws(s,r);n=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?h>Number.EPSILON&&(t=!0):a<-Number.EPSILON?h<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(l)&&(t=!0),t?(s=-o,r=a,n=Math.sqrt(c)):(s=a,r=o,n=Math.sqrt(c/2))}return new ws(s/n,r/n)}const k=[];for(let t=0,e=z.length,i=e-1,s=t+1;t=0;t--){const e=t/p,i=c*Math.cos(e*Math.PI/2),s=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=z.length;t=0;){const s=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=o+2*p;t0)&&d.push(e,r,h),(t!==i-1||o0!=t>0&&this.version++,this._anisotropy=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get dispersion(){return this._dispersion}set dispersion(t){this._dispersion>0!=t>0&&this.version++,this._dispersion=t}get sheen(){return this._sheen}set sheen(t){this._sheen>0!=t>0&&this.version++,this._sheen=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=t.anisotropy,this.anisotropyRotation=t.anisotropyRotation,this.anisotropyMap=t.anisotropyMap,this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.dispersion=t.dispersion,this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class ic extends xn{constructor(t){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new yn(16777215),this.specular=new yn(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new yn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Or,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class sc extends xn{constructor(t){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new yn(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new yn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}class rc extends xn{constructor(t){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}class nc extends xn{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new yn(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new yn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Or,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class ac extends xn{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class oc extends xn{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}class hc extends xn{constructor(t){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new yn(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this.fog=t.fog,this}}class lc extends Ho{constructor(t){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}function cc(t,e){return t&&t.constructor!==e?"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t):t}function uc(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort(function(e,i){return t[e]-t[i]}),i}function dc(t,e,i){const s=t.length,r=new t.constructor(s);for(let n=0,a=0;a!==s;++n){const s=i[n]*e;for(let i=0;i!==e;++i)r[a++]=t[s+i]}return r}function pc(t,e,i,s){let r=1,n=t[0];for(;void 0!==n&&void 0===n[s];)n=t[r++];if(void 0===n)return;let a=n[s];if(void 0!==a)if(Array.isArray(a))do{a=n[s],void 0!==a&&(e.push(n.time),i.push(...a)),n=t[r++]}while(void 0!==n);else if(void 0!==a.toArray)do{a=n[s],void 0!==a&&(e.push(n.time),a.toArray(i,i.length)),n=t[r++]}while(void 0!==n);else do{a=n[s],void 0!==a&&(e.push(n.time),i.push(a)),n=t[r++]}while(void 0!==n)}class mc{static convertArray(t,e){return cc(t,e)}static isTypedArray(t){return $i(t)}static getKeyframeOrder(t){return uc(t)}static sortedArray(t,e,i){return dc(t,e,i)}static flattenJSON(t,e,i,s){pc(t,e,i,s)}static subclip(t,e,i,s,r=30){return function(t,e,i,s,r=30){const n=t.clone();n.name=e;const a=[];for(let t=0;t=s)){h.push(e.times[t]);for(let i=0;in.tracks[t].times[0]&&(o=n.tracks[t].times[0]);for(let t=0;t=s.times[u]){const t=u*h+o,e=t+h-o;d=s.values.slice(t,e)}else{const t=s.createInterpolant(),e=o,i=h-o;t.evaluate(n),d=t.resultBuffer.slice(e,i)}"quaternion"===r&&(new Ms).fromArray(d).normalize().conjugate().toArray(d);const p=a.times.length;for(let t=0;t=r)){const a=e[1];t=r)break e}n=i,i=0;break i}break t}for(;i>>1;te;)--n;if(++n,0!==r||n!==s){r>=n&&(n=Math.max(n,1),r=n-1);const t=this.getValueSize();this.times=i.slice(r,n),this.values=this.values.slice(r*t,n*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!==0&&(as("KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,s=this.values,r=i.length;0===r&&(as("KeyframeTrack: Track is empty.",this),t=!1);let n=null;for(let e=0;e!==r;e++){const s=i[e];if("number"==typeof s&&isNaN(s)){as("KeyframeTrack: Time is not a valid number.",this,e,s),t=!1;break}if(null!==n&&n>s){as("KeyframeTrack: Out of order keys.",this,e,s,n),t=!1;break}n=s}if(void 0!==s&&$i(s))for(let e=0,i=s.length;e!==i;++e){const i=s[e];if(isNaN(i)){as("KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t}optimize(){const t=this.times.slice(),e=this.values.slice(),i=this.getValueSize(),s=this.getInterpolation()===Ee,r=t.length-1;let n=1;for(let a=1;a0){t[n]=t[r];for(let t=r*i,s=n*i,a=0;a!==i;++a)e[s+a]=e[t+a];++n}return n!==t.length?(this.times=t.slice(0,n),this.values=e.slice(0,n*i)):(this.times=t,this.values=e),this}clone(){const t=this.times.slice(),e=this.values.slice(),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}bc.prototype.ValueTypeName="",bc.prototype.TimeBufferType=Float32Array,bc.prototype.ValueBufferType=Float32Array,bc.prototype.DefaultInterpolation=Fe;class vc extends bc{constructor(t,e,i){super(t,e,i)}}vc.prototype.ValueTypeName="bool",vc.prototype.ValueBufferType=Array,vc.prototype.DefaultInterpolation=Ve,vc.prototype.InterpolantFactoryMethodLinear=void 0,vc.prototype.InterpolantFactoryMethodSmooth=void 0;class wc extends bc{constructor(t,e,i,s){super(t,e,i,s)}}wc.prototype.ValueTypeName="color";class Mc extends bc{constructor(t,e,i,s){super(t,e,i,s)}}Mc.prototype.ValueTypeName="number";class Sc extends yc{constructor(t,e,i,s){super(t,e,i,s)}interpolate_(t,e,i,s){const r=this.resultBuffer,n=this.sampleValues,a=this.valueSize,o=(i-e)/(s-e);let h=t*a;for(let t=h+a;h!==t;h+=4)Ms.slerpFlat(r,0,n,h-a,n,h,o);return r}}class _c extends bc{constructor(t,e,i,s){super(t,e,i,s)}InterpolantFactoryMethodLinear(t){return new Sc(this.times,this.values,this.getValueSize(),t)}}_c.prototype.ValueTypeName="quaternion",_c.prototype.InterpolantFactoryMethodSmooth=void 0;class Ac extends bc{constructor(t,e,i){super(t,e,i)}}Ac.prototype.ValueTypeName="string",Ac.prototype.ValueBufferType=Array,Ac.prototype.DefaultInterpolation=Ve,Ac.prototype.InterpolantFactoryMethodLinear=void 0,Ac.prototype.InterpolantFactoryMethodSmooth=void 0;class Tc extends bc{constructor(t,e,i,s){super(t,e,i,s)}}Tc.prototype.ValueTypeName="vector";class zc{constructor(t="",e=-1,i=[],s=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=s,this.uuid=ms(),this.userData={},this.duration<0&&this.resetDuration()}static parse(t){const e=[],i=t.tracks,s=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(Cc(i[t]).scale(s));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r.userData=JSON.parse(t.userData||"{}"),r}static toJSON(t){const e=[],i=t.tracks,s={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode,userData:JSON.stringify(t.userData)};for(let t=0,s=i.length;t!==s;++t)e.push(bc.toJSON(i[t]));return s}static CreateFromMorphTargetSequence(t,e,i,s){const r=e.length,n=[];for(let t=0;t1){const t=n[1];let e=s[t];e||(s[t]=e=[]),e.push(i)}}const n=[];for(const t in s)n.push(this.CreateFromMorphTargetSequence(t,s[t],e,i));return n}static parseAnimation(t,e){if(ns("AnimationClip: parseAnimation() is deprecated and will be removed with r185"),!t)return as("AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,s,r){if(0!==i.length){const n=[],a=[];pc(i,n,a,s),0!==n.length&&r.push(new t(e,n,a))}},s=[],r=t.name||"default",n=t.fps||30,a=t.blendMode;let o=t.length||-1;const h=t.hierarchy||[];for(let t=0;t{e&&e(r),this.manager.itemEnd(t)},0),r;if(void 0!==Pc[t])return void Pc[t].push({onLoad:e,onProgress:i,onError:s});Pc[t]=[],Pc[t].push({onLoad:e,onProgress:i,onError:s});const n=new Request(t,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin",signal:"function"==typeof AbortSignal.any?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal}),a=this.mimeType,o=this.responseType;fetch(n).then(e=>{if(200===e.status||0===e.status){if(0===e.status&&ns("FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===e.body||void 0===e.body.getReader)return e;const i=Pc[t],s=e.body.getReader(),r=e.headers.get("X-File-Size")||e.headers.get("Content-Length"),n=r?parseInt(r):0,a=0!==n;let o=0;const h=new ReadableStream({start(t){!function e(){s.read().then(({done:s,value:r})=>{if(s)t.close();else{o+=r.byteLength;const s=new ProgressEvent("progress",{lengthComputable:a,loaded:o,total:n});for(let t=0,e=i.length;t{t.error(e)})}()}});return new Response(h)}throw new Rc(`fetch for "${e.url}" responded with ${e.status}: ${e.statusText}`,e)}).then(t=>{switch(o){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then(t=>(new DOMParser).parseFromString(t,a));case"json":return t.json();default:if(""===a)return t.text();{const e=/charset="?([^;"\s]*)"?/i.exec(a),i=e&&e[1]?e[1].toLowerCase():void 0,s=new TextDecoder(i);return t.arrayBuffer().then(t=>s.decode(t))}}}).then(e=>{Ic.add(`file:${t}`,e);const i=Pc[t];delete Pc[t];for(let t=0,s=i.length;t{const i=Pc[t];if(void 0===i)throw this.manager.itemError(t),e;delete Pc[t];for(let t=0,s=i.length;t{this.manager.itemEnd(t)}),this.manager.itemStart(t)}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}class Vc extends Oc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Nc(this.manager);n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):as(e),r.manager.itemError(t)}},i,s)}parse(t){const e=[];for(let i=0;i0:s.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(s.uniforms[e]={},r.type){case"t":s.uniforms[e].value=i(r.value);break;case"c":s.uniforms[e].value=(new yn).setHex(r.value);break;case"v2":s.uniforms[e].value=(new ws).fromArray(r.value);break;case"v3":s.uniforms[e].value=(new Ss).fromArray(r.value);break;case"v4":s.uniforms[e].value=(new Us).fromArray(r.value);break;case"m3":s.uniforms[e].value=(new Ts).fromArray(r.value);break;case"m4":s.uniforms[e].value=(new Mr).fromArray(r.value);break;default:s.uniforms[e].value=r.value}}if(void 0!==t.defines&&(s.defines=t.defines),void 0!==t.vertexShader&&(s.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(s.fragmentShader=t.fragmentShader),void 0!==t.glslVersion&&(s.glslVersion=t.glslVersion),void 0!==t.extensions)for(const e in t.extensions)s.extensions[e]=t.extensions[e];if(void 0!==t.lights&&(s.lights=t.lights),void 0!==t.clipping&&(s.clipping=t.clipping),void 0!==t.size&&(s.size=t.size),void 0!==t.sizeAttenuation&&(s.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(s.map=i(t.map)),void 0!==t.matcap&&(s.matcap=i(t.matcap)),void 0!==t.alphaMap&&(s.alphaMap=i(t.alphaMap)),void 0!==t.bumpMap&&(s.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(s.bumpScale=t.bumpScale),void 0!==t.normalMap&&(s.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(s.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),s.normalScale=(new ws).fromArray(e)}return void 0!==t.displacementMap&&(s.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(s.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(s.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(s.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(s.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(s.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(s.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(s.specularMap=i(t.specularMap)),void 0!==t.specularIntensityMap&&(s.specularIntensityMap=i(t.specularIntensityMap)),void 0!==t.specularColorMap&&(s.specularColorMap=i(t.specularColorMap)),void 0!==t.envMap&&(s.envMap=i(t.envMap)),void 0!==t.envMapRotation&&s.envMapRotation.fromArray(t.envMapRotation),void 0!==t.envMapIntensity&&(s.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(s.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(s.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(s.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(s.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(s.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(s.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(s.gradientMap=i(t.gradientMap)),void 0!==t.clearcoatMap&&(s.clearcoatMap=i(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(s.clearcoatRoughnessMap=i(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(s.clearcoatNormalMap=i(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(s.clearcoatNormalScale=(new ws).fromArray(t.clearcoatNormalScale)),void 0!==t.iridescenceMap&&(s.iridescenceMap=i(t.iridescenceMap)),void 0!==t.iridescenceThicknessMap&&(s.iridescenceThicknessMap=i(t.iridescenceThicknessMap)),void 0!==t.transmissionMap&&(s.transmissionMap=i(t.transmissionMap)),void 0!==t.thicknessMap&&(s.thicknessMap=i(t.thicknessMap)),void 0!==t.anisotropyMap&&(s.anisotropyMap=i(t.anisotropyMap)),void 0!==t.sheenColorMap&&(s.sheenColorMap=i(t.sheenColorMap)),void 0!==t.sheenRoughnessMap&&(s.sheenRoughnessMap=i(t.sheenRoughnessMap)),s}setTextures(t){return this.textures=t,this}createMaterialFromType(t){return au.createMaterialFromType(t)}static createMaterialFromType(t){return new{ShadowMaterial:Ql,SpriteMaterial:Ia,RawShaderMaterial:Kl,ShaderMaterial:ca,PointsMaterial:lh,MeshPhysicalMaterial:ec,MeshStandardMaterial:tc,MeshPhongMaterial:ic,MeshToonMaterial:sc,MeshNormalMaterial:rc,MeshLambertMaterial:nc,MeshDepthMaterial:ac,MeshDistanceMaterial:oc,MeshBasicMaterial:bn,MeshMatcapMaterial:hc,LineDashedMaterial:lc,LineBasicMaterial:Ho,Material:xn}[t]}}class ou{static extractUrlBase(t){const e=t.lastIndexOf("/");return-1===e?"./":t.slice(0,e+1)}static resolveURL(t,e){return"string"!=typeof t||""===t?"":(/^https?:\/\//i.test(e)&&/^\//.test(t)&&(e=e.replace(/(^https?:\/\/[^\/]+).*/i,"$1")),/^(https?:)?\/\//i.test(t)||/^data:.*,.*$/i.test(t)||/^blob:.*$/i.test(t)?t:e+t)}}class hu extends Jn{constructor(){super(),this.isInstancedBufferGeometry=!0,this.type="InstancedBufferGeometry",this.instanceCount=1/0}copy(t){return super.copy(t),this.instanceCount=t.instanceCount,this}toJSON(){const t=super.toJSON();return t.instanceCount=this.instanceCount,t.isInstancedBufferGeometry=!0,t}}class lu extends Oc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Nc(r.manager);n.setPath(r.path),n.setRequestHeader(r.requestHeader),n.setWithCredentials(r.withCredentials),n.load(t,function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):as(e),r.manager.itemError(t)}},i,s)}parse(t){const e={},i={};function s(t,s){if(void 0!==e[s])return e[s];const r=t.interleavedBuffers[s],n=function(t,e){if(void 0!==i[e])return i[e];const s=t.arrayBuffers,r=s[e],n=new Uint32Array(r).buffer;return i[e]=n,n}(t,r.buffer),a=Gi(r.type,n),o=new Ta(a,r.stride);return o.uuid=r.uuid,e[s]=o,o}const r=t.isInstancedBufferGeometry?new hu:new Jn,n=t.data.index;if(void 0!==n){const t=Gi(n.type,n.array);r.setIndex(new Cn(t,1))}const a=t.data.attributes;for(const e in a){const i=a[e];let n;if(i.isInterleavedBufferAttribute){const e=s(t.data,i.data);n=new Ca(e,i.itemSize,i.offset,i.normalized)}else{const t=Gi(i.type,i.array);n=new(i.isInstancedBufferAttribute?lo:Cn)(t,i.itemSize,i.normalized)}void 0!==i.name&&(n.name=i.name),void 0!==i.usage&&n.setUsage(i.usage),r.setAttribute(e,n)}const o=t.data.morphAttributes;if(o)for(const e in o){const i=o[e],n=[];for(let e=0,r=i.length;e0){const i=new Bc(e);r=new Lc(i),r.setCrossOrigin(this.crossOrigin);for(let e=0,i=t.length;e0){s=new Lc(this.manager),s.setCrossOrigin(this.crossOrigin);for(let e=0,s=t.length;e{let e=null,i=null;return void 0!==t.boundingBox&&(e=(new Hs).fromJSON(t.boundingBox)),void 0!==t.boundingSphere&&(i=(new pr).fromJSON(t.boundingSphere)),{...t,boundingBox:e,boundingSphere:i}}),n._instanceInfo=t.instanceInfo,n._availableInstanceIds=t._availableInstanceIds,n._availableGeometryIds=t._availableGeometryIds,n._nextIndexStart=t.nextIndexStart,n._nextVertexStart=t.nextVertexStart,n._geometryCount=t.geometryCount,n._maxInstanceCount=t.maxInstanceCount,n._maxVertexCount=t.maxVertexCount,n._maxIndexCount=t.maxIndexCount,n._geometryInitialized=t.geometryInitialized,n._matricesTexture=c(t.matricesTexture.uuid),n._indirectTexture=c(t.indirectTexture.uuid),void 0!==t.colorsTexture&&(n._colorsTexture=c(t.colorsTexture.uuid)),void 0!==t.boundingSphere&&(n.boundingSphere=(new pr).fromJSON(t.boundingSphere)),void 0!==t.boundingBox&&(n.boundingBox=(new Hs).fromJSON(t.boundingBox));break;case"LOD":n=new Ya;break;case"Line":n=new sh(h(t.geometry),l(t.material));break;case"LineLoop":n=new hh(h(t.geometry),l(t.material));break;case"LineSegments":n=new oh(h(t.geometry),l(t.material));break;case"PointCloud":case"Points":n=new mh(h(t.geometry),l(t.material));break;case"Sprite":n=new Wa(l(t.material));break;case"Group":n=new va;break;case"Bone":n=new ro;break;default:n=new Hr}if(n.uuid=t.uuid,void 0!==t.name&&(n.name=t.name),void 0!==t.matrix?(n.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(n.matrixAutoUpdate=t.matrixAutoUpdate),n.matrixAutoUpdate&&n.matrix.decompose(n.position,n.quaternion,n.scale)):(void 0!==t.position&&n.position.fromArray(t.position),void 0!==t.rotation&&n.rotation.fromArray(t.rotation),void 0!==t.quaternion&&n.quaternion.fromArray(t.quaternion),void 0!==t.scale&&n.scale.fromArray(t.scale)),void 0!==t.up&&n.up.fromArray(t.up),void 0!==t.pivot&&(n.pivot=(new Ss).fromArray(t.pivot)),void 0!==t.castShadow&&(n.castShadow=t.castShadow),void 0!==t.receiveShadow&&(n.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.intensity&&(n.shadow.intensity=t.shadow.intensity),void 0!==t.shadow.bias&&(n.shadow.bias=t.shadow.bias),void 0!==t.shadow.normalBias&&(n.shadow.normalBias=t.shadow.normalBias),void 0!==t.shadow.radius&&(n.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&n.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(n.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.frustumCulled&&(n.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(n.renderOrder=t.renderOrder),void 0!==t.static&&(n.static=t.static),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.layers&&(n.layers.mask=t.layers),void 0!==t.children){const a=t.children;for(let t=0;t{if(!0!==mu.has(n))return e&&e(i),r.manager.itemEnd(t),i;s&&s(mu.get(n)),r.manager.itemError(t),r.manager.itemEnd(t)}):(setTimeout(function(){e&&e(n),r.manager.itemEnd(t)},0),n);const a={};a.credentials="anonymous"===this.crossOrigin?"same-origin":"include",a.headers=this.requestHeader,a.signal="function"==typeof AbortSignal.any?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal;const o=fetch(t,a).then(function(t){return t.blob()}).then(function(t){return createImageBitmap(t,Object.assign(r.options,{colorSpaceConversion:"none"}))}).then(function(i){return Ic.add(`image-bitmap:${t}`,i),e&&e(i),r.manager.itemEnd(t),i}).catch(function(e){s&&s(e),mu.set(o,e),Ic.remove(`image-bitmap:${t}`),r.manager.itemError(t),r.manager.itemEnd(t)});Ic.add(`image-bitmap:${t}`,o),r.manager.itemStart(t)}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}let gu;class fu{static getContext(){return void 0===gu&&(gu=new(window.AudioContext||window.webkitAudioContext)),gu}static setContext(t){gu=t}}class xu extends Oc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Nc(this.manager);function a(e){s?s(e):as(e),r.manager.itemError(t)}n.setResponseType("arraybuffer"),n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,function(t){try{const i=t.slice(0);fu.getContext().decodeAudioData(i,function(t){e(t)}).catch(a)}catch(t){a(t)}},i,s)}}const bu=new Mr,vu=new Mr,wu=new Mr;class Mu{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new ya,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new ya,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(t){const e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep,wu.copy(t.projectionMatrix);const i=e.eyeSep/2,s=i*e.near/e.focus,r=e.near*Math.tan(ds*e.fov*.5)/e.zoom;let n,a;vu.elements[12]=-i,bu.elements[12]=i,n=-r*e.aspect+s,a=r*e.aspect+s,wu.elements[0]=2*e.near/(a-n),wu.elements[8]=(a+n)/(a-n),this.cameraL.projectionMatrix.copy(wu),n=-r*e.aspect-s,a=r*e.aspect-s,wu.elements[0]=2*e.near/(a-n),wu.elements[8]=(a+n)/(a-n),this.cameraR.projectionMatrix.copy(wu)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(vu),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(bu)}}class Su extends ya{constructor(t=[]){super(),this.isArrayCamera=!0,this.isMultiViewCamera=!1,this.cameras=t}}class _u{constructor(t=!0){this.autoStart=t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=performance.now(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const e=performance.now();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}}const Au=new Ss,Tu=new Ms,zu=new Ss,Cu=new Ss,Iu=new Ss;class Bu extends Hr{constructor(){super(),this.type="AudioListener",this.context=fu.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new _u}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t);const e=this.context.listener;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(Au,Tu,zu),Cu.set(0,0,-1).applyQuaternion(Tu),Iu.set(0,1,0).applyQuaternion(Tu),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(Au.x,t),e.positionY.linearRampToValueAtTime(Au.y,t),e.positionZ.linearRampToValueAtTime(Au.z,t),e.forwardX.linearRampToValueAtTime(Cu.x,t),e.forwardY.linearRampToValueAtTime(Cu.y,t),e.forwardZ.linearRampToValueAtTime(Cu.z,t),e.upX.linearRampToValueAtTime(Iu.x,t),e.upY.linearRampToValueAtTime(Iu.y,t),e.upZ.linearRampToValueAtTime(Iu.z,t)}else e.setPosition(Au.x,Au.y,Au.z),e.setOrientation(Cu.x,Cu.y,Cu.z,Iu.x,Iu.y,Iu.z)}}class ku extends Hr{constructor(t){super(),this.type="Audio",this.listener=t,this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this}setMediaElementSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this}setMediaStreamSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(t),this.connect(),this}setBuffer(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this}play(t=0){if(!0===this.isPlaying)return void ns("Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void ns("Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+t;const e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd,e.onended=this.onEnded.bind(this),e.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=e,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;ns("Audio: this Audio has no playback control.")}stop(t=0){if(!1!==this.hasPlaybackControl)return this._progress=0,null!==this.source&&(this.source.stop(this.context.currentTime+t),this.source.onended=null),this.isPlaying=!1,this;ns("Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(i,s,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){a.setValue(i,s);break}}saveOriginalState(){const t=this.binding,e=this.buffer,i=this.valueSize,s=i*this._origIndex;t.getValue(e,s);for(let t=i,r=s;t!==r;++t)e[t]=e[s+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i=.5)for(let s=0;s!==r;++s)t[e+s]=t[i+s]}_slerp(t,e,i,s){Ms.slerpFlat(t,e,t,e,t,i,s)}_slerpAdditive(t,e,i,s,r){const n=this._workIndex*r;Ms.multiplyQuaternionsFlat(t,n,t,e,t,i),Ms.slerpFlat(t,e,t,e,t,n,s)}_lerp(t,e,i,s,r){const n=1-s;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*n+t[i+a]*s}}_lerpAdditive(t,e,i,s,r){for(let n=0;n!==r;++n){const r=e+n;t[r]=t[r]+t[i+n]*s}}}const Lu="\\[\\]\\.:\\/",ju=new RegExp("["+Lu+"]","g"),Du="[^"+Lu+"]",Uu="[^"+Lu.replace("\\.","")+"]",Wu=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",Du)+/(WCOD+)?/.source.replace("WCOD",Uu)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Du)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Du)+"$"),qu=["material","materials","bones","map"];class Ju{constructor(t,e,i){this.path=e,this.parsedPath=i||Ju.parseTrackName(e),this.node=Ju.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,i){return t&&t.isAnimationObjectGroup?new Ju.Composite(t,e,i):new Ju(t,e,i)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(ju,"")}static parseTrackName(t){const e=Wu.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},s=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==s&&-1!==s){const t=i.nodeName.substring(s+1);-1!==qu.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,s),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let s=0;s=r){const n=r++,l=t[n];e[l.uuid]=h,t[h]=l,e[o]=n,t[n]=a;for(let t=0,e=s;t!==e;++t){const e=i[t],s=e[n],r=e[h];e[h]=s,e[n]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,i=this._bindings,s=i.length;let r=this.nCachedObjects_,n=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,h=e[o];if(void 0!==h)if(delete e[o],h0&&(e[a.uuid]=h),t[h]=a,t.pop();for(let t=0,e=s;t!==e;++t){const e=i[t];e[h]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const i=this._bindingsIndicesByPath;let s=i[t];const r=this._bindings;if(void 0!==s)return r[s];const n=this._paths,a=this._parsedPaths,o=this._objects,h=o.length,l=this.nCachedObjects_,c=new Array(h);s=r.length,i[t]=s,n.push(t),a.push(e),r.push(c);for(let i=l,s=o.length;i!==s;++i){const s=o[i];c[i]=new Ju(s,t,e)}return c}unsubscribe_(t){const e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){const s=this._paths,r=this._parsedPaths,n=this._bindings,a=n.length-1,o=n[a];e[t[a]]=i,n[i]=o,n.pop(),r[i]=r[a],r.pop(),s[i]=s[a],s.pop()}}}class Yu{constructor(t,e,i=null,s=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=i,this.blendMode=s;const r=e.tracks,n=r.length,a=new Array(n),o={endingStart:Le,endingEnd:Le};for(let t=0;t!==n;++t){const e=r[t].createInterpolant(null);a[t]=e,e.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(n),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,i=!1){if(t.fadeOut(e),this.fadeIn(e),!0===i){const i=this._clip.duration,s=t._clip.duration,r=s/i,n=i/s;t.warp(1,r,e),this.warp(n,1,e)}return this}crossFadeTo(t,e,i=!1){return t.crossFadeFrom(this,e,i)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,i){const s=this._mixer,r=s.time,n=this.timeScale;let a=this._timeScaleInterpolant;null===a&&(a=s._lendControlInterpolant(),this._timeScaleInterpolant=a);const o=a.parameterPositions,h=a.sampleValues;return o[0]=r,o[1]=r+i,h[0]=t/n,h[1]=e/n,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,i,s){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const s=(t-r)*i;s<0||0===i?e=0:(this._startTime=null,e=i*s)}e*=this._updateTimeScale(t);const n=this._updateTime(e),a=this._updateWeight(t);if(a>0){const t=this._interpolants,e=this._propertyBindings;if(this.blendMode===We)for(let i=0,s=t.length;i!==s;++i)t[i].evaluate(n),e[i].accumulateAdditive(a);else for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(n),e[i].accumulate(s,a)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const s=i.evaluate(t)[0];e*=s,t>i.parameterPositions[1]&&(this.stopFading(),0===s&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let s=this.time+t,r=this._loopCount;const n=2202===i;if(0===t)return-1===r||!n||1&~r?s:e-s;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(s>=e)s=e;else{if(!(s<0)){this.time=s;break t}s=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,n)):this._setEndings(0===this.repetitions,!0,n)),s>=e||s<0){const i=Math.floor(s/e);s-=e*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,s=t>0?e:0,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,n)}else this._setEndings(!1,!1,n);this._loopCount=r,this.time=s,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this.time=s;if(n&&!(1&~r))return e-s}return s}_setEndings(t,e,i){const s=this._interpolantSettings;i?(s.endingStart=je,s.endingEnd=je):(s.endingStart=t?this.zeroSlopeAtStart?je:Le:De,s.endingEnd=e?this.zeroSlopeAtEnd?je:Le:De)}_scheduleFading(t,e,i){const s=this._mixer,r=s.time;let n=this._weightInterpolant;null===n&&(n=s._lendControlInterpolant(),this._weightInterpolant=n);const a=n.parameterPositions,o=n.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=i,this}}const Zu=new Float32Array(1);class Hu extends ls{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}_bindAction(t,e){const i=t._localRoot||this._root,s=t._clip.tracks,r=s.length,n=t._propertyBindings,a=t._interpolants,o=i.uuid,h=this._bindingsByRootAndName;let l=h[o];void 0===l&&(l={},h[o]=l);for(let t=0;t!==r;++t){const r=s[t],h=r.name;let c=l[h];if(void 0!==c)++c.referenceCount,n[t]=c;else{if(c=n[t],void 0!==c){null===c._cacheIndex&&(++c.referenceCount,this._addInactiveBinding(c,o,h));continue}const s=e&&e._propertyBindings[t].binding.parsedPath;c=new Eu(Ju.create(i,h,s),r.ValueTypeName,r.getValueSize()),++c.referenceCount,this._addInactiveBinding(c,o,h),n[t]=c}a[t].resultBuffer=c.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,i=t._clip.uuid,s=this._actionsByClip[i];this._bindAction(t,s&&s.knownActions[0]),this._addInactiveAction(t,i,e)}const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0===i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0===--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,s=this.time+=t,r=Math.sign(t),n=this._accuIndex^=1;for(let a=0;a!==i;++a){e[a]._update(s,t,r,n)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(n);return this}setTime(t){this.time=0;for(let t=0;t=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,ud).distanceTo(t)}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const pd=new Ss,md=new Ss,yd=new Ss,gd=new Ss,fd=new Ss,xd=new Ss,bd=new Ss;class vd{constructor(t=new Ss,e=new Ss){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){pd.subVectors(t,this.start),md.subVectors(this.end,this.start);const i=md.dot(md);let s=md.dot(pd)/i;return e&&(s=ys(s,0,1)),s}closestPointToPoint(t,e,i){const s=this.closestPointToPointParameter(t,e);return this.delta(i).multiplyScalar(s).add(this.start)}distanceSqToLine3(t,e=xd,i=bd){const s=1e-8*1e-8;let r,n;const a=this.start,o=t.start,h=this.end,l=t.end;yd.subVectors(h,a),gd.subVectors(l,o),fd.subVectors(a,o);const c=yd.dot(yd),u=gd.dot(gd),d=gd.dot(fd);if(c<=s&&u<=s)return e.copy(a),i.copy(o),e.sub(i),e.dot(e);if(c<=s)r=0,n=d/u,n=ys(n,0,1);else{const t=yd.dot(fd);if(u<=s)n=0,r=ys(-t/c,0,1);else{const e=yd.dot(gd),i=c*u-e*e;r=0!==i?ys((e*d-t*u)/i,0,1):0,n=(e*r+d)/u,n<0?(n=0,r=ys(-t/c,0,1)):n>1&&(n=1,r=ys((e-t)/c,0,1))}}return e.copy(a).add(yd.multiplyScalar(r)),i.copy(o).add(gd.multiplyScalar(n)),e.sub(i),e.dot(e)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}const wd=new Ss;class Md extends Hr{constructor(t,e){super(),this.light=t,this.matrixAutoUpdate=!1,this.color=e,this.type="SpotLightHelper";const i=new Jn,s=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let t=0,e=1,i=32;t1)for(let i=0;i.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{Yd.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(Yd,e)}}setLength(t,e=.2*t,i=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(i,e,i),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}}class $d extends oh{constructor(t=1){const e=[0,0,0,t,0,0,0,0,0,0,t,0,0,0,0,0,0,t],i=new Jn;i.setAttribute("position",new Fn(e,3)),i.setAttribute("color",new Fn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));super(i,new Ho({vertexColors:!0,toneMapped:!1})),this.type="AxesHelper"}setColors(t,e,i){const s=new yn,r=this.geometry.attributes.color.array;return s.set(t),s.toArray(r,0),s.toArray(r,3),s.set(e),s.toArray(r,6),s.toArray(r,9),s.set(i),s.toArray(r,12),s.toArray(r,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class Qd{constructor(){this.type="ShapePath",this.color=new yn,this.subPaths=[],this.currentPath=null}moveTo(t,e){return this.currentPath=new rl,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this}lineTo(t,e){return this.currentPath.lineTo(t,e),this}quadraticCurveTo(t,e,i,s){return this.currentPath.quadraticCurveTo(t,e,i,s),this}bezierCurveTo(t,e,i,s,r,n){return this.currentPath.bezierCurveTo(t,e,i,s,r,n),this}splineThru(t){return this.currentPath.splineThru(t),this}toShapes(t){function e(t,e){const i=e.length;let s=!1;for(let r=i-1,n=0;nNumber.EPSILON){if(h<0&&(i=e[n],o=-o,a=e[r],h=-h),t.ya.y)continue;if(t.y===i.y){if(t.x===i.x)return!0}else{const e=h*(t.x-i.x)-o*(t.y-i.y);if(0===e)return!0;if(e<0)continue;s=!s}}else{if(t.y!==i.y)continue;if(a.x<=t.x&&t.x<=i.x||i.x<=t.x&&t.x<=a.x)return!0}}return s}const i=Pl.isClockWise,s=this.subPaths;if(0===s.length)return[];let r,n,a;const o=[];if(1===s.length)return n=s[0],a=new nl,a.curves=n.curves,o.push(a),o;let h=!i(s[0].getPoints());h=t?!h:h;const l=[],c=[];let u,d,p=[],m=0;c[m]=void 0,p[m]=[];for(let e=0,a=s.length;e1){let t=!1,i=0;for(let t=0,e=c.length;t0&&!1===t&&(p=l)}for(let t=0,e=c.length;te?(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2):(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0),t}(t,e)}static cover(t,e){return function(t,e){const i=t.image&&t.image.width?t.image.width/t.image.height:1;return i>e?(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0):(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2),t}(t,e)}static fill(t){return function(t){return t.repeat.x=1,t.repeat.y=1,t.offset.x=0,t.offset.y=0,t}(t)}static getByteLength(t,e,i,s){return tp(t,e,i,s)}}"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:t}})),"undefined"!=typeof window&&(window.__THREE__?ns("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=t);export{it as ACESFilmicToneMapping,w as AddEquation,$ as AddOperation,We as AdditiveAnimationBlendMode,g as AdditiveBlending,rt as AgXToneMapping,jt as AlphaFormat,Bi as AlwaysCompare,U as AlwaysDepth,Mi as AlwaysStencilFunc,iu as AmbientLight,Yu as AnimationAction,zc as AnimationClip,Vc as AnimationLoader,Hu as AnimationMixer,Xu as AnimationObjectGroup,mc as AnimationUtils,Lh as ArcCurve,Su as ArrayCamera,Gd as ArrowHelper,at as AttachedBindMode,ku as Audio,Fu as AudioAnalyser,fu as AudioContext,Bu as AudioListener,xu as AudioLoader,$d as AxesHelper,d as BackSide,Ye as BasicDepthPacking,o as BasicShadowMap,Zo as BatchedMesh,ro as Bone,vc as BooleanKeyframeTrack,dd as Box2,Hs as Box3,Jd as Box3Helper,na as BoxGeometry,qd as BoxHelper,Cn as BufferAttribute,Jn as BufferGeometry,lu as BufferGeometryLoader,Ct as ByteType,Ic as Cache,ua as Camera,Dd as CameraHelper,Mh as CanvasTexture,Th as CapsuleGeometry,Jh as CatmullRomCurve3,et as CineonToneMapping,zh as CircleGeometry,yt as ClampToEdgeWrapping,_u as Clock,yn as Color,wc as ColorKeyframeTrack,ks as ColorManagement,Yi as Compatibility,vh as CompressedArrayTexture,wh as CompressedCubeTexture,bh as CompressedTexture,Fc as CompressedTextureLoader,Ih as ConeGeometry,L as ConstantAlphaFactor,F as ConstantColorFactor,Kd as Controls,fa as CubeCamera,_h as CubeDepthTexture,lt as CubeReflectionMapping,ct as CubeRefractionMapping,xa as CubeTexture,jc as CubeTextureLoader,pt as CubeUVReflectionMapping,Hh as CubicBezierCurve,Gh as CubicBezierCurve3,gc as CubicInterpolant,r as CullFaceBack,n as CullFaceFront,a as CullFaceFrontBack,s as CullFaceNone,Fh as Curve,sl as CurvePath,b as CustomBlending,st as CustomToneMapping,Ch as CylinderGeometry,ld as Cylindrical,Ys as Data3DTexture,Js as DataArrayTexture,no as DataTexture,Dc as DataTextureLoader,_n as DataUtils,ui as DecrementStencilOp,pi as DecrementWrapStencilOp,kc as DefaultLoadingManager,Wt as DepthFormat,qt as DepthStencilFormat,Sh as DepthTexture,ot as DetachedBindMode,eu as DirectionalLight,Ed as DirectionalLightHelper,xc as DiscreteInterpolant,kh as DodecahedronGeometry,p as DoubleSide,O as DstAlphaFactor,R as DstColorFactor,Ei as DynamicCopyUsage,Oi as DynamicDrawUsage,Ni as DynamicReadUsage,Vh as EdgesGeometry,Eh as EllipseCurve,Ai as EqualCompare,J as EqualDepth,fi as EqualStencilFunc,ut as EquirectangularReflectionMapping,dt as EquirectangularRefractionMapping,Or as Euler,ls as EventDispatcher,Ah as ExternalTexture,Vl as ExtrudeGeometry,Nc as FileLoader,Vn as Float16BufferAttribute,Fn as Float32BufferAttribute,Pt as FloatType,_a as Fog,Sa as FogExp2,xh as FramebufferTexture,u as FrontSide,To as Frustum,Io as FrustumArray,ed as GLBufferAttribute,ji as GLSL1,Di as GLSL3,zi as GreaterCompare,Y as GreaterDepth,Ii as GreaterEqualCompare,X as GreaterEqualDepth,wi as GreaterEqualStencilFunc,bi as GreaterStencilFunc,Pd as GridHelper,va as Group,Rt as HalfFloatType,qc as HemisphereLight,Od as HemisphereLightHelper,El as IcosahedronGeometry,yu as ImageBitmapLoader,Lc as ImageLoader,Ns as ImageUtils,ci as IncrementStencilOp,di as IncrementWrapStencilOp,lo as InstancedBufferAttribute,hu as InstancedBufferGeometry,td as InstancedInterleavedBuffer,xo as InstancedMesh,On as Int16BufferAttribute,Rn as Int32BufferAttribute,In as Int8BufferAttribute,kt as IntType,Ta as InterleavedBuffer,Ca as InterleavedBufferAttribute,yc as Interpolant,Ve as InterpolateDiscrete,Fe as InterpolateLinear,Ee as InterpolateSmooth,Xi as InterpolationSamplingMode,Ji as InterpolationSamplingType,mi as InvertStencilOp,hi as KeepStencilOp,bc as KeyframeTrack,Ya as LOD,Ll as LatheGeometry,Pr as Layers,_i as LessCompare,W as LessDepth,Ti as LessEqualCompare,q as LessEqualDepth,xi as LessEqualStencilFunc,gi as LessStencilFunc,Wc as Light,nu as LightProbe,sh as Line,vd as Line3,Ho as LineBasicMaterial,$h as LineCurve,Qh as LineCurve3,lc as LineDashedMaterial,hh as LineLoop,oh as LineSegments,Mt as LinearFilter,fc as LinearInterpolant,Tt as LinearMipMapLinearFilter,_t as LinearMipMapNearestFilter,At as LinearMipmapLinearFilter,St as LinearMipmapNearestFilter,ei as LinearSRGBColorSpace,K as LinearToneMapping,ii as LinearTransfer,Oc as Loader,ou as LoaderUtils,Bc as LoadingManager,Pe as LoopOnce,Ne as LoopPingPong,Re as LoopRepeat,e as MOUSE,xn as Material,v as MaterialBlending,au as MaterialLoader,vs as MathUtils,cd as Matrix2,Ts as Matrix3,Mr as Matrix4,A as MaxEquation,sa as Mesh,bn as MeshBasicMaterial,ac as MeshDepthMaterial,oc as MeshDistanceMaterial,nc as MeshLambertMaterial,hc as MeshMatcapMaterial,rc as MeshNormalMaterial,ic as MeshPhongMaterial,ec as MeshPhysicalMaterial,tc as MeshStandardMaterial,sc as MeshToonMaterial,_ as MinEquation,gt as MirroredRepeatWrapping,G as MixOperation,x as MultiplyBlending,H as MultiplyOperation,ft as NearestFilter,wt as NearestMipMapLinearFilter,bt as NearestMipMapNearestFilter,vt as NearestMipmapLinearFilter,xt as NearestMipmapNearestFilter,nt as NeutralToneMapping,Si as NeverCompare,D as NeverDepth,yi as NeverStencilFunc,m as NoBlending,Ke as NoColorSpace,ri as NoNormalPacking,Q as NoToneMapping,Ue as NormalAnimationBlendMode,y as NormalBlending,ai as NormalGAPacking,ni as NormalRGPacking,Ci as NotEqualCompare,Z as NotEqualDepth,vi as NotEqualStencilFunc,Mc as NumberKeyframeTrack,Hr as Object3D,cu as ObjectLoader,Qe as ObjectSpaceNormalMap,jl as OctahedronGeometry,z as OneFactor,j as OneMinusConstantAlphaFactor,E as OneMinusConstantColorFactor,P as OneMinusDstAlphaFactor,N as OneMinusDstColorFactor,k as OneMinusSrcAlphaFactor,I as OneMinusSrcColorFactor,Kc as OrthographicCamera,h as PCFShadowMap,l as PCFSoftShadowMap,rl as Path,ya as PerspectiveCamera,Mo as Plane,Dl as PlaneGeometry,Xd as PlaneHelper,Qc as PointLight,Cd as PointLightHelper,mh as Points,lh as PointsMaterial,Rd as PolarGridHelper,Bh as PolyhedronGeometry,Vu as PositionalAudio,Ju as PropertyBinding,Eu as PropertyMixer,Kh as QuadraticBezierCurve,tl as QuadraticBezierCurve3,Ms as Quaternion,_c as QuaternionKeyframeTrack,Sc as QuaternionLinearInterpolant,he as R11_EAC_Format,ps as RAD2DEG,ke as RED_GREEN_RGTC2_Format,Ie as RED_RGTC1_Format,t as REVISION,ce as RG11_EAC_Format,Ze as RGBADepthPacking,Ut as RGBAFormat,Gt as RGBAIntegerFormat,Se as RGBA_ASTC_10x10_Format,ve as RGBA_ASTC_10x5_Format,we as RGBA_ASTC_10x6_Format,Me as RGBA_ASTC_10x8_Format,_e as RGBA_ASTC_12x10_Format,Ae as RGBA_ASTC_12x12_Format,de as RGBA_ASTC_4x4_Format,pe as RGBA_ASTC_5x4_Format,me as RGBA_ASTC_5x5_Format,ye as RGBA_ASTC_6x5_Format,ge as RGBA_ASTC_6x6_Format,fe as RGBA_ASTC_8x5_Format,xe as RGBA_ASTC_8x6_Format,be as RGBA_ASTC_8x8_Format,Te as RGBA_BPTC_Format,oe as RGBA_ETC2_EAC_Format,re as RGBA_PVRTC_2BPPV1_Format,se as RGBA_PVRTC_4BPPV1_Format,Qt as RGBA_S3TC_DXT1_Format,Kt as RGBA_S3TC_DXT3_Format,te as RGBA_S3TC_DXT5_Format,He as RGBDepthPacking,Dt as RGBFormat,Ht as RGBIntegerFormat,ze as RGB_BPTC_SIGNED_Format,Ce as RGB_BPTC_UNSIGNED_Format,ne as RGB_ETC1_Format,ae as RGB_ETC2_Format,ie as RGB_PVRTC_2BPPV1_Format,ee as RGB_PVRTC_4BPPV1_Format,$t as RGB_S3TC_DXT1_Format,Ge as RGDepthPacking,Yt as RGFormat,Zt as RGIntegerFormat,Kl as RawShaderMaterial,wr as Ray,sd as Raycaster,su as RectAreaLight,Jt as RedFormat,Xt as RedIntegerFormat,tt as ReinhardToneMapping,Ws as RenderTarget,Gu as RenderTarget3D,mt as RepeatWrapping,li as ReplaceStencilOp,S as ReverseSubtractEquation,Ul as RingGeometry,le as SIGNED_R11_EAC_Format,Oe as SIGNED_RED_GREEN_RGTC2_Format,Be as SIGNED_RED_RGTC1_Format,ue as SIGNED_RG11_EAC_Format,ti as SRGBColorSpace,si as SRGBTransfer,Aa as Scene,ca as ShaderMaterial,Ql as ShadowMaterial,nl as Shape,Wl as ShapeGeometry,Qd as ShapePath,Pl as ShapeUtils,It as ShortType,ho as Skeleton,Td as SkeletonHelper,so as SkinnedMesh,Fs as Source,pr as Sphere,ql as SphereGeometry,hd as Spherical,ru as SphericalHarmonics3,el as SplineCurve,Gc as SpotLight,Md as SpotLightHelper,Wa as Sprite,Ia as SpriteMaterial,B as SrcAlphaFactor,V as SrcAlphaSaturateFactor,C as SrcColorFactor,Fi as StaticCopyUsage,ki as StaticDrawUsage,Ri as StaticReadUsage,Mu as StereoCamera,Li as StreamCopyUsage,Pi as StreamDrawUsage,Vi as StreamReadUsage,Ac as StringKeyframeTrack,M as SubtractEquation,f as SubtractiveBlending,i as TOUCH,$e as TangentSpaceNormalMap,Jl as TetrahedronGeometry,Ds as Texture,Uc as TextureLoader,ep as TextureUtils,ad as Timer,qi as TimestampQuery,Xl as TorusGeometry,Yl as TorusKnotGeometry,cn as Triangle,Xe as TriangleFanDrawMode,Je as TriangleStripDrawMode,qe as TrianglesDrawMode,Zl as TubeGeometry,ht as UVMapping,Pn as Uint16BufferAttribute,Nn as Uint32BufferAttribute,Bn as Uint8BufferAttribute,kn as Uint8ClampedBufferAttribute,$u as Uniform,Ku as UniformsGroup,la as UniformsUtils,zt as UnsignedByteType,Lt as UnsignedInt101111Type,Ft as UnsignedInt248Type,Et as UnsignedInt5999Type,Ot as UnsignedIntType,Nt as UnsignedShort4444Type,Vt as UnsignedShort5551Type,Bt as UnsignedShortType,c as VSMShadowMap,ws as Vector2,Ss as Vector3,Us as Vector4,Tc as VectorKeyframeTrack,fh as VideoFrameTexture,gh as VideoTexture,Zs as WebGL3DRenderTarget,Xs as WebGLArrayRenderTarget,Ui as WebGLCoordinateSystem,ba as WebGLCubeRenderTarget,qs as WebGLRenderTarget,Wi as WebGPUCoordinateSystem,Ma as WebXRController,Hl as WireframeGeometry,De as WrapAroundEnding,Le as ZeroCurvatureEnding,T as ZeroFactor,je as ZeroSlopeEnding,oi as ZeroStencilOp,Zi as arrayNeedsUint32,aa as cloneUniforms,Ki as createCanvasElement,Qi as createElementNS,as as error,tp as getByteLength,ss as getConsoleFunction,ha as getUnlitUniformColorSpace,$i as isTypedArray,rs as log,oa as mergeUniforms,hs as probeAsync,is as setConsoleFunction,ns as warn,os as warnOnce}; +const t="183dev",e={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},i={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},s=0,r=1,n=2,a=3,o=0,h=1,l=2,c=3,u=0,d=1,p=2,m=0,y=1,g=2,f=3,x=4,b=5,v=6,w=100,M=101,S=102,_=103,A=104,T=200,z=201,C=202,I=203,B=204,k=205,O=206,P=207,R=208,N=209,V=210,F=211,E=212,L=213,j=214,D=0,U=1,W=2,q=3,J=4,X=5,Y=6,Z=7,H=0,G=1,$=2,Q=0,K=1,tt=2,et=3,it=4,st=5,rt=6,nt=7,at="attached",ot="detached",ht=300,lt=301,ct=302,ut=303,dt=304,pt=306,mt=1e3,yt=1001,gt=1002,ft=1003,xt=1004,bt=1004,vt=1005,wt=1005,Mt=1006,St=1007,_t=1007,At=1008,Tt=1008,zt=1009,Ct=1010,It=1011,Bt=1012,kt=1013,Ot=1014,Pt=1015,Rt=1016,Nt=1017,Vt=1018,Ft=1020,Et=35902,Lt=35899,jt=1021,Dt=1022,Ut=1023,Wt=1026,qt=1027,Jt=1028,Xt=1029,Yt=1030,Zt=1031,Ht=1032,Gt=1033,$t=33776,Qt=33777,Kt=33778,te=33779,ee=35840,ie=35841,se=35842,re=35843,ne=36196,ae=37492,oe=37496,he=37488,le=37489,ce=37490,ue=37491,de=37808,pe=37809,me=37810,ye=37811,ge=37812,fe=37813,xe=37814,be=37815,ve=37816,we=37817,Me=37818,Se=37819,_e=37820,Ae=37821,Te=36492,ze=36494,Ce=36495,Ie=36283,Be=36284,ke=36285,Oe=36286,Pe=2200,Re=2201,Ne=2202,Ve=2300,Fe=2301,Ee=2302,Le=2400,je=2401,De=2402,Ue=2500,We=2501,qe=0,Je=1,Xe=2,Ye=3200,Ze=3201,He=3202,Ge=3203,$e=0,Qe=1,Ke="",ti="srgb",ei="srgb-linear",ii="linear",si="srgb",ri="",ni="rg",ai="ga",oi=0,hi=7680,li=7681,ci=7682,ui=7683,di=34055,pi=34056,mi=5386,yi=512,gi=513,fi=514,xi=515,bi=516,vi=517,wi=518,Mi=519,Si=512,_i=513,Ai=514,Ti=515,zi=516,Ci=517,Ii=518,Bi=519,ki=35044,Oi=35048,Pi=35040,Ri=35045,Ni=35049,Vi=35041,Fi=35046,Ei=35050,Li=35042,ji="100",Di="300 es",Ui=2e3,Wi=2001,qi={COMPUTE:"compute",RENDER:"render"},Ji={PERSPECTIVE:"perspective",LINEAR:"linear",FLAT:"flat"},Xi={NORMAL:"normal",CENTROID:"centroid",SAMPLE:"sample",FIRST:"first",EITHER:"either"},Yi={TEXTURE_COMPARE:"depthTextureCompare"};function Zi(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}const Hi={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function Gi(t,e){return new Hi[t](e)}function $i(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function Qi(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function Ki(){const t=Qi("canvas");return t.style.display="block",t}const ts={};let es=null;function is(t){es=t}function ss(){return es}function rs(...t){const e="THREE."+t.shift();es?es("log",e,...t):console.log(e,...t)}function ns(...t){const e="THREE."+t.shift();es?es("warn",e,...t):console.warn(e,...t)}function as(...t){const e="THREE."+t.shift();es?es("error",e,...t):console.error(e,...t)}function os(...t){const e=t.join(" ");e in ts||(ts[e]=!0,ns(...t))}function hs(t,e,i){return new Promise(function(s,r){setTimeout(function n(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:r();break;case t.TIMEOUT_EXPIRED:setTimeout(n,i);break;default:s()}},i)})}class ls{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)}hasEventListener(t,e){const i=this._listeners;return void 0!==i&&(void 0!==i[t]&&-1!==i[t].indexOf(e))}removeEventListener(t,e){const i=this._listeners;if(void 0===i)return;const s=i[t];if(void 0!==s){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}}dispatchEvent(t){const e=this._listeners;if(void 0===e)return;const i=e[t.type];if(void 0!==i){t.target=this;const e=i.slice(0);for(let i=0,s=e.length;i>8&255]+cs[t>>16&255]+cs[t>>24&255]+"-"+cs[255&e]+cs[e>>8&255]+"-"+cs[e>>16&15|64]+cs[e>>24&255]+"-"+cs[63&i|128]+cs[i>>8&255]+"-"+cs[i>>16&255]+cs[i>>24&255]+cs[255&s]+cs[s>>8&255]+cs[s>>16&255]+cs[s>>24&255]).toLowerCase()}function ys(t,e,i){return Math.max(e,Math.min(i,t))}function gs(t,e){return(t%e+e)%e}function fs(t,e,i){return(1-i)*t+i*e}function xs(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function bs(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const vs={DEG2RAD:ds,RAD2DEG:ps,generateUUID:ms,clamp:ys,euclideanModulo:gs,mapLinear:function(t,e,i,s,r){return s+(t-e)*(r-s)/(i-e)},inverseLerp:function(t,e,i){return t!==e?(i-t)/(e-t):0},lerp:fs,damp:function(t,e,i,s){return fs(t,e,1-Math.exp(-i*s))},pingpong:function(t,e=1){return e-Math.abs(gs(t,2*e)-e)},smoothstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){void 0!==t&&(us=t);let e=us+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296},degToRad:function(t){return t*ds},radToDeg:function(t){return t*ps},isPowerOfTwo:function(t){return!(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,i,s,r){const n=Math.cos,a=Math.sin,o=n(i/2),h=a(i/2),l=n((e+s)/2),c=a((e+s)/2),u=n((e-s)/2),d=a((e-s)/2),p=n((s-e)/2),m=a((s-e)/2);switch(r){case"XYX":t.set(o*c,h*u,h*d,o*l);break;case"YZY":t.set(h*d,o*c,h*u,o*l);break;case"ZXZ":t.set(h*u,h*d,o*c,o*l);break;case"XZX":t.set(o*c,h*m,h*p,o*l);break;case"YXY":t.set(h*p,o*c,h*m,o*l);break;case"ZYZ":t.set(h*m,h*p,o*c,o*l);break;default:ns("MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:bs,denormalize:xs};class ws{constructor(t=0,e=0){ws.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,s=t.elements;return this.x=s[0]*e+s[3]*i+s[6],this.y=s[1]*e+s[4]*i+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=ys(this.x,t.x,e.x),this.y=ys(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=ys(this.x,t,e),this.y=ys(this.y,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(ys(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(ys(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),s=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*i-n*s+t.x,this.y=r*s+n*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Ms{constructor(t=0,e=0,i=0,s=1){this.isQuaternion=!0,this._x=t,this._y=e,this._z=i,this._w=s}static slerpFlat(t,e,i,s,r,n,a){let o=i[s+0],h=i[s+1],l=i[s+2],c=i[s+3],u=r[n+0],d=r[n+1],p=r[n+2],m=r[n+3];if(c!==m||o!==u||h!==d||l!==p){let t=o*u+h*d+l*p+c*m;t<0&&(u=-u,d=-d,p=-p,m=-m,t=-t);let e=1-a;if(t<.9995){const i=Math.acos(t),s=Math.sin(i);e=Math.sin(e*i)/s,o=o*e+u*(a=Math.sin(a*i)/s),h=h*e+d*a,l=l*e+p*a,c=c*e+m*a}else{o=o*e+u*a,h=h*e+d*a,l=l*e+p*a,c=c*e+m*a;const t=1/Math.sqrt(o*o+h*h+l*l+c*c);o*=t,h*=t,l*=t,c*=t}}t[e]=o,t[e+1]=h,t[e+2]=l,t[e+3]=c}static multiplyQuaternionsFlat(t,e,i,s,r,n){const a=i[s],o=i[s+1],h=i[s+2],l=i[s+3],c=r[n],u=r[n+1],d=r[n+2],p=r[n+3];return t[e]=a*p+l*c+o*d-h*u,t[e+1]=o*p+l*u+h*c-a*d,t[e+2]=h*p+l*d+a*u-o*c,t[e+3]=l*p-a*c-o*u-h*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,s){return this._x=t,this._y=e,this._z=i,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const i=t._x,s=t._y,r=t._z,n=t._order,a=Math.cos,o=Math.sin,h=a(i/2),l=a(s/2),c=a(r/2),u=o(i/2),d=o(s/2),p=o(r/2);switch(n){case"XYZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"YXZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"ZXY":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"ZYX":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"YZX":this._x=u*l*c+h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c-u*d*p;break;case"XZY":this._x=u*l*c-h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c+u*d*p;break;default:ns("Quaternion: .setFromEuler() encountered an unknown order: "+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,s=Math.sin(i);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],s=e[4],r=e[8],n=e[1],a=e[5],o=e[9],h=e[2],l=e[6],c=e[10],u=i+a+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-o)*t,this._y=(r-h)*t,this._z=(n-s)*t}else if(i>a&&i>c){const t=2*Math.sqrt(1+i-a-c);this._w=(l-o)/t,this._x=.25*t,this._y=(s+n)/t,this._z=(r+h)/t}else if(a>c){const t=2*Math.sqrt(1+a-i-c);this._w=(r-h)/t,this._x=(s+n)/t,this._y=.25*t,this._z=(o+l)/t}else{const t=2*Math.sqrt(1+c-i-a);this._w=(n-s)/t,this._x=(r+h)/t,this._y=(o+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return i<1e-8?(i=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(ys(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const s=Math.min(1,e/i);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,s=t._y,r=t._z,n=t._w,a=e._x,o=e._y,h=e._z,l=e._w;return this._x=i*l+n*a+s*h-r*o,this._y=s*l+n*o+r*a-i*h,this._z=r*l+n*h+i*o-s*a,this._w=n*l-i*a-s*o-r*h,this._onChangeCallback(),this}slerp(t,e){let i=t._x,s=t._y,r=t._z,n=t._w,a=this.dot(t);a<0&&(i=-i,s=-s,r=-r,n=-n,a=-a);let o=1-e;if(a<.9995){const t=Math.acos(a),h=Math.sin(t);o=Math.sin(o*t)/h,e=Math.sin(e*t)/h,this._x=this._x*o+i*e,this._y=this._y*o+s*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this._onChangeCallback()}else this._x=this._x*o+i*e,this._y=this._y*o+s*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this.normalize();return this}slerpQuaternions(t,e,i){return this.copy(t).slerp(e,i)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),i=Math.random(),s=Math.sqrt(1-i),r=Math.sqrt(i);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class Ss{constructor(t=0,e=0,i=0){Ss.prototype.isVector3=!0,this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(As.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(As.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*s,this.y=r[1]*e+r[4]*i+r[7]*s,this.z=r[2]*e+r[5]*i+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=t.elements,n=1/(r[3]*e+r[7]*i+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*s+r[12])*n,this.y=(r[1]*e+r[5]*i+r[9]*s+r[13])*n,this.z=(r[2]*e+r[6]*i+r[10]*s+r[14])*n,this}applyQuaternion(t){const e=this.x,i=this.y,s=this.z,r=t.x,n=t.y,a=t.z,o=t.w,h=2*(n*s-a*i),l=2*(a*e-r*s),c=2*(r*i-n*e);return this.x=e+o*h+n*c-a*l,this.y=i+o*l+a*h-r*c,this.z=s+o*c+r*l-n*h,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*s,this.y=r[1]*e+r[5]*i+r[9]*s,this.z=r[2]*e+r[6]*i+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=ys(this.x,t.x,e.x),this.y=ys(this.y,t.y,e.y),this.z=ys(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=ys(this.x,t,e),this.y=ys(this.y,t,e),this.z=ys(this.z,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(ys(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,s=t.y,r=t.z,n=e.x,a=e.y,o=e.z;return this.x=s*o-r*a,this.y=r*n-i*o,this.z=i*a-s*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return _s.copy(this).projectOnVector(t),this.sub(_s)}reflect(t){return this.sub(_s.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(ys(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,s=this.z-t.z;return e*e+i*i+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const s=Math.sin(e)*t;return this.x=s*Math.sin(i),this.y=Math.cos(e)*t,this.z=s*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=2*Math.random()-1,i=Math.sqrt(1-e*e);return this.x=i*Math.cos(t),this.y=e,this.z=i*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const _s=new Ss,As=new Ms;class Ts{constructor(t,e,i,s,r,n,a,o,h){Ts.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h)}set(t,e,i,s,r,n,a,o,h){const l=this.elements;return l[0]=t,l[1]=s,l[2]=a,l[3]=e,l[4]=r,l[5]=o,l[6]=i,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[3],o=i[6],h=i[1],l=i[4],c=i[7],u=i[2],d=i[5],p=i[8],m=s[0],y=s[3],g=s[6],f=s[1],x=s[4],b=s[7],v=s[2],w=s[5],M=s[8];return r[0]=n*m+a*f+o*v,r[3]=n*y+a*x+o*w,r[6]=n*g+a*b+o*M,r[1]=h*m+l*f+c*v,r[4]=h*y+l*x+c*w,r[7]=h*g+l*b+c*M,r[2]=u*m+d*f+p*v,r[5]=u*y+d*x+p*w,r[8]=u*g+d*b+p*M,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8];return e*n*l-e*a*h-i*r*l+i*a*o+s*r*h-s*n*o}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=l*n-a*h,u=a*o-l*r,d=h*r-n*o,p=e*c+i*u+s*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=c*m,t[1]=(s*h-l*i)*m,t[2]=(a*i-s*n)*m,t[3]=u*m,t[4]=(l*e-s*o)*m,t[5]=(s*r-a*e)*m,t[6]=d*m,t[7]=(i*o-h*e)*m,t[8]=(n*e-i*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,s,r,n,a){const o=Math.cos(r),h=Math.sin(r);return this.set(i*o,i*h,-i*(o*n+h*a)+n+t,-s*h,s*o,-s*(-h*n+o*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(zs.makeScale(t,e)),this}rotate(t){return this.premultiply(zs.makeRotation(-t)),this}translate(t,e){return this.premultiply(zs.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,i,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const zs=new Ts,Cs=(new Ts).set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Is=(new Ts).set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function Bs(){const t={enabled:!0,workingColorSpace:ei,spaces:{},convert:function(t,e,i){return!1!==this.enabled&&e!==i&&e&&i?(this.spaces[e].transfer===si&&(t.r=Os(t.r),t.g=Os(t.g),t.b=Os(t.b)),this.spaces[e].primaries!==this.spaces[i].primaries&&(t.applyMatrix3(this.spaces[e].toXYZ),t.applyMatrix3(this.spaces[i].fromXYZ)),this.spaces[i].transfer===si&&(t.r=Ps(t.r),t.g=Ps(t.g),t.b=Ps(t.b)),t):t},workingToColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},colorSpaceToWorking:function(t,e){return this.convert(t,e,this.workingColorSpace)},getPrimaries:function(t){return this.spaces[t].primaries},getTransfer:function(t){return""===t?ii:this.spaces[t].transfer},getToneMappingMode:function(t){return this.spaces[t].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(t,e=this.workingColorSpace){return t.fromArray(this.spaces[e].luminanceCoefficients)},define:function(t){Object.assign(this.spaces,t)},_getMatrix:function(t,e,i){return t.copy(this.spaces[e].toXYZ).multiply(this.spaces[i].fromXYZ)},_getDrawingBufferColorSpace:function(t){return this.spaces[t].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(t=this.workingColorSpace){return this.spaces[t].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(e,i){return os("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),t.workingToColorSpace(e,i)},toWorkingColorSpace:function(e,i){return os("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),t.colorSpaceToWorking(e,i)}},e=[.64,.33,.3,.6,.15,.06],i=[.2126,.7152,.0722],s=[.3127,.329];return t.define({[ei]:{primaries:e,whitePoint:s,transfer:ii,toXYZ:Cs,fromXYZ:Is,luminanceCoefficients:i,workingColorSpaceConfig:{unpackColorSpace:ti},outputColorSpaceConfig:{drawingBufferColorSpace:ti}},[ti]:{primaries:e,whitePoint:s,transfer:si,toXYZ:Cs,fromXYZ:Is,luminanceCoefficients:i,outputColorSpaceConfig:{drawingBufferColorSpace:ti}}}),t}const ks=Bs();function Os(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function Ps(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}let Rs;class Ns{static getDataURL(t,e="image/png"){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let i;if(t instanceof HTMLCanvasElement)i=t;else{void 0===Rs&&(Rs=Qi("canvas")),Rs.width=t.width,Rs.height=t.height;const e=Rs.getContext("2d");t instanceof ImageData?e.putImageData(t,0,0):e.drawImage(t,0,0,t.width,t.height),i=Rs}return i.toDataURL(e)}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=Qi("canvas");e.width=t.width,e.height=t.height;const i=e.getContext("2d");i.drawImage(t,0,0,t.width,t.height);const s=i.getImageData(0,0,t.width,t.height),r=s.data;for(let t=0;t1),this.pmremVersion=0}get width(){return this.source.getSize(js).x}get height(){return this.source.getSize(js).y}get depth(){return this.source.getSize(js).z}get image(){return this.source.data}set image(t=null){this.source.data=t}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return(new this.constructor).copy(this)}copy(t){return this.name=t.name,this.source=t.source,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.channel=t.channel,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.colorSpace=t.colorSpace,this.renderTarget=t.renderTarget,this.isRenderTargetTexture=t.isRenderTargetTexture,this.isArrayTexture=t.isArrayTexture,this.userData=JSON.parse(JSON.stringify(t.userData)),this.needsUpdate=!0,this}setValues(t){for(const e in t){const i=t[e];if(void 0===i){ns(`Texture.setValues(): parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&i&&s.isVector2&&i.isVector2||s&&i&&s.isVector3&&i.isVector3||s&&i&&s.isMatrix3&&i.isMatrix3?s.copy(i):this[e]=i:ns(`Texture.setValues(): property '${e}' does not exist.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];const i={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(t).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(i.userData=this.userData),e||(t.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==ht)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case mt:t.x=t.x-Math.floor(t.x);break;case yt:t.x=t.x<0?0:1;break;case gt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case mt:t.y=t.y-Math.floor(t.y);break;case yt:t.y=t.y<0?0:1;break;case gt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){!0===t&&this.pmremVersion++}}Ds.DEFAULT_IMAGE=null,Ds.DEFAULT_MAPPING=ht,Ds.DEFAULT_ANISOTROPY=1;class Us{constructor(t=0,e=0,i=0,s=1){Us.prototype.isVector4=!0,this.x=t,this.y=e,this.z=i,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,s){return this.x=t,this.y=e,this.z=i,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*i+n[8]*s+n[12]*r,this.y=n[1]*e+n[5]*i+n[9]*s+n[13]*r,this.z=n[2]*e+n[6]*i+n[10]*s+n[14]*r,this.w=n[3]*e+n[7]*i+n[11]*s+n[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,s,r;const n=.01,a=.1,o=t.elements,h=o[0],l=o[4],c=o[8],u=o[1],d=o[5],p=o[9],m=o[2],y=o[6],g=o[10];if(Math.abs(l-u)o&&t>f?tf?o1);this.dispose()}this.viewport.set(0,0,t,e),this.scissor.set(0,0,t,e)}clone(){return(new this.constructor).copy(this)}copy(t){this.width=t.width,this.height=t.height,this.depth=t.depth,this.scissor.copy(t.scissor),this.scissorTest=t.scissorTest,this.viewport.copy(t.viewport),this.textures.length=0;for(let e=0,i=t.textures.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,$s),$s.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(nr),ar.subVectors(this.max,nr),Ks.subVectors(t.a,nr),tr.subVectors(t.b,nr),er.subVectors(t.c,nr),ir.subVectors(tr,Ks),sr.subVectors(er,tr),rr.subVectors(Ks,er);let e=[0,-ir.z,ir.y,0,-sr.z,sr.y,0,-rr.z,rr.y,ir.z,0,-ir.x,sr.z,0,-sr.x,rr.z,0,-rr.x,-ir.y,ir.x,0,-sr.y,sr.x,0,-rr.y,rr.x,0];return!!lr(e,Ks,tr,er,ar)&&(e=[1,0,0,0,1,0,0,0,1],!!lr(e,Ks,tr,er,ar)&&(or.crossVectors(ir,sr),e=[or.x,or.y,or.z],lr(e,Ks,tr,er,ar)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,$s).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize($s).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(Gs[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Gs[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Gs[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Gs[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Gs[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Gs[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Gs[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Gs[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Gs)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(t){return this.min.fromArray(t.min),this.max.fromArray(t.max),this}}const Gs=[new Ss,new Ss,new Ss,new Ss,new Ss,new Ss,new Ss,new Ss],$s=new Ss,Qs=new Hs,Ks=new Ss,tr=new Ss,er=new Ss,ir=new Ss,sr=new Ss,rr=new Ss,nr=new Ss,ar=new Ss,or=new Ss,hr=new Ss;function lr(t,e,i,s,r){for(let n=0,a=t.length-3;n<=a;n+=3){hr.fromArray(t,n);const a=r.x*Math.abs(hr.x)+r.y*Math.abs(hr.y)+r.z*Math.abs(hr.z),o=e.dot(hr),h=i.dot(hr),l=s.dot(hr);if(Math.max(-Math.max(o,h,l),Math.min(o,h,l))>a)return!1}return!0}const cr=new Hs,ur=new Ss,dr=new Ss;class pr{constructor(t=new Ss,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const i=this.center;void 0!==e?i.copy(e):cr.setFromPoints(t).getCenter(i);let s=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;ur.subVectors(t,this.center);const e=ur.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),i=.5*(t-this.radius);this.center.addScaledVector(ur,i/t),this.radius+=i}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(dr.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(ur.copy(t.center).add(dr)),this.expandByPoint(ur.copy(t.center).sub(dr))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(t){return this.radius=t.radius,this.center.fromArray(t.center),this}}const mr=new Ss,yr=new Ss,gr=new Ss,fr=new Ss,xr=new Ss,br=new Ss,vr=new Ss;class wr{constructor(t=new Ss,e=new Ss(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,mr)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,i)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=mr.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(mr.copy(this.origin).addScaledVector(this.direction,e),mr.distanceToSquared(t))}distanceSqToSegment(t,e,i,s){yr.copy(t).add(e).multiplyScalar(.5),gr.copy(e).sub(t).normalize(),fr.copy(this.origin).sub(yr);const r=.5*t.distanceTo(e),n=-this.direction.dot(gr),a=fr.dot(this.direction),o=-fr.dot(gr),h=fr.lengthSq(),l=Math.abs(1-n*n);let c,u,d,p;if(l>0)if(c=n*o-a,u=n*a-o,p=r*l,c>=0)if(u>=-p)if(u<=p){const t=1/l;c*=t,u*=t,d=c*(c+n*u+2*a)+u*(n*c+u+2*o)+h}else u=r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u=-r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u<=-p?(c=Math.max(0,-(-n*r+a)),u=c>0?-r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h):u<=p?(c=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+h):(c=Math.max(0,-(n*r+a)),u=c>0?r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h);else u=n>0?-r:r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;return i&&i.copy(this.origin).addScaledVector(this.direction,c),s&&s.copy(yr).addScaledVector(gr,u),d}intersectSphere(t,e){mr.subVectors(t.center,this.origin);const i=mr.dot(this.direction),s=mr.dot(mr)-i*i,r=t.radius*t.radius;if(s>r)return null;const n=Math.sqrt(r-s),a=i-n,o=i+n;return o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return!(t.radius<0)&&this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,s,r,n,a,o;const h=1/this.direction.x,l=1/this.direction.y,c=1/this.direction.z,u=this.origin;return h>=0?(i=(t.min.x-u.x)*h,s=(t.max.x-u.x)*h):(i=(t.max.x-u.x)*h,s=(t.min.x-u.x)*h),l>=0?(r=(t.min.y-u.y)*l,n=(t.max.y-u.y)*l):(r=(t.max.y-u.y)*l,n=(t.min.y-u.y)*l),i>n||r>s?null:((r>i||isNaN(i))&&(i=r),(n=0?(a=(t.min.z-u.z)*c,o=(t.max.z-u.z)*c):(a=(t.max.z-u.z)*c,o=(t.min.z-u.z)*c),i>o||a>s?null:((a>i||i!=i)&&(i=a),(o=0?i:s,e)))}intersectsBox(t){return null!==this.intersectBox(t,mr)}intersectTriangle(t,e,i,s,r){xr.subVectors(e,t),br.subVectors(i,t),vr.crossVectors(xr,br);let n,a=this.direction.dot(vr);if(a>0){if(s)return null;n=1}else{if(!(a<0))return null;n=-1,a=-a}fr.subVectors(this.origin,t);const o=n*this.direction.dot(br.crossVectors(fr,br));if(o<0)return null;const h=n*this.direction.dot(xr.cross(fr));if(h<0)return null;if(o+h>a)return null;const l=-n*fr.dot(vr);return l<0?null:this.at(l/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class Mr{constructor(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){Mr.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y)}set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){const g=this.elements;return g[0]=t,g[4]=e,g[8]=i,g[12]=s,g[1]=r,g[5]=n,g[9]=a,g[13]=o,g[2]=h,g[6]=l,g[10]=c,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=y,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new Mr).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return 0===this.determinant()?(t.set(1,0,0),e.set(0,1,0),i.set(0,0,1),this):(t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this)}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){if(0===t.determinant())return this.identity();const e=this.elements,i=t.elements,s=1/Sr.setFromMatrixColumn(t,0).length(),r=1/Sr.setFromMatrixColumn(t,1).length(),n=1/Sr.setFromMatrixColumn(t,2).length();return e[0]=i[0]*s,e[1]=i[1]*s,e[2]=i[2]*s,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*n,e[9]=i[9]*n,e[10]=i[10]*n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,i=t.x,s=t.y,r=t.z,n=Math.cos(i),a=Math.sin(i),o=Math.cos(s),h=Math.sin(s),l=Math.cos(r),c=Math.sin(r);if("XYZ"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=-o*c,e[8]=h,e[1]=i+s*h,e[5]=t-r*h,e[9]=-a*o,e[2]=r-t*h,e[6]=s+i*h,e[10]=n*o}else if("YXZ"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t+r*a,e[4]=s*a-i,e[8]=n*h,e[1]=n*c,e[5]=n*l,e[9]=-a,e[2]=i*a-s,e[6]=r+t*a,e[10]=n*o}else if("ZXY"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t-r*a,e[4]=-n*c,e[8]=s+i*a,e[1]=i+s*a,e[5]=n*l,e[9]=r-t*a,e[2]=-n*h,e[6]=a,e[10]=n*o}else if("ZYX"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=s*h-i,e[8]=t*h+r,e[1]=o*c,e[5]=r*h+t,e[9]=i*h-s,e[2]=-h,e[6]=a*o,e[10]=n*o}else if("YZX"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=r-t*c,e[8]=s*c+i,e[1]=c,e[5]=n*l,e[9]=-a*l,e[2]=-h*l,e[6]=i*c+s,e[10]=t-r*c}else if("XZY"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=-c,e[8]=h*l,e[1]=t*c+r,e[5]=n*l,e[9]=i*c-s,e[2]=s*c-i,e[6]=a*l,e[10]=r*c+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(Ar,t,Tr)}lookAt(t,e,i){const s=this.elements;return Ir.subVectors(t,e),0===Ir.lengthSq()&&(Ir.z=1),Ir.normalize(),zr.crossVectors(i,Ir),0===zr.lengthSq()&&(1===Math.abs(i.z)?Ir.x+=1e-4:Ir.z+=1e-4,Ir.normalize(),zr.crossVectors(i,Ir)),zr.normalize(),Cr.crossVectors(Ir,zr),s[0]=zr.x,s[4]=Cr.x,s[8]=Ir.x,s[1]=zr.y,s[5]=Cr.y,s[9]=Ir.y,s[2]=zr.z,s[6]=Cr.z,s[10]=Ir.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[4],o=i[8],h=i[12],l=i[1],c=i[5],u=i[9],d=i[13],p=i[2],m=i[6],y=i[10],g=i[14],f=i[3],x=i[7],b=i[11],v=i[15],w=s[0],M=s[4],S=s[8],_=s[12],A=s[1],T=s[5],z=s[9],C=s[13],I=s[2],B=s[6],k=s[10],O=s[14],P=s[3],R=s[7],N=s[11],V=s[15];return r[0]=n*w+a*A+o*I+h*P,r[4]=n*M+a*T+o*B+h*R,r[8]=n*S+a*z+o*k+h*N,r[12]=n*_+a*C+o*O+h*V,r[1]=l*w+c*A+u*I+d*P,r[5]=l*M+c*T+u*B+d*R,r[9]=l*S+c*z+u*k+d*N,r[13]=l*_+c*C+u*O+d*V,r[2]=p*w+m*A+y*I+g*P,r[6]=p*M+m*T+y*B+g*R,r[10]=p*S+m*z+y*k+g*N,r[14]=p*_+m*C+y*O+g*V,r[3]=f*w+x*A+b*I+v*P,r[7]=f*M+x*T+b*B+v*R,r[11]=f*S+x*z+b*k+v*N,r[15]=f*_+x*C+b*O+v*V,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],s=t[8],r=t[12],n=t[1],a=t[5],o=t[9],h=t[13],l=t[2],c=t[6],u=t[10],d=t[14],p=t[3],m=t[7],y=t[11],g=t[15],f=o*d-h*u,x=a*d-h*c,b=a*u-o*c,v=n*d-h*l,w=n*u-o*l,M=n*c-a*l;return e*(m*f-y*x+g*b)-i*(p*f-y*v+g*w)+s*(p*x-m*v+g*M)-r*(p*b-m*w+y*M)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=t[9],u=t[10],d=t[11],p=t[12],m=t[13],y=t[14],g=t[15],f=e*a-i*n,x=e*o-s*n,b=e*h-r*n,v=i*o-s*a,w=i*h-r*a,M=s*h-r*o,S=l*m-c*p,_=l*y-u*p,A=l*g-d*p,T=c*y-u*m,z=c*g-d*m,C=u*g-d*y,I=f*C-x*z+b*T+v*A-w*_+M*S;if(0===I)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const B=1/I;return t[0]=(a*C-o*z+h*T)*B,t[1]=(s*z-i*C-r*T)*B,t[2]=(m*M-y*w+g*v)*B,t[3]=(u*w-c*M-d*v)*B,t[4]=(o*A-n*C-h*_)*B,t[5]=(e*C-s*A+r*_)*B,t[6]=(y*b-p*M-g*x)*B,t[7]=(l*M-u*b+d*x)*B,t[8]=(n*z-a*A+h*S)*B,t[9]=(i*A-e*z-r*S)*B,t[10]=(p*w-m*b+g*f)*B,t[11]=(c*b-l*w-d*f)*B,t[12]=(a*_-n*T-o*S)*B,t[13]=(e*T-i*_+s*S)*B,t[14]=(m*x-p*v-y*f)*B,t[15]=(l*v-c*x+u*f)*B,this}scale(t){const e=this.elements,i=t.x,s=t.y,r=t.z;return e[0]*=i,e[4]*=s,e[8]*=r,e[1]*=i,e[5]*=s,e[9]*=r,e[2]*=i,e[6]*=s,e[10]*=r,e[3]*=i,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,s))}makeTranslation(t,e,i){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),s=Math.sin(e),r=1-i,n=t.x,a=t.y,o=t.z,h=r*n,l=r*a;return this.set(h*n+i,h*a-s*o,h*o+s*a,0,h*a+s*o,l*a+i,l*o-s*n,0,h*o-s*a,l*o+s*n,r*o*o+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i,s,r,n){return this.set(1,i,r,0,t,1,n,0,e,s,1,0,0,0,0,1),this}compose(t,e,i){const s=this.elements,r=e._x,n=e._y,a=e._z,o=e._w,h=r+r,l=n+n,c=a+a,u=r*h,d=r*l,p=r*c,m=n*l,y=n*c,g=a*c,f=o*h,x=o*l,b=o*c,v=i.x,w=i.y,M=i.z;return s[0]=(1-(m+g))*v,s[1]=(d+b)*v,s[2]=(p-x)*v,s[3]=0,s[4]=(d-b)*w,s[5]=(1-(u+g))*w,s[6]=(y+f)*w,s[7]=0,s[8]=(p+x)*M,s[9]=(y-f)*M,s[10]=(1-(u+m))*M,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,i){const s=this.elements;t.x=s[12],t.y=s[13],t.z=s[14];const r=this.determinant();if(0===r)return i.set(1,1,1),e.identity(),this;let n=Sr.set(s[0],s[1],s[2]).length();const a=Sr.set(s[4],s[5],s[6]).length(),o=Sr.set(s[8],s[9],s[10]).length();r<0&&(n=-n),_r.copy(this);const h=1/n,l=1/a,c=1/o;return _r.elements[0]*=h,_r.elements[1]*=h,_r.elements[2]*=h,_r.elements[4]*=l,_r.elements[5]*=l,_r.elements[6]*=l,_r.elements[8]*=c,_r.elements[9]*=c,_r.elements[10]*=c,e.setFromRotationMatrix(_r),i.x=n,i.y=a,i.z=o,this}makePerspective(t,e,i,s,r,n,a=2e3,o=!1){const h=this.elements,l=2*r/(e-t),c=2*r/(i-s),u=(e+t)/(e-t),d=(i+s)/(i-s);let p,m;if(o)p=r/(n-r),m=n*r/(n-r);else if(a===Ui)p=-(n+r)/(n-r),m=-2*n*r/(n-r);else{if(a!==Wi)throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+a);p=-n/(n-r),m=-n*r/(n-r)}return h[0]=l,h[4]=0,h[8]=u,h[12]=0,h[1]=0,h[5]=c,h[9]=d,h[13]=0,h[2]=0,h[6]=0,h[10]=p,h[14]=m,h[3]=0,h[7]=0,h[11]=-1,h[15]=0,this}makeOrthographic(t,e,i,s,r,n,a=2e3,o=!1){const h=this.elements,l=2/(e-t),c=2/(i-s),u=-(e+t)/(e-t),d=-(i+s)/(i-s);let p,m;if(o)p=1/(n-r),m=n/(n-r);else if(a===Ui)p=-2/(n-r),m=-(n+r)/(n-r);else{if(a!==Wi)throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+a);p=-1/(n-r),m=-r/(n-r)}return h[0]=l,h[4]=0,h[8]=0,h[12]=u,h[1]=0,h[5]=c,h[9]=0,h[13]=d,h[2]=0,h[6]=0,h[10]=p,h[14]=m,h[3]=0,h[7]=0,h[11]=0,h[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}const Sr=new Ss,_r=new Mr,Ar=new Ss(0,0,0),Tr=new Ss(1,1,1),zr=new Ss,Cr=new Ss,Ir=new Ss,Br=new Mr,kr=new Ms;class Or{constructor(t=0,e=0,i=0,s=Or.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=i,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,s=this._order){return this._x=t,this._y=e,this._z=i,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,i=!0){const s=t.elements,r=s[0],n=s[4],a=s[8],o=s[1],h=s[5],l=s[9],c=s[2],u=s[6],d=s[10];switch(e){case"XYZ":this._y=Math.asin(ys(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,d),this._z=Math.atan2(-n,r)):(this._x=Math.atan2(u,h),this._z=0);break;case"YXZ":this._x=Math.asin(-ys(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,h)):(this._y=Math.atan2(-c,r),this._z=0);break;case"ZXY":this._x=Math.asin(ys(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-c,d),this._z=Math.atan2(-n,h)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-ys(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-n,h));break;case"YZX":this._z=Math.asin(ys(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,h),this._y=Math.atan2(-c,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-ys(n,-1,1)),Math.abs(n)<.9999999?(this._x=Math.atan2(u,h),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-l,d),this._y=0);break;default:ns("Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return Br.makeRotationFromQuaternion(t),this.setFromRotationMatrix(Br,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return kr.setFromEuler(this),this.setFromQuaternion(kr,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}Or.DEFAULT_ORDER="XYZ";class Pr{constructor(){this.mask=1}set(t){this.mask=1<>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),null!==this.pivot&&(s.pivot=this.pivot.toArray()),!1===this.matrixAutoUpdate&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.geometryInfo=this._geometryInfo.map(t=>({...t,boundingBox:t.boundingBox?t.boundingBox.toJSON():void 0,boundingSphere:t.boundingSphere?t.boundingSphere.toJSON():void 0})),s.instanceInfo=this._instanceInfo.map(t=>({...t})),s.availableInstanceIds=this._availableInstanceIds.slice(),s.availableGeometryIds=this._availableGeometryIds.slice(),s.nextIndexStart=this._nextIndexStart,s.nextVertexStart=this._nextVertexStart,s.geometryCount=this._geometryCount,s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.matricesTexture=this._matricesTexture.toJSON(t),s.indirectTexture=this._indirectTexture.toJSON(t),null!==this._colorsTexture&&(s.colorsTexture=this._colorsTexture.toJSON(t)),null!==this.boundingSphere&&(s.boundingSphere=this.boundingSphere.toJSON()),null!==this.boundingBox&&(s.boundingBox=this.boundingBox.toJSON())),this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const i=e.shapes;if(Array.isArray(i))for(let e=0,s=i.length;e0){s.children=[];for(let e=0;e0){s.animations=[];for(let e=0;e0&&(i.geometries=e),s.length>0&&(i.materials=s),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),h.length>0&&(i.skeletons=h),l.length>0&&(i.animations=l),c.length>0&&(i.nodes=c)}return i.object=s,i;function n(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),null!==t.pivot&&(this.pivot=t.pivot.clone()),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.static=t.static,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,i,s,r){Gr.subVectors(s,e),$r.subVectors(i,e),Qr.subVectors(t,e);const n=Gr.dot(Gr),a=Gr.dot($r),o=Gr.dot(Qr),h=$r.dot($r),l=$r.dot(Qr),c=n*h-a*a;if(0===c)return r.set(0,0,0),null;const u=1/c,d=(h*o-a*l)*u,p=(n*l-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,s){return null!==this.getBarycoord(t,e,i,s,Kr)&&(Kr.x>=0&&Kr.y>=0&&Kr.x+Kr.y<=1)}static getInterpolation(t,e,i,s,r,n,a,o){return null===this.getBarycoord(t,e,i,s,Kr)?(o.x=0,o.y=0,"z"in o&&(o.z=0),"w"in o&&(o.w=0),null):(o.setScalar(0),o.addScaledVector(r,Kr.x),o.addScaledVector(n,Kr.y),o.addScaledVector(a,Kr.z),o)}static getInterpolatedAttribute(t,e,i,s,r,n){return on.setScalar(0),hn.setScalar(0),ln.setScalar(0),on.fromBufferAttribute(t,e),hn.fromBufferAttribute(t,i),ln.fromBufferAttribute(t,s),n.setScalar(0),n.addScaledVector(on,r.x),n.addScaledVector(hn,r.y),n.addScaledVector(ln,r.z),n}static isFrontFacing(t,e,i,s){return Gr.subVectors(i,e),$r.subVectors(t,e),Gr.cross($r).dot(s)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,s){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,i,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,i),this.c.fromBufferAttribute(t,s),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Gr.subVectors(this.c,this.b),$r.subVectors(this.a,this.b),.5*Gr.cross($r).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return cn.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return cn.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,i,s,r){return cn.getInterpolation(t,this.a,this.b,this.c,e,i,s,r)}containsPoint(t){return cn.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return cn.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const i=this.a,s=this.b,r=this.c;let n,a;tn.subVectors(s,i),en.subVectors(r,i),rn.subVectors(t,i);const o=tn.dot(rn),h=en.dot(rn);if(o<=0&&h<=0)return e.copy(i);nn.subVectors(t,s);const l=tn.dot(nn),c=en.dot(nn);if(l>=0&&c<=l)return e.copy(s);const u=o*c-l*h;if(u<=0&&o>=0&&l<=0)return n=o/(o-l),e.copy(i).addScaledVector(tn,n);an.subVectors(t,r);const d=tn.dot(an),p=en.dot(an);if(p>=0&&d<=p)return e.copy(r);const m=d*h-o*p;if(m<=0&&h>=0&&p<=0)return a=h/(h-p),e.copy(i).addScaledVector(en,a);const y=l*p-d*c;if(y<=0&&c-l>=0&&d-p>=0)return sn.subVectors(r,s),a=(c-l)/(c-l+(d-p)),e.copy(s).addScaledVector(sn,a);const g=1/(y+m+u);return n=m*g,a=u*g,e.copy(i).addScaledVector(tn,n).addScaledVector(en,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const un={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},dn={h:0,s:0,l:0},pn={h:0,s:0,l:0};function mn(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}class yn{constructor(t,e,i){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,i)}set(t,e,i){if(void 0===e&&void 0===i){const e=t;e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e)}else this.setRGB(t,e,i);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=ti){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,ks.colorSpaceToWorking(this,e),this}setRGB(t,e,i,s=ks.workingColorSpace){return this.r=t,this.g=e,this.b=i,ks.colorSpaceToWorking(this,s),this}setHSL(t,e,i,s=ks.workingColorSpace){if(t=gs(t,1),e=ys(e,0,1),i=ys(i,0,1),0===e)this.r=this.g=this.b=i;else{const s=i<=.5?i*(1+e):i+e-i*e,r=2*i-s;this.r=mn(r,s,t+1/3),this.g=mn(r,s,t),this.b=mn(r,s,t-1/3)}return ks.colorSpaceToWorking(this,s),this}setStyle(t,e=ti){function i(e){void 0!==e&&parseFloat(e)<1&&ns("Color: Alpha component of "+t+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const n=s[1],a=s[2];switch(n){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:ns("Color: Unknown color model "+t)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(t)){const i=s[1],r=i.length;if(3===r)return this.setRGB(parseInt(i.charAt(0),16)/15,parseInt(i.charAt(1),16)/15,parseInt(i.charAt(2),16)/15,e);if(6===r)return this.setHex(parseInt(i,16),e);ns("Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=ti){const i=un[t.toLowerCase()];return void 0!==i?this.setHex(i,e):ns("Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=Os(t.r),this.g=Os(t.g),this.b=Os(t.b),this}copyLinearToSRGB(t){return this.r=Ps(t.r),this.g=Ps(t.g),this.b=Ps(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=ti){return ks.workingToColorSpace(gn.copy(this),t),65536*Math.round(ys(255*gn.r,0,255))+256*Math.round(ys(255*gn.g,0,255))+Math.round(ys(255*gn.b,0,255))}getHexString(t=ti){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=ks.workingColorSpace){ks.workingToColorSpace(gn.copy(this),e);const i=gn.r,s=gn.g,r=gn.b,n=Math.max(i,s,r),a=Math.min(i,s,r);let o,h;const l=(a+n)/2;if(a===n)o=0,h=0;else{const t=n-a;switch(h=l<=.5?t/(n+a):t/(2-n-a),n){case i:o=(s-r)/t+(s0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){ns(`Material: parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&s.isColor?s.set(i):s&&s.isVector3&&i&&i.isVector3?s.copy(i):this[e]=i:ns(`Material: '${e}' is not a property of THREE.${this.type}.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};function s(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),void 0!==this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(i.sheenColorMap=this.sheenColorMap.toJSON(t).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(i.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(t).uuid),void 0!==this.dispersion&&(i.dispersion=this.dispersion),void 0!==this.iridescence&&(i.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(i.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(i.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(i.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(i.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),void 0!==this.anisotropy&&(i.anisotropy=this.anisotropy),void 0!==this.anisotropyRotation&&(i.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(i.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapRotation&&(i.envMapRotation=this.envMapRotation.toArray()),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),0!==this.side&&(i.side=this.side),!0===this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=!0),204!==this.blendSrc&&(i.blendSrc=this.blendSrc),205!==this.blendDst&&(i.blendDst=this.blendDst),100!==this.blendEquation&&(i.blendEquation=this.blendEquation),null!==this.blendSrcAlpha&&(i.blendSrcAlpha=this.blendSrcAlpha),null!==this.blendDstAlpha&&(i.blendDstAlpha=this.blendDstAlpha),null!==this.blendEquationAlpha&&(i.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(i.blendColor=this.blendColor.getHex()),0!==this.blendAlpha&&(i.blendAlpha=this.blendAlpha),3!==this.depthFunc&&(i.depthFunc=this.depthFunc),!1===this.depthTest&&(i.depthTest=this.depthTest),!1===this.depthWrite&&(i.depthWrite=this.depthWrite),!1===this.colorWrite&&(i.colorWrite=this.colorWrite),255!==this.stencilWriteMask&&(i.stencilWriteMask=this.stencilWriteMask),519!==this.stencilFunc&&(i.stencilFunc=this.stencilFunc),0!==this.stencilRef&&(i.stencilRef=this.stencilRef),255!==this.stencilFuncMask&&(i.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==hi&&(i.stencilFail=this.stencilFail),this.stencilZFail!==hi&&(i.stencilZFail=this.stencilZFail),this.stencilZPass!==hi&&(i.stencilZPass=this.stencilZPass),!0===this.stencilWrite&&(i.stencilWrite=this.stencilWrite),void 0!==this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaHash&&(i.alphaHash=!0),!0===this.alphaToCoverage&&(i.alphaToCoverage=!0),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=!0),!0===this.forceSinglePass&&(i.forceSinglePass=!0),!1===this.allowOverride&&(i.allowOverride=!1),!0===this.wireframe&&(i.wireframe=!0),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=!0),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),!1===this.fog&&(i.fog=!1),Object.keys(this.userData).length>0&&(i.userData=this.userData),e){const e=s(t.textures),r=s(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let s=0;s!==t;++s)i[s]=e[s].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.allowOverride=t.allowOverride,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}}class bn extends xn{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new yn(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Or,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const vn=wn();function wn(){const t=new ArrayBuffer(4),e=new Float32Array(t),i=new Uint32Array(t),s=new Uint32Array(512),r=new Uint32Array(512);for(let t=0;t<256;++t){const e=t-127;e<-27?(s[t]=0,s[256|t]=32768,r[t]=24,r[256|t]=24):e<-14?(s[t]=1024>>-e-14,s[256|t]=1024>>-e-14|32768,r[t]=-e-1,r[256|t]=-e-1):e<=15?(s[t]=e+15<<10,s[256|t]=e+15<<10|32768,r[t]=13,r[256|t]=13):e<128?(s[t]=31744,s[256|t]=64512,r[t]=24,r[256|t]=24):(s[t]=31744,s[256|t]=64512,r[t]=13,r[256|t]=13)}const n=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,i=0;for(;!(8388608&e);)e<<=1,i-=8388608;e&=-8388609,i+=947912704,n[t]=e|i}for(let t=1024;t<2048;++t)n[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)a[t]=t<<23;a[31]=1199570944,a[32]=2147483648;for(let t=33;t<63;++t)a[t]=2147483648+(t-32<<23);a[63]=3347054592;for(let t=1;t<64;++t)32!==t&&(o[t]=1024);return{floatView:e,uint32View:i,baseTable:s,shiftTable:r,mantissaTable:n,exponentTable:a,offsetTable:o}}function Mn(t){Math.abs(t)>65504&&ns("DataUtils.toHalfFloat(): Value out of range."),t=ys(t,-65504,65504),vn.floatView[0]=t;const e=vn.uint32View[0],i=e>>23&511;return vn.baseTable[i]+((8388607&e)>>vn.shiftTable[i])}function Sn(t){const e=t>>10;return vn.uint32View[0]=vn.mantissaTable[vn.offsetTable[e]+(1023&t)]+vn.exponentTable[e],vn.floatView[0]}class _n{static toHalfFloat(t){return Mn(t)}static fromHalfFloat(t){return Sn(t)}}const An=new Ss,Tn=new ws;let zn=0;class Cn{constructor(t,e,i=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:zn++}),this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=i,this.usage=ki,this.updateRanges=[],this.gpuType=Pt,this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,i){t*=this.itemSize,i*=e.itemSize;for(let s=0,r=this.itemSize;se.count&&ns("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Hs);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return as("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),void this.boundingBox.set(new Ss(-1/0,-1/0,-1/0),new Ss(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(let t=0,i=e.length;t0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const s=i[e];t.data.attributes[e]=s.toJSON(t.data)}const s={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],n=[];for(let e=0,s=i.length;e0&&(s[e]=n,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);const n=this.groups;n.length>0&&(t.data.groups=JSON.parse(JSON.stringify(n)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere=a.toJSON()),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone());const s=t.attributes;for(const t in s){const i=s[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],s=r[t];for(let t=0,r=s.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;t(t.far-t.near)**2)return}Xn.copy(r).invert(),Yn.copy(t.ray).applyMatrix4(Xn),null!==i.boundingBox&&!1===Yn.intersectsBox(i.boundingBox)||this._computeIntersections(t,e,Yn)}}_computeIntersections(t,e,i){let s;const r=this.geometry,n=this.material,a=r.index,o=r.attributes.position,h=r.attributes.uv,l=r.attributes.uv1,c=r.attributes.normal,u=r.groups,d=r.drawRange;if(null!==a)if(Array.isArray(n))for(let r=0,o=u.length;ri.far?null:{distance:l,point:ia.clone(),object:t}}(t,e,i,s,Gn,$n,Qn,ea);if(c){const t=new Ss;cn.getBarycoord(ea,Gn,$n,Qn,t),r&&(c.uv=cn.getInterpolatedAttribute(r,o,h,l,t,new ws)),n&&(c.uv1=cn.getInterpolatedAttribute(n,o,h,l,t,new ws)),a&&(c.normal=cn.getInterpolatedAttribute(a,o,h,l,t,new Ss),c.normal.dot(s.direction)>0&&c.normal.multiplyScalar(-1));const e={a:o,b:h,c:l,normal:new Ss,materialIndex:0};cn.getNormal(Gn,$n,Qn,e.normal),c.face=e,c.barycoord=t}return c}class na extends Jn{constructor(t=1,e=1,i=1,s=1,r=1,n=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:s,heightSegments:r,depthSegments:n};const a=this;s=Math.floor(s),r=Math.floor(r),n=Math.floor(n);const o=[],h=[],l=[],c=[];let u=0,d=0;function p(t,e,i,s,r,n,p,m,y,g,f){const x=n/y,b=p/g,v=n/2,w=p/2,M=m/2,S=y+1,_=g+1;let A=0,T=0;const z=new Ss;for(let n=0;n<_;n++){const a=n*b-w;for(let o=0;o0?1:-1,l.push(z.x,z.y,z.z),c.push(o/y),c.push(1-n/g),A+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e}}class ua extends Hr{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new Mr,this.projectionMatrix=new Mr,this.projectionMatrixInverse=new Mr,this.coordinateSystem=Ui,this._reversedDepth=!1}get reversedDepth(){return this._reversedDepth}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}const da=new Ss,pa=new ws,ma=new ws;class ya extends ua{constructor(t=50,e=1,i=.1,s=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=i,this.far=s,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*ps*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*ds*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*ps*Math.atan(Math.tan(.5*ds*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(t,e,i){da.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),e.set(da.x,da.y).multiplyScalar(-t/da.z),da.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),i.set(da.x,da.y).multiplyScalar(-t/da.z)}getViewSize(t,e){return this.getViewBounds(t,pa,ma),e.subVectors(ma,pa)}setViewOffset(t,e,i,s,r,n){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=s,this.view.width=r,this.view.height=n,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*ds*this.fov)/this.zoom,i=2*e,s=this.aspect*i,r=-.5*s;const n=this.view;if(null!==this.view&&this.view.enabled){const t=n.fullWidth,a=n.fullHeight;r+=n.offsetX*s/t,e-=n.offsetY*i/a,s*=n.width/t,i*=n.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,e,e-i,t,this.far,this.coordinateSystem,this.reversedDepth),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const ga=-90;class fa extends Hr{constructor(t,e,i){super(),this.type="CubeCamera",this.renderTarget=i,this.coordinateSystem=null,this.activeMipmapLevel=0;const s=new ya(ga,1,t,e);s.layers=this.layers,this.add(s);const r=new ya(ga,1,t,e);r.layers=this.layers,this.add(r);const n=new ya(ga,1,t,e);n.layers=this.layers,this.add(n);const a=new ya(ga,1,t,e);a.layers=this.layers,this.add(a);const o=new ya(ga,1,t,e);o.layers=this.layers,this.add(o);const h=new ya(ga,1,t,e);h.layers=this.layers,this.add(h)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[i,s,r,n,a,o]=e;for(const t of e)this.remove(t);if(t===Ui)i.up.set(0,1,0),i.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),n.up.set(0,0,1),n.lookAt(0,-1,0),a.up.set(0,1,0),a.lookAt(0,0,1),o.up.set(0,1,0),o.lookAt(0,0,-1);else{if(t!==Wi)throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);i.up.set(0,-1,0),i.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),n.up.set(0,0,-1),n.lookAt(0,-1,0),a.up.set(0,-1,0),a.lookAt(0,0,1),o.up.set(0,-1,0),o.lookAt(0,0,-1)}for(const t of e)this.add(t),t.updateMatrixWorld()}update(t,e){null===this.parent&&this.updateMatrixWorld();const{renderTarget:i,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,n,a,o,h,l]=this.children,c=t.getRenderTarget(),u=t.getActiveCubeFace(),d=t.getActiveMipmapLevel(),p=t.xr.enabled;t.xr.enabled=!1;const m=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,t.setRenderTarget(i,0,s),t.render(e,r),t.setRenderTarget(i,1,s),t.render(e,n),t.setRenderTarget(i,2,s),t.render(e,a),t.setRenderTarget(i,3,s),t.render(e,o),t.setRenderTarget(i,4,s),t.render(e,h),i.texture.generateMipmaps=m,t.setRenderTarget(i,5,s),t.render(e,l),t.setRenderTarget(c,u,d),t.xr.enabled=p,i.texture.needsPMREMUpdate=!0}}class xa extends Ds{constructor(t=[],e=301,i,s,r,n,a,o,h,l){super(t,e,i,s,r,n,a,o,h,l),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class ba extends qs{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const i={width:t,height:t,depth:1},s=[i,i,i,i,i,i];this.texture=new xa(s),this._setTextureOptions(e),this.texture.isRenderTargetTexture=!0}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const i={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},s=new na(5,5,5),r=new ca({name:"CubemapFromEquirect",uniforms:aa(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const n=new sa(s,r),a=e.minFilter;e.minFilter===At&&(e.minFilter=Mt);return new fa(1,10,this).update(t,n),e.minFilter=a,n.geometry.dispose(),n.material.dispose(),this}clear(t,e=!0,i=!0,s=!0){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,i,s);t.setRenderTarget(r)}}class va extends Hr{constructor(){super(),this.isGroup=!0,this.type="Group"}}const wa={type:"move"};class Ma{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return null===this._hand&&(this._hand=new va,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return null===this._targetRay&&(this._targetRay=new va,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new Ss,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new Ss),this._targetRay}getGripSpace(){return null===this._grip&&(this._grip=new va,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new Ss,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new Ss),this._grip}dispatchEvent(t){return null!==this._targetRay&&this._targetRay.dispatchEvent(t),null!==this._grip&&this._grip.dispatchEvent(t),null!==this._hand&&this._hand.dispatchEvent(t),this}connect(t){if(t&&t.hand){const e=this._hand;if(e)for(const i of t.hand.values())this._getHandJoint(e,i)}return this.dispatchEvent({type:"connected",data:t}),this}disconnect(t){return this.dispatchEvent({type:"disconnected",data:t}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this}update(t,e,i){let s=null,r=null,n=null;const a=this._targetRay,o=this._grip,h=this._hand;if(t&&"visible-blurred"!==e.session.visibilityState){if(h&&t.hand){n=!0;for(const s of t.hand.values()){const t=e.getJointPose(s,i),r=this._getHandJoint(h,s);null!==t&&(r.matrix.fromArray(t.transform.matrix),r.matrix.decompose(r.position,r.rotation,r.scale),r.matrixWorldNeedsUpdate=!0,r.jointRadius=t.radius),r.visible=null!==t}const s=h.joints["index-finger-tip"],r=h.joints["thumb-tip"],a=s.position.distanceTo(r.position),o=.02,l=.005;h.inputState.pinching&&a>o+l?(h.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!h.inputState.pinching&&a<=o-l&&(h.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));null!==a&&(s=e.getPose(t.targetRaySpace,i),null===s&&null!==r&&(s=r),null!==s&&(a.matrix.fromArray(s.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,s.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(s.linearVelocity)):a.hasLinearVelocity=!1,s.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(s.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(wa)))}return null!==a&&(a.visible=null!==s),null!==o&&(o.visible=null!==r),null!==h&&(h.visible=null!==n),this}_getHandJoint(t,e){if(void 0===t.joints[e.jointName]){const i=new va;i.matrixAutoUpdate=!1,i.visible=!1,t.joints[e.jointName]=i,t.add(i)}return t.joints[e.jointName]}}class Sa{constructor(t,e=25e-5){this.isFogExp2=!0,this.name="",this.color=new yn(t),this.density=e}clone(){return new Sa(this.color,this.density)}toJSON(){return{type:"FogExp2",name:this.name,color:this.color.getHex(),density:this.density}}}class _a{constructor(t,e=1,i=1e3){this.isFog=!0,this.name="",this.color=new yn(t),this.near=e,this.far=i}clone(){return new _a(this.color,this.near,this.far)}toJSON(){return{type:"Fog",name:this.name,color:this.color.getHex(),near:this.near,far:this.far}}}class Aa extends Hr{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new Or,this.environmentIntensity=1,this.environmentRotation=new Or,this.overrideMaterial=null,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,this.backgroundRotation.copy(t.backgroundRotation),this.environmentIntensity=t.environmentIntensity,this.environmentRotation.copy(t.environmentRotation),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.fog&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),1!==this.environmentIntensity&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}class Ta{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=ki,this.updateRanges=[],this.version=0,this.uuid=ms()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,i){t*=this.stride,i*=e.stride;for(let s=0,r=this.stride;st.far||e.push({distance:o,point:ka.clone(),uv:cn.getInterpolation(ka,Fa,Ea,La,ja,Da,Ua,new ws),face:null,object:this})}copy(t,e){return super.copy(t,e),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function qa(t,e,i,s,r,n){Ra.subVectors(t,i).addScalar(.5).multiply(s),void 0!==r?(Na.x=n*Ra.x-r*Ra.y,Na.y=r*Ra.x+n*Ra.y):Na.copy(Ra),t.copy(e),t.x+=Na.x,t.y+=Na.y,t.applyMatrix4(Va)}const Ja=new Ss,Xa=new Ss;class Ya extends Hr{constructor(){super(),this.isLOD=!0,this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,i=e.length;t0){let i,s;for(i=1,s=e.length;i0){Ja.setFromMatrixPosition(this.matrixWorld);const i=t.ray.origin.distanceTo(Ja);this.getObjectForDistance(i).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){Ja.setFromMatrixPosition(t.matrixWorld),Xa.setFromMatrixPosition(this.matrixWorld);const i=Ja.distanceTo(Xa)/t.zoom;let s,r;for(e[0].object.visible=!0,s=1,r=e.length;s=t))break;e[s-1].object.visible=!1,e[s].object.visible=!0}for(this._currentLevel=s-1;s1?null:e.copy(t.start).addScaledVector(i,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||wo.getNormalMatrix(t),s=this.coplanarPoint(bo).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const So=new pr,_o=new ws(.5,.5),Ao=new Ss;class To{constructor(t=new Mo,e=new Mo,i=new Mo,s=new Mo,r=new Mo,n=new Mo){this.planes=[t,e,i,s,r,n]}set(t,e,i,s,r,n){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(s),a[4].copy(r),a[5].copy(n),this}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t,e=2e3,i=!1){const s=this.planes,r=t.elements,n=r[0],a=r[1],o=r[2],h=r[3],l=r[4],c=r[5],u=r[6],d=r[7],p=r[8],m=r[9],y=r[10],g=r[11],f=r[12],x=r[13],b=r[14],v=r[15];if(s[0].setComponents(h-n,d-l,g-p,v-f).normalize(),s[1].setComponents(h+n,d+l,g+p,v+f).normalize(),s[2].setComponents(h+a,d+c,g+m,v+x).normalize(),s[3].setComponents(h-a,d-c,g-m,v-x).normalize(),i)s[4].setComponents(o,u,y,b).normalize(),s[5].setComponents(h-o,d-u,g-y,v-b).normalize();else if(s[4].setComponents(h-o,d-u,g-y,v-b).normalize(),e===Ui)s[5].setComponents(h+o,d+u,g+y,v+b).normalize();else{if(e!==Wi)throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);s[5].setComponents(o,u,y,b).normalize()}return this}intersectsObject(t){if(void 0!==t.boundingSphere)null===t.boundingSphere&&t.computeBoundingSphere(),So.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;null===e.boundingSphere&&e.computeBoundingSphere(),So.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(So)}intersectsSprite(t){So.center.set(0,0,0);const e=_o.distanceTo(t.center);return So.radius=.7071067811865476+e,So.applyMatrix4(t.matrixWorld),this.intersectsSphere(So)}intersectsSphere(t){const e=this.planes,i=t.center,s=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(i)0?t.max.x:t.min.x,Ao.y=s.normal.y>0?t.max.y:t.min.y,Ao.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(Ao)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}const zo=new Mr,Co=new To;class Io{constructor(){this.coordinateSystem=Ui}intersectsObject(t,e){if(!e.isArrayCamera||0===e.cameras.length)return!1;for(let i=0;i=r.length&&r.push({start:-1,count:-1,z:-1,index:-1});const a=r[this.index];n.push(a),this.index++,a.start=t,a.count=e,a.z=i,a.index=s}reset(){this.list.length=0,this.index=0}}const Ro=new Mr,No=new yn(1,1,1),Vo=new To,Fo=new Io,Eo=new Hs,Lo=new pr,jo=new Ss,Do=new Ss,Uo=new Ss,Wo=new Po,qo=new sa,Jo=[];function Xo(t,e,i=0){const s=e.itemSize;if(t.isInterleavedBufferAttribute||t.array.constructor!==e.array.constructor){const r=t.count;for(let n=0;n65535?new Uint32Array(s):new Uint16Array(s);e.setIndex(new Cn(t,1))}this._geometryInitialized=!0}}_validateGeometry(t){const e=this.geometry;if(Boolean(t.getIndex())!==Boolean(e.getIndex()))throw new Error('THREE.BatchedMesh: All geometries must consistently have "index".');for(const i in e.attributes){if(!t.hasAttribute(i))throw new Error(`THREE.BatchedMesh: Added geometry missing "${i}". All geometries must have consistent attributes.`);const s=t.getAttribute(i),r=e.getAttribute(i);if(s.itemSize!==r.itemSize||s.normalized!==r.normalized)throw new Error("THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.")}}validateInstanceId(t){const e=this._instanceInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid instanceId ${t}. Instance is either out of range or has been deleted.`)}validateGeometryId(t){const e=this._geometryInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid geometryId ${t}. Geometry is either out of range or has been deleted.`)}setCustomSort(t){return this.customSort=t,this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Hs);const t=this.boundingBox,e=this._instanceInfo;t.makeEmpty();for(let i=0,s=e.length;i=this.maxInstanceCount&&0===this._availableInstanceIds.length)throw new Error("THREE.BatchedMesh: Maximum item count reached.");const e={visible:!0,active:!0,geometryIndex:t};let i=null;this._availableInstanceIds.length>0?(this._availableInstanceIds.sort(Bo),i=this._availableInstanceIds.shift(),this._instanceInfo[i]=e):(i=this._instanceInfo.length,this._instanceInfo.push(e));const s=this._matricesTexture;Ro.identity().toArray(s.image.data,16*i),s.needsUpdate=!0;const r=this._colorsTexture;return r&&(No.toArray(r.image.data,4*i),r.needsUpdate=!0),this._visibilityChanged=!0,i}addGeometry(t,e=-1,i=-1){this._initializeGeometry(t),this._validateGeometry(t);const s={vertexStart:-1,vertexCount:-1,reservedVertexCount:-1,indexStart:-1,indexCount:-1,reservedIndexCount:-1,start:-1,count:-1,boundingBox:null,boundingSphere:null,active:!0},r=this._geometryInfo;s.vertexStart=this._nextVertexStart,s.reservedVertexCount=-1===e?t.getAttribute("position").count:e;const n=t.getIndex();if(null!==n&&(s.indexStart=this._nextIndexStart,s.reservedIndexCount=-1===i?n.count:i),-1!==s.indexStart&&s.indexStart+s.reservedIndexCount>this._maxIndexCount||s.vertexStart+s.reservedVertexCount>this._maxVertexCount)throw new Error("THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.");let a;return this._availableGeometryIds.length>0?(this._availableGeometryIds.sort(Bo),a=this._availableGeometryIds.shift(),r[a]=s):(a=this._geometryCount,this._geometryCount++,r.push(s)),this.setGeometryAt(a,t),this._nextIndexStart=s.indexStart+s.reservedIndexCount,this._nextVertexStart=s.vertexStart+s.reservedVertexCount,a}setGeometryAt(t,e){if(t>=this._geometryCount)throw new Error("THREE.BatchedMesh: Maximum geometry count reached.");this._validateGeometry(e);const i=this.geometry,s=null!==i.getIndex(),r=i.getIndex(),n=e.getIndex(),a=this._geometryInfo[t];if(s&&n.count>a.reservedIndexCount||e.attributes.position.count>a.reservedVertexCount)throw new Error("THREE.BatchedMesh: Reserved space not large enough for provided geometry.");const o=a.vertexStart,h=a.reservedVertexCount;a.vertexCount=e.getAttribute("position").count;for(const t in i.attributes){const s=e.getAttribute(t),r=i.getAttribute(t);Xo(s,r,o);const n=s.itemSize;for(let t=s.count,e=h;t=e.length||!1===e[t].active)return this;const i=this._instanceInfo;for(let e=0,s=i.length;ee).sort((t,e)=>i[t].vertexStart-i[e].vertexStart),r=this.geometry;for(let n=0,a=i.length;n=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingBox){const t=new Hs,e=i.index,r=i.attributes.position;for(let i=s.start,n=s.start+s.count;i=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingSphere){const e=new pr;this.getBoundingBoxAt(t,Eo),Eo.getCenter(e.center);const r=i.index,n=i.attributes.position;let a=0;for(let t=s.start,i=s.start+s.count;tt.active);if(Math.max(...i.map(t=>t.vertexStart+t.reservedVertexCount))>t)throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${e}. Cannot shrink further.`);if(this.geometry.index){if(Math.max(...i.map(t=>t.indexStart+t.reservedIndexCount))>e)throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${e}. Cannot shrink further.`)}const s=this.geometry;s.dispose(),this._maxVertexCount=t,this._maxIndexCount=e,this._geometryInitialized&&(this._geometryInitialized=!1,this.geometry=new Jn,this._initializeGeometry(s));const r=this.geometry;s.index&&Yo(s.index.array,r.index.array);for(const t in s.attributes)Yo(s.attributes[t].array,r.attributes[t].array)}raycast(t,e){const i=this._instanceInfo,s=this._geometryInfo,r=this.matrixWorld,n=this.geometry;qo.material=this.material,qo.geometry.index=n.index,qo.geometry.attributes=n.attributes,null===qo.geometry.boundingBox&&(qo.geometry.boundingBox=new Hs),null===qo.geometry.boundingSphere&&(qo.geometry.boundingSphere=new pr);for(let n=0,a=i.length;n({...t,boundingBox:null!==t.boundingBox?t.boundingBox.clone():null,boundingSphere:null!==t.boundingSphere?t.boundingSphere.clone():null})),this._instanceInfo=t._instanceInfo.map(t=>({...t})),this._availableInstanceIds=t._availableInstanceIds.slice(),this._availableGeometryIds=t._availableGeometryIds.slice(),this._nextIndexStart=t._nextIndexStart,this._nextVertexStart=t._nextVertexStart,this._geometryCount=t._geometryCount,this._maxInstanceCount=t._maxInstanceCount,this._maxVertexCount=t._maxVertexCount,this._maxIndexCount=t._maxIndexCount,this._geometryInitialized=t._geometryInitialized,this._multiDrawCounts=t._multiDrawCounts.slice(),this._multiDrawStarts=t._multiDrawStarts.slice(),this._indirectTexture=t._indirectTexture.clone(),this._indirectTexture.image.data=this._indirectTexture.image.data.slice(),this._matricesTexture=t._matricesTexture.clone(),this._matricesTexture.image.data=this._matricesTexture.image.data.slice(),null!==this._colorsTexture&&(this._colorsTexture=t._colorsTexture.clone(),this._colorsTexture.image.data=this._colorsTexture.image.data.slice()),this}dispose(){this.geometry.dispose(),this._matricesTexture.dispose(),this._matricesTexture=null,this._indirectTexture.dispose(),this._indirectTexture=null,null!==this._colorsTexture&&(this._colorsTexture.dispose(),this._colorsTexture=null)}onBeforeRender(t,e,i,s,r){if(!this._visibilityChanged&&!this.perObjectFrustumCulled&&!this.sortObjects)return;const n=s.getIndex(),a=null===n?1:n.array.BYTES_PER_ELEMENT,o=this._instanceInfo,h=this._multiDrawStarts,l=this._multiDrawCounts,c=this._geometryInfo,u=this.perObjectFrustumCulled,d=this._indirectTexture,p=d.image.data,m=i.isArrayCamera?Fo:Vo;u&&!i.isArrayCamera&&(Ro.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse).multiply(this.matrixWorld),Vo.setFromProjectionMatrix(Ro,i.coordinateSystem,i.reversedDepth));let y=0;if(this.sortObjects){Ro.copy(this.matrixWorld).invert(),jo.setFromMatrixPosition(i.matrixWorld).applyMatrix4(Ro),Do.set(0,0,-1).transformDirection(i.matrixWorld).transformDirection(Ro);for(let t=0,e=o.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;ts)return;eh.applyMatrix4(t.matrixWorld);const h=e.ray.origin.distanceTo(eh);return he.far?void 0:{distance:h,point:ih.clone().applyMatrix4(t.matrixWorld),index:a,face:null,faceIndex:null,barycoord:null,object:t}}const nh=new Ss,ah=new Ss;class oh extends sh{constructor(t,e){super(t,e),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(null===t.index){const e=t.attributes.position,i=[];for(let t=0,s=e.count;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;tr.far)return;n.push({distance:h,distanceToRay:Math.sqrt(o),point:i,index:e,face:null,faceIndex:null,barycoord:null,object:a})}}class gh extends Ds{constructor(t,e,i,s,r=1006,n=1006,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isVideoTexture=!0,this.generateMipmaps=!1,this._requestVideoFrameCallbackId=0;const l=this;"requestVideoFrameCallback"in t&&(this._requestVideoFrameCallbackId=t.requestVideoFrameCallback(function e(){l.needsUpdate=!0,l._requestVideoFrameCallbackId=t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}dispose(){0!==this._requestVideoFrameCallbackId&&(this.source.data.cancelVideoFrameCallback(this._requestVideoFrameCallbackId),this._requestVideoFrameCallbackId=0),super.dispose()}}class fh extends gh{constructor(t,e,i,s,r,n,a,o){super({},t,e,i,s,r,n,a,o),this.isVideoFrameTexture=!0}update(){}clone(){return(new this.constructor).copy(this)}setFrame(t){this.image=t,this.needsUpdate=!0}}class xh extends Ds{constructor(t,e){super({width:t,height:e}),this.isFramebufferTexture=!0,this.magFilter=ft,this.minFilter=ft,this.generateMipmaps=!1,this.needsUpdate=!0}}class bh extends Ds{constructor(t,e,i,s,r,n,a,o,h,l,c,u){super(null,n,a,o,h,l,s,r,c,u),this.isCompressedTexture=!0,this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}class vh extends bh{constructor(t,e,i,s,r,n){super(t,e,i,r,n),this.isCompressedArrayTexture=!0,this.image.depth=s,this.wrapR=yt,this.layerUpdates=new Set}addLayerUpdate(t){this.layerUpdates.add(t)}clearLayerUpdates(){this.layerUpdates.clear()}}class wh extends bh{constructor(t,e,i){super(void 0,t[0].width,t[0].height,e,i,lt),this.isCompressedCubeTexture=!0,this.isCubeTexture=!0,this.image=t}}class Mh extends Ds{constructor(t,e,i,s,r,n,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isCanvasTexture=!0,this.needsUpdate=!0}}class Sh extends Ds{constructor(t,e,i=1014,s,r,n,a=1003,o=1003,h,l=1026,c=1){if(l!==Wt&&1027!==l)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");super({width:t,height:e,depth:c},s,r,n,a,o,l,i,h),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.source=new Fs(Object.assign({},t.image)),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return null!==this.compareFunction&&(e.compareFunction=this.compareFunction),e}}class _h extends Sh{constructor(t,e=1014,i=301,s,r,n=1003,a=1003,o,h=1026){const l={width:t,height:t,depth:1},c=[l,l,l,l,l,l];super(t,t,e,i,s,r,n,a,o,h),this.image=c,this.isCubeDepthTexture=!0,this.isCubeTexture=!0}get images(){return this.image}set images(t){this.image=t}}class Ah extends Ds{constructor(t=null){super(),this.sourceTexture=t,this.isExternalTexture=!0}copy(t){return super.copy(t),this.sourceTexture=t.sourceTexture,this}}class Th extends Jn{constructor(t=1,e=1,i=4,s=8,r=1){super(),this.type="CapsuleGeometry",this.parameters={radius:t,height:e,capSegments:i,radialSegments:s,heightSegments:r},e=Math.max(0,e),i=Math.max(1,Math.floor(i)),s=Math.max(3,Math.floor(s)),r=Math.max(1,Math.floor(r));const n=[],a=[],o=[],h=[],l=e/2,c=Math.PI/2*t,u=e,d=2*c+u,p=2*i+r,m=s+1,y=new Ss,g=new Ss;for(let f=0;f<=p;f++){let x=0,b=0,v=0,w=0;if(f<=i){const e=f/i,s=e*Math.PI/2;b=-l-t*Math.cos(s),v=t*Math.sin(s),w=-t*Math.cos(s),x=e*c}else if(f<=i+r){const s=(f-i)/r;b=s*e-l,v=t,w=0,x=c+s*u}else{const e=(f-i-r)/i,s=e*Math.PI/2;b=l+t*Math.sin(s),v=t*Math.cos(s),w=t*Math.sin(s),x=c+u+e*c}const M=Math.max(0,Math.min(1,x/d));let S=0;0===f?S=.5/s:f===p&&(S=-.5/s);for(let t=0;t<=s;t++){const e=t/s,i=e*Math.PI*2,r=Math.sin(i),n=Math.cos(i);g.x=-v*n,g.y=b,g.z=v*r,a.push(g.x,g.y,g.z),y.set(-v*n,w,v*r),y.normalize(),o.push(y.x,y.y,y.z),h.push(e+S,M)}if(f>0){const t=(f-1)*m;for(let e=0;e0||0!==s)&&(l.push(n,a,h),x+=3),(e>0||s!==r-1)&&(l.push(a,o,h),x+=3)}h.addGroup(g,x,0),g+=x}(),!1===n&&(t>0&&f(!0),e>0&&f(!1)),this.setIndex(l),this.setAttribute("position",new Fn(c,3)),this.setAttribute("normal",new Fn(u,3)),this.setAttribute("uv",new Fn(d,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Ch(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Ih extends Ch{constructor(t=1,e=1,i=32,s=1,r=!1,n=0,a=2*Math.PI){super(0,t,e,i,s,r,n,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:s,openEnded:r,thetaStart:n,thetaLength:a}}static fromJSON(t){return new Ih(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Bh extends Jn{constructor(t=[],e=[],i=1,s=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:s};const r=[],n=[];function a(t,e,i,s){const r=s+1,n=[];for(let s=0;s<=r;s++){n[s]=[];const a=t.clone().lerp(i,s/r),o=e.clone().lerp(i,s/r),h=r-s;for(let t=0;t<=h;t++)n[s][t]=0===t&&s===r?a:a.clone().lerp(o,t/h)}for(let t=0;t.9&&a<.1&&(e<.2&&(n[t+0]+=1),i<.2&&(n[t+2]+=1),s<.2&&(n[t+4]+=1))}}()}(),this.setAttribute("position",new Fn(r,3)),this.setAttribute("normal",new Fn(r.slice(),3)),this.setAttribute("uv",new Fn(n,2)),0===s?this.computeVertexNormals():this.normalizeNormals()}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Bh(t.vertices,t.indices,t.radius,t.detail)}}class kh extends Bh{constructor(t=1,e=0){const i=(1+Math.sqrt(5))/2,s=1/i;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-s,-i,0,-s,i,0,s,-i,0,s,i,-s,-i,0,-s,i,0,s,-i,0,s,i,0,-i,0,-s,i,0,-s,-i,0,s,i,0,s],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}static fromJSON(t){return new kh(t.radius,t.detail)}}const Oh=new Ss,Ph=new Ss,Rh=new Ss,Nh=new cn;class Vh extends Jn{constructor(t=null,e=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:t,thresholdAngle:e},null!==t){const i=4,s=Math.pow(10,i),r=Math.cos(ds*e),n=t.getIndex(),a=t.getAttribute("position"),o=n?n.count:a.count,h=[0,0,0],l=["a","b","c"],c=new Array(3),u={},d=[];for(let t=0;t0)){h=s;break}h=s-1}if(s=h,i[s]===n)return s/(r-1);const l=i[s];return(s+(n-l)/(i[s+1]-l))/(r-1)}getTangent(t,e){const i=1e-4;let s=t-i,r=t+i;s<0&&(s=0),r>1&&(r=1);const n=this.getPoint(s),a=this.getPoint(r),o=e||(n.isVector2?new ws:new Ss);return o.copy(a).sub(n).normalize(),o}getTangentAt(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)}computeFrenetFrames(t,e=!1){const i=new Ss,s=[],r=[],n=[],a=new Ss,o=new Mr;for(let e=0;e<=t;e++){const i=e/t;s[e]=this.getTangentAt(i,new Ss)}r[0]=new Ss,n[0]=new Ss;let h=Number.MAX_VALUE;const l=Math.abs(s[0].x),c=Math.abs(s[0].y),u=Math.abs(s[0].z);l<=h&&(h=l,i.set(1,0,0)),c<=h&&(h=c,i.set(0,1,0)),u<=h&&i.set(0,0,1),a.crossVectors(s[0],i).normalize(),r[0].crossVectors(s[0],a),n[0].crossVectors(s[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),n[e]=n[e-1].clone(),a.crossVectors(s[e-1],s[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(ys(s[e-1].dot(s[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}n[e].crossVectors(s[e],r[e])}if(!0===e){let e=Math.acos(ys(r[0].dot(r[t]),-1,1));e/=t,s[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(o.makeRotationAxis(s[i],e*i)),n[i].crossVectors(s[i],r[i])}return{tangents:s,normals:r,binormals:n}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.7,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class Eh extends Fh{constructor(t=0,e=0,i=1,s=1,r=0,n=2*Math.PI,a=!1,o=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=i,this.yRadius=s,this.aStartAngle=r,this.aEndAngle=n,this.aClockwise=a,this.aRotation=o}getPoint(t,e=new ws){const i=e,s=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const n=Math.abs(r)s;)r-=s;r0?0:(Math.floor(Math.abs(h)/r)+1)*r:0===l&&h===r-1&&(h=r-2,l=1),this.closed||h>0?a=s[(h-1)%r]:(Dh.subVectors(s[0],s[1]).add(s[0]),a=Dh);const c=s[h%r],u=s[(h+1)%r];if(this.closed||h+2s.length-2?s.length-1:n+1],c=s[n>s.length-3?s.length-1:n+2];return i.set(Xh(a,o.x,h.x,l.x,c.x),Xh(a,o.y,h.y,l.y,c.y)),i}copy(t){super.copy(t),this.points=[];for(let e=0,i=t.points.length;e=i){const t=s[r]-i,n=this.curves[r],a=n.getLength(),o=0===a?0:1-t/a;return n.getPointAt(o,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,s=this.curves.length;i1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,i=t.curves.length;e0){const t=h.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(h);const l=h.getPoint(1);return this.currentPoint.copy(l),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class nl extends rl{constructor(t){super(t),this.uuid=ms(),this.type="Shape",this.holes=[]}getPointsHoles(t){const e=[];for(let i=0,s=this.holes.length;i80*i){o=t[0],h=t[1];let e=o,s=h;for(let n=i;ne&&(e=i),r>s&&(s=r)}l=Math.max(e-o,s-h),l=0!==l?32767/l:0}return ll(n,a,i,o,h,l,0),a}function ol(t,e,i,s,r){let n;if(r===function(t,e,i,s){let r=0;for(let n=e,a=i-s;n0)for(let r=e;r=e;r-=s)n=Il(r/s|0,t[r],t[r+1],n);return n&&Sl(n,n.next)&&(Bl(n),n=n.next),n}function hl(t,e){if(!t)return t;e||(e=t);let i,s=t;do{if(i=!1,s.steiner||!Sl(s,s.next)&&0!==Ml(s.prev,s,s.next))s=s.next;else{if(Bl(s),s=e=s.prev,s===s.next)break;i=!0}}while(i||s!==e);return e}function ll(t,e,i,s,r,n,a){if(!t)return;!a&&n&&function(t,e,i,s){let r=t;do{0===r.z&&(r.z=fl(r.x,r.y,e,i,s)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i=1;do{let s,r=t;t=null;let n=null;for(e=0;r;){e++;let a=r,o=0;for(let t=0;t0||h>0&&a;)0!==o&&(0===h||!a||r.z<=a.z)?(s=r,r=r.nextZ,o--):(s=a,a=a.nextZ,h--),n?n.nextZ=s:t=s,s.prevZ=n,n=s;r=a}n.nextZ=null,i*=2}while(e>1)}(r)}(t,s,r,n);let o=t;for(;t.prev!==t.next;){const h=t.prev,l=t.next;if(n?ul(t,s,r,n):cl(t))e.push(h.i,t.i,l.i),Bl(t),t=l.next,o=l.next;else if((t=l)===o){a?1===a?ll(t=dl(hl(t),e),e,i,s,r,n,2):2===a&&pl(t,e,i,s,r,n):ll(hl(t),e,i,s,r,n,1);break}}}function cl(t){const e=t.prev,i=t,s=t.next;if(Ml(e,i,s)>=0)return!1;const r=e.x,n=i.x,a=s.x,o=e.y,h=i.y,l=s.y,c=Math.min(r,n,a),u=Math.min(o,h,l),d=Math.max(r,n,a),p=Math.max(o,h,l);let m=s.next;for(;m!==e;){if(m.x>=c&&m.x<=d&&m.y>=u&&m.y<=p&&vl(r,o,n,h,a,l,m.x,m.y)&&Ml(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function ul(t,e,i,s){const r=t.prev,n=t,a=t.next;if(Ml(r,n,a)>=0)return!1;const o=r.x,h=n.x,l=a.x,c=r.y,u=n.y,d=a.y,p=Math.min(o,h,l),m=Math.min(c,u,d),y=Math.max(o,h,l),g=Math.max(c,u,d),f=fl(p,m,e,i,s),x=fl(y,g,e,i,s);let b=t.prevZ,v=t.nextZ;for(;b&&b.z>=f&&v&&v.z<=x;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&vl(o,c,h,u,l,d,b.x,b.y)&&Ml(b.prev,b,b.next)>=0)return!1;if(b=b.prevZ,v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&vl(o,c,h,u,l,d,v.x,v.y)&&Ml(v.prev,v,v.next)>=0)return!1;v=v.nextZ}for(;b&&b.z>=f;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&vl(o,c,h,u,l,d,b.x,b.y)&&Ml(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;v&&v.z<=x;){if(v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&vl(o,c,h,u,l,d,v.x,v.y)&&Ml(v.prev,v,v.next)>=0)return!1;v=v.nextZ}return!0}function dl(t,e){let i=t;do{const s=i.prev,r=i.next.next;!Sl(s,r)&&_l(s,i,i.next,r)&&zl(s,r)&&zl(r,s)&&(e.push(s.i,i.i,r.i),Bl(i),Bl(i.next),i=t=r),i=i.next}while(i!==t);return hl(i)}function pl(t,e,i,s,r,n){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&wl(a,t)){let o=Cl(a,t);return a=hl(a,a.next),o=hl(o,o.next),ll(a,e,i,s,r,n,0),void ll(o,e,i,s,r,n,0)}t=t.next}a=a.next}while(a!==t)}function ml(t,e){let i=t.x-e.x;if(0===i&&(i=t.y-e.y,0===i)){i=(t.next.y-t.y)/(t.next.x-t.x)-(e.next.y-e.y)/(e.next.x-e.x)}return i}function yl(t,e){const i=function(t,e){let i=e;const s=t.x,r=t.y;let n,a=-1/0;if(Sl(t,i))return i;do{if(Sl(t,i.next))return i.next;if(r<=i.y&&r>=i.next.y&&i.next.y!==i.y){const t=i.x+(r-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(t<=s&&t>a&&(a=t,n=i.x=i.x&&i.x>=h&&s!==i.x&&bl(rn.x||i.x===n.x&&gl(n,i)))&&(n=i,c=e)}i=i.next}while(i!==o);return n}(t,e);if(!i)return e;const s=Cl(i,t);return hl(s,s.next),hl(i,i.next)}function gl(t,e){return Ml(t.prev,t,e.prev)<0&&Ml(e.next,t,t.next)<0}function fl(t,e,i,s,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-s)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function xl(t){let e=t,i=t;do{(e.x=(t-a)*(n-o)&&(t-a)*(s-o)>=(i-a)*(e-o)&&(i-a)*(n-o)>=(r-a)*(s-o)}function vl(t,e,i,s,r,n,a,o){return!(t===a&&e===o)&&bl(t,e,i,s,r,n,a,o)}function wl(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&_l(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(zl(t,e)&&zl(e,t)&&function(t,e){let i=t,s=!1;const r=(t.x+e.x)/2,n=(t.y+e.y)/2;do{i.y>n!=i.next.y>n&&i.next.y!==i.y&&r<(i.next.x-i.x)*(n-i.y)/(i.next.y-i.y)+i.x&&(s=!s),i=i.next}while(i!==t);return s}(t,e)&&(Ml(t.prev,t,e.prev)||Ml(t,e.prev,e))||Sl(t,e)&&Ml(t.prev,t,t.next)>0&&Ml(e.prev,e,e.next)>0)}function Ml(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function Sl(t,e){return t.x===e.x&&t.y===e.y}function _l(t,e,i,s){const r=Tl(Ml(t,e,i)),n=Tl(Ml(t,e,s)),a=Tl(Ml(i,s,t)),o=Tl(Ml(i,s,e));return r!==n&&a!==o||(!(0!==r||!Al(t,i,e))||(!(0!==n||!Al(t,s,e))||(!(0!==a||!Al(i,t,s))||!(0!==o||!Al(i,e,s)))))}function Al(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function Tl(t){return t>0?1:t<0?-1:0}function zl(t,e){return Ml(t.prev,t,t.next)<0?Ml(t,e,t.next)>=0&&Ml(t,t.prev,e)>=0:Ml(t,e,t.prev)<0||Ml(t,t.next,e)<0}function Cl(t,e){const i=kl(t.i,t.x,t.y),s=kl(e.i,e.x,e.y),r=t.next,n=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,s.next=i,i.prev=s,n.next=s,s.prev=n,s}function Il(t,e,i,s){const r=kl(t,e,i);return s?(r.next=s.next,r.prev=s,s.next.prev=r,s.next=r):(r.prev=r,r.next=r),r}function Bl(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function kl(t,e,i){return{i:t,x:e,y:i,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}class Ol{static triangulate(t,e,i=2){return al(t,e,i)}}class Pl{static area(t){const e=t.length;let i=0;for(let s=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function Nl(t,e){for(let i=0;iNumber.EPSILON){const u=Math.sqrt(c),d=Math.sqrt(h*h+l*l),p=e.x-o/u,m=e.y+a/u,y=((i.x-l/d-p)*l-(i.y+h/d-m)*h)/(a*l-o*h);s=p+a*y-t.x,r=m+o*y-t.y;const g=s*s+r*r;if(g<=2)return new ws(s,r);n=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?h>Number.EPSILON&&(t=!0):a<-Number.EPSILON?h<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(l)&&(t=!0),t?(s=-o,r=a,n=Math.sqrt(c)):(s=a,r=o,n=Math.sqrt(c/2))}return new ws(s/n,r/n)}const k=[];for(let t=0,e=z.length,i=e-1,s=t+1;t=0;t--){const e=t/p,i=c*Math.cos(e*Math.PI/2),s=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=z.length;t=0;){const s=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=o+2*p;t0)&&d.push(e,r,h),(t!==i-1||o0!=t>0&&this.version++,this._anisotropy=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get dispersion(){return this._dispersion}set dispersion(t){this._dispersion>0!=t>0&&this.version++,this._dispersion=t}get sheen(){return this._sheen}set sheen(t){this._sheen>0!=t>0&&this.version++,this._sheen=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=t.anisotropy,this.anisotropyRotation=t.anisotropyRotation,this.anisotropyMap=t.anisotropyMap,this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.dispersion=t.dispersion,this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class ic extends xn{constructor(t){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new yn(16777215),this.specular=new yn(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new yn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Or,this.combine=0,this.reflectivity=1,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.envMapIntensity=t.envMapIntensity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class sc extends xn{constructor(t){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new yn(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new yn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}class rc extends xn{constructor(t){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}class nc extends xn{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new yn(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new yn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Or,this.combine=0,this.reflectivity=1,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.envMapIntensity=t.envMapIntensity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class ac extends xn{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class oc extends xn{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}class hc extends xn{constructor(t){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new yn(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this.fog=t.fog,this}}class lc extends Ho{constructor(t){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}function cc(t,e){return t&&t.constructor!==e?"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t):t}function uc(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort(function(e,i){return t[e]-t[i]}),i}function dc(t,e,i){const s=t.length,r=new t.constructor(s);for(let n=0,a=0;a!==s;++n){const s=i[n]*e;for(let i=0;i!==e;++i)r[a++]=t[s+i]}return r}function pc(t,e,i,s){let r=1,n=t[0];for(;void 0!==n&&void 0===n[s];)n=t[r++];if(void 0===n)return;let a=n[s];if(void 0!==a)if(Array.isArray(a))do{a=n[s],void 0!==a&&(e.push(n.time),i.push(...a)),n=t[r++]}while(void 0!==n);else if(void 0!==a.toArray)do{a=n[s],void 0!==a&&(e.push(n.time),a.toArray(i,i.length)),n=t[r++]}while(void 0!==n);else do{a=n[s],void 0!==a&&(e.push(n.time),i.push(a)),n=t[r++]}while(void 0!==n)}class mc{static convertArray(t,e){return cc(t,e)}static isTypedArray(t){return $i(t)}static getKeyframeOrder(t){return uc(t)}static sortedArray(t,e,i){return dc(t,e,i)}static flattenJSON(t,e,i,s){pc(t,e,i,s)}static subclip(t,e,i,s,r=30){return function(t,e,i,s,r=30){const n=t.clone();n.name=e;const a=[];for(let t=0;t=s)){h.push(e.times[t]);for(let i=0;in.tracks[t].times[0]&&(o=n.tracks[t].times[0]);for(let t=0;t=s.times[u]){const t=u*h+o,e=t+h-o;d=s.values.slice(t,e)}else{const t=s.createInterpolant(),e=o,i=h-o;t.evaluate(n),d=t.resultBuffer.slice(e,i)}"quaternion"===r&&(new Ms).fromArray(d).normalize().conjugate().toArray(d);const p=a.times.length;for(let t=0;t=r)){const a=e[1];t=r)break e}n=i,i=0;break i}break t}for(;i>>1;te;)--n;if(++n,0!==r||n!==s){r>=n&&(n=Math.max(n,1),r=n-1);const t=this.getValueSize();this.times=i.slice(r,n),this.values=this.values.slice(r*t,n*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!==0&&(as("KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,s=this.values,r=i.length;0===r&&(as("KeyframeTrack: Track is empty.",this),t=!1);let n=null;for(let e=0;e!==r;e++){const s=i[e];if("number"==typeof s&&isNaN(s)){as("KeyframeTrack: Time is not a valid number.",this,e,s),t=!1;break}if(null!==n&&n>s){as("KeyframeTrack: Out of order keys.",this,e,s,n),t=!1;break}n=s}if(void 0!==s&&$i(s))for(let e=0,i=s.length;e!==i;++e){const i=s[e];if(isNaN(i)){as("KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t}optimize(){const t=this.times.slice(),e=this.values.slice(),i=this.getValueSize(),s=this.getInterpolation()===Ee,r=t.length-1;let n=1;for(let a=1;a0){t[n]=t[r];for(let t=r*i,s=n*i,a=0;a!==i;++a)e[s+a]=e[t+a];++n}return n!==t.length?(this.times=t.slice(0,n),this.values=e.slice(0,n*i)):(this.times=t,this.values=e),this}clone(){const t=this.times.slice(),e=this.values.slice(),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}bc.prototype.ValueTypeName="",bc.prototype.TimeBufferType=Float32Array,bc.prototype.ValueBufferType=Float32Array,bc.prototype.DefaultInterpolation=Fe;class vc extends bc{constructor(t,e,i){super(t,e,i)}}vc.prototype.ValueTypeName="bool",vc.prototype.ValueBufferType=Array,vc.prototype.DefaultInterpolation=Ve,vc.prototype.InterpolantFactoryMethodLinear=void 0,vc.prototype.InterpolantFactoryMethodSmooth=void 0;class wc extends bc{constructor(t,e,i,s){super(t,e,i,s)}}wc.prototype.ValueTypeName="color";class Mc extends bc{constructor(t,e,i,s){super(t,e,i,s)}}Mc.prototype.ValueTypeName="number";class Sc extends yc{constructor(t,e,i,s){super(t,e,i,s)}interpolate_(t,e,i,s){const r=this.resultBuffer,n=this.sampleValues,a=this.valueSize,o=(i-e)/(s-e);let h=t*a;for(let t=h+a;h!==t;h+=4)Ms.slerpFlat(r,0,n,h-a,n,h,o);return r}}class _c extends bc{constructor(t,e,i,s){super(t,e,i,s)}InterpolantFactoryMethodLinear(t){return new Sc(this.times,this.values,this.getValueSize(),t)}}_c.prototype.ValueTypeName="quaternion",_c.prototype.InterpolantFactoryMethodSmooth=void 0;class Ac extends bc{constructor(t,e,i){super(t,e,i)}}Ac.prototype.ValueTypeName="string",Ac.prototype.ValueBufferType=Array,Ac.prototype.DefaultInterpolation=Ve,Ac.prototype.InterpolantFactoryMethodLinear=void 0,Ac.prototype.InterpolantFactoryMethodSmooth=void 0;class Tc extends bc{constructor(t,e,i,s){super(t,e,i,s)}}Tc.prototype.ValueTypeName="vector";class zc{constructor(t="",e=-1,i=[],s=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=s,this.uuid=ms(),this.userData={},this.duration<0&&this.resetDuration()}static parse(t){const e=[],i=t.tracks,s=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(Cc(i[t]).scale(s));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r.userData=JSON.parse(t.userData||"{}"),r}static toJSON(t){const e=[],i=t.tracks,s={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode,userData:JSON.stringify(t.userData)};for(let t=0,s=i.length;t!==s;++t)e.push(bc.toJSON(i[t]));return s}static CreateFromMorphTargetSequence(t,e,i,s){const r=e.length,n=[];for(let t=0;t1){const t=n[1];let e=s[t];e||(s[t]=e=[]),e.push(i)}}const n=[];for(const t in s)n.push(this.CreateFromMorphTargetSequence(t,s[t],e,i));return n}static parseAnimation(t,e){if(ns("AnimationClip: parseAnimation() is deprecated and will be removed with r185"),!t)return as("AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,s,r){if(0!==i.length){const n=[],a=[];pc(i,n,a,s),0!==n.length&&r.push(new t(e,n,a))}},s=[],r=t.name||"default",n=t.fps||30,a=t.blendMode;let o=t.length||-1;const h=t.hierarchy||[];for(let t=0;t{e&&e(r),this.manager.itemEnd(t)},0),r;if(void 0!==Pc[t])return void Pc[t].push({onLoad:e,onProgress:i,onError:s});Pc[t]=[],Pc[t].push({onLoad:e,onProgress:i,onError:s});const n=new Request(t,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin",signal:"function"==typeof AbortSignal.any?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal}),a=this.mimeType,o=this.responseType;fetch(n).then(e=>{if(200===e.status||0===e.status){if(0===e.status&&ns("FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===e.body||void 0===e.body.getReader)return e;const i=Pc[t],s=e.body.getReader(),r=e.headers.get("X-File-Size")||e.headers.get("Content-Length"),n=r?parseInt(r):0,a=0!==n;let o=0;const h=new ReadableStream({start(t){!function e(){s.read().then(({done:s,value:r})=>{if(s)t.close();else{o+=r.byteLength;const s=new ProgressEvent("progress",{lengthComputable:a,loaded:o,total:n});for(let t=0,e=i.length;t{t.error(e)})}()}});return new Response(h)}throw new Rc(`fetch for "${e.url}" responded with ${e.status}: ${e.statusText}`,e)}).then(t=>{switch(o){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then(t=>(new DOMParser).parseFromString(t,a));case"json":return t.json();default:if(""===a)return t.text();{const e=/charset="?([^;"\s]*)"?/i.exec(a),i=e&&e[1]?e[1].toLowerCase():void 0,s=new TextDecoder(i);return t.arrayBuffer().then(t=>s.decode(t))}}}).then(e=>{Ic.add(`file:${t}`,e);const i=Pc[t];delete Pc[t];for(let t=0,s=i.length;t{const i=Pc[t];if(void 0===i)throw this.manager.itemError(t),e;delete Pc[t];for(let t=0,s=i.length;t{this.manager.itemEnd(t)}),this.manager.itemStart(t)}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}class Vc extends Oc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Nc(this.manager);n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):as(e),r.manager.itemError(t)}},i,s)}parse(t){const e=[];for(let i=0;i0:s.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(s.uniforms[e]={},r.type){case"t":s.uniforms[e].value=i(r.value);break;case"c":s.uniforms[e].value=(new yn).setHex(r.value);break;case"v2":s.uniforms[e].value=(new ws).fromArray(r.value);break;case"v3":s.uniforms[e].value=(new Ss).fromArray(r.value);break;case"v4":s.uniforms[e].value=(new Us).fromArray(r.value);break;case"m3":s.uniforms[e].value=(new Ts).fromArray(r.value);break;case"m4":s.uniforms[e].value=(new Mr).fromArray(r.value);break;default:s.uniforms[e].value=r.value}}if(void 0!==t.defines&&(s.defines=t.defines),void 0!==t.vertexShader&&(s.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(s.fragmentShader=t.fragmentShader),void 0!==t.glslVersion&&(s.glslVersion=t.glslVersion),void 0!==t.extensions)for(const e in t.extensions)s.extensions[e]=t.extensions[e];if(void 0!==t.lights&&(s.lights=t.lights),void 0!==t.clipping&&(s.clipping=t.clipping),void 0!==t.size&&(s.size=t.size),void 0!==t.sizeAttenuation&&(s.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(s.map=i(t.map)),void 0!==t.matcap&&(s.matcap=i(t.matcap)),void 0!==t.alphaMap&&(s.alphaMap=i(t.alphaMap)),void 0!==t.bumpMap&&(s.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(s.bumpScale=t.bumpScale),void 0!==t.normalMap&&(s.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(s.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),s.normalScale=(new ws).fromArray(e)}return void 0!==t.displacementMap&&(s.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(s.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(s.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(s.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(s.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(s.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(s.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(s.specularMap=i(t.specularMap)),void 0!==t.specularIntensityMap&&(s.specularIntensityMap=i(t.specularIntensityMap)),void 0!==t.specularColorMap&&(s.specularColorMap=i(t.specularColorMap)),void 0!==t.envMap&&(s.envMap=i(t.envMap)),void 0!==t.envMapRotation&&s.envMapRotation.fromArray(t.envMapRotation),void 0!==t.envMapIntensity&&(s.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(s.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(s.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(s.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(s.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(s.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(s.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(s.gradientMap=i(t.gradientMap)),void 0!==t.clearcoatMap&&(s.clearcoatMap=i(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(s.clearcoatRoughnessMap=i(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(s.clearcoatNormalMap=i(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(s.clearcoatNormalScale=(new ws).fromArray(t.clearcoatNormalScale)),void 0!==t.iridescenceMap&&(s.iridescenceMap=i(t.iridescenceMap)),void 0!==t.iridescenceThicknessMap&&(s.iridescenceThicknessMap=i(t.iridescenceThicknessMap)),void 0!==t.transmissionMap&&(s.transmissionMap=i(t.transmissionMap)),void 0!==t.thicknessMap&&(s.thicknessMap=i(t.thicknessMap)),void 0!==t.anisotropyMap&&(s.anisotropyMap=i(t.anisotropyMap)),void 0!==t.sheenColorMap&&(s.sheenColorMap=i(t.sheenColorMap)),void 0!==t.sheenRoughnessMap&&(s.sheenRoughnessMap=i(t.sheenRoughnessMap)),s}setTextures(t){return this.textures=t,this}createMaterialFromType(t){return au.createMaterialFromType(t)}static createMaterialFromType(t){return new{ShadowMaterial:Ql,SpriteMaterial:Ia,RawShaderMaterial:Kl,ShaderMaterial:ca,PointsMaterial:lh,MeshPhysicalMaterial:ec,MeshStandardMaterial:tc,MeshPhongMaterial:ic,MeshToonMaterial:sc,MeshNormalMaterial:rc,MeshLambertMaterial:nc,MeshDepthMaterial:ac,MeshDistanceMaterial:oc,MeshBasicMaterial:bn,MeshMatcapMaterial:hc,LineDashedMaterial:lc,LineBasicMaterial:Ho,Material:xn}[t]}}class ou{static extractUrlBase(t){const e=t.lastIndexOf("/");return-1===e?"./":t.slice(0,e+1)}static resolveURL(t,e){return"string"!=typeof t||""===t?"":(/^https?:\/\//i.test(e)&&/^\//.test(t)&&(e=e.replace(/(^https?:\/\/[^\/]+).*/i,"$1")),/^(https?:)?\/\//i.test(t)||/^data:.*,.*$/i.test(t)||/^blob:.*$/i.test(t)?t:e+t)}}class hu extends Jn{constructor(){super(),this.isInstancedBufferGeometry=!0,this.type="InstancedBufferGeometry",this.instanceCount=1/0}copy(t){return super.copy(t),this.instanceCount=t.instanceCount,this}toJSON(){const t=super.toJSON();return t.instanceCount=this.instanceCount,t.isInstancedBufferGeometry=!0,t}}class lu extends Oc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Nc(r.manager);n.setPath(r.path),n.setRequestHeader(r.requestHeader),n.setWithCredentials(r.withCredentials),n.load(t,function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):as(e),r.manager.itemError(t)}},i,s)}parse(t){const e={},i={};function s(t,s){if(void 0!==e[s])return e[s];const r=t.interleavedBuffers[s],n=function(t,e){if(void 0!==i[e])return i[e];const s=t.arrayBuffers,r=s[e],n=new Uint32Array(r).buffer;return i[e]=n,n}(t,r.buffer),a=Gi(r.type,n),o=new Ta(a,r.stride);return o.uuid=r.uuid,e[s]=o,o}const r=t.isInstancedBufferGeometry?new hu:new Jn,n=t.data.index;if(void 0!==n){const t=Gi(n.type,n.array);r.setIndex(new Cn(t,1))}const a=t.data.attributes;for(const e in a){const i=a[e];let n;if(i.isInterleavedBufferAttribute){const e=s(t.data,i.data);n=new Ca(e,i.itemSize,i.offset,i.normalized)}else{const t=Gi(i.type,i.array);n=new(i.isInstancedBufferAttribute?lo:Cn)(t,i.itemSize,i.normalized)}void 0!==i.name&&(n.name=i.name),void 0!==i.usage&&n.setUsage(i.usage),r.setAttribute(e,n)}const o=t.data.morphAttributes;if(o)for(const e in o){const i=o[e],n=[];for(let e=0,r=i.length;e0){const i=new Bc(e);r=new Lc(i),r.setCrossOrigin(this.crossOrigin);for(let e=0,i=t.length;e0){s=new Lc(this.manager),s.setCrossOrigin(this.crossOrigin);for(let e=0,s=t.length;e{let e=null,i=null;return void 0!==t.boundingBox&&(e=(new Hs).fromJSON(t.boundingBox)),void 0!==t.boundingSphere&&(i=(new pr).fromJSON(t.boundingSphere)),{...t,boundingBox:e,boundingSphere:i}}),n._instanceInfo=t.instanceInfo,n._availableInstanceIds=t._availableInstanceIds,n._availableGeometryIds=t._availableGeometryIds,n._nextIndexStart=t.nextIndexStart,n._nextVertexStart=t.nextVertexStart,n._geometryCount=t.geometryCount,n._maxInstanceCount=t.maxInstanceCount,n._maxVertexCount=t.maxVertexCount,n._maxIndexCount=t.maxIndexCount,n._geometryInitialized=t.geometryInitialized,n._matricesTexture=c(t.matricesTexture.uuid),n._indirectTexture=c(t.indirectTexture.uuid),void 0!==t.colorsTexture&&(n._colorsTexture=c(t.colorsTexture.uuid)),void 0!==t.boundingSphere&&(n.boundingSphere=(new pr).fromJSON(t.boundingSphere)),void 0!==t.boundingBox&&(n.boundingBox=(new Hs).fromJSON(t.boundingBox));break;case"LOD":n=new Ya;break;case"Line":n=new sh(h(t.geometry),l(t.material));break;case"LineLoop":n=new hh(h(t.geometry),l(t.material));break;case"LineSegments":n=new oh(h(t.geometry),l(t.material));break;case"PointCloud":case"Points":n=new mh(h(t.geometry),l(t.material));break;case"Sprite":n=new Wa(l(t.material));break;case"Group":n=new va;break;case"Bone":n=new ro;break;default:n=new Hr}if(n.uuid=t.uuid,void 0!==t.name&&(n.name=t.name),void 0!==t.matrix?(n.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(n.matrixAutoUpdate=t.matrixAutoUpdate),n.matrixAutoUpdate&&n.matrix.decompose(n.position,n.quaternion,n.scale)):(void 0!==t.position&&n.position.fromArray(t.position),void 0!==t.rotation&&n.rotation.fromArray(t.rotation),void 0!==t.quaternion&&n.quaternion.fromArray(t.quaternion),void 0!==t.scale&&n.scale.fromArray(t.scale)),void 0!==t.up&&n.up.fromArray(t.up),void 0!==t.pivot&&(n.pivot=(new Ss).fromArray(t.pivot)),void 0!==t.castShadow&&(n.castShadow=t.castShadow),void 0!==t.receiveShadow&&(n.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.intensity&&(n.shadow.intensity=t.shadow.intensity),void 0!==t.shadow.bias&&(n.shadow.bias=t.shadow.bias),void 0!==t.shadow.normalBias&&(n.shadow.normalBias=t.shadow.normalBias),void 0!==t.shadow.radius&&(n.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&n.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(n.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.frustumCulled&&(n.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(n.renderOrder=t.renderOrder),void 0!==t.static&&(n.static=t.static),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.layers&&(n.layers.mask=t.layers),void 0!==t.children){const a=t.children;for(let t=0;t{if(!0!==mu.has(n))return e&&e(i),r.manager.itemEnd(t),i;s&&s(mu.get(n)),r.manager.itemError(t),r.manager.itemEnd(t)}):(setTimeout(function(){e&&e(n),r.manager.itemEnd(t)},0),n);const a={};a.credentials="anonymous"===this.crossOrigin?"same-origin":"include",a.headers=this.requestHeader,a.signal="function"==typeof AbortSignal.any?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal;const o=fetch(t,a).then(function(t){return t.blob()}).then(function(t){return createImageBitmap(t,Object.assign(r.options,{colorSpaceConversion:"none"}))}).then(function(i){return Ic.add(`image-bitmap:${t}`,i),e&&e(i),r.manager.itemEnd(t),i}).catch(function(e){s&&s(e),mu.set(o,e),Ic.remove(`image-bitmap:${t}`),r.manager.itemError(t),r.manager.itemEnd(t)});Ic.add(`image-bitmap:${t}`,o),r.manager.itemStart(t)}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}let gu;class fu{static getContext(){return void 0===gu&&(gu=new(window.AudioContext||window.webkitAudioContext)),gu}static setContext(t){gu=t}}class xu extends Oc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Nc(this.manager);function a(e){s?s(e):as(e),r.manager.itemError(t)}n.setResponseType("arraybuffer"),n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,function(t){try{const i=t.slice(0);fu.getContext().decodeAudioData(i,function(t){e(t)}).catch(a)}catch(t){a(t)}},i,s)}}const bu=new Mr,vu=new Mr,wu=new Mr;class Mu{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new ya,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new ya,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(t){const e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep,wu.copy(t.projectionMatrix);const i=e.eyeSep/2,s=i*e.near/e.focus,r=e.near*Math.tan(ds*e.fov*.5)/e.zoom;let n,a;vu.elements[12]=-i,bu.elements[12]=i,n=-r*e.aspect+s,a=r*e.aspect+s,wu.elements[0]=2*e.near/(a-n),wu.elements[8]=(a+n)/(a-n),this.cameraL.projectionMatrix.copy(wu),n=-r*e.aspect-s,a=r*e.aspect-s,wu.elements[0]=2*e.near/(a-n),wu.elements[8]=(a+n)/(a-n),this.cameraR.projectionMatrix.copy(wu)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(vu),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(bu)}}class Su extends ya{constructor(t=[]){super(),this.isArrayCamera=!0,this.isMultiViewCamera=!1,this.cameras=t}}class _u{constructor(t=!0){this.autoStart=t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=performance.now(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const e=performance.now();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}}const Au=new Ss,Tu=new Ms,zu=new Ss,Cu=new Ss,Iu=new Ss;class Bu extends Hr{constructor(){super(),this.type="AudioListener",this.context=fu.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new _u}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t);const e=this.context.listener;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(Au,Tu,zu),Cu.set(0,0,-1).applyQuaternion(Tu),Iu.set(0,1,0).applyQuaternion(Tu),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(Au.x,t),e.positionY.linearRampToValueAtTime(Au.y,t),e.positionZ.linearRampToValueAtTime(Au.z,t),e.forwardX.linearRampToValueAtTime(Cu.x,t),e.forwardY.linearRampToValueAtTime(Cu.y,t),e.forwardZ.linearRampToValueAtTime(Cu.z,t),e.upX.linearRampToValueAtTime(Iu.x,t),e.upY.linearRampToValueAtTime(Iu.y,t),e.upZ.linearRampToValueAtTime(Iu.z,t)}else e.setPosition(Au.x,Au.y,Au.z),e.setOrientation(Cu.x,Cu.y,Cu.z,Iu.x,Iu.y,Iu.z)}}class ku extends Hr{constructor(t){super(),this.type="Audio",this.listener=t,this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this}setMediaElementSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this}setMediaStreamSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(t),this.connect(),this}setBuffer(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this}play(t=0){if(!0===this.isPlaying)return void ns("Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void ns("Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+t;const e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd,e.onended=this.onEnded.bind(this),e.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=e,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;ns("Audio: this Audio has no playback control.")}stop(t=0){if(!1!==this.hasPlaybackControl)return this._progress=0,null!==this.source&&(this.source.stop(this.context.currentTime+t),this.source.onended=null),this.isPlaying=!1,this;ns("Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(i,s,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){a.setValue(i,s);break}}saveOriginalState(){const t=this.binding,e=this.buffer,i=this.valueSize,s=i*this._origIndex;t.getValue(e,s);for(let t=i,r=s;t!==r;++t)e[t]=e[s+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i=.5)for(let s=0;s!==r;++s)t[e+s]=t[i+s]}_slerp(t,e,i,s){Ms.slerpFlat(t,e,t,e,t,i,s)}_slerpAdditive(t,e,i,s,r){const n=this._workIndex*r;Ms.multiplyQuaternionsFlat(t,n,t,e,t,i),Ms.slerpFlat(t,e,t,e,t,n,s)}_lerp(t,e,i,s,r){const n=1-s;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*n+t[i+a]*s}}_lerpAdditive(t,e,i,s,r){for(let n=0;n!==r;++n){const r=e+n;t[r]=t[r]+t[i+n]*s}}}const Lu="\\[\\]\\.:\\/",ju=new RegExp("["+Lu+"]","g"),Du="[^"+Lu+"]",Uu="[^"+Lu.replace("\\.","")+"]",Wu=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",Du)+/(WCOD+)?/.source.replace("WCOD",Uu)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Du)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Du)+"$"),qu=["material","materials","bones","map"];class Ju{constructor(t,e,i){this.path=e,this.parsedPath=i||Ju.parseTrackName(e),this.node=Ju.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,i){return t&&t.isAnimationObjectGroup?new Ju.Composite(t,e,i):new Ju(t,e,i)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(ju,"")}static parseTrackName(t){const e=Wu.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},s=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==s&&-1!==s){const t=i.nodeName.substring(s+1);-1!==qu.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,s),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let s=0;s=r){const n=r++,l=t[n];e[l.uuid]=h,t[h]=l,e[o]=n,t[n]=a;for(let t=0,e=s;t!==e;++t){const e=i[t],s=e[n],r=e[h];e[h]=s,e[n]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,i=this._bindings,s=i.length;let r=this.nCachedObjects_,n=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,h=e[o];if(void 0!==h)if(delete e[o],h0&&(e[a.uuid]=h),t[h]=a,t.pop();for(let t=0,e=s;t!==e;++t){const e=i[t];e[h]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const i=this._bindingsIndicesByPath;let s=i[t];const r=this._bindings;if(void 0!==s)return r[s];const n=this._paths,a=this._parsedPaths,o=this._objects,h=o.length,l=this.nCachedObjects_,c=new Array(h);s=r.length,i[t]=s,n.push(t),a.push(e),r.push(c);for(let i=l,s=o.length;i!==s;++i){const s=o[i];c[i]=new Ju(s,t,e)}return c}unsubscribe_(t){const e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){const s=this._paths,r=this._parsedPaths,n=this._bindings,a=n.length-1,o=n[a];e[t[a]]=i,n[i]=o,n.pop(),r[i]=r[a],r.pop(),s[i]=s[a],s.pop()}}}class Yu{constructor(t,e,i=null,s=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=i,this.blendMode=s;const r=e.tracks,n=r.length,a=new Array(n),o={endingStart:Le,endingEnd:Le};for(let t=0;t!==n;++t){const e=r[t].createInterpolant(null);a[t]=e,e.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(n),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,i=!1){if(t.fadeOut(e),this.fadeIn(e),!0===i){const i=this._clip.duration,s=t._clip.duration,r=s/i,n=i/s;t.warp(1,r,e),this.warp(n,1,e)}return this}crossFadeTo(t,e,i=!1){return t.crossFadeFrom(this,e,i)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,i){const s=this._mixer,r=s.time,n=this.timeScale;let a=this._timeScaleInterpolant;null===a&&(a=s._lendControlInterpolant(),this._timeScaleInterpolant=a);const o=a.parameterPositions,h=a.sampleValues;return o[0]=r,o[1]=r+i,h[0]=t/n,h[1]=e/n,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,i,s){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const s=(t-r)*i;s<0||0===i?e=0:(this._startTime=null,e=i*s)}e*=this._updateTimeScale(t);const n=this._updateTime(e),a=this._updateWeight(t);if(a>0){const t=this._interpolants,e=this._propertyBindings;if(this.blendMode===We)for(let i=0,s=t.length;i!==s;++i)t[i].evaluate(n),e[i].accumulateAdditive(a);else for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(n),e[i].accumulate(s,a)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const s=i.evaluate(t)[0];e*=s,t>i.parameterPositions[1]&&(this.stopFading(),0===s&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let s=this.time+t,r=this._loopCount;const n=2202===i;if(0===t)return-1===r||!n||1&~r?s:e-s;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(s>=e)s=e;else{if(!(s<0)){this.time=s;break t}s=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,n)):this._setEndings(0===this.repetitions,!0,n)),s>=e||s<0){const i=Math.floor(s/e);s-=e*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,s=t>0?e:0,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,n)}else this._setEndings(!1,!1,n);this._loopCount=r,this.time=s,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this.time=s;if(n&&!(1&~r))return e-s}return s}_setEndings(t,e,i){const s=this._interpolantSettings;i?(s.endingStart=je,s.endingEnd=je):(s.endingStart=t?this.zeroSlopeAtStart?je:Le:De,s.endingEnd=e?this.zeroSlopeAtEnd?je:Le:De)}_scheduleFading(t,e,i){const s=this._mixer,r=s.time;let n=this._weightInterpolant;null===n&&(n=s._lendControlInterpolant(),this._weightInterpolant=n);const a=n.parameterPositions,o=n.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=i,this}}const Zu=new Float32Array(1);class Hu extends ls{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}_bindAction(t,e){const i=t._localRoot||this._root,s=t._clip.tracks,r=s.length,n=t._propertyBindings,a=t._interpolants,o=i.uuid,h=this._bindingsByRootAndName;let l=h[o];void 0===l&&(l={},h[o]=l);for(let t=0;t!==r;++t){const r=s[t],h=r.name;let c=l[h];if(void 0!==c)++c.referenceCount,n[t]=c;else{if(c=n[t],void 0!==c){null===c._cacheIndex&&(++c.referenceCount,this._addInactiveBinding(c,o,h));continue}const s=e&&e._propertyBindings[t].binding.parsedPath;c=new Eu(Ju.create(i,h,s),r.ValueTypeName,r.getValueSize()),++c.referenceCount,this._addInactiveBinding(c,o,h),n[t]=c}a[t].resultBuffer=c.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,i=t._clip.uuid,s=this._actionsByClip[i];this._bindAction(t,s&&s.knownActions[0]),this._addInactiveAction(t,i,e)}const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0===i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0===--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,s=this.time+=t,r=Math.sign(t),n=this._accuIndex^=1;for(let a=0;a!==i;++a){e[a]._update(s,t,r,n)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(n);return this}setTime(t){this.time=0;for(let t=0;t=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,ud).distanceTo(t)}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const pd=new Ss,md=new Ss,yd=new Ss,gd=new Ss,fd=new Ss,xd=new Ss,bd=new Ss;class vd{constructor(t=new Ss,e=new Ss){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){pd.subVectors(t,this.start),md.subVectors(this.end,this.start);const i=md.dot(md);let s=md.dot(pd)/i;return e&&(s=ys(s,0,1)),s}closestPointToPoint(t,e,i){const s=this.closestPointToPointParameter(t,e);return this.delta(i).multiplyScalar(s).add(this.start)}distanceSqToLine3(t,e=xd,i=bd){const s=1e-8*1e-8;let r,n;const a=this.start,o=t.start,h=this.end,l=t.end;yd.subVectors(h,a),gd.subVectors(l,o),fd.subVectors(a,o);const c=yd.dot(yd),u=gd.dot(gd),d=gd.dot(fd);if(c<=s&&u<=s)return e.copy(a),i.copy(o),e.sub(i),e.dot(e);if(c<=s)r=0,n=d/u,n=ys(n,0,1);else{const t=yd.dot(fd);if(u<=s)n=0,r=ys(-t/c,0,1);else{const e=yd.dot(gd),i=c*u-e*e;r=0!==i?ys((e*d-t*u)/i,0,1):0,n=(e*r+d)/u,n<0?(n=0,r=ys(-t/c,0,1)):n>1&&(n=1,r=ys((e-t)/c,0,1))}}return e.copy(a).add(yd.multiplyScalar(r)),i.copy(o).add(gd.multiplyScalar(n)),e.sub(i),e.dot(e)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}const wd=new Ss;class Md extends Hr{constructor(t,e){super(),this.light=t,this.matrixAutoUpdate=!1,this.color=e,this.type="SpotLightHelper";const i=new Jn,s=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let t=0,e=1,i=32;t1)for(let i=0;i.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{Yd.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(Yd,e)}}setLength(t,e=.2*t,i=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(i,e,i),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}}class $d extends oh{constructor(t=1){const e=[0,0,0,t,0,0,0,0,0,0,t,0,0,0,0,0,0,t],i=new Jn;i.setAttribute("position",new Fn(e,3)),i.setAttribute("color",new Fn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));super(i,new Ho({vertexColors:!0,toneMapped:!1})),this.type="AxesHelper"}setColors(t,e,i){const s=new yn,r=this.geometry.attributes.color.array;return s.set(t),s.toArray(r,0),s.toArray(r,3),s.set(e),s.toArray(r,6),s.toArray(r,9),s.set(i),s.toArray(r,12),s.toArray(r,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class Qd{constructor(){this.type="ShapePath",this.color=new yn,this.subPaths=[],this.currentPath=null}moveTo(t,e){return this.currentPath=new rl,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this}lineTo(t,e){return this.currentPath.lineTo(t,e),this}quadraticCurveTo(t,e,i,s){return this.currentPath.quadraticCurveTo(t,e,i,s),this}bezierCurveTo(t,e,i,s,r,n){return this.currentPath.bezierCurveTo(t,e,i,s,r,n),this}splineThru(t){return this.currentPath.splineThru(t),this}toShapes(t){function e(t,e){const i=e.length;let s=!1;for(let r=i-1,n=0;nNumber.EPSILON){if(h<0&&(i=e[n],o=-o,a=e[r],h=-h),t.ya.y)continue;if(t.y===i.y){if(t.x===i.x)return!0}else{const e=h*(t.x-i.x)-o*(t.y-i.y);if(0===e)return!0;if(e<0)continue;s=!s}}else{if(t.y!==i.y)continue;if(a.x<=t.x&&t.x<=i.x||i.x<=t.x&&t.x<=a.x)return!0}}return s}const i=Pl.isClockWise,s=this.subPaths;if(0===s.length)return[];let r,n,a;const o=[];if(1===s.length)return n=s[0],a=new nl,a.curves=n.curves,o.push(a),o;let h=!i(s[0].getPoints());h=t?!h:h;const l=[],c=[];let u,d,p=[],m=0;c[m]=void 0,p[m]=[];for(let e=0,a=s.length;e1){let t=!1,i=0;for(let t=0,e=c.length;t0&&!1===t&&(p=l)}for(let t=0,e=c.length;te?(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2):(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0),t}(t,e)}static cover(t,e){return function(t,e){const i=t.image&&t.image.width?t.image.width/t.image.height:1;return i>e?(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0):(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2),t}(t,e)}static fill(t){return function(t){return t.repeat.x=1,t.repeat.y=1,t.offset.x=0,t.offset.y=0,t}(t)}static getByteLength(t,e,i,s){return tp(t,e,i,s)}}"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:t}})),"undefined"!=typeof window&&(window.__THREE__?ns("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=t);export{it as ACESFilmicToneMapping,w as AddEquation,$ as AddOperation,We as AdditiveAnimationBlendMode,g as AdditiveBlending,rt as AgXToneMapping,jt as AlphaFormat,Bi as AlwaysCompare,U as AlwaysDepth,Mi as AlwaysStencilFunc,iu as AmbientLight,Yu as AnimationAction,zc as AnimationClip,Vc as AnimationLoader,Hu as AnimationMixer,Xu as AnimationObjectGroup,mc as AnimationUtils,Lh as ArcCurve,Su as ArrayCamera,Gd as ArrowHelper,at as AttachedBindMode,ku as Audio,Fu as AudioAnalyser,fu as AudioContext,Bu as AudioListener,xu as AudioLoader,$d as AxesHelper,d as BackSide,Ye as BasicDepthPacking,o as BasicShadowMap,Zo as BatchedMesh,ro as Bone,vc as BooleanKeyframeTrack,dd as Box2,Hs as Box3,Jd as Box3Helper,na as BoxGeometry,qd as BoxHelper,Cn as BufferAttribute,Jn as BufferGeometry,lu as BufferGeometryLoader,Ct as ByteType,Ic as Cache,ua as Camera,Dd as CameraHelper,Mh as CanvasTexture,Th as CapsuleGeometry,Jh as CatmullRomCurve3,et as CineonToneMapping,zh as CircleGeometry,yt as ClampToEdgeWrapping,_u as Clock,yn as Color,wc as ColorKeyframeTrack,ks as ColorManagement,Yi as Compatibility,vh as CompressedArrayTexture,wh as CompressedCubeTexture,bh as CompressedTexture,Fc as CompressedTextureLoader,Ih as ConeGeometry,L as ConstantAlphaFactor,F as ConstantColorFactor,Kd as Controls,fa as CubeCamera,_h as CubeDepthTexture,lt as CubeReflectionMapping,ct as CubeRefractionMapping,xa as CubeTexture,jc as CubeTextureLoader,pt as CubeUVReflectionMapping,Hh as CubicBezierCurve,Gh as CubicBezierCurve3,gc as CubicInterpolant,r as CullFaceBack,n as CullFaceFront,a as CullFaceFrontBack,s as CullFaceNone,Fh as Curve,sl as CurvePath,b as CustomBlending,st as CustomToneMapping,Ch as CylinderGeometry,ld as Cylindrical,Ys as Data3DTexture,Js as DataArrayTexture,no as DataTexture,Dc as DataTextureLoader,_n as DataUtils,ui as DecrementStencilOp,pi as DecrementWrapStencilOp,kc as DefaultLoadingManager,Wt as DepthFormat,qt as DepthStencilFormat,Sh as DepthTexture,ot as DetachedBindMode,eu as DirectionalLight,Ed as DirectionalLightHelper,xc as DiscreteInterpolant,kh as DodecahedronGeometry,p as DoubleSide,O as DstAlphaFactor,R as DstColorFactor,Ei as DynamicCopyUsage,Oi as DynamicDrawUsage,Ni as DynamicReadUsage,Vh as EdgesGeometry,Eh as EllipseCurve,Ai as EqualCompare,J as EqualDepth,fi as EqualStencilFunc,ut as EquirectangularReflectionMapping,dt as EquirectangularRefractionMapping,Or as Euler,ls as EventDispatcher,Ah as ExternalTexture,Vl as ExtrudeGeometry,Nc as FileLoader,Vn as Float16BufferAttribute,Fn as Float32BufferAttribute,Pt as FloatType,_a as Fog,Sa as FogExp2,xh as FramebufferTexture,u as FrontSide,To as Frustum,Io as FrustumArray,ed as GLBufferAttribute,ji as GLSL1,Di as GLSL3,zi as GreaterCompare,Y as GreaterDepth,Ii as GreaterEqualCompare,X as GreaterEqualDepth,wi as GreaterEqualStencilFunc,bi as GreaterStencilFunc,Pd as GridHelper,va as Group,Rt as HalfFloatType,qc as HemisphereLight,Od as HemisphereLightHelper,El as IcosahedronGeometry,yu as ImageBitmapLoader,Lc as ImageLoader,Ns as ImageUtils,ci as IncrementStencilOp,di as IncrementWrapStencilOp,lo as InstancedBufferAttribute,hu as InstancedBufferGeometry,td as InstancedInterleavedBuffer,xo as InstancedMesh,On as Int16BufferAttribute,Rn as Int32BufferAttribute,In as Int8BufferAttribute,kt as IntType,Ta as InterleavedBuffer,Ca as InterleavedBufferAttribute,yc as Interpolant,Ve as InterpolateDiscrete,Fe as InterpolateLinear,Ee as InterpolateSmooth,Xi as InterpolationSamplingMode,Ji as InterpolationSamplingType,mi as InvertStencilOp,hi as KeepStencilOp,bc as KeyframeTrack,Ya as LOD,Ll as LatheGeometry,Pr as Layers,_i as LessCompare,W as LessDepth,Ti as LessEqualCompare,q as LessEqualDepth,xi as LessEqualStencilFunc,gi as LessStencilFunc,Wc as Light,nu as LightProbe,sh as Line,vd as Line3,Ho as LineBasicMaterial,$h as LineCurve,Qh as LineCurve3,lc as LineDashedMaterial,hh as LineLoop,oh as LineSegments,Mt as LinearFilter,fc as LinearInterpolant,Tt as LinearMipMapLinearFilter,_t as LinearMipMapNearestFilter,At as LinearMipmapLinearFilter,St as LinearMipmapNearestFilter,ei as LinearSRGBColorSpace,K as LinearToneMapping,ii as LinearTransfer,Oc as Loader,ou as LoaderUtils,Bc as LoadingManager,Pe as LoopOnce,Ne as LoopPingPong,Re as LoopRepeat,e as MOUSE,xn as Material,v as MaterialBlending,au as MaterialLoader,vs as MathUtils,cd as Matrix2,Ts as Matrix3,Mr as Matrix4,A as MaxEquation,sa as Mesh,bn as MeshBasicMaterial,ac as MeshDepthMaterial,oc as MeshDistanceMaterial,nc as MeshLambertMaterial,hc as MeshMatcapMaterial,rc as MeshNormalMaterial,ic as MeshPhongMaterial,ec as MeshPhysicalMaterial,tc as MeshStandardMaterial,sc as MeshToonMaterial,_ as MinEquation,gt as MirroredRepeatWrapping,G as MixOperation,x as MultiplyBlending,H as MultiplyOperation,ft as NearestFilter,wt as NearestMipMapLinearFilter,bt as NearestMipMapNearestFilter,vt as NearestMipmapLinearFilter,xt as NearestMipmapNearestFilter,nt as NeutralToneMapping,Si as NeverCompare,D as NeverDepth,yi as NeverStencilFunc,m as NoBlending,Ke as NoColorSpace,ri as NoNormalPacking,Q as NoToneMapping,Ue as NormalAnimationBlendMode,y as NormalBlending,ai as NormalGAPacking,ni as NormalRGPacking,Ci as NotEqualCompare,Z as NotEqualDepth,vi as NotEqualStencilFunc,Mc as NumberKeyframeTrack,Hr as Object3D,cu as ObjectLoader,Qe as ObjectSpaceNormalMap,jl as OctahedronGeometry,z as OneFactor,j as OneMinusConstantAlphaFactor,E as OneMinusConstantColorFactor,P as OneMinusDstAlphaFactor,N as OneMinusDstColorFactor,k as OneMinusSrcAlphaFactor,I as OneMinusSrcColorFactor,Kc as OrthographicCamera,h as PCFShadowMap,l as PCFSoftShadowMap,rl as Path,ya as PerspectiveCamera,Mo as Plane,Dl as PlaneGeometry,Xd as PlaneHelper,Qc as PointLight,Cd as PointLightHelper,mh as Points,lh as PointsMaterial,Rd as PolarGridHelper,Bh as PolyhedronGeometry,Vu as PositionalAudio,Ju as PropertyBinding,Eu as PropertyMixer,Kh as QuadraticBezierCurve,tl as QuadraticBezierCurve3,Ms as Quaternion,_c as QuaternionKeyframeTrack,Sc as QuaternionLinearInterpolant,he as R11_EAC_Format,ps as RAD2DEG,ke as RED_GREEN_RGTC2_Format,Ie as RED_RGTC1_Format,t as REVISION,ce as RG11_EAC_Format,Ze as RGBADepthPacking,Ut as RGBAFormat,Gt as RGBAIntegerFormat,Se as RGBA_ASTC_10x10_Format,ve as RGBA_ASTC_10x5_Format,we as RGBA_ASTC_10x6_Format,Me as RGBA_ASTC_10x8_Format,_e as RGBA_ASTC_12x10_Format,Ae as RGBA_ASTC_12x12_Format,de as RGBA_ASTC_4x4_Format,pe as RGBA_ASTC_5x4_Format,me as RGBA_ASTC_5x5_Format,ye as RGBA_ASTC_6x5_Format,ge as RGBA_ASTC_6x6_Format,fe as RGBA_ASTC_8x5_Format,xe as RGBA_ASTC_8x6_Format,be as RGBA_ASTC_8x8_Format,Te as RGBA_BPTC_Format,oe as RGBA_ETC2_EAC_Format,re as RGBA_PVRTC_2BPPV1_Format,se as RGBA_PVRTC_4BPPV1_Format,Qt as RGBA_S3TC_DXT1_Format,Kt as RGBA_S3TC_DXT3_Format,te as RGBA_S3TC_DXT5_Format,He as RGBDepthPacking,Dt as RGBFormat,Ht as RGBIntegerFormat,ze as RGB_BPTC_SIGNED_Format,Ce as RGB_BPTC_UNSIGNED_Format,ne as RGB_ETC1_Format,ae as RGB_ETC2_Format,ie as RGB_PVRTC_2BPPV1_Format,ee as RGB_PVRTC_4BPPV1_Format,$t as RGB_S3TC_DXT1_Format,Ge as RGDepthPacking,Yt as RGFormat,Zt as RGIntegerFormat,Kl as RawShaderMaterial,wr as Ray,sd as Raycaster,su as RectAreaLight,Jt as RedFormat,Xt as RedIntegerFormat,tt as ReinhardToneMapping,Ws as RenderTarget,Gu as RenderTarget3D,mt as RepeatWrapping,li as ReplaceStencilOp,S as ReverseSubtractEquation,Ul as RingGeometry,le as SIGNED_R11_EAC_Format,Oe as SIGNED_RED_GREEN_RGTC2_Format,Be as SIGNED_RED_RGTC1_Format,ue as SIGNED_RG11_EAC_Format,ti as SRGBColorSpace,si as SRGBTransfer,Aa as Scene,ca as ShaderMaterial,Ql as ShadowMaterial,nl as Shape,Wl as ShapeGeometry,Qd as ShapePath,Pl as ShapeUtils,It as ShortType,ho as Skeleton,Td as SkeletonHelper,so as SkinnedMesh,Fs as Source,pr as Sphere,ql as SphereGeometry,hd as Spherical,ru as SphericalHarmonics3,el as SplineCurve,Gc as SpotLight,Md as SpotLightHelper,Wa as Sprite,Ia as SpriteMaterial,B as SrcAlphaFactor,V as SrcAlphaSaturateFactor,C as SrcColorFactor,Fi as StaticCopyUsage,ki as StaticDrawUsage,Ri as StaticReadUsage,Mu as StereoCamera,Li as StreamCopyUsage,Pi as StreamDrawUsage,Vi as StreamReadUsage,Ac as StringKeyframeTrack,M as SubtractEquation,f as SubtractiveBlending,i as TOUCH,$e as TangentSpaceNormalMap,Jl as TetrahedronGeometry,Ds as Texture,Uc as TextureLoader,ep as TextureUtils,ad as Timer,qi as TimestampQuery,Xl as TorusGeometry,Yl as TorusKnotGeometry,cn as Triangle,Xe as TriangleFanDrawMode,Je as TriangleStripDrawMode,qe as TrianglesDrawMode,Zl as TubeGeometry,ht as UVMapping,Pn as Uint16BufferAttribute,Nn as Uint32BufferAttribute,Bn as Uint8BufferAttribute,kn as Uint8ClampedBufferAttribute,$u as Uniform,Ku as UniformsGroup,la as UniformsUtils,zt as UnsignedByteType,Lt as UnsignedInt101111Type,Ft as UnsignedInt248Type,Et as UnsignedInt5999Type,Ot as UnsignedIntType,Nt as UnsignedShort4444Type,Vt as UnsignedShort5551Type,Bt as UnsignedShortType,c as VSMShadowMap,ws as Vector2,Ss as Vector3,Us as Vector4,Tc as VectorKeyframeTrack,fh as VideoFrameTexture,gh as VideoTexture,Zs as WebGL3DRenderTarget,Xs as WebGLArrayRenderTarget,Ui as WebGLCoordinateSystem,ba as WebGLCubeRenderTarget,qs as WebGLRenderTarget,Wi as WebGPUCoordinateSystem,Ma as WebXRController,Hl as WireframeGeometry,De as WrapAroundEnding,Le as ZeroCurvatureEnding,T as ZeroFactor,je as ZeroSlopeEnding,oi as ZeroStencilOp,Zi as arrayNeedsUint32,aa as cloneUniforms,Ki as createCanvasElement,Qi as createElementNS,as as error,tp as getByteLength,ss as getConsoleFunction,ha as getUnlitUniformColorSpace,$i as isTypedArray,rs as log,oa as mergeUniforms,hs as probeAsync,is as setConsoleFunction,ns as warn,os as warnOnce}; diff --git a/build/three.module.js b/build/three.module.js index 85042d19347bbf..f352369f0c80f0 100644 --- a/build/three.module.js +++ b/build/three.module.js @@ -3,7 +3,7 @@ * Copyright 2010-2026 Three.js Authors * SPDX-License-Identifier: MIT */ -import { Matrix3, Vector2, Color, mergeUniforms, Vector3, CubeUVReflectionMapping, Mesh, BoxGeometry, ShaderMaterial, BackSide, cloneUniforms, Euler, Matrix4, ColorManagement, SRGBTransfer, PlaneGeometry, FrontSide, getUnlitUniformColorSpace, IntType, warn, HalfFloatType, UnsignedByteType, FloatType, RGBAFormat, Plane, EquirectangularReflectionMapping, EquirectangularRefractionMapping, WebGLCubeRenderTarget, CubeReflectionMapping, CubeRefractionMapping, BufferGeometry, OrthographicCamera, PerspectiveCamera, NoToneMapping, MeshBasicMaterial, error, NoBlending, WebGLRenderTarget, BufferAttribute, LinearSRGBColorSpace, LinearFilter, warnOnce, Uint32BufferAttribute, Uint16BufferAttribute, arrayNeedsUint32, Vector4, DataArrayTexture, Float32BufferAttribute, RawShaderMaterial, CustomToneMapping, NeutralToneMapping, AgXToneMapping, ACESFilmicToneMapping, CineonToneMapping, ReinhardToneMapping, LinearToneMapping, CubeTexture, Data3DTexture, GreaterEqualCompare, LessEqualCompare, DepthTexture, Texture, GLSL3, VSMShadowMap, PCFShadowMap, AddOperation, MixOperation, MultiplyOperation, LinearTransfer, UniformsUtils, DoubleSide, NormalBlending, TangentSpaceNormalMap, ObjectSpaceNormalMap, Layers, RGFormat, Frustum, MeshDepthMaterial, MeshDistanceMaterial, PCFSoftShadowMap, DepthFormat, NearestFilter, CubeDepthTexture, UnsignedIntType, LessEqualDepth, ReverseSubtractEquation, SubtractEquation, AddEquation, OneMinusConstantAlphaFactor, ConstantAlphaFactor, OneMinusConstantColorFactor, ConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, DstAlphaFactor, DstColorFactor, SrcAlphaSaturateFactor, SrcAlphaFactor, SrcColorFactor, OneFactor, ZeroFactor, NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceNone, CullFaceBack, CullFaceFront, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, MinEquation, MaxEquation, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NotEqualCompare, GreaterCompare, EqualCompare, LessCompare, AlwaysCompare, NeverCompare, NoColorSpace, DepthStencilFormat, getByteLength, UnsignedInt248Type, UnsignedShortType, createElementNS, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt5999Type, UnsignedInt101111Type, ByteType, ShortType, AlphaFormat, RGBFormat, RedFormat, RedIntegerFormat, RGIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, R11_EAC_Format, SIGNED_R11_EAC_Format, RG11_EAC_Format, SIGNED_RG11_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, ExternalTexture, EventDispatcher, ArrayCamera, WebXRController, RAD2DEG, DataTexture, createCanvasElement, SRGBColorSpace, REVISION, log, WebGLCoordinateSystem, probeAsync } from './three.core.js'; +import { Matrix3, Vector2, Color, mergeUniforms, Vector3, CubeUVReflectionMapping, Mesh, BoxGeometry, ShaderMaterial, BackSide, cloneUniforms, Euler, Matrix4, ColorManagement, SRGBTransfer, PlaneGeometry, FrontSide, getUnlitUniformColorSpace, IntType, warn, HalfFloatType, UnsignedByteType, FloatType, RGBAFormat, Plane, CubeReflectionMapping, CubeRefractionMapping, BufferGeometry, OrthographicCamera, PerspectiveCamera, NoToneMapping, MeshBasicMaterial, error, NoBlending, WebGLRenderTarget, BufferAttribute, LinearSRGBColorSpace, LinearFilter, EquirectangularReflectionMapping, EquirectangularRefractionMapping, WebGLCubeRenderTarget, warnOnce, Uint32BufferAttribute, Uint16BufferAttribute, arrayNeedsUint32, Vector4, DataArrayTexture, Float32BufferAttribute, RawShaderMaterial, CustomToneMapping, NeutralToneMapping, AgXToneMapping, ACESFilmicToneMapping, CineonToneMapping, ReinhardToneMapping, LinearToneMapping, CubeTexture, Data3DTexture, GreaterEqualCompare, LessEqualCompare, DepthTexture, Texture, GLSL3, VSMShadowMap, PCFShadowMap, AddOperation, MixOperation, MultiplyOperation, LinearTransfer, UniformsUtils, DoubleSide, NormalBlending, TangentSpaceNormalMap, ObjectSpaceNormalMap, Layers, RGFormat, Frustum, MeshDepthMaterial, MeshDistanceMaterial, PCFSoftShadowMap, DepthFormat, NearestFilter, CubeDepthTexture, UnsignedIntType, LessEqualDepth, ReverseSubtractEquation, SubtractEquation, AddEquation, OneMinusConstantAlphaFactor, ConstantAlphaFactor, OneMinusConstantColorFactor, ConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, DstAlphaFactor, DstColorFactor, SrcAlphaSaturateFactor, SrcAlphaFactor, SrcColorFactor, OneFactor, ZeroFactor, NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceNone, CullFaceBack, CullFaceFront, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, MinEquation, MaxEquation, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NotEqualCompare, GreaterCompare, EqualCompare, LessCompare, AlwaysCompare, NeverCompare, NoColorSpace, DepthStencilFormat, getByteLength, UnsignedInt248Type, UnsignedShortType, createElementNS, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt5999Type, UnsignedInt101111Type, ByteType, ShortType, AlphaFormat, RGBFormat, RedFormat, RedIntegerFormat, RGIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, R11_EAC_Format, SIGNED_R11_EAC_Format, RG11_EAC_Format, SIGNED_RG11_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, ExternalTexture, EventDispatcher, ArrayCamera, WebXRController, RAD2DEG, DataTexture, createCanvasElement, SRGBColorSpace, REVISION, log, WebGLCoordinateSystem, probeAsync } from './three.core.js'; export { AdditiveAnimationBlendMode, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxHelper, BufferGeometryLoader, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CircleGeometry, Clock, ColorKeyframeTrack, Compatibility, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, Controls, CubeCamera, CubeTextureLoader, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceFrontBack, Curve, CurvePath, CylinderGeometry, Cylindrical, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualStencilFunc, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Fog, FogExp2, FramebufferTexture, FrustumArray, GLBufferAttribute, GLSL1, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialBlending, MaterialLoader, MathUtils, Matrix2, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NeverStencilFunc, NoNormalPacking, NormalAnimationBlendMode, NormalGAPacking, NormalRGPacking, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, OctahedronGeometry, Path, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RGBADepthPacking, RGBDepthPacking, RGBIntegerFormat, RGDepthPacking, Ray, Raycaster, RectAreaLight, RenderTarget, RenderTarget3D, ReplaceStencilOp, RingGeometry, Scene, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, TOUCH, TetrahedronGeometry, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroSlopeEnding, ZeroStencilOp, getConsoleFunction, setConsoleFunction } from './three.core.js'; function WebGLAnimation() { @@ -309,7 +309,7 @@ var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; -var batching_pars_vertex = "#ifdef USE_BATCHING\n\t#if ! defined( GL_ANGLE_multi_draw )\n\t#define gl_DrawID _gl_DrawID\n\tuniform int _gl_DrawID;\n\t#endif\n\tuniform highp sampler2D batchingTexture;\n\tuniform highp usampler2D batchingIdTexture;\n\tmat4 getBatchingMatrix( const in float i ) {\n\t\tint size = textureSize( batchingTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n\tfloat getIndirectIndex( const in int i ) {\n\t\tint size = textureSize( batchingIdTexture, 0 ).x;\n\t\tint x = i % size;\n\t\tint y = i / size;\n\t\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\n\t}\n#endif\n#ifdef USE_BATCHING_COLOR\n\tuniform sampler2D batchingColorTexture;\n\tvec3 getBatchingColor( const in float i ) {\n\t\tint size = textureSize( batchingColorTexture, 0 ).x;\n\t\tint j = int( i );\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\n\t}\n#endif"; +var batching_pars_vertex = "#ifdef USE_BATCHING\n\t#if ! defined( GL_ANGLE_multi_draw )\n\t#define gl_DrawID _gl_DrawID\n\tuniform int _gl_DrawID;\n\t#endif\n\tuniform highp sampler2D batchingTexture;\n\tuniform highp usampler2D batchingIdTexture;\n\tmat4 getBatchingMatrix( const in float i ) {\n\t\tint size = textureSize( batchingTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n\tfloat getIndirectIndex( const in int i ) {\n\t\tint size = textureSize( batchingIdTexture, 0 ).x;\n\t\tint x = i % size;\n\t\tint y = i / size;\n\t\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\n\t}\n#endif\n#ifdef USE_BATCHING_COLOR\n\tuniform sampler2D batchingColorTexture;\n\tvec4 getBatchingColor( const in float i ) {\n\t\tint size = textureSize( batchingColorTexture, 0 ).x;\n\t\tint j = int( i );\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 );\n\t}\n#endif"; var batching_vertex = "#ifdef USE_BATCHING\n\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\n#endif"; @@ -331,13 +331,13 @@ var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 v var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif"; -var color_fragment = "#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif"; +var color_fragment = "#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#endif"; -var color_pars_fragment = "#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif"; +var color_pars_fragment = "#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#endif"; -var color_pars_vertex = "#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec3 vColor;\n#endif"; +var color_pars_vertex = "#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec4 vColor;\n#endif"; -var color_vertex = "#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.xyz;\n#endif"; +var color_vertex = "#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec4( 1.0 );\n#endif\n#ifdef USE_COLOR_ALPHA\n\tvColor *= color;\n#elif defined( USE_COLOR )\n\tvColor.rgb *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.rgb *= instanceColor.rgb;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvColor *= getBatchingColor( getIndirectIndex( gl_DrawID ) );\n#endif"; var common = "#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated"; @@ -357,7 +357,7 @@ var colorspace_fragment = "gl_FragColor = linearToOutputTexel( gl_FragColor );"; var colorspace_pars_fragment = "vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}"; -var envmap_fragment = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif"; +var envmap_fragment = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t\t#endif\n\t#endif\n#endif"; var envmap_common_pars_fragment = "#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n#endif"; @@ -401,9 +401,9 @@ var lights_physical_pars_fragment = "uniform sampler2D dfgLUT;\nstruct PhysicalM var lights_fragment_begin = "\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\n\t\tmaterial.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif"; -var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif"; +var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\t#if defined( STANDARD ) || defined( LAMBERT ) || defined( PHONG )\n\t\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t\t#endif\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif"; -var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif"; +var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\t#if defined( LAMBERT ) || defined( PHONG )\n\t\tirradiance += iblIrradiance;\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif"; var logdepthbuf_fragment = "#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif"; @@ -457,7 +457,7 @@ var iridescence_pars_fragment = "#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D var opaque_fragment = "#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );"; -var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}"; +var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\n\t\treturn depth * ( far - near ) - far;\n\t#else\n\t\treturn depth * ( near - far ) - near;\n\t#endif\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\t\n\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\treturn ( near * far ) / ( ( near - far ) * depth - near );\n\t#else\n\t\treturn ( near * far ) / ( ( far - near ) * depth - far );\n\t#endif\n}"; var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif"; @@ -471,7 +471,7 @@ var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUG var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; -var shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat dp = 1.0 - shadowCoord.z;\n\t\t\t\t#else\n\t\t\t\t\tfloat dp = shadowCoord.z;\n\t\t\t\t#endif\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, dp ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tdepth = 1.0 - depth;\n\t\t\t\t#endif\n\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tfloat dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp -= shadowBias;\n\t\t\t#else\n\t\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp += shadowBias;\n\t\t\t#endif\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\tvec2 sample0 = vogelDiskSample( 0, 5, phi );\n\t\t\tvec2 sample1 = vogelDiskSample( 1, 5, phi );\n\t\t\tvec2 sample2 = vogelDiskSample( 2, 5, phi );\n\t\t\tvec2 sample3 = vogelDiskSample( 3, 5, phi );\n\t\t\tvec2 sample4 = vogelDiskSample( 4, 5, phi );\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tshadow = step( dp, depth );\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\n#endif"; +var shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadowCoord.z -= shadowBias;\n\t\t\t#else\n\t\t\t\tshadowCoord.z += shadowBias;\n\t\t\t#endif\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat hard_shadow = step( mean, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\t#endif\n\t\t\t\t\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadowCoord.z -= shadowBias;\n\t\t\t#else\n\t\t\t\tshadowCoord.z += shadowBias;\n\t\t\t#endif\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tshadow = step( depth, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t\t#endif\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tfloat dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp -= shadowBias;\n\t\t\t#else\n\t\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp += shadowBias;\n\t\t\t#endif\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\tvec2 sample0 = vogelDiskSample( 0, 5, phi );\n\t\t\tvec2 sample1 = vogelDiskSample( 1, 5, phi );\n\t\t\tvec2 sample2 = vogelDiskSample( 2, 5, phi );\n\t\t\tvec2 sample3 = vogelDiskSample( 3, 5, phi );\n\t\t\tvec2 sample4 = vogelDiskSample( 4, 5, phi );\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tshadow = step( dp, depth );\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\n#endif"; var shadowmap_pars_vertex = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif"; @@ -541,7 +541,7 @@ const fragment$a = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_ const vertex$9 = "#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}"; -const fragment$9 = "#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; +const fragment$9 = "#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; const vertex$8 = "#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}"; @@ -553,7 +553,7 @@ const fragment$7 = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SH const vertex$6 = "#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}"; -const fragment$6 = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; +const fragment$6 = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; const vertex$5 = "#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}"; @@ -977,7 +977,8 @@ const ShaderLib = { UniformsLib.fog, UniformsLib.lights, { - emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) } + emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }, + envMapIntensity: { value: 1 } } ] ), @@ -1003,7 +1004,8 @@ const ShaderLib = { { emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }, specular: { value: /*@__PURE__*/ new Color( 0x111111 ) }, - shininess: { value: 30 } + shininess: { value: 30 }, + envMapIntensity: { value: 1 } } ] ), @@ -1299,7 +1301,7 @@ const _rgb = { r: 0, b: 0, g: 0 }; const _e1$1 = /*@__PURE__*/ new Euler(); const _m1$1 = /*@__PURE__*/ new Matrix4(); -function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) { +function WebGLBackground( renderer, environments, state, objects, alpha, premultipliedAlpha ) { const clearColor = new Color( 0x000000 ); let clearAlpha = alpha === true ? 0 : 1; @@ -1318,7 +1320,7 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, if ( background && background.isTexture ) { const usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background - background = ( usePMREM ? cubeuvmaps : cubemaps ).get( background ); + background = environments.get( background, usePMREM ); } @@ -2638,101 +2640,6 @@ function WebGLClipping( properties ) { } -function WebGLCubeMaps( renderer ) { - - let cubemaps = new WeakMap(); - - function mapTextureMapping( texture, mapping ) { - - if ( mapping === EquirectangularReflectionMapping ) { - - texture.mapping = CubeReflectionMapping; - - } else if ( mapping === EquirectangularRefractionMapping ) { - - texture.mapping = CubeRefractionMapping; - - } - - return texture; - - } - - function get( texture ) { - - if ( texture && texture.isTexture ) { - - const mapping = texture.mapping; - - if ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) { - - if ( cubemaps.has( texture ) ) { - - const cubemap = cubemaps.get( texture ).texture; - return mapTextureMapping( cubemap, texture.mapping ); - - } else { - - const image = texture.image; - - if ( image && image.height > 0 ) { - - const renderTarget = new WebGLCubeRenderTarget( image.height ); - renderTarget.fromEquirectangularTexture( renderer, texture ); - cubemaps.set( texture, renderTarget ); - - texture.addEventListener( 'dispose', onTextureDispose ); - - return mapTextureMapping( renderTarget.texture, texture.mapping ); - - } else { - - // image not yet ready. try the conversion next frame - - return null; - - } - - } - - } - - } - - return texture; - - } - - function onTextureDispose( event ) { - - const texture = event.target; - - texture.removeEventListener( 'dispose', onTextureDispose ); - - const cubemap = cubemaps.get( texture ); - - if ( cubemap !== undefined ) { - - cubemaps.delete( texture ); - cubemap.dispose(); - - } - - } - - function dispose() { - - cubemaps = new WeakMap(); - - } - - return { - get: get, - dispose: dispose - }; - -} - const LOD_MIN = 4; // The standard deviations (radians) associated with the extra mips. @@ -3873,13 +3780,73 @@ function _getCommonVertexShader() { } -function WebGLCubeUVMaps( renderer ) { +function WebGLEnvironments( renderer ) { - let cubeUVmaps = new WeakMap(); + let cubeMaps = new WeakMap(); + let pmremMaps = new WeakMap(); let pmremGenerator = null; - function get( texture ) { + function get( texture, usePMREM = false ) { + + if ( texture === null || texture === undefined ) return null; + + if ( usePMREM ) { + + return getPMREM( texture ); + + } + + return getCube( texture ); + + } + + function getCube( texture ) { + + if ( texture && texture.isTexture ) { + + const mapping = texture.mapping; + + if ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) { + + if ( cubeMaps.has( texture ) ) { + + const cubemap = cubeMaps.get( texture ).texture; + return mapTextureMapping( cubemap, texture.mapping ); + + } else { + + const image = texture.image; + + if ( image && image.height > 0 ) { + + const renderTarget = new WebGLCubeRenderTarget( image.height ); + renderTarget.fromEquirectangularTexture( renderer, texture ); + cubeMaps.set( texture, renderTarget ); + + texture.addEventListener( 'dispose', onCubemapDispose ); + + return mapTextureMapping( renderTarget.texture, texture.mapping ); + + } else { + + // image not yet ready. try the conversion next frame + + return null; + + } + + } + + } + + } + + return texture; + + } + + function getPMREM( texture ) { if ( texture && texture.isTexture ) { @@ -3892,7 +3859,7 @@ function WebGLCubeUVMaps( renderer ) { if ( isEquirectMap || isCubeMap ) { - let renderTarget = cubeUVmaps.get( texture ); + let renderTarget = pmremMaps.get( texture ); const currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0; @@ -3903,7 +3870,7 @@ function WebGLCubeUVMaps( renderer ) { renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget ); renderTarget.texture.pmremVersion = texture.pmremVersion; - cubeUVmaps.set( texture, renderTarget ); + pmremMaps.set( texture, renderTarget ); return renderTarget.texture; @@ -3924,9 +3891,9 @@ function WebGLCubeUVMaps( renderer ) { renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture ); renderTarget.texture.pmremVersion = texture.pmremVersion; - cubeUVmaps.set( texture, renderTarget ); + pmremMaps.set( texture, renderTarget ); - texture.addEventListener( 'dispose', onTextureDispose ); + texture.addEventListener( 'dispose', onPMREMDispose ); return renderTarget.texture; @@ -3950,6 +3917,22 @@ function WebGLCubeUVMaps( renderer ) { } + function mapTextureMapping( texture, mapping ) { + + if ( mapping === EquirectangularReflectionMapping ) { + + texture.mapping = CubeReflectionMapping; + + } else if ( mapping === EquirectangularRefractionMapping ) { + + texture.mapping = CubeRefractionMapping; + + } + + return texture; + + } + function isCubeTextureComplete( image ) { let count = 0; @@ -3963,21 +3946,37 @@ function WebGLCubeUVMaps( renderer ) { return count === length; + } + + function onCubemapDispose( event ) { + + const texture = event.target; + + texture.removeEventListener( 'dispose', onCubemapDispose ); + + const cubemap = cubeMaps.get( texture ); + + if ( cubemap !== undefined ) { + + cubeMaps.delete( texture ); + cubemap.dispose(); + + } } - function onTextureDispose( event ) { + function onPMREMDispose( event ) { const texture = event.target; - texture.removeEventListener( 'dispose', onTextureDispose ); + texture.removeEventListener( 'dispose', onPMREMDispose ); - const cubemapUV = cubeUVmaps.get( texture ); + const pmrem = pmremMaps.get( texture ); - if ( cubemapUV !== undefined ) { + if ( pmrem !== undefined ) { - cubeUVmaps.delete( texture ); - cubemapUV.dispose(); + pmremMaps.delete( texture ); + pmrem.dispose(); } @@ -3985,7 +3984,8 @@ function WebGLCubeUVMaps( renderer ) { function dispose() { - cubeUVmaps = new WeakMap(); + cubeMaps = new WeakMap(); + pmremMaps = new WeakMap(); if ( pmremGenerator !== null ) { @@ -6836,8 +6836,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) { parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '', parameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '', - parameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? '#define USE_COLOR' : '', - parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '', + parameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '', + parameters.vertexAlphas || parameters.batchingColor ? '#define USE_COLOR_ALPHA' : '', parameters.vertexUv1s ? '#define USE_UV1' : '', parameters.vertexUv2s ? '#define USE_UV2' : '', parameters.vertexUv3s ? '#define USE_UV3' : '', @@ -7251,7 +7251,7 @@ class WebGLShaderStage { } -function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) { +function WebGLPrograms( renderer, environments, extensions, capabilities, bindingStates, clipping ) { const _programLayers = new Layers(); const _customShaders = new WebGLShaderCache(); @@ -7295,9 +7295,10 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities const fog = scene.fog; const geometry = object.geometry; - const environment = material.isMeshStandardMaterial ? scene.environment : null; + const environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) ? scene.environment : null; - const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment ); + const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ) || ( material.isMeshPhongMaterial && ! material.envMap ); + const envMap = environments.get( material.envMap || environment, usePMREM ); const envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null; const shaderID = shaderIDs[ material.type ]; @@ -8888,7 +8889,7 @@ function WebGLRenderStates( extensions ) { const vertex = "void main() {\n\tgl_Position = vec4( position, 1.0 );\n}"; -const fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"; +const fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"; const _cubeDirections = [ /*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( -1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ), @@ -9069,6 +9070,9 @@ function WebGLShadowMap( renderer, objects, capabilities ) { } + const reversedDepthBuffer = renderer.state.buffers.depth.getReversed(); + shadow.camera._reversedDepth = reversedDepthBuffer; + if ( shadow.map === null || typeChanged === true ) { if ( shadow.map !== null ) { @@ -9127,8 +9131,6 @@ function WebGLShadowMap( renderer, objects, capabilities ) { shadow.map.depthTexture.name = light.name + '.shadowMap'; shadow.map.depthTexture.format = DepthFormat; - const reversedDepthBuffer = renderer.state.buffers.depth.getReversed(); - if ( this.type === PCFShadowMap ) { shadow.map.depthTexture.compareFunction = reversedDepthBuffer ? GreaterEqualCompare : LessEqualCompare; @@ -14680,6 +14682,12 @@ function WebGLMaterials( renderer, properties ) { refreshUniformsCommon( uniforms, material ); + if ( material.envMap ) { + + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + } else if ( material.isMeshToonMaterial ) { refreshUniformsCommon( uniforms, material ); @@ -14690,6 +14698,12 @@ function WebGLMaterials( renderer, properties ) { refreshUniformsCommon( uniforms, material ); refreshUniformsPhong( uniforms, material ); + if ( material.envMap ) { + + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + } else if ( material.isMeshStandardMaterial ) { refreshUniformsCommon( uniforms, material ); @@ -16016,7 +16030,7 @@ class WebGLRenderer { } let extensions, capabilities, state, info; - let properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects; + let properties, textures, environments, attributes, geometries, objects; let programCache, materials, renderLists, renderStates, clipping, shadowMap; let background, morphtargets, bufferRenderer, indexedBufferRenderer; @@ -16043,19 +16057,18 @@ class WebGLRenderer { info = new WebGLInfo( _gl ); properties = new WebGLProperties(); textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ); - cubemaps = new WebGLCubeMaps( _this ); - cubeuvmaps = new WebGLCubeUVMaps( _this ); + environments = new WebGLEnvironments( _this ); attributes = new WebGLAttributes( _gl ); bindingStates = new WebGLBindingStates( _gl, attributes ); geometries = new WebGLGeometries( _gl, attributes, info, bindingStates ); objects = new WebGLObjects( _gl, geometries, attributes, bindingStates, info ); morphtargets = new WebGLMorphtargets( _gl, capabilities, textures ); clipping = new WebGLClipping( properties ); - programCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ); + programCache = new WebGLPrograms( _this, environments, extensions, capabilities, bindingStates, clipping ); materials = new WebGLMaterials( _this, properties ); renderLists = new WebGLRenderLists(); renderStates = new WebGLRenderStates( extensions ); - background = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha ); + background = new WebGLBackground( _this, environments, state, objects, _alpha, premultipliedAlpha ); shadowMap = new WebGLShadowMap( _this, objects, capabilities ); uniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state ); @@ -16657,8 +16670,7 @@ class WebGLRenderer { renderLists.dispose(); renderStates.dispose(); properties.dispose(); - cubemaps.dispose(); - cubeuvmaps.dispose(); + environments.dispose(); objects.dispose(); bindingStates.dispose(); uniformsGroups.dispose(); @@ -17737,9 +17749,11 @@ class WebGLRenderer { // always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change - materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null; + materialProperties.environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) ? scene.environment : null; materialProperties.fog = scene.fog; - materialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment ); + + const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ) || ( material.isMeshPhongMaterial && ! material.envMap ); + materialProperties.envMap = environments.get( material.envMap || materialProperties.environment, usePMREM ); materialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation; if ( programs === undefined ) { @@ -17870,9 +17884,10 @@ class WebGLRenderer { textures.resetTextureUnits(); const fog = scene.fog; - const environment = material.isMeshStandardMaterial ? scene.environment : null; + const environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) ? scene.environment : null; const colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ); - const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment ); + const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ) || ( material.isMeshPhongMaterial && ! material.envMap ); + const envMap = environments.get( material.envMap || environment, usePMREM ); const vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4; const vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 ); const morphTargets = !! geometry.morphAttributes.position; @@ -18197,7 +18212,7 @@ class WebGLRenderer { } - if ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) { + if ( ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) && material.envMap === null && scene.environment !== null ) { m_uniforms.envMapIntensity.value = scene.environmentIntensity; diff --git a/build/three.module.min.js b/build/three.module.min.js index a02f4b5793239b..aa3b4e833356cf 100644 --- a/build/three.module.min.js +++ b/build/three.module.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2026 Three.js Authors * SPDX-License-Identifier: MIT */ -import{Matrix3 as e,Vector2 as t,Color as n,mergeUniforms as i,Vector3 as r,CubeUVReflectionMapping as a,Mesh as o,BoxGeometry as s,ShaderMaterial as l,BackSide as c,cloneUniforms as d,Euler as u,Matrix4 as f,ColorManagement as p,SRGBTransfer as m,PlaneGeometry as h,FrontSide as _,getUnlitUniformColorSpace as g,IntType as v,warn as E,HalfFloatType as S,UnsignedByteType as T,FloatType as M,RGBAFormat as x,Plane as A,EquirectangularReflectionMapping as R,EquirectangularRefractionMapping as b,WebGLCubeRenderTarget as C,CubeReflectionMapping as P,CubeRefractionMapping as L,BufferGeometry as U,OrthographicCamera as D,PerspectiveCamera as w,NoToneMapping as I,MeshBasicMaterial as N,error as y,NoBlending as F,WebGLRenderTarget as O,BufferAttribute as B,LinearSRGBColorSpace as G,LinearFilter as H,warnOnce as V,Uint32BufferAttribute as W,Uint16BufferAttribute as k,arrayNeedsUint32 as z,Vector4 as X,DataArrayTexture as Y,Float32BufferAttribute as K,RawShaderMaterial as j,CustomToneMapping as q,NeutralToneMapping as Z,AgXToneMapping as $,ACESFilmicToneMapping as Q,CineonToneMapping as J,ReinhardToneMapping as ee,LinearToneMapping as te,CubeTexture as ne,Data3DTexture as ie,GreaterEqualCompare as re,LessEqualCompare as ae,DepthTexture as oe,Texture as se,GLSL3 as le,VSMShadowMap as ce,PCFShadowMap as de,AddOperation as ue,MixOperation as fe,MultiplyOperation as pe,LinearTransfer as me,UniformsUtils as he,DoubleSide as _e,NormalBlending as ge,TangentSpaceNormalMap as ve,ObjectSpaceNormalMap as Ee,Layers as Se,RGFormat as Te,Frustum as Me,MeshDepthMaterial as xe,MeshDistanceMaterial as Ae,PCFSoftShadowMap as Re,DepthFormat as be,NearestFilter as Ce,CubeDepthTexture as Pe,UnsignedIntType as Le,LessEqualDepth as Ue,ReverseSubtractEquation as De,SubtractEquation as we,AddEquation as Ie,OneMinusConstantAlphaFactor as Ne,ConstantAlphaFactor as ye,OneMinusConstantColorFactor as Fe,ConstantColorFactor as Oe,OneMinusDstAlphaFactor as Be,OneMinusDstColorFactor as Ge,OneMinusSrcAlphaFactor as He,OneMinusSrcColorFactor as Ve,DstAlphaFactor as We,DstColorFactor as ke,SrcAlphaSaturateFactor as ze,SrcAlphaFactor as Xe,SrcColorFactor as Ye,OneFactor as Ke,ZeroFactor as je,NotEqualDepth as qe,GreaterDepth as Ze,GreaterEqualDepth as $e,EqualDepth as Qe,LessDepth as Je,AlwaysDepth as et,NeverDepth as tt,CullFaceNone as nt,CullFaceBack as it,CullFaceFront as rt,CustomBlending as at,MultiplyBlending as ot,SubtractiveBlending as st,AdditiveBlending as lt,MinEquation as ct,MaxEquation as dt,MirroredRepeatWrapping as ut,ClampToEdgeWrapping as ft,RepeatWrapping as pt,LinearMipmapLinearFilter as mt,LinearMipmapNearestFilter as ht,NearestMipmapLinearFilter as _t,NearestMipmapNearestFilter as gt,NotEqualCompare as vt,GreaterCompare as Et,EqualCompare as St,LessCompare as Tt,AlwaysCompare as Mt,NeverCompare as xt,NoColorSpace as At,DepthStencilFormat as Rt,getByteLength as bt,UnsignedInt248Type as Ct,UnsignedShortType as Pt,createElementNS as Lt,UnsignedShort4444Type as Ut,UnsignedShort5551Type as Dt,UnsignedInt5999Type as wt,UnsignedInt101111Type as It,ByteType as Nt,ShortType as yt,AlphaFormat as Ft,RGBFormat as Ot,RedFormat as Bt,RedIntegerFormat as Gt,RGIntegerFormat as Ht,RGBAIntegerFormat as Vt,RGB_S3TC_DXT1_Format as Wt,RGBA_S3TC_DXT1_Format as kt,RGBA_S3TC_DXT3_Format as zt,RGBA_S3TC_DXT5_Format as Xt,RGB_PVRTC_4BPPV1_Format as Yt,RGB_PVRTC_2BPPV1_Format as Kt,RGBA_PVRTC_4BPPV1_Format as jt,RGBA_PVRTC_2BPPV1_Format as qt,RGB_ETC1_Format as Zt,RGB_ETC2_Format as $t,RGBA_ETC2_EAC_Format as Qt,R11_EAC_Format as Jt,SIGNED_R11_EAC_Format as en,RG11_EAC_Format as tn,SIGNED_RG11_EAC_Format as nn,RGBA_ASTC_4x4_Format as rn,RGBA_ASTC_5x4_Format as an,RGBA_ASTC_5x5_Format as on,RGBA_ASTC_6x5_Format as sn,RGBA_ASTC_6x6_Format as ln,RGBA_ASTC_8x5_Format as cn,RGBA_ASTC_8x6_Format as dn,RGBA_ASTC_8x8_Format as un,RGBA_ASTC_10x5_Format as fn,RGBA_ASTC_10x6_Format as pn,RGBA_ASTC_10x8_Format as mn,RGBA_ASTC_10x10_Format as hn,RGBA_ASTC_12x10_Format as _n,RGBA_ASTC_12x12_Format as gn,RGBA_BPTC_Format as vn,RGB_BPTC_SIGNED_Format as En,RGB_BPTC_UNSIGNED_Format as Sn,RED_RGTC1_Format as Tn,SIGNED_RED_RGTC1_Format as Mn,RED_GREEN_RGTC2_Format as xn,SIGNED_RED_GREEN_RGTC2_Format as An,ExternalTexture as Rn,EventDispatcher as bn,ArrayCamera as Cn,WebXRController as Pn,RAD2DEG as Ln,DataTexture as Un,createCanvasElement as Dn,SRGBColorSpace as wn,REVISION as In,log as Nn,WebGLCoordinateSystem as yn,probeAsync as Fn}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AlwaysStencilFunc,AmbientLight,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BasicShadowMap,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,Camera,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,Compatibility,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,Controls,CubeCamera,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CylinderGeometry,Cylindrical,DataTextureLoader,DataUtils,DecrementStencilOp,DecrementWrapStencilOp,DefaultLoadingManager,DetachedBindMode,DirectionalLight,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicDrawUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,EqualStencilFunc,ExtrudeGeometry,FileLoader,Float16BufferAttribute,Fog,FogExp2,FramebufferTexture,FrustumArray,GLBufferAttribute,GLSL1,GreaterEqualStencilFunc,GreaterStencilFunc,GridHelper,Group,HemisphereLight,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,IncrementStencilOp,IncrementWrapStencilOp,InstancedBufferAttribute,InstancedBufferGeometry,InstancedInterleavedBuffer,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,InterleavedBuffer,InterleavedBufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,InterpolationSamplingMode,InterpolationSamplingType,InvertStencilOp,KeepStencilOp,KeyframeTrack,LOD,LatheGeometry,LessEqualStencilFunc,LessStencilFunc,Light,LightProbe,Line,Line3,LineBasicMaterial,LineCurve,LineCurve3,LineDashedMaterial,LineLoop,LineSegments,LinearInterpolant,LinearMipMapLinearFilter,LinearMipMapNearestFilter,Loader,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,Material,MaterialBlending,MaterialLoader,MathUtils,Matrix2,MeshLambertMaterial,MeshMatcapMaterial,MeshNormalMaterial,MeshPhongMaterial,MeshPhysicalMaterial,MeshStandardMaterial,MeshToonMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NeverStencilFunc,NoNormalPacking,NormalAnimationBlendMode,NormalGAPacking,NormalRGPacking,NotEqualStencilFunc,NumberKeyframeTrack,Object3D,ObjectLoader,OctahedronGeometry,Path,PlaneHelper,PointLight,PointLightHelper,Points,PointsMaterial,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,Quaternion,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGBIntegerFormat,RGDepthPacking,Ray,Raycaster,RectAreaLight,RenderTarget,RenderTarget3D,ReplaceStencilOp,RingGeometry,Scene,ShadowMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Sphere,SphereGeometry,Spherical,SphericalHarmonics3,SplineCurve,SpotLight,SpotLightHelper,Sprite,SpriteMaterial,StaticCopyUsage,StaticDrawUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,Timer,TimestampQuery,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,UVMapping,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGPUCoordinateSystem,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding,ZeroStencilOp,getConsoleFunction,setConsoleFunction}from"./three.core.min.js";function On(){let e=null,t=!1,n=null,i=null;function r(t,a){n(t,a),i=e.requestAnimationFrame(r)}return{start:function(){!0!==t&&null!==n&&(i=e.requestAnimationFrame(r),t=!0)},stop:function(){e.cancelAnimationFrame(i),t=!1},setAnimationLoop:function(e){n=e},setContext:function(t){e=t}}}function Bn(e){const t=new WeakMap;return{get:function(e){return e.isInterleavedBufferAttribute&&(e=e.data),t.get(e)},remove:function(n){n.isInterleavedBufferAttribute&&(n=n.data);const i=t.get(n);i&&(e.deleteBuffer(i.buffer),t.delete(n))},update:function(n,i){if(n.isInterleavedBufferAttribute&&(n=n.data),n.isGLBufferAttribute){const e=t.get(n);return void((!e||e.versione.start-t.start);let t=0;for(let e=1;e 0\n\tvec4 plane;\n\t#ifdef ALPHA_TO_COVERAGE\n\t\tfloat distanceToPlane, distanceGradient;\n\t\tfloat clipOpacity = 1.0;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\tif ( clipOpacity == 0.0 ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tfloat unionClipOpacity = 1.0;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\t\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tclipOpacity *= 1.0 - unionClipOpacity;\n\t\t#endif\n\t\tdiffuseColor.a *= clipOpacity;\n\t\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tbool clipped = true;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tif ( clipped ) discard;\n\t\t#endif\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n\t\temissiveColor = sRGBTransferEOTF( emissiveColor );\n\t#endif\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",colorspace_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",colorspace_pars_fragment:"vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif ( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.metalness = metalnessFactor;\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor;\n\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = vec3( 0.04 );\n\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n\tmaterial.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.0001, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif",lights_physical_pars_fragment:"uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tvec3 diffuseContribution;\n\tvec3 specularColor;\n\tvec3 specularColorBlended;\n\tfloat roughness;\n\tfloat metalness;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t\tvec3 iridescenceFresnelDielectric;\n\t\tvec3 iridescenceFresnelMetallic;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn v;\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColorBlended;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat rInv = 1.0 / ( roughness + 0.1 );\n\tfloat a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv;\n\tfloat b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv;\n\tfloat DG = exp( a * dotNV + b );\n\treturn saturate( DG );\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;\n\tvec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;\n\tvec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;\n\tvec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;\n\tfloat Ess_V = dfgV.x + dfgV.y;\n\tfloat Ess_L = dfgL.x + dfgL.y;\n\tfloat Ems_V = 1.0 - Ess_V;\n\tfloat Ems_L = 1.0 - Ess_L;\n\tvec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619;\n\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );\n\tfloat compensationFactor = Ems_V * Ems_L;\n\tvec3 multiScatter = Fms * compensationFactor;\n\treturn singleScatter + multiScatter;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColorBlended * t2.x + ( vec3( 1.0 ) - material.specularColorBlended ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseContribution * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n \n \t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n \n \t\tfloat sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n \t\tfloat sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness );\n \n \t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );\n \n \t\tirradiance *= sheenEnergyComp;\n \n \t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tdiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectDiffuse += diffuse;\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ) * RECIPROCAL_PI;\n \t#endif\n\tvec3 singleScatteringDielectric = vec3( 0.0 );\n\tvec3 multiScatteringDielectric = vec3( 0.0 );\n\tvec3 singleScatteringMetallic = vec3( 0.0 );\n\tvec3 multiScatteringMetallic = vec3( 0.0 );\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#endif\n\tvec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness );\n\tvec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness );\n\tvec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric;\n\tvec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tvec3 indirectSpecular = radiance * singleScattering;\n\tindirectSpecular += multiScattering * cosineWeightedIrradiance;\n\tvec3 indirectDiffuse = diffuse * cosineWeightedIrradiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tindirectSpecular *= sheenEnergyComp;\n\t\tindirectDiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectSpecular += indirectSpecular;\n\treflectedLight.indirectDiffuse += indirectDiffuse;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\n\t\tmaterial.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\n\tvFragDepth = 1.0 + gl_Position.w;\n\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphinstance_vertex:"#ifdef USE_INSTANCING_MORPH\n\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n\t}\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_INSTANCING_MORPH\n\t\tuniform float morphTargetBaseInfluence;\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t#endif\n\tuniform sampler2DArray morphTargetsTexture;\n\tuniform ivec2 morphTargetsTextureSize;\n\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t}\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;",normal_fragment_maps:"#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",opaque_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat dp = 1.0 - shadowCoord.z;\n\t\t\t\t#else\n\t\t\t\t\tfloat dp = shadowCoord.z;\n\t\t\t\t#endif\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, dp ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tdepth = 1.0 - depth;\n\t\t\t\t#endif\n\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tfloat dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp -= shadowBias;\n\t\t\t#else\n\t\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp += shadowBias;\n\t\t\t#endif\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\tvec2 sample0 = vogelDiskSample( 0, 5, phi );\n\t\t\tvec2 sample1 = vogelDiskSample( 1, 5, phi );\n\t\t\tvec2 sample2 = vogelDiskSample( 2, 5, phi );\n\t\t\tvec2 sample3 = vogelDiskSample( 3, 5, phi );\n\t\t\tvec2 sample4 = vogelDiskSample( 4, 5, phi );\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tshadow = step( dp, depth );\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0 && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseContribution, material.specularColorBlended, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif",uv_pars_fragment:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_pars_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\n\t#else\n\t\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\n\t#endif\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#elif DEPTH_PACKING == 3202\n\t\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n\t#elif DEPTH_PACKING == 3203\n\t\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n\t#endif\n}",distance_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distance_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = vec4( dist, 0.0, 0.0, 1.0 );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( normalize( normal ) * 0.5 + 0.5, diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n \n\t\toutgoingLight = outgoingLight + sheenSpecularDirect + sheenSpecularIndirect;\n \n \t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"},Hn={common:{diffuse:{value:new n(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new e}},envmap:{envMap:{value:null},envMapRotation:{value:new e},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},dfgLUT:{value:null}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new e}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new e}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new e},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new e},normalScale:{value:new t(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new e},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new e}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new e}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new e}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new n(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new n(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0},uvTransform:{value:new e}},sprite:{diffuse:{value:new n(16777215)},opacity:{value:1},center:{value:new t(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}}},Vn={basic:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.fog]),vertexShader:Gn.meshbasic_vert,fragmentShader:Gn.meshbasic_frag},lambert:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)}}]),vertexShader:Gn.meshlambert_vert,fragmentShader:Gn.meshlambert_frag},phong:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)},specular:{value:new n(1118481)},shininess:{value:30}}]),vertexShader:Gn.meshphong_vert,fragmentShader:Gn.meshphong_frag},standard:{uniforms:i([Hn.common,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.roughnessmap,Hn.metalnessmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Gn.meshphysical_vert,fragmentShader:Gn.meshphysical_frag},toon:{uniforms:i([Hn.common,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.gradientmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)}}]),vertexShader:Gn.meshtoon_vert,fragmentShader:Gn.meshtoon_frag},matcap:{uniforms:i([Hn.common,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,{matcap:{value:null}}]),vertexShader:Gn.meshmatcap_vert,fragmentShader:Gn.meshmatcap_frag},points:{uniforms:i([Hn.points,Hn.fog]),vertexShader:Gn.points_vert,fragmentShader:Gn.points_frag},dashed:{uniforms:i([Hn.common,Hn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Gn.linedashed_vert,fragmentShader:Gn.linedashed_frag},depth:{uniforms:i([Hn.common,Hn.displacementmap]),vertexShader:Gn.depth_vert,fragmentShader:Gn.depth_frag},normal:{uniforms:i([Hn.common,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,{opacity:{value:1}}]),vertexShader:Gn.meshnormal_vert,fragmentShader:Gn.meshnormal_frag},sprite:{uniforms:i([Hn.sprite,Hn.fog]),vertexShader:Gn.sprite_vert,fragmentShader:Gn.sprite_frag},background:{uniforms:{uvTransform:{value:new e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Gn.background_vert,fragmentShader:Gn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new e}},vertexShader:Gn.backgroundCube_vert,fragmentShader:Gn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Gn.cube_vert,fragmentShader:Gn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Gn.equirect_vert,fragmentShader:Gn.equirect_frag},distance:{uniforms:i([Hn.common,Hn.displacementmap,{referencePosition:{value:new r},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Gn.distance_vert,fragmentShader:Gn.distance_frag},shadow:{uniforms:i([Hn.lights,Hn.fog,{color:{value:new n(0)},opacity:{value:1}}]),vertexShader:Gn.shadow_vert,fragmentShader:Gn.shadow_frag}};Vn.physical={uniforms:i([Vn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new e},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new e},clearcoatNormalScale:{value:new t(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new e},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new e},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new e},sheen:{value:0},sheenColor:{value:new n(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new e},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new e},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new e},transmissionSamplerSize:{value:new t},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new e},attenuationDistance:{value:0},attenuationColor:{value:new n(0)},specularColor:{value:new n(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new e},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new e},anisotropyVector:{value:new t},anisotropyMap:{value:null},anisotropyMapTransform:{value:new e}}]),vertexShader:Gn.meshphysical_vert,fragmentShader:Gn.meshphysical_frag};const Wn={r:0,b:0,g:0},kn=new u,zn=new f;function Xn(e,t,i,r,u,f,v){const E=new n(0);let S,T,M=!0===f?0:1,x=null,A=0,R=null;function b(e){let n=!0===e.isScene?e.background:null;if(n&&n.isTexture){n=(e.backgroundBlurriness>0?i:t).get(n)}return n}function C(t,n){t.getRGB(Wn,g(e)),r.buffers.color.setClear(Wn.r,Wn.g,Wn.b,n,v)}return{getClearColor:function(){return E},setClearColor:function(e,t=1){E.set(e),M=t,C(E,M)},getClearAlpha:function(){return M},setClearAlpha:function(e){M=e,C(E,M)},render:function(t){let n=!1;const i=b(t);null===i?C(E,M):i&&i.isColor&&(C(i,1),n=!0);const a=e.xr.getEnvironmentBlendMode();"additive"===a?r.buffers.color.setClear(0,0,0,1,v):"alpha-blend"===a&&r.buffers.color.setClear(0,0,0,0,v),(e.autoClear||n)&&(r.buffers.depth.setTest(!0),r.buffers.depth.setMask(!0),r.buffers.color.setMask(!0),e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil))},addToRenderList:function(t,n){const i=b(n);i&&(i.isCubeTexture||i.mapping===a)?(void 0===T&&(T=new o(new s(1,1,1),new l({name:"BackgroundCubeMaterial",uniforms:d(Vn.backgroundCube.uniforms),vertexShader:Vn.backgroundCube.vertexShader,fragmentShader:Vn.backgroundCube.fragmentShader,side:c,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),T.geometry.deleteAttribute("normal"),T.geometry.deleteAttribute("uv"),T.onBeforeRender=function(e,t,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(T.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),u.update(T)),kn.copy(n.backgroundRotation),kn.x*=-1,kn.y*=-1,kn.z*=-1,i.isCubeTexture&&!1===i.isRenderTargetTexture&&(kn.y*=-1,kn.z*=-1),T.material.uniforms.envMap.value=i,T.material.uniforms.flipEnvMap.value=i.isCubeTexture&&!1===i.isRenderTargetTexture?-1:1,T.material.uniforms.backgroundBlurriness.value=n.backgroundBlurriness,T.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,T.material.uniforms.backgroundRotation.value.setFromMatrix4(zn.makeRotationFromEuler(kn)),T.material.toneMapped=p.getTransfer(i.colorSpace)!==m,x===i&&A===i.version&&R===e.toneMapping||(T.material.needsUpdate=!0,x=i,A=i.version,R=e.toneMapping),T.layers.enableAll(),t.unshift(T,T.geometry,T.material,0,0,null)):i&&i.isTexture&&(void 0===S&&(S=new o(new h(2,2),new l({name:"BackgroundMaterial",uniforms:d(Vn.background.uniforms),vertexShader:Vn.background.vertexShader,fragmentShader:Vn.background.fragmentShader,side:_,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),S.geometry.deleteAttribute("normal"),Object.defineProperty(S.material,"map",{get:function(){return this.uniforms.t2D.value}}),u.update(S)),S.material.uniforms.t2D.value=i,S.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,S.material.toneMapped=p.getTransfer(i.colorSpace)!==m,!0===i.matrixAutoUpdate&&i.updateMatrix(),S.material.uniforms.uvTransform.value.copy(i.matrix),x===i&&A===i.version&&R===e.toneMapping||(S.material.needsUpdate=!0,x=i,A=i.version,R=e.toneMapping),S.layers.enableAll(),t.unshift(S,S.geometry,S.material,0,0,null))},dispose:function(){void 0!==T&&(T.geometry.dispose(),T.material.dispose(),T=void 0),void 0!==S&&(S.geometry.dispose(),S.material.dispose(),S=void 0)}}}function Yn(e,t){const n=e.getParameter(e.MAX_VERTEX_ATTRIBS),i={},r=c(null);let a=r,o=!1;function s(t){return e.bindVertexArray(t)}function l(t){return e.deleteVertexArray(t)}function c(e){const t=[],i=[],r=[];for(let e=0;e=0){const n=r[t];let i=o[t];if(void 0===i&&("instanceMatrix"===t&&e.instanceMatrix&&(i=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(i=e.instanceColor)),void 0===n)return!0;if(n.attribute!==i)return!0;if(i&&n.data!==i.data)return!0;s++}}return a.attributesNum!==s||a.index!==i}(n,h,l,_),g&&function(e,t,n,i){const r={},o=t.attributes;let s=0;const l=n.getAttributes();for(const t in l){if(l[t].location>=0){let n=o[t];void 0===n&&("instanceMatrix"===t&&e.instanceMatrix&&(n=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(n=e.instanceColor));const i={};i.attribute=n,n&&n.data&&(i.data=n.data),r[t]=i,s++}}a.attributes=r,a.attributesNum=s,a.index=i}(n,h,l,_),null!==_&&t.update(_,e.ELEMENT_ARRAY_BUFFER),(g||o)&&(o=!1,function(n,i,r,a){d();const o=a.attributes,s=r.getAttributes(),l=i.defaultAttributeValues;for(const i in s){const r=s[i];if(r.location>=0){let s=o[i];if(void 0===s&&("instanceMatrix"===i&&n.instanceMatrix&&(s=n.instanceMatrix),"instanceColor"===i&&n.instanceColor&&(s=n.instanceColor)),void 0!==s){const i=s.normalized,o=s.itemSize,l=t.get(s);if(void 0===l)continue;const c=l.buffer,d=l.type,p=l.bytesPerElement,h=d===e.INT||d===e.UNSIGNED_INT||s.gpuType===v;if(s.isInterleavedBufferAttribute){const t=s.data,l=t.stride,_=s.offset;if(t.isInstancedInterleavedBuffer){for(let e=0;e0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT).precision>0)return"highp";t="mediump"}return"mediump"===t&&e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.MEDIUM_FLOAT).precision>0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let o=void 0!==n.precision?n.precision:"highp";const s=a(o);s!==o&&(E("WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==r)return r;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");r=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else r=0;return r},getMaxPrecision:a,textureFormatReadable:function(t){return t===x||i.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const r=n===S&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==T&&i.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==M&&!r)},precision:o,logarithmicDepthBuffer:!0===n.logarithmicDepthBuffer,reversedDepthBuffer:!0===n.reversedDepthBuffer&&t.has("EXT_clip_control"),maxTextures:e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),maxVertexTextures:e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS),maxTextureSize:e.getParameter(e.MAX_TEXTURE_SIZE),maxCubemapSize:e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE),maxAttributes:e.getParameter(e.MAX_VERTEX_ATTRIBS),maxVertexUniforms:e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS),maxVaryings:e.getParameter(e.MAX_VARYING_VECTORS),maxFragmentUniforms:e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),maxSamples:e.getParameter(e.MAX_SAMPLES),samples:e.getParameter(e.SAMPLES)}}function qn(t){const n=this;let i=null,r=0,a=!1,o=!1;const s=new A,l=new e,c={value:null,needsUpdate:!1};function d(e,t,i,r){const a=null!==e?e.length:0;let o=null;if(0!==a){if(o=c.value,!0!==r||null===o){const n=i+4*a,r=t.matrixWorldInverse;l.getNormalMatrix(r),(null===o||o.length0);n.numPlanes=r,n.numIntersection=0}();else{const e=o?0:r,t=4*e;let n=m.clippingState||null;c.value=n,n=d(u,s,t,l);for(let e=0;e!==t;++e)n[e]=i[e];m.clippingState=n,this.numIntersection=f?this.numPlanes:0,this.numPlanes+=e}}}function Zn(e){let t=new WeakMap;function n(e,t){return t===R?e.mapping=P:t===b&&(e.mapping=L),e}function i(e){const n=e.target;n.removeEventListener("dispose",i);const r=t.get(n);void 0!==r&&(t.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const a=r.mapping;if(a===R||a===b){if(t.has(r)){return n(t.get(r).texture,r.mapping)}{const a=r.image;if(a&&a.height>0){const o=new C(a.height);return o.fromEquirectangularTexture(e,r),t.set(r,o),r.addEventListener("dispose",i),n(o.texture,r.mapping)}return null}}}return r},dispose:function(){t=new WeakMap}}}const $n=[.125,.215,.35,.446,.526,.582],Qn=20,Jn=new D,ei=new n;let ti=null,ni=0,ii=0,ri=!1;const ai=new r;class oi{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._backgroundBox=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._blurMaterial=null,this._ggxMaterial=null}fromScene(e,t=0,n=.1,i=100,r={}){const{size:a=256,position:o=ai}=r;ti=this._renderer.getRenderTarget(),ni=this._renderer.getActiveCubeFace(),ii=this._renderer.getActiveMipmapLevel(),ri=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(a);const s=this._allocateTargets();return s.depthBuffer=!0,this._sceneToCubeUV(e,n,i,s,o),t>0&&this._blur(s,0,0,t),this._applyPMREM(s),this._cleanup(s),s}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=di(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=ci(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?l=$n[s-e+4-1]:0===s&&(l=0),n.push(l);const c=1/(a-2),d=-c,u=1+c,f=[d,d,u,d,u,u,d,d,u,u,d,u],p=6,m=6,h=3,_=2,g=1,v=new Float32Array(h*m*p),E=new Float32Array(_*m*p),S=new Float32Array(g*m*p);for(let e=0;e2?0:-1,i=[t,n,0,t+2/3,n,0,t+2/3,n+1,0,t,n,0,t+2/3,n+1,0,t,n+1,0];v.set(i,h*m*e),E.set(f,_*m*e);const r=[e,e,e,e,e,e];S.set(r,g*m*e)}const T=new U;T.setAttribute("position",new B(v,h)),T.setAttribute("uv",new B(E,_)),T.setAttribute("faceIndex",new B(S,g)),i.push(new o(T,null)),r>4&&r--}return{lodMeshes:i,sizeLods:t,sigmas:n}}(i)),this._blurMaterial=function(e,t,n){const i=new Float32Array(Qn),a=new r(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:Qn,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:i},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:a}},vertexShader:ui(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t",blending:F,depthTest:!1,depthWrite:!1});return o}(i,e,t),this._ggxMaterial=function(e,t,n){const i=new l({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:256,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:ui(),fragmentShader:'\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// "Sampling the GGX Distribution of Visible Normals"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tvec3 T1 = vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(V, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + V.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * V;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t',blending:F,depthTest:!1,depthWrite:!1});return i}(i,e,t)}return i}_compileMaterial(e){const t=new o(new U,e);this._renderer.compile(t,Jn)}_sceneToCubeUV(e,t,n,i,r){const a=new w(90,1,t,n),l=[1,-1,1,1,1,1],d=[1,1,1,-1,-1,-1],u=this._renderer,f=u.autoClear,p=u.toneMapping;u.getClearColor(ei),u.toneMapping=I,u.autoClear=!1;u.state.buffers.depth.getReversed()&&(u.setRenderTarget(i),u.clearDepth(),u.setRenderTarget(null)),null===this._backgroundBox&&(this._backgroundBox=new o(new s,new N({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1})));const m=this._backgroundBox,h=m.material;let _=!1;const g=e.background;g?g.isColor&&(h.color.copy(g),e.background=null,_=!0):(h.color.copy(ei),_=!0);for(let t=0;t<6;t++){const n=t%3;0===n?(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x+d[t],r.y,r.z)):1===n?(a.up.set(0,0,l[t]),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y+d[t],r.z)):(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y,r.z+d[t]));const o=this._cubeSize;li(i,n*o,t>2?o:0,o,o),u.setRenderTarget(i),_&&u.render(m,a),u.render(e,a)}u.toneMapping=p,u.autoClear=f,e.background=g}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===P||e.mapping===L;i?(null===this._cubemapMaterial&&(this._cubemapMaterial=di()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=ci());const r=i?this._cubemapMaterial:this._equirectMaterial,a=this._lodMeshes[0];a.material=r;r.uniforms.envMap.value=e;const o=this._cubeSize;li(t,0,0,3*o,2*o),n.setRenderTarget(t),n.render(a,Jn)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodMeshes.length;for(let t=1;tu-4?n-u+4:0),m=4*(this._cubeSize-f);s.envMap.value=e.texture,s.roughness.value=d,s.mipInt.value=u-t,li(r,p,m,3*f,2*f),i.setRenderTarget(r),i.render(o,Jn),s.envMap.value=r.texture,s.roughness.value=0,s.mipInt.value=u-n,li(e,p,m,3*f,2*f),i.setRenderTarget(e),i.render(o,Jn)}_blur(e,t,n,i,r){const a=this._pingPongRenderTarget;this._halfBlur(e,a,t,n,i,"latitudinal",r),this._halfBlur(a,e,n,n,i,"longitudinal",r)}_halfBlur(e,t,n,i,r,a,o){const s=this._renderer,l=this._blurMaterial;"latitudinal"!==a&&"longitudinal"!==a&&y("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[i];c.material=l;const d=l.uniforms,u=this._sizeLods[n]-1,f=isFinite(r)?Math.PI/(2*u):2*Math.PI/39,p=r/f,m=isFinite(r)?1+Math.floor(3*p):Qn;m>Qn&&E(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);const h=[];let _=0;for(let e=0;eg-4?i-g+4:0),4*(this._cubeSize-v),3*v,2*v),s.setRenderTarget(t),s.render(c,Jn)}}function si(e,t,n){const i=new O(e,t,n);return i.texture.mapping=a,i.texture.name="PMREM.cubeUv",i.scissorTest=!0,i}function li(e,t,n,i,r){e.viewport.set(t,n,i,r),e.scissor.set(t,n,i,r)}function ci(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:ui(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t",blending:F,depthTest:!1,depthWrite:!1})}function di(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:ui(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t",blending:F,depthTest:!1,depthWrite:!1})}function ui(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function fi(e){let t=new WeakMap,n=null;function i(e){const n=e.target;n.removeEventListener("dispose",i);const r=t.get(n);void 0!==r&&(t.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const a=r.mapping,o=a===R||a===b,s=a===P||a===L;if(o||s){let a=t.get(r);const l=void 0!==a?a.texture.pmremVersion:0;if(r.isRenderTargetTexture&&r.pmremVersion!==l)return null===n&&(n=new oi(e)),a=o?n.fromEquirectangular(r,a):n.fromCubemap(r,a),a.texture.pmremVersion=r.pmremVersion,t.set(r,a),a.texture;if(void 0!==a)return a.texture;{const l=r.image;return o&&l&&l.height>0||s&&l&&function(e){let t=0;const n=6;for(let i=0;in.maxTextureSize&&(T=Math.ceil(S/n.maxTextureSize),S=n.maxTextureSize);const x=new Float32Array(S*T*4*u),A=new Y(x,S,T,u);A.type=M,A.needsUpdate=!0;const R=4*E;for(let C=0;C\n\t\t\t#include \n\n\t\t\tvoid main() {\n\t\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t\t#ifdef LINEAR_TONE_MAPPING\n\t\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( AGX_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef SRGB_TRANSFER\n\t\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\t\t\t\t#endif\n\t\t\t}",depthTest:!1,depthWrite:!1}),d=new o(l,c),u=new D(-1,1,1,-1,0,1);let f,h=null,_=null,g=!1,v=null,E=[],T=!1;this.setSize=function(e,t){a.setSize(e,t),s.setSize(e,t);for(let n=0;n0&&!0===E[0].isRenderPass;const t=a.width,n=a.height;for(let e=0;e0)return e;const r=t*n;let a=bi[r];if(void 0===a&&(a=new Float32Array(r),bi[r]=a),0!==t){i.toArray(a,0);for(let i=1,r=0;i!==t;++i)r+=n,e[i].toArray(a,r)}return a}function wi(e,t){if(e.length!==t.length)return!1;for(let n=0,i=e.length;n0&&(this.seq=i.concat(r))}setValue(e,t,n,i){const r=this.map[t];void 0!==r&&r.setValue(e,n,i)}setOptional(e,t,n){const i=t[n];void 0!==i&&this.setValue(e,n,i)}static upload(e,t,n,i){for(let r=0,a=t.length;r!==a;++r){const a=t[r],o=n[a.id];!1!==o.needsUpdate&&a.setValue(e,o.value,i)}}static seqWithValue(e,t){const n=[];for(let i=0,r=e.length;i!==r;++i){const r=e[i];r.id in t&&n.push(r)}return n}}function br(e,t,n){const i=e.createShader(t);return e.shaderSource(i,n),e.compileShader(i),i}let Cr=0;const Pr=new e;function Lr(e,t,n){const i=e.getShaderParameter(t,e.COMPILE_STATUS),r=(e.getShaderInfoLog(t)||"").trim();if(i&&""===r)return"";const a=/ERROR: 0:(\d+)/.exec(r);if(a){const i=parseInt(a[1]);return n.toUpperCase()+"\n\n"+r+"\n\n"+function(e,t){const n=e.split("\n"),i=[],r=Math.max(t-6,0),a=Math.min(t+6,n.length);for(let e=r;e":" "} ${r}: ${n[e]}`)}return i.join("\n")}(e.getShaderSource(t),i)}return r}function Ur(e,t){const n=function(e){p._getMatrix(Pr,p.workingColorSpace,e);const t=`mat3( ${Pr.elements.map(e=>e.toFixed(4))} )`;switch(p.getTransfer(e)){case me:return[t,"LinearTransferOETF"];case m:return[t,"sRGBTransferOETF"];default:return E("WebGLProgram: Unsupported color space: ",e),[t,"LinearTransferOETF"]}}(t);return[`vec4 ${e}( vec4 value ) {`,`\treturn ${n[1]}( vec4( value.rgb * ${n[0]}, value.a ) );`,"}"].join("\n")}const Dr={[te]:"Linear",[ee]:"Reinhard",[J]:"Cineon",[Q]:"ACESFilmic",[$]:"AgX",[Z]:"Neutral",[q]:"Custom"};function wr(e,t){const n=Dr[t];return void 0===n?(E("WebGLProgram: Unsupported toneMapping:",t),"vec3 "+e+"( vec3 color ) { return LinearToneMapping( color ); }"):"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const Ir=new r;function Nr(){p.getLuminanceCoefficients(Ir);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${Ir.x.toFixed(4)}, ${Ir.y.toFixed(4)}, ${Ir.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function yr(e){return""!==e}function Fr(e,t){const n=t.numSpotLightShadows+t.numSpotLightMaps-t.numSpotLightShadowsWithMaps;return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,t.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,n).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,t.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function Or(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Br=/^[ \t]*#include +<([\w\d./]+)>/gm;function Gr(e){return e.replace(Br,Vr)}const Hr=new Map;function Vr(e,t){let n=Gn[t];if(void 0===n){const e=Hr.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=Gn[e],E('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Gr(n)}const Wr=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function kr(e){return e.replace(Wr,zr)}function zr(e,t,n,i){let r="";for(let e=parseInt(t);e0&&(_+="\n"),g=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m].filter(yr).join("\n"),g.length>0&&(g+="\n")):(_=[Xr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,n.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",n.batching?"#define USE_BATCHING":"",n.batchingColor?"#define USE_BATCHING_COLOR":"",n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.instancingMorph?"#define USE_INSTANCING_MORPH":"",n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+d:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.displacementMap?"#define USE_DISPLACEMENTMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.mapUv?"#define MAP_UV "+n.mapUv:"",n.alphaMapUv?"#define ALPHAMAP_UV "+n.alphaMapUv:"",n.lightMapUv?"#define LIGHTMAP_UV "+n.lightMapUv:"",n.aoMapUv?"#define AOMAP_UV "+n.aoMapUv:"",n.emissiveMapUv?"#define EMISSIVEMAP_UV "+n.emissiveMapUv:"",n.bumpMapUv?"#define BUMPMAP_UV "+n.bumpMapUv:"",n.normalMapUv?"#define NORMALMAP_UV "+n.normalMapUv:"",n.displacementMapUv?"#define DISPLACEMENTMAP_UV "+n.displacementMapUv:"",n.metalnessMapUv?"#define METALNESSMAP_UV "+n.metalnessMapUv:"",n.roughnessMapUv?"#define ROUGHNESSMAP_UV "+n.roughnessMapUv:"",n.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+n.anisotropyMapUv:"",n.clearcoatMapUv?"#define CLEARCOATMAP_UV "+n.clearcoatMapUv:"",n.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+n.clearcoatNormalMapUv:"",n.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+n.clearcoatRoughnessMapUv:"",n.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+n.iridescenceMapUv:"",n.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+n.iridescenceThicknessMapUv:"",n.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+n.sheenColorMapUv:"",n.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+n.sheenRoughnessMapUv:"",n.specularMapUv?"#define SPECULARMAP_UV "+n.specularMapUv:"",n.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+n.specularColorMapUv:"",n.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+n.specularIntensityMapUv:"",n.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+n.transmissionMapUv:"",n.thicknessMapUv?"#define THICKNESSMAP_UV "+n.thicknessMapUv:"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.morphColors?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH","\tuniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1","\tattribute vec2 uv1;","#endif","#ifdef USE_UV2","\tattribute vec2 uv2;","#endif","#ifdef USE_UV3","\tattribute vec2 uv3;","#endif","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(yr).join("\n"),g=[Xr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+c:"",n.envMap?"#define "+d:"",n.envMap?"#define "+u:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.dispersion?"#define USE_DISPERSION":"",n.iridescence?"#define USE_IRIDESCENCE":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor||n.batchingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==I?"#define TONE_MAPPING":"",n.toneMapping!==I?Gn.tonemapping_pars_fragment:"",n.toneMapping!==I?wr("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",Gn.colorspace_pars_fragment,Ur("linearToOutputTexel",n.outputColorSpace),Nr(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(yr).join("\n")),o=Gr(o),o=Fr(o,n),o=Or(o,n),s=Gr(s),s=Fr(s,n),s=Or(s,n),o=kr(o),s=kr(s),!0!==n.isRawShaderMaterial&&(v="#version 300 es\n",_=[p,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_,g=["#define varying in",n.glslVersion===le?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===le?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+g);const S=v+_+o,T=v+g+s,M=br(r,r.VERTEX_SHADER,S),x=br(r,r.FRAGMENT_SHADER,T);function A(t){if(e.debug.checkShaderErrors){const n=r.getProgramInfoLog(h)||"",i=r.getShaderInfoLog(M)||"",a=r.getShaderInfoLog(x)||"",o=n.trim(),s=i.trim(),l=a.trim();let c=!0,d=!0;if(!1===r.getProgramParameter(h,r.LINK_STATUS))if(c=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(r,h,M,x);else{const e=Lr(r,M,"vertex"),n=Lr(r,x,"fragment");y("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(h,r.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+o+"\n"+e+"\n"+n)}else""!==o?E("WebGLProgram: Program Info Log:",o):""!==s&&""!==l||(d=!1);d&&(t.diagnostics={runnable:c,programLog:o,vertexShader:{log:s,prefix:_},fragmentShader:{log:l,prefix:g}})}r.deleteShader(M),r.deleteShader(x),R=new Rr(r,h),b=function(e,t){const n={},i=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let r=0;r0,J=o.clearcoat>0,ee=o.dispersion>0,te=o.iridescence>0,ne=o.sheen>0,ie=o.transmission>0,re=Q&&!!o.anisotropyMap,ae=J&&!!o.clearcoatMap,oe=J&&!!o.clearcoatNormalMap,se=J&&!!o.clearcoatRoughnessMap,le=te&&!!o.iridescenceMap,ce=te&&!!o.iridescenceThicknessMap,de=ne&&!!o.sheenColorMap,ue=ne&&!!o.sheenRoughnessMap,fe=!!o.specularMap,pe=!!o.specularColorMap,me=!!o.specularIntensityMap,he=ie&&!!o.transmissionMap,Se=ie&&!!o.thicknessMap,Te=!!o.gradientMap,Me=!!o.alphaMap,xe=o.alphaTest>0,Ae=!!o.alphaHash,Re=!!o.extensions;let be=I;o.toneMapped&&(null!==F&&!0!==F.isXRRenderTarget||(be=e.toneMapping));const Ce={shaderID:C,shaderType:o.type,shaderName:o.name,vertexShader:U,fragmentShader:D,defines:o.defines,customVertexShaderID:w,customFragmentShaderID:N,isRawShaderMaterial:!0===o.isRawShaderMaterial,glslVersion:o.glslVersion,precision:g,batching:H,batchingColor:H&&null!==T._colorsTexture,instancing:B,instancingColor:B&&null!==T.instanceColor,instancingMorph:B&&null!==T.morphTexture,outputColorSpace:null===F?e.outputColorSpace:!0===F.isXRRenderTarget?F.texture.colorSpace:G,alphaToCoverage:!!o.alphaToCoverage,map:V,matcap:W,envMap:k,envMapMode:k&&R.mapping,envMapCubeUVHeight:b,aoMap:z,lightMap:X,bumpMap:Y,normalMap:K,displacementMap:j,emissiveMap:q,normalMapObjectSpace:K&&o.normalMapType===Ee,normalMapTangentSpace:K&&o.normalMapType===ve,metalnessMap:Z,roughnessMap:$,anisotropy:Q,anisotropyMap:re,clearcoat:J,clearcoatMap:ae,clearcoatNormalMap:oe,clearcoatRoughnessMap:se,dispersion:ee,iridescence:te,iridescenceMap:le,iridescenceThicknessMap:ce,sheen:ne,sheenColorMap:de,sheenRoughnessMap:ue,specularMap:fe,specularColorMap:pe,specularIntensityMap:me,transmission:ie,transmissionMap:he,thicknessMap:Se,gradientMap:Te,opaque:!1===o.transparent&&o.blending===ge&&!1===o.alphaToCoverage,alphaMap:Me,alphaTest:xe,alphaHash:Ae,combine:o.combine,mapUv:V&&S(o.map.channel),aoMapUv:z&&S(o.aoMap.channel),lightMapUv:X&&S(o.lightMap.channel),bumpMapUv:Y&&S(o.bumpMap.channel),normalMapUv:K&&S(o.normalMap.channel),displacementMapUv:j&&S(o.displacementMap.channel),emissiveMapUv:q&&S(o.emissiveMap.channel),metalnessMapUv:Z&&S(o.metalnessMap.channel),roughnessMapUv:$&&S(o.roughnessMap.channel),anisotropyMapUv:re&&S(o.anisotropyMap.channel),clearcoatMapUv:ae&&S(o.clearcoatMap.channel),clearcoatNormalMapUv:oe&&S(o.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:se&&S(o.clearcoatRoughnessMap.channel),iridescenceMapUv:le&&S(o.iridescenceMap.channel),iridescenceThicknessMapUv:ce&&S(o.iridescenceThicknessMap.channel),sheenColorMapUv:de&&S(o.sheenColorMap.channel),sheenRoughnessMapUv:ue&&S(o.sheenRoughnessMap.channel),specularMapUv:fe&&S(o.specularMap.channel),specularColorMapUv:pe&&S(o.specularColorMap.channel),specularIntensityMapUv:me&&S(o.specularIntensityMap.channel),transmissionMapUv:he&&S(o.transmissionMap.channel),thicknessMapUv:Se&&S(o.thicknessMap.channel),alphaMapUv:Me&&S(o.alphaMap.channel),vertexTangents:!!x.attributes.tangent&&(K||Q),vertexColors:o.vertexColors,vertexAlphas:!0===o.vertexColors&&!!x.attributes.color&&4===x.attributes.color.itemSize,pointsUvs:!0===T.isPoints&&!!x.attributes.uv&&(V||Me),fog:!!M,useFog:!0===o.fog,fogExp2:!!M&&M.isFogExp2,flatShading:!0===o.flatShading&&!1===o.wireframe,sizeAttenuation:!0===o.sizeAttenuation,logarithmicDepthBuffer:_,reversedDepthBuffer:O,skinning:!0===T.isSkinnedMesh,morphTargets:void 0!==x.morphAttributes.position,morphNormals:void 0!==x.morphAttributes.normal,morphColors:void 0!==x.morphAttributes.color,morphTargetsCount:L,morphTextureStride:y,numDirLights:l.directional.length,numPointLights:l.point.length,numSpotLights:l.spot.length,numSpotLightMaps:l.spotLightMap.length,numRectAreaLights:l.rectArea.length,numHemiLights:l.hemi.length,numDirLightShadows:l.directionalShadowMap.length,numPointLightShadows:l.pointShadowMap.length,numSpotLightShadows:l.spotShadowMap.length,numSpotLightShadowsWithMaps:l.numSpotLightShadowsWithMaps,numLightProbes:l.numLightProbes,numClippingPlanes:s.numPlanes,numClipIntersection:s.numIntersection,dithering:o.dithering,shadowMapEnabled:e.shadowMap.enabled&&f.length>0,shadowMapType:e.shadowMap.type,toneMapping:be,decodeVideoTexture:V&&!0===o.map.isVideoTexture&&p.getTransfer(o.map.colorSpace)===m,decodeVideoTextureEmissive:q&&!0===o.emissiveMap.isVideoTexture&&p.getTransfer(o.emissiveMap.colorSpace)===m,premultipliedAlpha:o.premultipliedAlpha,doubleSided:o.side===_e,flipSided:o.side===c,useDepthPacking:o.depthPacking>=0,depthPacking:o.depthPacking||0,index0AttributeName:o.index0AttributeName,extensionClipCullDistance:Re&&!0===o.extensions.clipCullDistance&&i.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Re&&!0===o.extensions.multiDraw||H)&&i.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:i.has("KHR_parallel_shader_compile"),customProgramCacheKey:o.customProgramCacheKey()};return Ce.vertexUv1s=u.has(1),Ce.vertexUv2s=u.has(2),Ce.vertexUv3s=u.has(3),u.clear(),Ce},getProgramCacheKey:function(t){const n=[];if(t.shaderID?n.push(t.shaderID):(n.push(t.customVertexShaderID),n.push(t.customFragmentShaderID)),void 0!==t.defines)for(const e in t.defines)n.push(e),n.push(t.defines[e]);return!1===t.isRawShaderMaterial&&(!function(e,t){e.push(t.precision),e.push(t.outputColorSpace),e.push(t.envMapMode),e.push(t.envMapCubeUVHeight),e.push(t.mapUv),e.push(t.alphaMapUv),e.push(t.lightMapUv),e.push(t.aoMapUv),e.push(t.bumpMapUv),e.push(t.normalMapUv),e.push(t.displacementMapUv),e.push(t.emissiveMapUv),e.push(t.metalnessMapUv),e.push(t.roughnessMapUv),e.push(t.anisotropyMapUv),e.push(t.clearcoatMapUv),e.push(t.clearcoatNormalMapUv),e.push(t.clearcoatRoughnessMapUv),e.push(t.iridescenceMapUv),e.push(t.iridescenceThicknessMapUv),e.push(t.sheenColorMapUv),e.push(t.sheenRoughnessMapUv),e.push(t.specularMapUv),e.push(t.specularColorMapUv),e.push(t.specularIntensityMapUv),e.push(t.transmissionMapUv),e.push(t.thicknessMapUv),e.push(t.combine),e.push(t.fogExp2),e.push(t.sizeAttenuation),e.push(t.morphTargetsCount),e.push(t.morphAttributeCount),e.push(t.numDirLights),e.push(t.numPointLights),e.push(t.numSpotLights),e.push(t.numSpotLightMaps),e.push(t.numHemiLights),e.push(t.numRectAreaLights),e.push(t.numDirLightShadows),e.push(t.numPointLightShadows),e.push(t.numSpotLightShadows),e.push(t.numSpotLightShadowsWithMaps),e.push(t.numLightProbes),e.push(t.shadowMapType),e.push(t.toneMapping),e.push(t.numClippingPlanes),e.push(t.numClipIntersection),e.push(t.depthPacking)}(n,t),function(e,t){l.disableAll(),t.instancing&&l.enable(0);t.instancingColor&&l.enable(1);t.instancingMorph&&l.enable(2);t.matcap&&l.enable(3);t.envMap&&l.enable(4);t.normalMapObjectSpace&&l.enable(5);t.normalMapTangentSpace&&l.enable(6);t.clearcoat&&l.enable(7);t.iridescence&&l.enable(8);t.alphaTest&&l.enable(9);t.vertexColors&&l.enable(10);t.vertexAlphas&&l.enable(11);t.vertexUv1s&&l.enable(12);t.vertexUv2s&&l.enable(13);t.vertexUv3s&&l.enable(14);t.vertexTangents&&l.enable(15);t.anisotropy&&l.enable(16);t.alphaHash&&l.enable(17);t.batching&&l.enable(18);t.dispersion&&l.enable(19);t.batchingColor&&l.enable(20);t.gradientMap&&l.enable(21);e.push(l.mask),l.disableAll(),t.fog&&l.enable(0);t.useFog&&l.enable(1);t.flatShading&&l.enable(2);t.logarithmicDepthBuffer&&l.enable(3);t.reversedDepthBuffer&&l.enable(4);t.skinning&&l.enable(5);t.morphTargets&&l.enable(6);t.morphNormals&&l.enable(7);t.morphColors&&l.enable(8);t.premultipliedAlpha&&l.enable(9);t.shadowMapEnabled&&l.enable(10);t.doubleSided&&l.enable(11);t.flipSided&&l.enable(12);t.useDepthPacking&&l.enable(13);t.dithering&&l.enable(14);t.transmission&&l.enable(15);t.sheen&&l.enable(16);t.opaque&&l.enable(17);t.pointsUvs&&l.enable(18);t.decodeVideoTexture&&l.enable(19);t.decodeVideoTextureEmissive&&l.enable(20);t.alphaToCoverage&&l.enable(21);e.push(l.mask)}(n,t),n.push(e.outputColorSpace)),n.push(t.customProgramCacheKey),n.join()},getUniforms:function(e){const t=v[e.type];let n;if(t){const e=Vn[t];n=he.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let i=h.get(n);return void 0!==i?++i.usedTimes:(i=new Zr(e,n,t,o),f.push(i),h.set(n,i)),i},releaseProgram:function(e){if(0===--e.usedTimes){const t=f.indexOf(e);f[t]=f[f.length-1],f.pop(),h.delete(e.cacheKey),e.destroy()}},releaseShaderCache:function(e){d.remove(e)},programs:f,dispose:function(){d.dispose()}}}function ta(){let e=new WeakMap;return{has:function(t){return e.has(t)},get:function(t){let n=e.get(t);return void 0===n&&(n={},e.set(t,n)),n},remove:function(t){e.delete(t)},update:function(t,n,i){e.get(t)[n]=i},dispose:function(){e=new WeakMap}}}function na(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.materialVariant!==t.materialVariant?e.materialVariant-t.materialVariant:e.z!==t.z?e.z-t.z:e.id-t.id}function ia(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function ra(){const e=[];let t=0;const n=[],i=[],r=[];function a(e){let t=0;return e.isInstancedMesh&&(t+=2),e.isSkinnedMesh&&(t+=1),t}function o(n,i,r,o,s,l){let c=e[t];return void 0===c?(c={id:n.id,object:n,geometry:i,material:r,materialVariant:a(n),groupOrder:o,renderOrder:n.renderOrder,z:s,group:l},e[t]=c):(c.id=n.id,c.object=n,c.geometry=i,c.material=r,c.materialVariant=a(n),c.groupOrder=o,c.renderOrder=n.renderOrder,c.z=s,c.group=l),t++,c}return{opaque:n,transmissive:i,transparent:r,init:function(){t=0,n.length=0,i.length=0,r.length=0},push:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.push(d):!0===a.transparent?r.push(d):n.push(d)},unshift:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.unshift(d):!0===a.transparent?r.unshift(d):n.unshift(d)},finish:function(){for(let n=t,i=e.length;n1&&n.sort(e||na),i.length>1&&i.sort(t||ia),r.length>1&&r.sort(t||ia)}}}function aa(){let e=new WeakMap;return{get:function(t,n){const i=e.get(t);let r;return void 0===i?(r=new ra,e.set(t,[r])):n>=i.length?(r=new ra,i.push(r)):r=i[n],r},dispose:function(){e=new WeakMap}}}function oa(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let i;switch(t.type){case"DirectionalLight":i={direction:new r,color:new n};break;case"SpotLight":i={position:new r,direction:new r,color:new n,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new r,color:new n,distance:0,decay:0};break;case"HemisphereLight":i={direction:new r,skyColor:new n,groundColor:new n};break;case"RectAreaLight":i={color:new n,position:new r,halfWidth:new r,halfHeight:new r}}return e[t.id]=i,i}}}let sa=0;function la(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function ca(e){const n=new oa,i=function(){const e={};return{get:function(n){if(void 0!==e[n.id])return e[n.id];let i;switch(n.type){case"DirectionalLight":case"SpotLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t};break;case"PointLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t,shadowCameraNear:1,shadowCameraFar:1e3}}return e[n.id]=i,i}}}(),a={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let e=0;e<9;e++)a.probe.push(new r);const o=new r,s=new f,l=new f;return{setup:function(t){let r=0,o=0,s=0;for(let e=0;e<9;e++)a.probe[e].set(0,0,0);let l=0,c=0,d=0,u=0,f=0,p=0,m=0,h=0,_=0,g=0,v=0;t.sort(la);for(let e=0,E=t.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=Hn.LTC_FLOAT_1,a.rectAreaLTC2=Hn.LTC_FLOAT_2):(a.rectAreaLTC1=Hn.LTC_HALF_1,a.rectAreaLTC2=Hn.LTC_HALF_2)),a.ambient[0]=r,a.ambient[1]=o,a.ambient[2]=s;const E=a.hash;E.directionalLength===l&&E.pointLength===c&&E.spotLength===d&&E.rectAreaLength===u&&E.hemiLength===f&&E.numDirectionalShadows===p&&E.numPointShadows===m&&E.numSpotShadows===h&&E.numSpotMaps===_&&E.numLightProbes===v||(a.directional.length=l,a.spot.length=d,a.rectArea.length=u,a.point.length=c,a.hemi.length=f,a.directionalShadow.length=p,a.directionalShadowMap.length=p,a.pointShadow.length=m,a.pointShadowMap.length=m,a.spotShadow.length=h,a.spotShadowMap.length=h,a.directionalShadowMatrix.length=p,a.pointShadowMatrix.length=m,a.spotLightMatrix.length=h+_-g,a.spotLightMap.length=_,a.numSpotLightShadowsWithMaps=g,a.numLightProbes=v,E.directionalLength=l,E.pointLength=c,E.spotLength=d,E.rectAreaLength=u,E.hemiLength=f,E.numDirectionalShadows=p,E.numPointShadows=m,E.numSpotShadows=h,E.numSpotMaps=_,E.numLightProbes=v,a.version=sa++)},setupView:function(e,t){let n=0,i=0,r=0,c=0,d=0;const u=t.matrixWorldInverse;for(let t=0,f=e.length;t=r.length?(a=new da(e),r.push(a)):a=r[i],a},dispose:function(){t=new WeakMap}}}const fa=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],pa=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],ma=new f,ha=new r,_a=new r;function ga(e,n,i){let r=new Me;const a=new t,s=new t,d=new X,u=new xe,f=new Ae,p={},m=i.maxTextureSize,h={[_]:c,[c]:_,[_e]:_e},g=new l({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new t},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"}),v=g.clone();v.defines.HORIZONTAL_PASS=1;const T=new U;T.setAttribute("position",new B(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const x=new o(T,g),A=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=de;let R=this.type;function b(t,i){const r=n.update(x);g.defines.VSM_SAMPLES!==t.blurSamples&&(g.defines.VSM_SAMPLES=t.blurSamples,v.defines.VSM_SAMPLES=t.blurSamples,g.needsUpdate=!0,v.needsUpdate=!0),null===t.mapPass&&(t.mapPass=new O(a.x,a.y,{format:Te,type:S})),g.uniforms.shadow_pass.value=t.map.depthTexture,g.uniforms.resolution.value=t.mapSize,g.uniforms.radius.value=t.radius,e.setRenderTarget(t.mapPass),e.clear(),e.renderBufferDirect(i,null,r,g,x,null),v.uniforms.shadow_pass.value=t.mapPass.texture,v.uniforms.resolution.value=t.mapSize,v.uniforms.radius.value=t.radius,e.setRenderTarget(t.map),e.clear(),e.renderBufferDirect(i,null,r,v,x,null)}function P(t,n,i,r){let a=null;const o=!0===i.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)a=o;else if(a=!0===i.isPointLight?f:u,e.localClippingEnabled&&!0===n.clipShadows&&Array.isArray(n.clippingPlanes)&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0||n.map&&n.alphaTest>0||!0===n.alphaToCoverage){const e=a.uuid,t=n.uuid;let i=p[e];void 0===i&&(i={},p[e]=i);let r=i[t];void 0===r&&(r=a.clone(),i[t]=r,n.addEventListener("dispose",D)),a=r}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=r===ce?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:h[n.side],a.alphaMap=n.alphaMap,a.alphaTest=!0===n.alphaToCoverage?.5:n.alphaTest,a.map=n.map,a.clipShadows=n.clipShadows,a.clippingPlanes=n.clippingPlanes,a.clipIntersection=n.clipIntersection,a.displacementMap=n.displacementMap,a.displacementScale=n.displacementScale,a.displacementBias=n.displacementBias,a.wireframeLinewidth=n.wireframeLinewidth,a.linewidth=n.linewidth,!0===i.isPointLight&&!0===a.isMeshDistanceMaterial){e.properties.get(a).light=i}return a}function L(t,i,a,o,s){if(!1===t.visible)return;if(t.layers.test(i.layers)&&(t.isMesh||t.isLine||t.isPoints)&&(t.castShadow||t.receiveShadow&&s===ce)&&(!t.frustumCulled||r.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,t.matrixWorld);const r=n.update(t),l=t.material;if(Array.isArray(l)){const n=r.groups;for(let c=0,d=n.length;ce.needsUpdate=!0):e.material.needsUpdate=!0)});for(let o=0,l=t.length;om||a.y>m)&&(a.x>m&&(s.x=Math.floor(m/p.x),a.x=s.x*p.x,c.mapSize.x=s.x),a.y>m&&(s.y=Math.floor(m/p.y),a.y=s.y*p.y,c.mapSize.y=s.y)),null===c.map||!0===f){if(null!==c.map&&(null!==c.map.depthTexture&&(c.map.depthTexture.dispose(),c.map.depthTexture=null),c.map.dispose()),this.type===ce){if(l.isPointLight){E("WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead.");continue}c.map=new O(a.x,a.y,{format:Te,type:S,minFilter:H,magFilter:H,generateMipmaps:!1}),c.map.texture.name=l.name+".shadowMap",c.map.depthTexture=new oe(a.x,a.y,M),c.map.depthTexture.name=l.name+".shadowMapDepth",c.map.depthTexture.format=be,c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Ce,c.map.depthTexture.magFilter=Ce}else{l.isPointLight?(c.map=new C(a.x),c.map.depthTexture=new Pe(a.x,Le)):(c.map=new O(a.x,a.y),c.map.depthTexture=new oe(a.x,a.y,Le)),c.map.depthTexture.name=l.name+".shadowMap",c.map.depthTexture.format=be;const t=e.state.buffers.depth.getReversed();this.type===de?(c.map.depthTexture.compareFunction=t?re:ae,c.map.depthTexture.minFilter=H,c.map.depthTexture.magFilter=H):(c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Ce,c.map.depthTexture.magFilter=Ce)}c.camera.updateProjectionMatrix()}const h=c.map.isWebGLCubeRenderTarget?6:1;for(let t=0;t=1):-1!==I.indexOf("OpenGL ES")&&(w=parseFloat(/^OpenGL ES (\d)/.exec(I)[1]),D=w>=2);let N=null,O={};const B=e.getParameter(e.SCISSOR_BOX),G=e.getParameter(e.VIEWPORT),H=(new X).fromArray(B),V=(new X).fromArray(G);function W(t,n,i,r){const a=new Uint8Array(4),o=e.createTexture();e.bindTexture(t,o),e.texParameteri(t,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(t,e.TEXTURE_MAG_FILTER,e.NEAREST);for(let o=0;on||r.height>n)&&(i=n/Math.max(r.width,r.height)),i<1){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof VideoFrame&&e instanceof VideoFrame){const n=Math.floor(i*r.width),a=Math.floor(i*r.height);void 0===f&&(f=g(n,a));const o=t?g(n,a):f;o.width=n,o.height=a;return o.getContext("2d").drawImage(e,0,0,n,a),E("WebGLRenderer: Texture has been resized from ("+r.width+"x"+r.height+") to ("+n+"x"+a+")."),o}return"data"in e&&E("WebGLRenderer: Image in DataTexture is too big ("+r.width+"x"+r.height+")."),e}return e}function S(e){return e.generateMipmaps}function A(t){e.generateMipmap(t)}function R(t){return t.isWebGLCubeRenderTarget?e.TEXTURE_CUBE_MAP:t.isWebGL3DRenderTarget?e.TEXTURE_3D:t.isWebGLArrayRenderTarget||t.isCompressedArrayTexture?e.TEXTURE_2D_ARRAY:e.TEXTURE_2D}function b(t,i,r,a,o=!1){if(null!==t){if(void 0!==e[t])return e[t];E("WebGLRenderer: Attempt to use non-existing WebGL internal format '"+t+"'")}let s=i;if(i===e.RED&&(r===e.FLOAT&&(s=e.R32F),r===e.HALF_FLOAT&&(s=e.R16F),r===e.UNSIGNED_BYTE&&(s=e.R8)),i===e.RED_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.R8UI),r===e.UNSIGNED_SHORT&&(s=e.R16UI),r===e.UNSIGNED_INT&&(s=e.R32UI),r===e.BYTE&&(s=e.R8I),r===e.SHORT&&(s=e.R16I),r===e.INT&&(s=e.R32I)),i===e.RG&&(r===e.FLOAT&&(s=e.RG32F),r===e.HALF_FLOAT&&(s=e.RG16F),r===e.UNSIGNED_BYTE&&(s=e.RG8)),i===e.RG_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RG8UI),r===e.UNSIGNED_SHORT&&(s=e.RG16UI),r===e.UNSIGNED_INT&&(s=e.RG32UI),r===e.BYTE&&(s=e.RG8I),r===e.SHORT&&(s=e.RG16I),r===e.INT&&(s=e.RG32I)),i===e.RGB_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGB8UI),r===e.UNSIGNED_SHORT&&(s=e.RGB16UI),r===e.UNSIGNED_INT&&(s=e.RGB32UI),r===e.BYTE&&(s=e.RGB8I),r===e.SHORT&&(s=e.RGB16I),r===e.INT&&(s=e.RGB32I)),i===e.RGBA_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGBA8UI),r===e.UNSIGNED_SHORT&&(s=e.RGBA16UI),r===e.UNSIGNED_INT&&(s=e.RGBA32UI),r===e.BYTE&&(s=e.RGBA8I),r===e.SHORT&&(s=e.RGBA16I),r===e.INT&&(s=e.RGBA32I)),i===e.RGB&&(r===e.UNSIGNED_INT_5_9_9_9_REV&&(s=e.RGB9_E5),r===e.UNSIGNED_INT_10F_11F_11F_REV&&(s=e.R11F_G11F_B10F)),i===e.RGBA){const t=o?me:p.getTransfer(a);r===e.FLOAT&&(s=e.RGBA32F),r===e.HALF_FLOAT&&(s=e.RGBA16F),r===e.UNSIGNED_BYTE&&(s=t===m?e.SRGB8_ALPHA8:e.RGBA8),r===e.UNSIGNED_SHORT_4_4_4_4&&(s=e.RGBA4),r===e.UNSIGNED_SHORT_5_5_5_1&&(s=e.RGB5_A1)}return s!==e.R16F&&s!==e.R32F&&s!==e.RG16F&&s!==e.RG32F&&s!==e.RGBA16F&&s!==e.RGBA32F||n.get("EXT_color_buffer_float"),s}function C(t,n){let i;return t?null===n||n===Le||n===Ct?i=e.DEPTH24_STENCIL8:n===M?i=e.DEPTH32F_STENCIL8:n===Pt&&(i=e.DEPTH24_STENCIL8,E("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===Le||n===Ct?i=e.DEPTH_COMPONENT24:n===M?i=e.DEPTH_COMPONENT32F:n===Pt&&(i=e.DEPTH_COMPONENT16),i}function P(e,t){return!0===S(e)||e.isFramebufferTexture&&e.minFilter!==Ce&&e.minFilter!==H?Math.log2(Math.max(t.width,t.height))+1:void 0!==e.mipmaps&&e.mipmaps.length>0?e.mipmaps.length:e.isCompressedTexture&&Array.isArray(e.image)?t.mipmaps.length:1}function L(e){const t=e.target;t.removeEventListener("dispose",L),function(e){const t=r.get(e);if(void 0===t.__webglInit)return;const n=e.source,i=h.get(n);if(i){const r=i[t.__cacheKey];r.usedTimes--,0===r.usedTimes&&D(e),0===Object.keys(i).length&&h.delete(n)}r.remove(e)}(t),t.isVideoTexture&&u.delete(t)}function U(t){const n=t.target;n.removeEventListener("dispose",U),function(t){const n=r.get(t);t.depthTexture&&(t.depthTexture.dispose(),r.remove(t.depthTexture));if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(n.__webglFramebuffer[t]))for(let i=0;i0&&a.__version!==t.version){const e=t.image;if(null===e)E("WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==e.complete)return void k(a,t,n);E("WebGLRenderer: Texture marked for update but image is incomplete")}}else t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null);i.bindTexture(e.TEXTURE_2D,a.__webglTexture,e.TEXTURE0+n)}const N={[pt]:e.REPEAT,[ft]:e.CLAMP_TO_EDGE,[ut]:e.MIRRORED_REPEAT},F={[Ce]:e.NEAREST,[gt]:e.NEAREST_MIPMAP_NEAREST,[_t]:e.NEAREST_MIPMAP_LINEAR,[H]:e.LINEAR,[ht]:e.LINEAR_MIPMAP_NEAREST,[mt]:e.LINEAR_MIPMAP_LINEAR},O={[xt]:e.NEVER,[Mt]:e.ALWAYS,[Tt]:e.LESS,[ae]:e.LEQUAL,[St]:e.EQUAL,[re]:e.GEQUAL,[Et]:e.GREATER,[vt]:e.NOTEQUAL};function B(t,i){if(i.type!==M||!1!==n.has("OES_texture_float_linear")||i.magFilter!==H&&i.magFilter!==ht&&i.magFilter!==_t&&i.magFilter!==mt&&i.minFilter!==H&&i.minFilter!==ht&&i.minFilter!==_t&&i.minFilter!==mt||E("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),e.texParameteri(t,e.TEXTURE_WRAP_S,N[i.wrapS]),e.texParameteri(t,e.TEXTURE_WRAP_T,N[i.wrapT]),t!==e.TEXTURE_3D&&t!==e.TEXTURE_2D_ARRAY||e.texParameteri(t,e.TEXTURE_WRAP_R,N[i.wrapR]),e.texParameteri(t,e.TEXTURE_MAG_FILTER,F[i.magFilter]),e.texParameteri(t,e.TEXTURE_MIN_FILTER,F[i.minFilter]),i.compareFunction&&(e.texParameteri(t,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(t,e.TEXTURE_COMPARE_FUNC,O[i.compareFunction])),!0===n.has("EXT_texture_filter_anisotropic")){if(i.magFilter===Ce)return;if(i.minFilter!==_t&&i.minFilter!==mt)return;if(i.type===M&&!1===n.has("OES_texture_float_linear"))return;if(i.anisotropy>1||r.get(i).__currentAnisotropy){const o=n.get("EXT_texture_filter_anisotropic");e.texParameterf(t,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(i.anisotropy,a.getMaxAnisotropy())),r.get(i).__currentAnisotropy=i.anisotropy}}}function V(t,n){let i=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",L));const r=n.source;let a=h.get(r);void 0===a&&(a={},h.set(r,a));const o=function(e){const t=[];return t.push(e.wrapS),t.push(e.wrapT),t.push(e.wrapR||0),t.push(e.magFilter),t.push(e.minFilter),t.push(e.anisotropy),t.push(e.internalFormat),t.push(e.format),t.push(e.type),t.push(e.generateMipmaps),t.push(e.premultiplyAlpha),t.push(e.flipY),t.push(e.unpackAlignment),t.push(e.colorSpace),t.join()}(n);if(o!==t.__cacheKey){void 0===a[o]&&(a[o]={texture:e.createTexture(),usedTimes:0},s.memory.textures++,i=!0),a[o].usedTimes++;const r=a[t.__cacheKey];void 0!==r&&(a[t.__cacheKey].usedTimes--,0===r.usedTimes&&D(n)),t.__cacheKey=o,t.__webglTexture=a[o].texture}return i}function W(e,t,n){return Math.floor(Math.floor(e/n)/t)}function k(t,n,s){let l=e.TEXTURE_2D;(n.isDataArrayTexture||n.isCompressedArrayTexture)&&(l=e.TEXTURE_2D_ARRAY),n.isData3DTexture&&(l=e.TEXTURE_3D);const c=V(t,n),d=n.source;i.bindTexture(l,t.__webglTexture,e.TEXTURE0+s);const u=r.get(d);if(d.version!==u.__version||!0===c){i.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),r=n.colorSpace===At?null:p.getPrimaries(n.colorSpace),f=n.colorSpace===At||t===r?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,f);let m=v(n.image,!1,a.maxTextureSize);m=Q(n,m);const h=o.convert(n.format,n.colorSpace),_=o.convert(n.type);let g,T=b(n.internalFormat,h,_,n.colorSpace,n.isVideoTexture);B(l,n);const M=n.mipmaps,R=!0!==n.isVideoTexture,L=void 0===u.__version||!0===c,U=d.dataReady,D=P(n,m);if(n.isDepthTexture)T=C(n.format===Rt,n.type),L&&(R?i.texStorage2D(e.TEXTURE_2D,1,T,m.width,m.height):i.texImage2D(e.TEXTURE_2D,0,T,m.width,m.height,0,h,_,null));else if(n.isDataTexture)if(M.length>0){R&&L&&i.texStorage2D(e.TEXTURE_2D,D,T,M[0].width,M[0].height);for(let t=0,n=M.length;te.start-t.start);let s=0;for(let e=1;e0){const r=bt(g.width,g.height,n.format,n.type);for(const a of n.layerUpdates){const n=g.data.subarray(a*r/g.data.BYTES_PER_ELEMENT,(a+1)*r/g.data.BYTES_PER_ELEMENT);i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,a,g.width,g.height,1,h,n)}n.clearLayerUpdates()}else i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,g.data)}else i.compressedTexImage3D(e.TEXTURE_2D_ARRAY,t,T,g.width,g.height,m.depth,0,g.data,0,0);else E("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else R?U&&i.texSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,_,g.data):i.texImage3D(e.TEXTURE_2D_ARRAY,t,T,g.width,g.height,m.depth,0,h,_,g.data)}else{R&&L&&i.texStorage2D(e.TEXTURE_2D,D,T,M[0].width,M[0].height);for(let t=0,r=M.length;t0){const t=bt(m.width,m.height,n.format,n.type);for(const r of n.layerUpdates){const n=m.data.subarray(r*t/m.data.BYTES_PER_ELEMENT,(r+1)*t/m.data.BYTES_PER_ELEMENT);i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,r,m.width,m.height,1,h,_,n)}n.clearLayerUpdates()}else i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)}else i.texImage3D(e.TEXTURE_2D_ARRAY,0,T,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isData3DTexture)R?(L&&i.texStorage3D(e.TEXTURE_3D,D,T,m.width,m.height,m.depth),U&&i.texSubImage3D(e.TEXTURE_3D,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)):i.texImage3D(e.TEXTURE_3D,0,T,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isFramebufferTexture){if(L)if(R)i.texStorage2D(e.TEXTURE_2D,D,T,m.width,m.height);else{let t=m.width,n=m.height;for(let r=0;r>=1,n>>=1}}else if(M.length>0){if(R&&L){const t=J(M[0]);i.texStorage2D(e.TEXTURE_2D,D,T,t.width,t.height)}for(let t=0,n=M.length;t>d),r=Math.max(1,n.height>>d);c===e.TEXTURE_3D||c===e.TEXTURE_2D_ARRAY?i.texImage3D(c,d,p,t,r,n.depth,0,u,f,null):i.texImage2D(c,d,p,t,r,0,u,f,null)}i.bindFramebuffer(e.FRAMEBUFFER,t),$(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,Z(n)):(c===e.TEXTURE_2D||c>=e.TEXTURE_CUBE_MAP_POSITIVE_X&&c<=e.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&e.framebufferTexture2D(e.FRAMEBUFFER,s,c,h.__webglTexture,d),i.bindFramebuffer(e.FRAMEBUFFER,null)}function X(t,n,i){if(e.bindRenderbuffer(e.RENDERBUFFER,t),n.depthBuffer){const r=n.depthTexture,a=r&&r.isDepthTexture?r.type:null,o=C(n.stencilBuffer,a),s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT;$(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,Z(n),o,n.width,n.height):i?e.renderbufferStorageMultisample(e.RENDERBUFFER,Z(n),o,n.width,n.height):e.renderbufferStorage(e.RENDERBUFFER,o,n.width,n.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,s,e.RENDERBUFFER,t)}else{const t=n.textures;for(let r=0;r{delete n.__boundDepthTexture,delete n.__depthDisposeCallback,e.removeEventListener("dispose",t)};e.addEventListener("dispose",t),n.__depthDisposeCallback=t}n.__boundDepthTexture=e}if(t.depthTexture&&!n.__autoAllocateDepthBuffer)if(a)for(let e=0;e<6;e++)Y(n.__webglFramebuffer[e],t,e);else{const e=t.texture.mipmaps;e&&e.length>0?Y(n.__webglFramebuffer[0],t,0):Y(n.__webglFramebuffer,t,0)}else if(a){n.__webglDepthbuffer=[];for(let r=0;r<6;r++)if(i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[r]),void 0===n.__webglDepthbuffer[r])n.__webglDepthbuffer[r]=e.createRenderbuffer(),X(n.__webglDepthbuffer[r],t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,a=n.__webglDepthbuffer[r];e.bindRenderbuffer(e.RENDERBUFFER,a),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,a)}}else{const r=t.texture.mipmaps;if(r&&r.length>0?i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[0]):i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer),void 0===n.__webglDepthbuffer)n.__webglDepthbuffer=e.createRenderbuffer(),X(n.__webglDepthbuffer,t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,r=n.__webglDepthbuffer;e.bindRenderbuffer(e.RENDERBUFFER,r),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,r)}}i.bindFramebuffer(e.FRAMEBUFFER,null)}const j=[],q=[];function Z(e){return Math.min(a.maxSamples,e.samples)}function $(e){const t=r.get(e);return e.samples>0&&!0===n.has("WEBGL_multisampled_render_to_texture")&&!1!==t.__useRenderToTexture}function Q(e,t){const n=e.colorSpace,i=e.format,r=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==G&&n!==At&&(p.getTransfer(n)===m?i===x&&r===T||E("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):y("WebGLTextures: Unsupported texture color space:",n)),t}function J(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?(d.width=e.naturalWidth||e.width,d.height=e.naturalHeight||e.height):"undefined"!=typeof VideoFrame&&e instanceof VideoFrame?(d.width=e.displayWidth,d.height=e.displayHeight):(d.width=e.width,d.height=e.height),d}this.allocateTextureUnit=function(){const e=w;return e>=a.maxTextures&&E("WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+a.maxTextures),w+=1,e},this.resetTextureUnits=function(){w=0},this.setTexture2D=I,this.setTexture2DArray=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?k(a,t,n):(t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null),i.bindTexture(e.TEXTURE_2D_ARRAY,a.__webglTexture,e.TEXTURE0+n))},this.setTexture3D=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?k(a,t,n):i.bindTexture(e.TEXTURE_3D,a.__webglTexture,e.TEXTURE0+n)},this.setTextureCube=function(t,n){const s=r.get(t);!0!==t.isCubeDepthTexture&&t.version>0&&s.__version!==t.version?function(t,n,s){if(6!==n.image.length)return;const l=V(t,n),c=n.source;i.bindTexture(e.TEXTURE_CUBE_MAP,t.__webglTexture,e.TEXTURE0+s);const d=r.get(c);if(c.version!==d.__version||!0===l){i.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),r=n.colorSpace===At?null:p.getPrimaries(n.colorSpace),u=n.colorSpace===At||t===r?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,u);const f=n.isCompressedTexture||n.image[0].isCompressedTexture,m=n.image[0]&&n.image[0].isDataTexture,h=[];for(let e=0;e<6;e++)h[e]=f||m?m?n.image[e].image:n.image[e]:v(n.image[e],!0,a.maxCubemapSize),h[e]=Q(n,h[e]);const _=h[0],g=o.convert(n.format,n.colorSpace),T=o.convert(n.type),M=b(n.internalFormat,g,T,n.colorSpace),R=!0!==n.isVideoTexture,C=void 0===d.__version||!0===l,L=c.dataReady;let U,D=P(n,_);if(B(e.TEXTURE_CUBE_MAP,n),f){R&&C&&i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,_.width,_.height);for(let t=0;t<6;t++){U=h[t].mipmaps;for(let r=0;r0&&D++;const t=J(h[0]);i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,t.width,t.height)}for(let t=0;t<6;t++)if(m){R?L&&i.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,h[t].width,h[t].height,g,T,h[t].data):i.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,M,h[t].width,h[t].height,0,g,T,h[t].data);for(let n=0;n1;if(u||(void 0===l.__webglTexture&&(l.__webglTexture=e.createTexture()),l.__version=n.version,s.memory.textures++),d){a.__webglFramebuffer=[];for(let t=0;t<6;t++)if(n.mipmaps&&n.mipmaps.length>0){a.__webglFramebuffer[t]=[];for(let i=0;i0){a.__webglFramebuffer=[];for(let t=0;t0&&!1===$(t)){a.__webglMultisampledFramebuffer=e.createFramebuffer(),a.__webglColorRenderbuffer=[],i.bindFramebuffer(e.FRAMEBUFFER,a.__webglMultisampledFramebuffer);for(let n=0;n0)for(let r=0;r0)for(let i=0;i0)if(!1===$(t)){const n=t.textures,a=t.width,o=t.height;let s=e.COLOR_BUFFER_BIT;const l=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,d=r.get(t),u=n.length>1;if(u)for(let t=0;t0?i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer[0]):i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer);for(let i=0;i= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}",uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new o(new h(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class xa extends bn{constructor(e,n){super();const i=this;let a=null,o=1,s=null,l="local-floor",c=1,d=null,u=null,f=null,p=null,m=null,h=null;const _="undefined"!=typeof XRWebGLBinding,g=new Ma,v={},S=n.getContextAttributes();let M=null,A=null;const R=[],b=[],C=new t;let P=null;const L=new w;L.viewport=new X;const U=new w;U.viewport=new X;const D=[L,U],I=new Cn;let N=null,y=null;function F(e){const t=b.indexOf(e.inputSource);if(-1===t)return;const n=R[t];void 0!==n&&(n.update(e.inputSource,e.frame,d||s),n.dispatchEvent({type:e.type,data:e.inputSource}))}function B(){a.removeEventListener("select",F),a.removeEventListener("selectstart",F),a.removeEventListener("selectend",F),a.removeEventListener("squeeze",F),a.removeEventListener("squeezestart",F),a.removeEventListener("squeezeend",F),a.removeEventListener("end",B),a.removeEventListener("inputsourceschange",G);for(let e=0;e=0&&(b[i]=null,R[i].disconnect(n))}for(let t=0;t=b.length){b.push(n),i=e;break}if(null===b[e]){b[e]=n,i=e;break}}if(-1===i)break}const r=R[i];r&&r.connect(n)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getGripSpace()},this.getHand=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){o=e,!0===i.isPresenting&&E("WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){l=e,!0===i.isPresenting&&E("WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return d||s},this.setReferenceSpace=function(e){d=e},this.getBaseLayer=function(){return null!==p?p:m},this.getBinding=function(){return null===f&&_&&(f=new XRWebGLBinding(a,n)),f},this.getFrame=function(){return h},this.getSession=function(){return a},this.setSession=async function(t){if(a=t,null!==a){M=e.getRenderTarget(),a.addEventListener("select",F),a.addEventListener("selectstart",F),a.addEventListener("selectend",F),a.addEventListener("squeeze",F),a.addEventListener("squeezestart",F),a.addEventListener("squeezeend",F),a.addEventListener("end",B),a.addEventListener("inputsourceschange",G),!0!==S.xrCompatible&&await n.makeXRCompatible(),P=e.getPixelRatio(),e.getSize(C);if(_&&"createProjectionLayer"in XRWebGLBinding.prototype){let t=null,i=null,r=null;S.depth&&(r=S.stencil?n.DEPTH24_STENCIL8:n.DEPTH_COMPONENT24,t=S.stencil?Rt:be,i=S.stencil?Ct:Le);const s={colorFormat:n.RGBA8,depthFormat:r,scaleFactor:o};f=this.getBinding(),p=f.createProjectionLayer(s),a.updateRenderState({layers:[p]}),e.setPixelRatio(1),e.setSize(p.textureWidth,p.textureHeight,!1),A=new O(p.textureWidth,p.textureHeight,{format:x,type:T,depthTexture:new oe(p.textureWidth,p.textureHeight,i,void 0,void 0,void 0,void 0,void 0,void 0,t),stencilBuffer:S.stencil,colorSpace:e.outputColorSpace,samples:S.antialias?4:0,resolveDepthBuffer:!1===p.ignoreDepthValues,resolveStencilBuffer:!1===p.ignoreDepthValues})}else{const t={antialias:S.antialias,alpha:!0,depth:S.depth,stencil:S.stencil,framebufferScaleFactor:o};m=new XRWebGLLayer(a,n,t),a.updateRenderState({baseLayer:m}),e.setPixelRatio(1),e.setSize(m.framebufferWidth,m.framebufferHeight,!1),A=new O(m.framebufferWidth,m.framebufferHeight,{format:x,type:T,colorSpace:e.outputColorSpace,stencilBuffer:S.stencil,resolveDepthBuffer:!1===m.ignoreDepthValues,resolveStencilBuffer:!1===m.ignoreDepthValues})}A.isXRRenderTarget=!0,this.setFoveation(c),d=null,s=await a.requestReferenceSpace(l),z.setContext(a),z.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==a)return a.environmentBlendMode},this.getDepthTexture=function(){return g.getDepthTexture()};const H=new r,V=new r;function W(e,t){null===t?e.matrixWorld.copy(e.matrix):e.matrixWorld.multiplyMatrices(t.matrixWorld,e.matrix),e.matrixWorldInverse.copy(e.matrixWorld).invert()}this.updateCamera=function(e){if(null===a)return;let t=e.near,n=e.far;null!==g.texture&&(g.depthNear>0&&(t=g.depthNear),g.depthFar>0&&(n=g.depthFar)),I.near=U.near=L.near=t,I.far=U.far=L.far=n,N===I.near&&y===I.far||(a.updateRenderState({depthNear:I.near,depthFar:I.far}),N=I.near,y=I.far),I.layers.mask=6|e.layers.mask,L.layers.mask=-5&I.layers.mask,U.layers.mask=-3&I.layers.mask;const i=e.parent,r=I.cameras;W(I,i);for(let e=0;e0&&(e.alphaTest.value=i.alphaTest);const r=t.get(i),a=r.envMap,o=r.envMapRotation;a&&(e.envMap.value=a,Aa.copy(o),Aa.x*=-1,Aa.y*=-1,Aa.z*=-1,a.isCubeTexture&&!1===a.isRenderTargetTexture&&(Aa.y*=-1,Aa.z*=-1),e.envMapRotation.value.setFromMatrix4(Ra.makeRotationFromEuler(Aa)),e.flipEnvMap.value=a.isCubeTexture&&!1===a.isRenderTargetTexture?-1:1,e.reflectivity.value=i.reflectivity,e.ior.value=i.ior,e.refractionRatio.value=i.refractionRatio),i.lightMap&&(e.lightMap.value=i.lightMap,e.lightMapIntensity.value=i.lightMapIntensity,n(i.lightMap,e.lightMapTransform)),i.aoMap&&(e.aoMap.value=i.aoMap,e.aoMapIntensity.value=i.aoMapIntensity,n(i.aoMap,e.aoMapTransform))}return{refreshFogUniforms:function(t,n){n.color.getRGB(t.fogColor.value,g(e)),n.isFog?(t.fogNear.value=n.near,t.fogFar.value=n.far):n.isFogExp2&&(t.fogDensity.value=n.density)},refreshMaterialUniforms:function(e,r,a,o,s){r.isMeshBasicMaterial||r.isMeshLambertMaterial?i(e,r):r.isMeshToonMaterial?(i(e,r),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}(e,r)):r.isMeshPhongMaterial?(i(e,r),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4)}(e,r)):r.isMeshStandardMaterial?(i(e,r),function(e,t){e.metalness.value=t.metalness,t.metalnessMap&&(e.metalnessMap.value=t.metalnessMap,n(t.metalnessMap,e.metalnessMapTransform));e.roughness.value=t.roughness,t.roughnessMap&&(e.roughnessMap.value=t.roughnessMap,n(t.roughnessMap,e.roughnessMapTransform));t.envMap&&(e.envMapIntensity.value=t.envMapIntensity)}(e,r),r.isMeshPhysicalMaterial&&function(e,t,i){e.ior.value=t.ior,t.sheen>0&&(e.sheenColor.value.copy(t.sheenColor).multiplyScalar(t.sheen),e.sheenRoughness.value=t.sheenRoughness,t.sheenColorMap&&(e.sheenColorMap.value=t.sheenColorMap,n(t.sheenColorMap,e.sheenColorMapTransform)),t.sheenRoughnessMap&&(e.sheenRoughnessMap.value=t.sheenRoughnessMap,n(t.sheenRoughnessMap,e.sheenRoughnessMapTransform)));t.clearcoat>0&&(e.clearcoat.value=t.clearcoat,e.clearcoatRoughness.value=t.clearcoatRoughness,t.clearcoatMap&&(e.clearcoatMap.value=t.clearcoatMap,n(t.clearcoatMap,e.clearcoatMapTransform)),t.clearcoatRoughnessMap&&(e.clearcoatRoughnessMap.value=t.clearcoatRoughnessMap,n(t.clearcoatRoughnessMap,e.clearcoatRoughnessMapTransform)),t.clearcoatNormalMap&&(e.clearcoatNormalMap.value=t.clearcoatNormalMap,n(t.clearcoatNormalMap,e.clearcoatNormalMapTransform),e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale),t.side===c&&e.clearcoatNormalScale.value.negate()));t.dispersion>0&&(e.dispersion.value=t.dispersion);t.iridescence>0&&(e.iridescence.value=t.iridescence,e.iridescenceIOR.value=t.iridescenceIOR,e.iridescenceThicknessMinimum.value=t.iridescenceThicknessRange[0],e.iridescenceThicknessMaximum.value=t.iridescenceThicknessRange[1],t.iridescenceMap&&(e.iridescenceMap.value=t.iridescenceMap,n(t.iridescenceMap,e.iridescenceMapTransform)),t.iridescenceThicknessMap&&(e.iridescenceThicknessMap.value=t.iridescenceThicknessMap,n(t.iridescenceThicknessMap,e.iridescenceThicknessMapTransform)));t.transmission>0&&(e.transmission.value=t.transmission,e.transmissionSamplerMap.value=i.texture,e.transmissionSamplerSize.value.set(i.width,i.height),t.transmissionMap&&(e.transmissionMap.value=t.transmissionMap,n(t.transmissionMap,e.transmissionMapTransform)),e.thickness.value=t.thickness,t.thicknessMap&&(e.thicknessMap.value=t.thicknessMap,n(t.thicknessMap,e.thicknessMapTransform)),e.attenuationDistance.value=t.attenuationDistance,e.attenuationColor.value.copy(t.attenuationColor));t.anisotropy>0&&(e.anisotropyVector.value.set(t.anisotropy*Math.cos(t.anisotropyRotation),t.anisotropy*Math.sin(t.anisotropyRotation)),t.anisotropyMap&&(e.anisotropyMap.value=t.anisotropyMap,n(t.anisotropyMap,e.anisotropyMapTransform)));e.specularIntensity.value=t.specularIntensity,e.specularColor.value.copy(t.specularColor),t.specularColorMap&&(e.specularColorMap.value=t.specularColorMap,n(t.specularColorMap,e.specularColorMapTransform));t.specularIntensityMap&&(e.specularIntensityMap.value=t.specularIntensityMap,n(t.specularIntensityMap,e.specularIntensityMapTransform))}(e,r,s)):r.isMeshMatcapMaterial?(i(e,r),function(e,t){t.matcap&&(e.matcap.value=t.matcap)}(e,r)):r.isMeshDepthMaterial?i(e,r):r.isMeshDistanceMaterial?(i(e,r),function(e,n){const i=t.get(n).light;e.referencePosition.value.setFromMatrixPosition(i.matrixWorld),e.nearDistance.value=i.shadow.camera.near,e.farDistance.value=i.shadow.camera.far}(e,r)):r.isMeshNormalMaterial?i(e,r):r.isLineBasicMaterial?(function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform))}(e,r),r.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,r)):r.isPointsMaterial?function(e,t,i,r){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*i,e.scale.value=.5*r,t.map&&(e.map.value=t.map,n(t.map,e.uvTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r,a,o):r.isSpriteMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.rotation.value=t.rotation,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r):r.isShadowMaterial?(e.color.value.copy(r.color),e.opacity.value=r.opacity):r.isShaderMaterial&&(r.uniformsNeedUpdate=!1)}}}function Ca(e,t,n,i){let r={},a={},o=[];const s=e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS);function l(e,t,n,i){const r=e.value,a=t+"_"+n;if(void 0===i[a])return i[a]="number"==typeof r||"boolean"==typeof r?r:r.clone(),!0;{const e=i[a];if("number"==typeof r||"boolean"==typeof r){if(e!==r)return i[a]=r,!0}else if(!1===e.equals(r))return e.copy(r),!0}return!1}function c(e){const t={boundary:0,storage:0};return"number"==typeof e||"boolean"==typeof e?(t.boundary=4,t.storage=4):e.isVector2?(t.boundary=8,t.storage=8):e.isVector3||e.isColor?(t.boundary=16,t.storage=12):e.isVector4?(t.boundary=16,t.storage=16):e.isMatrix3?(t.boundary=48,t.storage=48):e.isMatrix4?(t.boundary=64,t.storage=64):e.isTexture?E("WebGLRenderer: Texture samplers can not be part of an uniforms group."):E("WebGLRenderer: Unsupported uniform value type.",e),t}function d(t){const n=t.target;n.removeEventListener("dispose",d);const i=o.indexOf(n.__bindingPointIndex);o.splice(i,1),e.deleteBuffer(r[n.id]),delete r[n.id],delete a[n.id]}return{bind:function(e,t){const n=t.program;i.uniformBlockBinding(e,n)},update:function(n,u){let f=r[n.id];void 0===f&&(!function(e){const t=e.uniforms;let n=0;const i=16;for(let e=0,r=t.length;e0&&(n+=i-r);e.__size=n,e.__cache={}}(n),f=function(t){const n=function(){for(let e=0;e0),u=!!n.morphAttributes.position,f=!!n.morphAttributes.normal,p=!!n.morphAttributes.color;let m=I;i.toneMapped&&(null!==k&&!0!==k.isXRRenderTarget||(m=N.toneMapping));const h=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,_=void 0!==h?h.length:0,g=Se.get(i),v=L.state.lights;if(!0===se&&(!0===le||e!==Y)){const t=e===Y&&i.id===z;Ne.setState(i,e,t)}let E=!1;i.version===g.__version?g.needsLights&&g.lightsStateVersion!==v.state.version||g.outputColorSpace!==s||r.isBatchedMesh&&!1===g.batching?E=!0:r.isBatchedMesh||!0!==g.batching?r.isBatchedMesh&&!0===g.batchingColor&&null===r.colorTexture||r.isBatchedMesh&&!1===g.batchingColor&&null!==r.colorTexture||r.isInstancedMesh&&!1===g.instancing?E=!0:r.isInstancedMesh||!0!==g.instancing?r.isSkinnedMesh&&!1===g.skinning?E=!0:r.isSkinnedMesh||!0!==g.skinning?r.isInstancedMesh&&!0===g.instancingColor&&null===r.instanceColor||r.isInstancedMesh&&!1===g.instancingColor&&null!==r.instanceColor||r.isInstancedMesh&&!0===g.instancingMorph&&null===r.morphTexture||r.isInstancedMesh&&!1===g.instancingMorph&&null!==r.morphTexture||g.envMap!==l||!0===i.fog&&g.fog!==a?E=!0:void 0===g.numClippingPlanes||g.numClippingPlanes===Ne.numPlanes&&g.numIntersection===Ne.numIntersection?(g.vertexAlphas!==c||g.vertexTangents!==d||g.morphTargets!==u||g.morphNormals!==f||g.morphColors!==p||g.toneMapping!==m||g.morphTargetsCount!==_)&&(E=!0):E=!0:E=!0:E=!0:E=!0:(E=!0,g.__version=i.version);let T=g.currentProgram;!0===E&&(T=st(i,t,r));let M=!1,x=!1,A=!1;const R=T.getUniforms(),b=g.uniforms;ve.useProgram(T.program)&&(M=!0,x=!0,A=!0);i.id!==z&&(z=i.id,x=!0);if(M||Y!==e){ve.buffers.depth.getReversed()&&!0!==e.reversedDepth&&(e._reversedDepth=!0,e.updateProjectionMatrix()),R.setValue(ke,"projectionMatrix",e.projectionMatrix),R.setValue(ke,"viewMatrix",e.matrixWorldInverse);const t=R.map.cameraPosition;void 0!==t&&t.setValue(ke,de.setFromMatrixPosition(e.matrixWorld)),ge.logarithmicDepthBuffer&&R.setValue(ke,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&R.setValue(ke,"isOrthographic",!0===e.isOrthographicCamera),Y!==e&&(Y=e,x=!0,A=!0)}g.needsLights&&(v.state.directionalShadowMap.length>0&&R.setValue(ke,"directionalShadowMap",v.state.directionalShadowMap,xe),v.state.spotShadowMap.length>0&&R.setValue(ke,"spotShadowMap",v.state.spotShadowMap,xe),v.state.pointShadowMap.length>0&&R.setValue(ke,"pointShadowMap",v.state.pointShadowMap,xe));if(r.isSkinnedMesh){R.setOptional(ke,r,"bindMatrix"),R.setOptional(ke,r,"bindMatrixInverse");const e=r.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),R.setValue(ke,"boneTexture",e.boneTexture,xe))}r.isBatchedMesh&&(R.setOptional(ke,r,"batchingTexture"),R.setValue(ke,"batchingTexture",r._matricesTexture,xe),R.setOptional(ke,r,"batchingIdTexture"),R.setValue(ke,"batchingIdTexture",r._indirectTexture,xe),R.setOptional(ke,r,"batchingColorTexture"),null!==r._colorsTexture&&R.setValue(ke,"batchingColorTexture",r._colorsTexture,xe));const C=n.morphAttributes;void 0===C.position&&void 0===C.normal&&void 0===C.color||Oe.update(r,n,T);(x||g.receiveShadow!==r.receiveShadow)&&(g.receiveShadow=r.receiveShadow,R.setValue(ke,"receiveShadow",r.receiveShadow));i.isMeshStandardMaterial&&null===i.envMap&&null!==t.environment&&(b.envMapIntensity.value=t.environmentIntensity);void 0!==b.dfgLUT&&(b.dfgLUT.value=(null===La&&(La=new Un(Pa,16,16,Te,S),La.name="DFG_LUT",La.minFilter=H,La.magFilter=H,La.wrapS=ft,La.wrapT=ft,La.generateMipmaps=!1,La.needsUpdate=!0),La));x&&(R.setValue(ke,"toneMappingExposure",N.toneMappingExposure),g.needsLights&&(U=A,(P=b).ambientLightColor.needsUpdate=U,P.lightProbe.needsUpdate=U,P.directionalLights.needsUpdate=U,P.directionalLightShadows.needsUpdate=U,P.pointLights.needsUpdate=U,P.pointLightShadows.needsUpdate=U,P.spotLights.needsUpdate=U,P.spotLightShadows.needsUpdate=U,P.rectAreaLights.needsUpdate=U,P.hemisphereLights.needsUpdate=U),a&&!0===i.fog&&De.refreshFogUniforms(b,a),De.refreshMaterialUniforms(b,i,ee,J,L.state.transmissionRenderTarget[e.id]),Rr.upload(ke,lt(g),b,xe));var P,U;i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(Rr.upload(ke,lt(g),b,xe),i.uniformsNeedUpdate=!1);i.isSpriteMaterial&&R.setValue(ke,"center",r.center);if(R.setValue(ke,"modelViewMatrix",r.modelViewMatrix),R.setValue(ke,"normalMatrix",r.normalMatrix),R.setValue(ke,"modelMatrix",r.matrixWorld),i.isShaderMaterial||i.isRawShaderMaterial){const e=i.uniformsGroups;for(let t=0,n=e.length;t{function n(){i.forEach(function(e){Se.get(e).currentProgram.isReady()&&i.delete(e)}),0!==i.size?setTimeout(n,10):t(e)}null!==he.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)})};let Qe=null;function Je(){tt.stop()}function et(){tt.start()}const tt=new On;function nt(e,t,n,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)n=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)L.pushLight(e),e.castShadow&&L.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||oe.intersectsSprite(e)){i&&ue.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ce);const t=Pe.update(e),r=e.material;r.visible&&P.push(e,t,r,n,ue.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||oe.intersectsObject(e))){const t=Pe.update(e),r=e.material;if(i&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),ue.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),ue.copy(t.boundingSphere.center)),ue.applyMatrix4(e.matrixWorld).applyMatrix4(ce)),Array.isArray(r)){const i=t.groups;for(let a=0,o=i.length;a0&&at(r,t,n),a.length>0&&at(a,t,n),o.length>0&&at(o,t,n),ve.buffers.depth.setTest(!0),ve.buffers.depth.setMask(!0),ve.buffers.color.setMask(!0),ve.setPolygonOffset(!1)}function rt(e,t,n,i){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;if(void 0===L.state.transmissionRenderTarget[i.id]){const e=he.has("EXT_color_buffer_half_float")||he.has("EXT_color_buffer_float");L.state.transmissionRenderTarget[i.id]=new O(1,1,{generateMipmaps:!0,type:e?S:T,minFilter:mt,samples:ge.samples,stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:p.workingColorSpace})}const r=L.state.transmissionRenderTarget[i.id],a=i.viewport||K;r.setSize(a.z*N.transmissionResolutionScale,a.w*N.transmissionResolutionScale);const s=N.getRenderTarget(),l=N.getActiveCubeFace(),d=N.getActiveMipmapLevel();N.setRenderTarget(r),N.getClearColor(Z),$=N.getClearAlpha(),$<1&&N.setClearColor(16777215,.5),N.clear(),pe&&Fe.render(n);const u=N.toneMapping;N.toneMapping=I;const f=i.viewport;if(void 0!==i.viewport&&(i.viewport=void 0),L.setupLightsView(i),!0===se&&Ne.setGlobalState(N.clippingPlanes,i),at(e,n,i),xe.updateMultisampleRenderTarget(r),xe.updateRenderTargetMipmap(r),!1===he.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let r=0,a=t.length;r0)for(let t=0,a=r.length;t0&&rt(n,i,e,t),pe&&Fe.render(e),it(P,e,t)}null!==k&&0===W&&(xe.updateMultisampleRenderTarget(k),xe.updateRenderTargetMipmap(k)),i&&w.end(N),!0===e.isScene&&e.onAfterRender(N,e,t),Ve.resetDefaultState(),z=-1,Y=null,D.pop(),D.length>0?(L=D[D.length-1],!0===se&&Ne.setGlobalState(N.clippingPlanes,L.state.camera)):L=null,U.pop(),P=U.length>0?U[U.length-1]:null},this.getActiveCubeFace=function(){return B},this.getActiveMipmapLevel=function(){return W},this.getRenderTarget=function(){return k},this.setRenderTargetTextures=function(e,t,n){const i=Se.get(e);i.__autoAllocateDepthBuffer=!1===e.resolveDepthBuffer,!1===i.__autoAllocateDepthBuffer&&(i.__useRenderToTexture=!1),Se.get(e.texture).__webglTexture=t,Se.get(e.depthTexture).__webglTexture=i.__autoAllocateDepthBuffer?void 0:n,i.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(e,t){const n=Se.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const dt=ke.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){k=e,B=t,W=n;let i=null,r=!1,a=!1;if(e){const o=Se.get(e);if(void 0!==o.__useDefaultFramebuffer)return ve.bindFramebuffer(ke.FRAMEBUFFER,o.__webglFramebuffer),K.copy(e.viewport),j.copy(e.scissor),q=e.scissorTest,ve.viewport(K),ve.scissor(j),ve.setScissorTest(q),void(z=-1);if(void 0===o.__webglFramebuffer)xe.setupRenderTarget(e);else if(o.__hasExternalTextures)xe.rebindTextures(e,Se.get(e.texture).__webglTexture,Se.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(o.__boundDepthTexture!==t){if(null!==t&&Se.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");xe.setupDepthRenderbuffer(e)}}const s=e.texture;(s.isData3DTexture||s.isDataArrayTexture||s.isCompressedArrayTexture)&&(a=!0);const l=Se.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(i=Array.isArray(l[t])?l[t][n]:l[t],r=!0):i=e.samples>0&&!1===xe.useMultisampledRTT(e)?Se.get(e).__webglMultisampledFramebuffer:Array.isArray(l)?l[n]:l,K.copy(e.viewport),j.copy(e.scissor),q=e.scissorTest}else K.copy(ie).multiplyScalar(ee).floor(),j.copy(re).multiplyScalar(ee).floor(),q=ae;0!==n&&(i=dt);if(ve.bindFramebuffer(ke.FRAMEBUFFER,i)&&ve.drawBuffers(e,i),ve.viewport(K),ve.scissor(j),ve.setScissorTest(q),r){const i=Se.get(e.texture);ke.framebufferTexture2D(ke.FRAMEBUFFER,ke.COLOR_ATTACHMENT0,ke.TEXTURE_CUBE_MAP_POSITIVE_X+t,i.__webglTexture,n)}else if(a){const i=t;for(let t=0;t1&&ke.readBuffer(ke.COLOR_ATTACHMENT0+s),!ge.textureFormatReadable(l))return void y("WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!ge.textureTypeReadable(c))return void y("WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r&&ke.readPixels(t,n,i,r,He.convert(l),He.convert(c),a)}finally{const e=null!==k?Se.get(k).__webglFramebuffer:null;ve.bindFramebuffer(ke.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,i,r,a,o,s=0){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let l=Se.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(l=l[o]),l){if(t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r){ve.bindFramebuffer(ke.FRAMEBUFFER,l);const o=e.textures[s],c=o.format,d=o.type;if(e.textures.length>1&&ke.readBuffer(ke.COLOR_ATTACHMENT0+s),!ge.textureFormatReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ge.textureTypeReadable(d))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const u=ke.createBuffer();ke.bindBuffer(ke.PIXEL_PACK_BUFFER,u),ke.bufferData(ke.PIXEL_PACK_BUFFER,a.byteLength,ke.STREAM_READ),ke.readPixels(t,n,i,r,He.convert(c),He.convert(d),0);const f=null!==k?Se.get(k).__webglFramebuffer:null;ve.bindFramebuffer(ke.FRAMEBUFFER,f);const p=ke.fenceSync(ke.SYNC_GPU_COMMANDS_COMPLETE,0);return ke.flush(),await Fn(ke,p,4),ke.bindBuffer(ke.PIXEL_PACK_BUFFER,u),ke.getBufferSubData(ke.PIXEL_PACK_BUFFER,0,a),ke.deleteBuffer(u),ke.deleteSync(p),a}throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(e,t=null,n=0){const i=Math.pow(2,-n),r=Math.floor(e.image.width*i),a=Math.floor(e.image.height*i),o=null!==t?t.x:0,s=null!==t?t.y:0;xe.setTexture2D(e,0),ke.copyTexSubImage2D(ke.TEXTURE_2D,n,0,0,o,s,r,a),ve.unbindTexture()};const ut=ke.createFramebuffer(),pt=ke.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,i=null,r=0,a=0){let o,s,l,c,d,u,f,p,m;const h=e.isCompressedTexture?e.mipmaps[a]:e.image;if(null!==n)o=n.max.x-n.min.x,s=n.max.y-n.min.y,l=n.isBox3?n.max.z-n.min.z:1,c=n.min.x,d=n.min.y,u=n.isBox3?n.min.z:0;else{const t=Math.pow(2,-r);o=Math.floor(h.width*t),s=Math.floor(h.height*t),l=e.isDataArrayTexture?h.depth:e.isData3DTexture?Math.floor(h.depth*t):1,c=0,d=0,u=0}null!==i?(f=i.x,p=i.y,m=i.z):(f=0,p=0,m=0);const _=He.convert(t.format),g=He.convert(t.type);let v;t.isData3DTexture?(xe.setTexture3D(t,0),v=ke.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(xe.setTexture2DArray(t,0),v=ke.TEXTURE_2D_ARRAY):(xe.setTexture2D(t,0),v=ke.TEXTURE_2D),ke.pixelStorei(ke.UNPACK_FLIP_Y_WEBGL,t.flipY),ke.pixelStorei(ke.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),ke.pixelStorei(ke.UNPACK_ALIGNMENT,t.unpackAlignment);const E=ke.getParameter(ke.UNPACK_ROW_LENGTH),S=ke.getParameter(ke.UNPACK_IMAGE_HEIGHT),T=ke.getParameter(ke.UNPACK_SKIP_PIXELS),M=ke.getParameter(ke.UNPACK_SKIP_ROWS),x=ke.getParameter(ke.UNPACK_SKIP_IMAGES);ke.pixelStorei(ke.UNPACK_ROW_LENGTH,h.width),ke.pixelStorei(ke.UNPACK_IMAGE_HEIGHT,h.height),ke.pixelStorei(ke.UNPACK_SKIP_PIXELS,c),ke.pixelStorei(ke.UNPACK_SKIP_ROWS,d),ke.pixelStorei(ke.UNPACK_SKIP_IMAGES,u);const A=e.isDataArrayTexture||e.isData3DTexture,R=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=Se.get(e),i=Se.get(t),h=Se.get(n.__renderTarget),_=Se.get(i.__renderTarget);ve.bindFramebuffer(ke.READ_FRAMEBUFFER,h.__webglFramebuffer),ve.bindFramebuffer(ke.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;ne.start-t.start);let t=0;for(let e=1;e 0\n\tvec4 plane;\n\t#ifdef ALPHA_TO_COVERAGE\n\t\tfloat distanceToPlane, distanceGradient;\n\t\tfloat clipOpacity = 1.0;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\tif ( clipOpacity == 0.0 ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tfloat unionClipOpacity = 1.0;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\t\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tclipOpacity *= 1.0 - unionClipOpacity;\n\t\t#endif\n\t\tdiffuseColor.a *= clipOpacity;\n\t\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tbool clipped = true;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tif ( clipped ) discard;\n\t\t#endif\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec4 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec4( 1.0 );\n#endif\n#ifdef USE_COLOR_ALPHA\n\tvColor *= color;\n#elif defined( USE_COLOR )\n\tvColor.rgb *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.rgb *= instanceColor.rgb;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvColor *= getBatchingColor( getIndirectIndex( gl_DrawID ) );\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n\t\temissiveColor = sRGBTransferEOTF( emissiveColor );\n\t#endif\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",colorspace_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",colorspace_pars_fragment:"vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t\t#endif\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif ( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.metalness = metalnessFactor;\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor;\n\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = vec3( 0.04 );\n\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n\tmaterial.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.0001, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif",lights_physical_pars_fragment:"uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tvec3 diffuseContribution;\n\tvec3 specularColor;\n\tvec3 specularColorBlended;\n\tfloat roughness;\n\tfloat metalness;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t\tvec3 iridescenceFresnelDielectric;\n\t\tvec3 iridescenceFresnelMetallic;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn v;\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColorBlended;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat rInv = 1.0 / ( roughness + 0.1 );\n\tfloat a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv;\n\tfloat b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv;\n\tfloat DG = exp( a * dotNV + b );\n\treturn saturate( DG );\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;\n\tvec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;\n\tvec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;\n\tvec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;\n\tfloat Ess_V = dfgV.x + dfgV.y;\n\tfloat Ess_L = dfgL.x + dfgL.y;\n\tfloat Ems_V = 1.0 - Ess_V;\n\tfloat Ems_L = 1.0 - Ess_L;\n\tvec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619;\n\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );\n\tfloat compensationFactor = Ems_V * Ems_L;\n\tvec3 multiScatter = Fms * compensationFactor;\n\treturn singleScatter + multiScatter;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColorBlended * t2.x + ( vec3( 1.0 ) - material.specularColorBlended ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseContribution * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n \n \t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n \n \t\tfloat sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n \t\tfloat sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness );\n \n \t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );\n \n \t\tirradiance *= sheenEnergyComp;\n \n \t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tdiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectDiffuse += diffuse;\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ) * RECIPROCAL_PI;\n \t#endif\n\tvec3 singleScatteringDielectric = vec3( 0.0 );\n\tvec3 multiScatteringDielectric = vec3( 0.0 );\n\tvec3 singleScatteringMetallic = vec3( 0.0 );\n\tvec3 multiScatteringMetallic = vec3( 0.0 );\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#endif\n\tvec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness );\n\tvec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness );\n\tvec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric;\n\tvec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tvec3 indirectSpecular = radiance * singleScattering;\n\tindirectSpecular += multiScattering * cosineWeightedIrradiance;\n\tvec3 indirectDiffuse = diffuse * cosineWeightedIrradiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tindirectSpecular *= sheenEnergyComp;\n\t\tindirectDiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectSpecular += indirectSpecular;\n\treflectedLight.indirectDiffuse += indirectDiffuse;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\n\t\tmaterial.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\t#if defined( STANDARD ) || defined( LAMBERT ) || defined( PHONG )\n\t\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t\t#endif\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\t#if defined( LAMBERT ) || defined( PHONG )\n\t\tirradiance += iblIrradiance;\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\n\tvFragDepth = 1.0 + gl_Position.w;\n\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphinstance_vertex:"#ifdef USE_INSTANCING_MORPH\n\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n\t}\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_INSTANCING_MORPH\n\t\tuniform float morphTargetBaseInfluence;\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t#endif\n\tuniform sampler2DArray morphTargetsTexture;\n\tuniform ivec2 morphTargetsTextureSize;\n\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t}\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;",normal_fragment_maps:"#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",opaque_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\n\t\treturn depth * ( far - near ) - far;\n\t#else\n\t\treturn depth * ( near - far ) - near;\n\t#endif\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\t\n\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\treturn ( near * far ) / ( ( near - far ) * depth - near );\n\t#else\n\t\treturn ( near * far ) / ( ( far - near ) * depth - far );\n\t#endif\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadowCoord.z -= shadowBias;\n\t\t\t#else\n\t\t\t\tshadowCoord.z += shadowBias;\n\t\t\t#endif\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat hard_shadow = step( mean, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\t#endif\n\t\t\t\t\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadowCoord.z -= shadowBias;\n\t\t\t#else\n\t\t\t\tshadowCoord.z += shadowBias;\n\t\t\t#endif\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tshadow = step( depth, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t\t#endif\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tfloat dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp -= shadowBias;\n\t\t\t#else\n\t\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp += shadowBias;\n\t\t\t#endif\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\tvec2 sample0 = vogelDiskSample( 0, 5, phi );\n\t\t\tvec2 sample1 = vogelDiskSample( 1, 5, phi );\n\t\t\tvec2 sample2 = vogelDiskSample( 2, 5, phi );\n\t\t\tvec2 sample3 = vogelDiskSample( 3, 5, phi );\n\t\t\tvec2 sample4 = vogelDiskSample( 4, 5, phi );\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tshadow = step( dp, depth );\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0 && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseContribution, material.specularColorBlended, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif",uv_pars_fragment:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_pars_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\n\t#else\n\t\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\n\t#endif\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#elif DEPTH_PACKING == 3202\n\t\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n\t#elif DEPTH_PACKING == 3203\n\t\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n\t#endif\n}",distance_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distance_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = vec4( dist, 0.0, 0.0, 1.0 );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( normalize( normal ) * 0.5 + 0.5, diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n \n\t\toutgoingLight = outgoingLight + sheenSpecularDirect + sheenSpecularIndirect;\n \n \t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"},Hn={common:{diffuse:{value:new n(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new e}},envmap:{envMap:{value:null},envMapRotation:{value:new e},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},dfgLUT:{value:null}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new e}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new e}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new e},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new e},normalScale:{value:new t(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new e},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new e}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new e}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new e}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new n(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new n(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0},uvTransform:{value:new e}},sprite:{diffuse:{value:new n(16777215)},opacity:{value:1},center:{value:new t(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}}},Vn={basic:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.fog]),vertexShader:Gn.meshbasic_vert,fragmentShader:Gn.meshbasic_frag},lambert:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)},envMapIntensity:{value:1}}]),vertexShader:Gn.meshlambert_vert,fragmentShader:Gn.meshlambert_frag},phong:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)},specular:{value:new n(1118481)},shininess:{value:30},envMapIntensity:{value:1}}]),vertexShader:Gn.meshphong_vert,fragmentShader:Gn.meshphong_frag},standard:{uniforms:i([Hn.common,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.roughnessmap,Hn.metalnessmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Gn.meshphysical_vert,fragmentShader:Gn.meshphysical_frag},toon:{uniforms:i([Hn.common,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.gradientmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)}}]),vertexShader:Gn.meshtoon_vert,fragmentShader:Gn.meshtoon_frag},matcap:{uniforms:i([Hn.common,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,{matcap:{value:null}}]),vertexShader:Gn.meshmatcap_vert,fragmentShader:Gn.meshmatcap_frag},points:{uniforms:i([Hn.points,Hn.fog]),vertexShader:Gn.points_vert,fragmentShader:Gn.points_frag},dashed:{uniforms:i([Hn.common,Hn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Gn.linedashed_vert,fragmentShader:Gn.linedashed_frag},depth:{uniforms:i([Hn.common,Hn.displacementmap]),vertexShader:Gn.depth_vert,fragmentShader:Gn.depth_frag},normal:{uniforms:i([Hn.common,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,{opacity:{value:1}}]),vertexShader:Gn.meshnormal_vert,fragmentShader:Gn.meshnormal_frag},sprite:{uniforms:i([Hn.sprite,Hn.fog]),vertexShader:Gn.sprite_vert,fragmentShader:Gn.sprite_frag},background:{uniforms:{uvTransform:{value:new e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Gn.background_vert,fragmentShader:Gn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new e}},vertexShader:Gn.backgroundCube_vert,fragmentShader:Gn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Gn.cube_vert,fragmentShader:Gn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Gn.equirect_vert,fragmentShader:Gn.equirect_frag},distance:{uniforms:i([Hn.common,Hn.displacementmap,{referencePosition:{value:new r},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Gn.distance_vert,fragmentShader:Gn.distance_frag},shadow:{uniforms:i([Hn.lights,Hn.fog,{color:{value:new n(0)},opacity:{value:1}}]),vertexShader:Gn.shadow_vert,fragmentShader:Gn.shadow_frag}};Vn.physical={uniforms:i([Vn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new e},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new e},clearcoatNormalScale:{value:new t(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new e},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new e},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new e},sheen:{value:0},sheenColor:{value:new n(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new e},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new e},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new e},transmissionSamplerSize:{value:new t},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new e},attenuationDistance:{value:0},attenuationColor:{value:new n(0)},specularColor:{value:new n(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new e},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new e},anisotropyVector:{value:new t},anisotropyMap:{value:null},anisotropyMapTransform:{value:new e}}]),vertexShader:Gn.meshphysical_vert,fragmentShader:Gn.meshphysical_frag};const Wn={r:0,b:0,g:0},kn=new u,zn=new f;function Xn(e,t,i,r,u,f){const v=new n(0);let E,S,M=!0===u?0:1,T=null,x=0,A=null;function R(e){let n=!0===e.isScene?e.background:null;if(n&&n.isTexture){const i=e.backgroundBlurriness>0;n=t.get(n,i)}return n}function b(t,n){t.getRGB(Wn,g(e)),i.buffers.color.setClear(Wn.r,Wn.g,Wn.b,n,f)}return{getClearColor:function(){return v},setClearColor:function(e,t=1){v.set(e),M=t,b(v,M)},getClearAlpha:function(){return M},setClearAlpha:function(e){M=e,b(v,M)},render:function(t){let n=!1;const r=R(t);null===r?b(v,M):r&&r.isColor&&(b(r,1),n=!0);const a=e.xr.getEnvironmentBlendMode();"additive"===a?i.buffers.color.setClear(0,0,0,1,f):"alpha-blend"===a&&i.buffers.color.setClear(0,0,0,0,f),(e.autoClear||n)&&(i.buffers.depth.setTest(!0),i.buffers.depth.setMask(!0),i.buffers.color.setMask(!0),e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil))},addToRenderList:function(t,n){const i=R(n);i&&(i.isCubeTexture||i.mapping===a)?(void 0===S&&(S=new o(new s(1,1,1),new l({name:"BackgroundCubeMaterial",uniforms:d(Vn.backgroundCube.uniforms),vertexShader:Vn.backgroundCube.vertexShader,fragmentShader:Vn.backgroundCube.fragmentShader,side:c,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),S.geometry.deleteAttribute("normal"),S.geometry.deleteAttribute("uv"),S.onBeforeRender=function(e,t,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(S.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),r.update(S)),kn.copy(n.backgroundRotation),kn.x*=-1,kn.y*=-1,kn.z*=-1,i.isCubeTexture&&!1===i.isRenderTargetTexture&&(kn.y*=-1,kn.z*=-1),S.material.uniforms.envMap.value=i,S.material.uniforms.flipEnvMap.value=i.isCubeTexture&&!1===i.isRenderTargetTexture?-1:1,S.material.uniforms.backgroundBlurriness.value=n.backgroundBlurriness,S.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,S.material.uniforms.backgroundRotation.value.setFromMatrix4(zn.makeRotationFromEuler(kn)),S.material.toneMapped=p.getTransfer(i.colorSpace)!==m,T===i&&x===i.version&&A===e.toneMapping||(S.material.needsUpdate=!0,T=i,x=i.version,A=e.toneMapping),S.layers.enableAll(),t.unshift(S,S.geometry,S.material,0,0,null)):i&&i.isTexture&&(void 0===E&&(E=new o(new h(2,2),new l({name:"BackgroundMaterial",uniforms:d(Vn.background.uniforms),vertexShader:Vn.background.vertexShader,fragmentShader:Vn.background.fragmentShader,side:_,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),E.geometry.deleteAttribute("normal"),Object.defineProperty(E.material,"map",{get:function(){return this.uniforms.t2D.value}}),r.update(E)),E.material.uniforms.t2D.value=i,E.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,E.material.toneMapped=p.getTransfer(i.colorSpace)!==m,!0===i.matrixAutoUpdate&&i.updateMatrix(),E.material.uniforms.uvTransform.value.copy(i.matrix),T===i&&x===i.version&&A===e.toneMapping||(E.material.needsUpdate=!0,T=i,x=i.version,A=e.toneMapping),E.layers.enableAll(),t.unshift(E,E.geometry,E.material,0,0,null))},dispose:function(){void 0!==S&&(S.geometry.dispose(),S.material.dispose(),S=void 0),void 0!==E&&(E.geometry.dispose(),E.material.dispose(),E=void 0)}}}function Yn(e,t){const n=e.getParameter(e.MAX_VERTEX_ATTRIBS),i={},r=c(null);let a=r,o=!1;function s(t){return e.bindVertexArray(t)}function l(t){return e.deleteVertexArray(t)}function c(e){const t=[],i=[],r=[];for(let e=0;e=0){const n=r[t];let i=o[t];if(void 0===i&&("instanceMatrix"===t&&e.instanceMatrix&&(i=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(i=e.instanceColor)),void 0===n)return!0;if(n.attribute!==i)return!0;if(i&&n.data!==i.data)return!0;s++}}return a.attributesNum!==s||a.index!==i}(n,h,l,_),g&&function(e,t,n,i){const r={},o=t.attributes;let s=0;const l=n.getAttributes();for(const t in l){if(l[t].location>=0){let n=o[t];void 0===n&&("instanceMatrix"===t&&e.instanceMatrix&&(n=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(n=e.instanceColor));const i={};i.attribute=n,n&&n.data&&(i.data=n.data),r[t]=i,s++}}a.attributes=r,a.attributesNum=s,a.index=i}(n,h,l,_),null!==_&&t.update(_,e.ELEMENT_ARRAY_BUFFER),(g||o)&&(o=!1,function(n,i,r,a){d();const o=a.attributes,s=r.getAttributes(),l=i.defaultAttributeValues;for(const i in s){const r=s[i];if(r.location>=0){let s=o[i];if(void 0===s&&("instanceMatrix"===i&&n.instanceMatrix&&(s=n.instanceMatrix),"instanceColor"===i&&n.instanceColor&&(s=n.instanceColor)),void 0!==s){const i=s.normalized,o=s.itemSize,l=t.get(s);if(void 0===l)continue;const c=l.buffer,d=l.type,p=l.bytesPerElement,h=d===e.INT||d===e.UNSIGNED_INT||s.gpuType===v;if(s.isInterleavedBufferAttribute){const t=s.data,l=t.stride,_=s.offset;if(t.isInstancedInterleavedBuffer){for(let e=0;e0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT).precision>0)return"highp";t="mediump"}return"mediump"===t&&e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.MEDIUM_FLOAT).precision>0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let o=void 0!==n.precision?n.precision:"highp";const s=a(o);s!==o&&(E("WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==r)return r;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");r=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else r=0;return r},getMaxPrecision:a,textureFormatReadable:function(t){return t===x||i.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const r=n===S&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==M&&i.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==T&&!r)},precision:o,logarithmicDepthBuffer:!0===n.logarithmicDepthBuffer,reversedDepthBuffer:!0===n.reversedDepthBuffer&&t.has("EXT_clip_control"),maxTextures:e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),maxVertexTextures:e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS),maxTextureSize:e.getParameter(e.MAX_TEXTURE_SIZE),maxCubemapSize:e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE),maxAttributes:e.getParameter(e.MAX_VERTEX_ATTRIBS),maxVertexUniforms:e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS),maxVaryings:e.getParameter(e.MAX_VARYING_VECTORS),maxFragmentUniforms:e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),maxSamples:e.getParameter(e.MAX_SAMPLES),samples:e.getParameter(e.SAMPLES)}}function qn(t){const n=this;let i=null,r=0,a=!1,o=!1;const s=new A,l=new e,c={value:null,needsUpdate:!1};function d(e,t,i,r){const a=null!==e?e.length:0;let o=null;if(0!==a){if(o=c.value,!0!==r||null===o){const n=i+4*a,r=t.matrixWorldInverse;l.getNormalMatrix(r),(null===o||o.length0);n.numPlanes=r,n.numIntersection=0}();else{const e=o?0:r,t=4*e;let n=m.clippingState||null;c.value=n,n=d(u,s,t,l);for(let e=0;e!==t;++e)n[e]=i[e];m.clippingState=n,this.numIntersection=f?this.numPlanes:0,this.numPlanes+=e}}}const Zn=[.125,.215,.35,.446,.526,.582],$n=20,Qn=new P,Jn=new n;let ei=null,ti=0,ni=0,ii=!1;const ri=new r;class ai{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._backgroundBox=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._blurMaterial=null,this._ggxMaterial=null}fromScene(e,t=0,n=.1,i=100,r={}){const{size:a=256,position:o=ri}=r;ei=this._renderer.getRenderTarget(),ti=this._renderer.getActiveCubeFace(),ni=this._renderer.getActiveMipmapLevel(),ii=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(a);const s=this._allocateTargets();return s.depthBuffer=!0,this._sceneToCubeUV(e,n,i,s,o),t>0&&this._blur(s,0,0,t),this._applyPMREM(s),this._cleanup(s),s}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=ci(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=li(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?l=Zn[s-e+4-1]:0===s&&(l=0),n.push(l);const c=1/(a-2),d=-c,u=1+c,f=[d,d,u,d,u,u,d,d,u,u,d,u],p=6,m=6,h=3,_=2,g=1,v=new Float32Array(h*m*p),E=new Float32Array(_*m*p),S=new Float32Array(g*m*p);for(let e=0;e2?0:-1,i=[t,n,0,t+2/3,n,0,t+2/3,n+1,0,t,n,0,t+2/3,n+1,0,t,n+1,0];v.set(i,h*m*e),E.set(f,_*m*e);const r=[e,e,e,e,e,e];S.set(r,g*m*e)}const M=new C;M.setAttribute("position",new y(v,h)),M.setAttribute("uv",new y(E,_)),M.setAttribute("faceIndex",new y(S,g)),i.push(new o(M,null)),r>4&&r--}return{lodMeshes:i,sizeLods:t,sigmas:n}}(i)),this._blurMaterial=function(e,t,n){const i=new Float32Array($n),a=new r(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:$n,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:i},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:a}},vertexShader:di(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t",blending:I,depthTest:!1,depthWrite:!1});return o}(i,e,t),this._ggxMaterial=function(e,t,n){const i=new l({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:256,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:di(),fragmentShader:'\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// "Sampling the GGX Distribution of Visible Normals"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tvec3 T1 = vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(V, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + V.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * V;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t',blending:I,depthTest:!1,depthWrite:!1});return i}(i,e,t)}return i}_compileMaterial(e){const t=new o(new C,e);this._renderer.compile(t,Qn)}_sceneToCubeUV(e,t,n,i,r){const a=new L(90,1,t,n),l=[1,-1,1,1,1,1],d=[1,1,1,-1,-1,-1],u=this._renderer,f=u.autoClear,p=u.toneMapping;u.getClearColor(Jn),u.toneMapping=U,u.autoClear=!1;u.state.buffers.depth.getReversed()&&(u.setRenderTarget(i),u.clearDepth(),u.setRenderTarget(null)),null===this._backgroundBox&&(this._backgroundBox=new o(new s,new D({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1})));const m=this._backgroundBox,h=m.material;let _=!1;const g=e.background;g?g.isColor&&(h.color.copy(g),e.background=null,_=!0):(h.color.copy(Jn),_=!0);for(let t=0;t<6;t++){const n=t%3;0===n?(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x+d[t],r.y,r.z)):1===n?(a.up.set(0,0,l[t]),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y+d[t],r.z)):(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y,r.z+d[t]));const o=this._cubeSize;si(i,n*o,t>2?o:0,o,o),u.setRenderTarget(i),_&&u.render(m,a),u.render(e,a)}u.toneMapping=p,u.autoClear=f,e.background=g}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===R||e.mapping===b;i?(null===this._cubemapMaterial&&(this._cubemapMaterial=ci()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=li());const r=i?this._cubemapMaterial:this._equirectMaterial,a=this._lodMeshes[0];a.material=r;r.uniforms.envMap.value=e;const o=this._cubeSize;si(t,0,0,3*o,2*o),n.setRenderTarget(t),n.render(a,Qn)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodMeshes.length;for(let t=1;tu-4?n-u+4:0),m=4*(this._cubeSize-f);s.envMap.value=e.texture,s.roughness.value=d,s.mipInt.value=u-t,si(r,p,m,3*f,2*f),i.setRenderTarget(r),i.render(o,Qn),s.envMap.value=r.texture,s.roughness.value=0,s.mipInt.value=u-n,si(e,p,m,3*f,2*f),i.setRenderTarget(e),i.render(o,Qn)}_blur(e,t,n,i,r){const a=this._pingPongRenderTarget;this._halfBlur(e,a,t,n,i,"latitudinal",r),this._halfBlur(a,e,n,n,i,"longitudinal",r)}_halfBlur(e,t,n,i,r,a,o){const s=this._renderer,l=this._blurMaterial;"latitudinal"!==a&&"longitudinal"!==a&&w("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[i];c.material=l;const d=l.uniforms,u=this._sizeLods[n]-1,f=isFinite(r)?Math.PI/(2*u):2*Math.PI/39,p=r/f,m=isFinite(r)?1+Math.floor(3*p):$n;m>$n&&E(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);const h=[];let _=0;for(let e=0;e<$n;++e){const t=e/p,n=Math.exp(-t*t/2);h.push(n),0===e?_+=n:eg-4?i-g+4:0),4*(this._cubeSize-v),3*v,2*v),s.setRenderTarget(t),s.render(c,Qn)}}function oi(e,t,n){const i=new N(e,t,n);return i.texture.mapping=a,i.texture.name="PMREM.cubeUv",i.scissorTest=!0,i}function si(e,t,n,i,r){e.viewport.set(t,n,i,r),e.scissor.set(t,n,i,r)}function li(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:di(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t",blending:I,depthTest:!1,depthWrite:!1})}function ci(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:di(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t",blending:I,depthTest:!1,depthWrite:!1})}function di(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function ui(e){let t=new WeakMap,n=new WeakMap,i=null;function r(e,t){return t===B?e.mapping=R:t===G&&(e.mapping=b),e}function a(e){const n=e.target;n.removeEventListener("dispose",a);const i=t.get(n);void 0!==i&&(t.delete(n),i.dispose())}function o(e){const t=e.target;t.removeEventListener("dispose",o);const i=n.get(t);void 0!==i&&(n.delete(t),i.dispose())}return{get:function(s,l=!1){return null==s?null:l?function(t){if(t&&t.isTexture){const r=t.mapping,a=r===B||r===G,s=r===R||r===b;if(a||s){let r=n.get(t);const l=void 0!==r?r.texture.pmremVersion:0;if(t.isRenderTargetTexture&&t.pmremVersion!==l)return null===i&&(i=new ai(e)),r=a?i.fromEquirectangular(t,r):i.fromCubemap(t,r),r.texture.pmremVersion=t.pmremVersion,n.set(t,r),r.texture;if(void 0!==r)return r.texture;{const l=t.image;return a&&l&&l.height>0||s&&l&&function(e){let t=0;const n=6;for(let i=0;i0){const o=new H(i.height);return o.fromEquirectangularTexture(e,n),t.set(n,o),n.addEventListener("dispose",a),r(o.texture,n.mapping)}return null}}}return n}(s)},dispose:function(){t=new WeakMap,n=new WeakMap,null!==i&&(i.dispose(),i=null)}}}function fi(e){const t={};function n(n){if(void 0!==t[n])return t[n];const i=e.getExtension(n);return t[n]=i,i}return{has:function(e){return null!==n(e)},init:function(){n("EXT_color_buffer_float"),n("WEBGL_clip_cull_distance"),n("OES_texture_float_linear"),n("EXT_color_buffer_half_float"),n("WEBGL_multisampled_render_to_texture"),n("WEBGL_render_shared_exponent")},get:function(e){const t=n(e);return null===t&&V("WebGLRenderer: "+e+" extension not supported."),t}}}function pi(e,t,n,i){const r={},a=new WeakMap;function o(e){const s=e.target;null!==s.index&&t.remove(s.index);for(const e in s.attributes)t.remove(s.attributes[e]);s.removeEventListener("dispose",o),delete r[s.id];const l=a.get(s);l&&(t.remove(l),a.delete(s)),i.releaseStatesOfGeometry(s),!0===s.isInstancedBufferGeometry&&delete s._maxInstanceCount,n.memory.geometries--}function s(e){const n=[],i=e.index,r=e.attributes.position;let o=0;if(null!==i){const e=i.array;o=i.version;for(let t=0,i=e.length;tn.maxTextureSize&&(M=Math.ceil(S/n.maxTextureSize),S=n.maxTextureSize);const x=new Float32Array(S*M*4*u),A=new Y(x,S,M,u);A.type=T,A.needsUpdate=!0;const R=4*E;for(let C=0;C\n\t\t\t#include \n\n\t\t\tvoid main() {\n\t\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t\t#ifdef LINEAR_TONE_MAPPING\n\t\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( AGX_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef SRGB_TRANSFER\n\t\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\t\t\t\t#endif\n\t\t\t}",depthTest:!1,depthWrite:!1}),d=new o(l,c),u=new P(-1,1,1,-1,0,1);let f,h=null,_=null,g=!1,v=null,E=[],M=!1;this.setSize=function(e,t){a.setSize(e,t),s.setSize(e,t);for(let n=0;n0&&!0===E[0].isRenderPass;const t=a.width,n=a.height;for(let e=0;e0)return e;const r=t*n;let a=Ri[r];if(void 0===a&&(a=new Float32Array(r),Ri[r]=a),0!==t){i.toArray(a,0);for(let i=1,r=0;i!==t;++i)r+=n,e[i].toArray(a,r)}return a}function Di(e,t){if(e.length!==t.length)return!1;for(let n=0,i=e.length;n0&&(this.seq=i.concat(r))}setValue(e,t,n,i){const r=this.map[t];void 0!==r&&r.setValue(e,n,i)}setOptional(e,t,n){const i=t[n];void 0!==i&&this.setValue(e,n,i)}static upload(e,t,n,i){for(let r=0,a=t.length;r!==a;++r){const a=t[r],o=n[a.id];!1!==o.needsUpdate&&a.setValue(e,o.value,i)}}static seqWithValue(e,t){const n=[];for(let i=0,r=e.length;i!==r;++i){const r=e[i];r.id in t&&n.push(r)}return n}}function Rr(e,t,n){const i=e.createShader(t);return e.shaderSource(i,n),e.compileShader(i),i}let br=0;const Cr=new e;function Pr(e,t,n){const i=e.getShaderParameter(t,e.COMPILE_STATUS),r=(e.getShaderInfoLog(t)||"").trim();if(i&&""===r)return"";const a=/ERROR: 0:(\d+)/.exec(r);if(a){const i=parseInt(a[1]);return n.toUpperCase()+"\n\n"+r+"\n\n"+function(e,t){const n=e.split("\n"),i=[],r=Math.max(t-6,0),a=Math.min(t+6,n.length);for(let e=r;e":" "} ${r}: ${n[e]}`)}return i.join("\n")}(e.getShaderSource(t),i)}return r}function Lr(e,t){const n=function(e){p._getMatrix(Cr,p.workingColorSpace,e);const t=`mat3( ${Cr.elements.map(e=>e.toFixed(4))} )`;switch(p.getTransfer(e)){case me:return[t,"LinearTransferOETF"];case m:return[t,"sRGBTransferOETF"];default:return E("WebGLProgram: Unsupported color space: ",e),[t,"LinearTransferOETF"]}}(t);return[`vec4 ${e}( vec4 value ) {`,`\treturn ${n[1]}( vec4( value.rgb * ${n[0]}, value.a ) );`,"}"].join("\n")}const Ur={[te]:"Linear",[ee]:"Reinhard",[J]:"Cineon",[Q]:"ACESFilmic",[$]:"AgX",[Z]:"Neutral",[q]:"Custom"};function Dr(e,t){const n=Ur[t];return void 0===n?(E("WebGLProgram: Unsupported toneMapping:",t),"vec3 "+e+"( vec3 color ) { return LinearToneMapping( color ); }"):"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const wr=new r;function Ir(){p.getLuminanceCoefficients(wr);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${wr.x.toFixed(4)}, ${wr.y.toFixed(4)}, ${wr.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function Nr(e){return""!==e}function yr(e,t){const n=t.numSpotLightShadows+t.numSpotLightMaps-t.numSpotLightShadowsWithMaps;return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,t.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,n).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,t.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function Fr(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Or=/^[ \t]*#include +<([\w\d./]+)>/gm;function Br(e){return e.replace(Or,Hr)}const Gr=new Map;function Hr(e,t){let n=Gn[t];if(void 0===n){const e=Gr.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=Gn[e],E('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Br(n)}const Vr=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Wr(e){return e.replace(Vr,kr)}function kr(e,t,n,i){let r="";for(let e=parseInt(t);e0&&(_+="\n"),g=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m].filter(Nr).join("\n"),g.length>0&&(g+="\n")):(_=[zr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,n.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",n.batching?"#define USE_BATCHING":"",n.batchingColor?"#define USE_BATCHING_COLOR":"",n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.instancingMorph?"#define USE_INSTANCING_MORPH":"",n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+d:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.displacementMap?"#define USE_DISPLACEMENTMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.mapUv?"#define MAP_UV "+n.mapUv:"",n.alphaMapUv?"#define ALPHAMAP_UV "+n.alphaMapUv:"",n.lightMapUv?"#define LIGHTMAP_UV "+n.lightMapUv:"",n.aoMapUv?"#define AOMAP_UV "+n.aoMapUv:"",n.emissiveMapUv?"#define EMISSIVEMAP_UV "+n.emissiveMapUv:"",n.bumpMapUv?"#define BUMPMAP_UV "+n.bumpMapUv:"",n.normalMapUv?"#define NORMALMAP_UV "+n.normalMapUv:"",n.displacementMapUv?"#define DISPLACEMENTMAP_UV "+n.displacementMapUv:"",n.metalnessMapUv?"#define METALNESSMAP_UV "+n.metalnessMapUv:"",n.roughnessMapUv?"#define ROUGHNESSMAP_UV "+n.roughnessMapUv:"",n.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+n.anisotropyMapUv:"",n.clearcoatMapUv?"#define CLEARCOATMAP_UV "+n.clearcoatMapUv:"",n.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+n.clearcoatNormalMapUv:"",n.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+n.clearcoatRoughnessMapUv:"",n.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+n.iridescenceMapUv:"",n.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+n.iridescenceThicknessMapUv:"",n.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+n.sheenColorMapUv:"",n.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+n.sheenRoughnessMapUv:"",n.specularMapUv?"#define SPECULARMAP_UV "+n.specularMapUv:"",n.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+n.specularColorMapUv:"",n.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+n.specularIntensityMapUv:"",n.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+n.transmissionMapUv:"",n.thicknessMapUv?"#define THICKNESSMAP_UV "+n.thicknessMapUv:"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.morphColors?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH","\tuniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1","\tattribute vec2 uv1;","#endif","#ifdef USE_UV2","\tattribute vec2 uv2;","#endif","#ifdef USE_UV3","\tattribute vec2 uv3;","#endif","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Nr).join("\n"),g=[zr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+c:"",n.envMap?"#define "+d:"",n.envMap?"#define "+u:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.dispersion?"#define USE_DISPERSION":"",n.iridescence?"#define USE_IRIDESCENCE":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor?"#define USE_COLOR":"",n.vertexAlphas||n.batchingColor?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==U?"#define TONE_MAPPING":"",n.toneMapping!==U?Gn.tonemapping_pars_fragment:"",n.toneMapping!==U?Dr("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",Gn.colorspace_pars_fragment,Lr("linearToOutputTexel",n.outputColorSpace),Ir(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Nr).join("\n")),o=Br(o),o=yr(o,n),o=Fr(o,n),s=Br(s),s=yr(s,n),s=Fr(s,n),o=Wr(o),s=Wr(s),!0!==n.isRawShaderMaterial&&(v="#version 300 es\n",_=[p,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_,g=["#define varying in",n.glslVersion===le?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===le?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+g);const S=v+_+o,M=v+g+s,T=Rr(r,r.VERTEX_SHADER,S),x=Rr(r,r.FRAGMENT_SHADER,M);function A(t){if(e.debug.checkShaderErrors){const n=r.getProgramInfoLog(h)||"",i=r.getShaderInfoLog(T)||"",a=r.getShaderInfoLog(x)||"",o=n.trim(),s=i.trim(),l=a.trim();let c=!0,d=!0;if(!1===r.getProgramParameter(h,r.LINK_STATUS))if(c=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(r,h,T,x);else{const e=Pr(r,T,"vertex"),n=Pr(r,x,"fragment");w("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(h,r.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+o+"\n"+e+"\n"+n)}else""!==o?E("WebGLProgram: Program Info Log:",o):""!==s&&""!==l||(d=!1);d&&(t.diagnostics={runnable:c,programLog:o,vertexShader:{log:s,prefix:_},fragmentShader:{log:l,prefix:g}})}r.deleteShader(T),r.deleteShader(x),R=new Ar(r,h),b=function(e,t){const n={},i=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let r=0;r0,J=r.clearcoat>0,ee=r.dispersion>0,te=r.iridescence>0,ne=r.sheen>0,ie=r.transmission>0,re=Q&&!!r.anisotropyMap,ae=J&&!!r.clearcoatMap,oe=J&&!!r.clearcoatNormalMap,se=J&&!!r.clearcoatRoughnessMap,le=te&&!!r.iridescenceMap,ce=te&&!!r.iridescenceThicknessMap,de=ne&&!!r.sheenColorMap,ue=ne&&!!r.sheenRoughnessMap,fe=!!r.specularMap,pe=!!r.specularColorMap,me=!!r.specularIntensityMap,he=ie&&!!r.transmissionMap,Se=ie&&!!r.thicknessMap,Me=!!r.gradientMap,Te=!!r.alphaMap,xe=r.alphaTest>0,Ae=!!r.alphaHash,Re=!!r.extensions;let be=U;r.toneMapped&&(null!==O&&!0!==O.isXRRenderTarget||(be=e.toneMapping));const Ce={shaderID:C,shaderType:r.type,shaderName:r.name,vertexShader:D,fragmentShader:w,defines:r.defines,customVertexShaderID:I,customFragmentShaderID:N,isRawShaderMaterial:!0===r.isRawShaderMaterial,glslVersion:r.glslVersion,precision:_,batching:H,batchingColor:H&&null!==S._colorsTexture,instancing:G,instancingColor:G&&null!==S.instanceColor,instancingMorph:G&&null!==S.morphTexture,outputColorSpace:null===O?e.outputColorSpace:!0===O.isXRRenderTarget?O.texture.colorSpace:F,alphaToCoverage:!!r.alphaToCoverage,map:V,matcap:W,envMap:k,envMapMode:k&&R.mapping,envMapCubeUVHeight:b,aoMap:z,lightMap:X,bumpMap:Y,normalMap:K,displacementMap:j,emissiveMap:q,normalMapObjectSpace:K&&r.normalMapType===Ee,normalMapTangentSpace:K&&r.normalMapType===ve,metalnessMap:Z,roughnessMap:$,anisotropy:Q,anisotropyMap:re,clearcoat:J,clearcoatMap:ae,clearcoatNormalMap:oe,clearcoatRoughnessMap:se,dispersion:ee,iridescence:te,iridescenceMap:le,iridescenceThicknessMap:ce,sheen:ne,sheenColorMap:de,sheenRoughnessMap:ue,specularMap:fe,specularColorMap:pe,specularIntensityMap:me,transmission:ie,transmissionMap:he,thicknessMap:Se,gradientMap:Me,opaque:!1===r.transparent&&r.blending===ge&&!1===r.alphaToCoverage,alphaMap:Te,alphaTest:xe,alphaHash:Ae,combine:r.combine,mapUv:V&&v(r.map.channel),aoMapUv:z&&v(r.aoMap.channel),lightMapUv:X&&v(r.lightMap.channel),bumpMapUv:Y&&v(r.bumpMap.channel),normalMapUv:K&&v(r.normalMap.channel),displacementMapUv:j&&v(r.displacementMap.channel),emissiveMapUv:q&&v(r.emissiveMap.channel),metalnessMapUv:Z&&v(r.metalnessMap.channel),roughnessMapUv:$&&v(r.roughnessMap.channel),anisotropyMapUv:re&&v(r.anisotropyMap.channel),clearcoatMapUv:ae&&v(r.clearcoatMap.channel),clearcoatNormalMapUv:oe&&v(r.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:se&&v(r.clearcoatRoughnessMap.channel),iridescenceMapUv:le&&v(r.iridescenceMap.channel),iridescenceThicknessMapUv:ce&&v(r.iridescenceThicknessMap.channel),sheenColorMapUv:de&&v(r.sheenColorMap.channel),sheenRoughnessMapUv:ue&&v(r.sheenRoughnessMap.channel),specularMapUv:fe&&v(r.specularMap.channel),specularColorMapUv:pe&&v(r.specularColorMap.channel),specularIntensityMapUv:me&&v(r.specularIntensityMap.channel),transmissionMapUv:he&&v(r.transmissionMap.channel),thicknessMapUv:Se&&v(r.thicknessMap.channel),alphaMapUv:Te&&v(r.alphaMap.channel),vertexTangents:!!T.attributes.tangent&&(K||Q),vertexColors:r.vertexColors,vertexAlphas:!0===r.vertexColors&&!!T.attributes.color&&4===T.attributes.color.itemSize,pointsUvs:!0===S.isPoints&&!!T.attributes.uv&&(V||Te),fog:!!M,useFog:!0===r.fog,fogExp2:!!M&&M.isFogExp2,flatShading:!0===r.flatShading&&!1===r.wireframe,sizeAttenuation:!0===r.sizeAttenuation,logarithmicDepthBuffer:h,reversedDepthBuffer:B,skinning:!0===S.isSkinnedMesh,morphTargets:void 0!==T.morphAttributes.position,morphNormals:void 0!==T.morphAttributes.normal,morphColors:void 0!==T.morphAttributes.color,morphTargetsCount:L,morphTextureStride:y,numDirLights:s.directional.length,numPointLights:s.point.length,numSpotLights:s.spot.length,numSpotLightMaps:s.spotLightMap.length,numRectAreaLights:s.rectArea.length,numHemiLights:s.hemi.length,numDirLightShadows:s.directionalShadowMap.length,numPointLightShadows:s.pointShadowMap.length,numSpotLightShadows:s.spotShadowMap.length,numSpotLightShadowsWithMaps:s.numSpotLightShadowsWithMaps,numLightProbes:s.numLightProbes,numClippingPlanes:o.numPlanes,numClipIntersection:o.numIntersection,dithering:r.dithering,shadowMapEnabled:e.shadowMap.enabled&&u.length>0,shadowMapType:e.shadowMap.type,toneMapping:be,decodeVideoTexture:V&&!0===r.map.isVideoTexture&&p.getTransfer(r.map.colorSpace)===m,decodeVideoTextureEmissive:q&&!0===r.emissiveMap.isVideoTexture&&p.getTransfer(r.emissiveMap.colorSpace)===m,premultipliedAlpha:r.premultipliedAlpha,doubleSided:r.side===_e,flipSided:r.side===c,useDepthPacking:r.depthPacking>=0,depthPacking:r.depthPacking||0,index0AttributeName:r.index0AttributeName,extensionClipCullDistance:Re&&!0===r.extensions.clipCullDistance&&n.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Re&&!0===r.extensions.multiDraw||H)&&n.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:n.has("KHR_parallel_shader_compile"),customProgramCacheKey:r.customProgramCacheKey()};return Ce.vertexUv1s=d.has(1),Ce.vertexUv2s=d.has(2),Ce.vertexUv3s=d.has(3),d.clear(),Ce},getProgramCacheKey:function(t){const n=[];if(t.shaderID?n.push(t.shaderID):(n.push(t.customVertexShaderID),n.push(t.customFragmentShaderID)),void 0!==t.defines)for(const e in t.defines)n.push(e),n.push(t.defines[e]);return!1===t.isRawShaderMaterial&&(!function(e,t){e.push(t.precision),e.push(t.outputColorSpace),e.push(t.envMapMode),e.push(t.envMapCubeUVHeight),e.push(t.mapUv),e.push(t.alphaMapUv),e.push(t.lightMapUv),e.push(t.aoMapUv),e.push(t.bumpMapUv),e.push(t.normalMapUv),e.push(t.displacementMapUv),e.push(t.emissiveMapUv),e.push(t.metalnessMapUv),e.push(t.roughnessMapUv),e.push(t.anisotropyMapUv),e.push(t.clearcoatMapUv),e.push(t.clearcoatNormalMapUv),e.push(t.clearcoatRoughnessMapUv),e.push(t.iridescenceMapUv),e.push(t.iridescenceThicknessMapUv),e.push(t.sheenColorMapUv),e.push(t.sheenRoughnessMapUv),e.push(t.specularMapUv),e.push(t.specularColorMapUv),e.push(t.specularIntensityMapUv),e.push(t.transmissionMapUv),e.push(t.thicknessMapUv),e.push(t.combine),e.push(t.fogExp2),e.push(t.sizeAttenuation),e.push(t.morphTargetsCount),e.push(t.morphAttributeCount),e.push(t.numDirLights),e.push(t.numPointLights),e.push(t.numSpotLights),e.push(t.numSpotLightMaps),e.push(t.numHemiLights),e.push(t.numRectAreaLights),e.push(t.numDirLightShadows),e.push(t.numPointLightShadows),e.push(t.numSpotLightShadows),e.push(t.numSpotLightShadowsWithMaps),e.push(t.numLightProbes),e.push(t.shadowMapType),e.push(t.toneMapping),e.push(t.numClippingPlanes),e.push(t.numClipIntersection),e.push(t.depthPacking)}(n,t),function(e,t){s.disableAll(),t.instancing&&s.enable(0);t.instancingColor&&s.enable(1);t.instancingMorph&&s.enable(2);t.matcap&&s.enable(3);t.envMap&&s.enable(4);t.normalMapObjectSpace&&s.enable(5);t.normalMapTangentSpace&&s.enable(6);t.clearcoat&&s.enable(7);t.iridescence&&s.enable(8);t.alphaTest&&s.enable(9);t.vertexColors&&s.enable(10);t.vertexAlphas&&s.enable(11);t.vertexUv1s&&s.enable(12);t.vertexUv2s&&s.enable(13);t.vertexUv3s&&s.enable(14);t.vertexTangents&&s.enable(15);t.anisotropy&&s.enable(16);t.alphaHash&&s.enable(17);t.batching&&s.enable(18);t.dispersion&&s.enable(19);t.batchingColor&&s.enable(20);t.gradientMap&&s.enable(21);e.push(s.mask),s.disableAll(),t.fog&&s.enable(0);t.useFog&&s.enable(1);t.flatShading&&s.enable(2);t.logarithmicDepthBuffer&&s.enable(3);t.reversedDepthBuffer&&s.enable(4);t.skinning&&s.enable(5);t.morphTargets&&s.enable(6);t.morphNormals&&s.enable(7);t.morphColors&&s.enable(8);t.premultipliedAlpha&&s.enable(9);t.shadowMapEnabled&&s.enable(10);t.doubleSided&&s.enable(11);t.flipSided&&s.enable(12);t.useDepthPacking&&s.enable(13);t.dithering&&s.enable(14);t.transmission&&s.enable(15);t.sheen&&s.enable(16);t.opaque&&s.enable(17);t.pointsUvs&&s.enable(18);t.decodeVideoTexture&&s.enable(19);t.decodeVideoTextureEmissive&&s.enable(20);t.alphaToCoverage&&s.enable(21);e.push(s.mask)}(n,t),n.push(e.outputColorSpace)),n.push(t.customProgramCacheKey),n.join()},getUniforms:function(e){const t=g[e.type];let n;if(t){const e=Vn[t];n=he.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let i=f.get(n);return void 0!==i?++i.usedTimes:(i=new qr(e,n,t,r),u.push(i),f.set(n,i)),i},releaseProgram:function(e){if(0===--e.usedTimes){const t=u.indexOf(e);u[t]=u[u.length-1],u.pop(),f.delete(e.cacheKey),e.destroy()}},releaseShaderCache:function(e){l.remove(e)},programs:u,dispose:function(){l.dispose()}}}function ea(){let e=new WeakMap;return{has:function(t){return e.has(t)},get:function(t){let n=e.get(t);return void 0===n&&(n={},e.set(t,n)),n},remove:function(t){e.delete(t)},update:function(t,n,i){e.get(t)[n]=i},dispose:function(){e=new WeakMap}}}function ta(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.materialVariant!==t.materialVariant?e.materialVariant-t.materialVariant:e.z!==t.z?e.z-t.z:e.id-t.id}function na(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function ia(){const e=[];let t=0;const n=[],i=[],r=[];function a(e){let t=0;return e.isInstancedMesh&&(t+=2),e.isSkinnedMesh&&(t+=1),t}function o(n,i,r,o,s,l){let c=e[t];return void 0===c?(c={id:n.id,object:n,geometry:i,material:r,materialVariant:a(n),groupOrder:o,renderOrder:n.renderOrder,z:s,group:l},e[t]=c):(c.id=n.id,c.object=n,c.geometry=i,c.material=r,c.materialVariant=a(n),c.groupOrder=o,c.renderOrder=n.renderOrder,c.z=s,c.group=l),t++,c}return{opaque:n,transmissive:i,transparent:r,init:function(){t=0,n.length=0,i.length=0,r.length=0},push:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.push(d):!0===a.transparent?r.push(d):n.push(d)},unshift:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.unshift(d):!0===a.transparent?r.unshift(d):n.unshift(d)},finish:function(){for(let n=t,i=e.length;n1&&n.sort(e||ta),i.length>1&&i.sort(t||na),r.length>1&&r.sort(t||na)}}}function ra(){let e=new WeakMap;return{get:function(t,n){const i=e.get(t);let r;return void 0===i?(r=new ia,e.set(t,[r])):n>=i.length?(r=new ia,i.push(r)):r=i[n],r},dispose:function(){e=new WeakMap}}}function aa(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let i;switch(t.type){case"DirectionalLight":i={direction:new r,color:new n};break;case"SpotLight":i={position:new r,direction:new r,color:new n,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new r,color:new n,distance:0,decay:0};break;case"HemisphereLight":i={direction:new r,skyColor:new n,groundColor:new n};break;case"RectAreaLight":i={color:new n,position:new r,halfWidth:new r,halfHeight:new r}}return e[t.id]=i,i}}}let oa=0;function sa(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function la(e){const n=new aa,i=function(){const e={};return{get:function(n){if(void 0!==e[n.id])return e[n.id];let i;switch(n.type){case"DirectionalLight":case"SpotLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t};break;case"PointLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t,shadowCameraNear:1,shadowCameraFar:1e3}}return e[n.id]=i,i}}}(),a={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let e=0;e<9;e++)a.probe.push(new r);const o=new r,s=new f,l=new f;return{setup:function(t){let r=0,o=0,s=0;for(let e=0;e<9;e++)a.probe[e].set(0,0,0);let l=0,c=0,d=0,u=0,f=0,p=0,m=0,h=0,_=0,g=0,v=0;t.sort(sa);for(let e=0,E=t.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=Hn.LTC_FLOAT_1,a.rectAreaLTC2=Hn.LTC_FLOAT_2):(a.rectAreaLTC1=Hn.LTC_HALF_1,a.rectAreaLTC2=Hn.LTC_HALF_2)),a.ambient[0]=r,a.ambient[1]=o,a.ambient[2]=s;const E=a.hash;E.directionalLength===l&&E.pointLength===c&&E.spotLength===d&&E.rectAreaLength===u&&E.hemiLength===f&&E.numDirectionalShadows===p&&E.numPointShadows===m&&E.numSpotShadows===h&&E.numSpotMaps===_&&E.numLightProbes===v||(a.directional.length=l,a.spot.length=d,a.rectArea.length=u,a.point.length=c,a.hemi.length=f,a.directionalShadow.length=p,a.directionalShadowMap.length=p,a.pointShadow.length=m,a.pointShadowMap.length=m,a.spotShadow.length=h,a.spotShadowMap.length=h,a.directionalShadowMatrix.length=p,a.pointShadowMatrix.length=m,a.spotLightMatrix.length=h+_-g,a.spotLightMap.length=_,a.numSpotLightShadowsWithMaps=g,a.numLightProbes=v,E.directionalLength=l,E.pointLength=c,E.spotLength=d,E.rectAreaLength=u,E.hemiLength=f,E.numDirectionalShadows=p,E.numPointShadows=m,E.numSpotShadows=h,E.numSpotMaps=_,E.numLightProbes=v,a.version=oa++)},setupView:function(e,t){let n=0,i=0,r=0,c=0,d=0;const u=t.matrixWorldInverse;for(let t=0,f=e.length;t=r.length?(a=new ca(e),r.push(a)):a=r[i],a},dispose:function(){t=new WeakMap}}}const ua=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],fa=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],pa=new f,ma=new r,ha=new r;function _a(e,n,i){let r=new Te;const a=new t,s=new t,d=new X,u=new xe,f=new Ae,p={},m=i.maxTextureSize,h={[_]:c,[c]:_,[_e]:_e},g=new l({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new t},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"}),v=g.clone();v.defines.HORIZONTAL_PASS=1;const M=new C;M.setAttribute("position",new y(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const x=new o(M,g),A=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=de;let R=this.type;function b(t,i){const r=n.update(x);g.defines.VSM_SAMPLES!==t.blurSamples&&(g.defines.VSM_SAMPLES=t.blurSamples,v.defines.VSM_SAMPLES=t.blurSamples,g.needsUpdate=!0,v.needsUpdate=!0),null===t.mapPass&&(t.mapPass=new N(a.x,a.y,{format:Me,type:S})),g.uniforms.shadow_pass.value=t.map.depthTexture,g.uniforms.resolution.value=t.mapSize,g.uniforms.radius.value=t.radius,e.setRenderTarget(t.mapPass),e.clear(),e.renderBufferDirect(i,null,r,g,x,null),v.uniforms.shadow_pass.value=t.mapPass.texture,v.uniforms.resolution.value=t.mapSize,v.uniforms.radius.value=t.radius,e.setRenderTarget(t.map),e.clear(),e.renderBufferDirect(i,null,r,v,x,null)}function P(t,n,i,r){let a=null;const o=!0===i.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)a=o;else if(a=!0===i.isPointLight?f:u,e.localClippingEnabled&&!0===n.clipShadows&&Array.isArray(n.clippingPlanes)&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0||n.map&&n.alphaTest>0||!0===n.alphaToCoverage){const e=a.uuid,t=n.uuid;let i=p[e];void 0===i&&(i={},p[e]=i);let r=i[t];void 0===r&&(r=a.clone(),i[t]=r,n.addEventListener("dispose",U)),a=r}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=r===ce?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:h[n.side],a.alphaMap=n.alphaMap,a.alphaTest=!0===n.alphaToCoverage?.5:n.alphaTest,a.map=n.map,a.clipShadows=n.clipShadows,a.clippingPlanes=n.clippingPlanes,a.clipIntersection=n.clipIntersection,a.displacementMap=n.displacementMap,a.displacementScale=n.displacementScale,a.displacementBias=n.displacementBias,a.wireframeLinewidth=n.wireframeLinewidth,a.linewidth=n.linewidth,!0===i.isPointLight&&!0===a.isMeshDistanceMaterial){e.properties.get(a).light=i}return a}function L(t,i,a,o,s){if(!1===t.visible)return;if(t.layers.test(i.layers)&&(t.isMesh||t.isLine||t.isPoints)&&(t.castShadow||t.receiveShadow&&s===ce)&&(!t.frustumCulled||r.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,t.matrixWorld);const r=n.update(t),l=t.material;if(Array.isArray(l)){const n=r.groups;for(let c=0,d=n.length;ce.needsUpdate=!0):e.material.needsUpdate=!0)});for(let o=0,l=t.length;om||a.y>m)&&(a.x>m&&(s.x=Math.floor(m/p.x),a.x=s.x*p.x,c.mapSize.x=s.x),a.y>m&&(s.y=Math.floor(m/p.y),a.y=s.y*p.y,c.mapSize.y=s.y));const h=e.state.buffers.depth.getReversed();if(c.camera._reversedDepth=h,null===c.map||!0===f){if(null!==c.map&&(null!==c.map.depthTexture&&(c.map.depthTexture.dispose(),c.map.depthTexture=null),c.map.dispose()),this.type===ce){if(l.isPointLight){E("WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead.");continue}c.map=new N(a.x,a.y,{format:Me,type:S,minFilter:O,magFilter:O,generateMipmaps:!1}),c.map.texture.name=l.name+".shadowMap",c.map.depthTexture=new oe(a.x,a.y,T),c.map.depthTexture.name=l.name+".shadowMapDepth",c.map.depthTexture.format=be,c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Ce,c.map.depthTexture.magFilter=Ce}else l.isPointLight?(c.map=new H(a.x),c.map.depthTexture=new Pe(a.x,Le)):(c.map=new N(a.x,a.y),c.map.depthTexture=new oe(a.x,a.y,Le)),c.map.depthTexture.name=l.name+".shadowMap",c.map.depthTexture.format=be,this.type===de?(c.map.depthTexture.compareFunction=h?re:ae,c.map.depthTexture.minFilter=O,c.map.depthTexture.magFilter=O):(c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Ce,c.map.depthTexture.magFilter=Ce);c.camera.updateProjectionMatrix()}const _=c.map.isWebGLCubeRenderTarget?6:1;for(let t=0;t<_;t++){if(c.map.isWebGLCubeRenderTarget)e.setRenderTarget(c.map,t),e.clear();else{0===t&&(e.setRenderTarget(c.map),e.clear());const n=c.getViewport(t);d.set(s.x*n.x,s.y*n.y,s.x*n.z,s.y*n.w),u.viewport(d)}if(l.isPointLight){const e=c.camera,n=c.matrix,i=l.distance||e.far;i!==e.far&&(e.far=i,e.updateProjectionMatrix()),ma.setFromMatrixPosition(l.matrixWorld),e.position.copy(ma),ha.copy(e.position),ha.add(ua[t]),e.up.copy(fa[t]),e.lookAt(ha),e.updateMatrixWorld(),n.makeTranslation(-ma.x,-ma.y,-ma.z),pa.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),c._frustum.setFromProjectionMatrix(pa,e.coordinateSystem,e.reversedDepth)}else c.updateMatrices(l);r=c.getFrustum(),L(n,i,c.camera,l,this.type)}!0!==c.isPointLightShadow&&this.type===ce&&b(c,i),c.needsUpdate=!1}R=this.type,A.needsUpdate=!1,e.setRenderTarget(o,l,c)}}const ga={[tt]:et,[Je]:Ze,[Qe]:qe,[Ue]:$e,[et]:tt,[Ze]:Je,[qe]:Qe,[$e]:Ue};function va(e,t){const i=new function(){let t=!1;const n=new X;let i=null;const r=new X(0,0,0,0);return{setMask:function(n){i===n||t||(e.colorMask(n,n,n,n),i=n)},setLocked:function(e){t=e},setClear:function(t,i,a,o,s){!0===s&&(t*=o,i*=o,a*=o),n.set(t,i,a,o),!1===r.equals(n)&&(e.clearColor(t,i,a,o),r.copy(n))},reset:function(){t=!1,i=null,r.set(-1,0,0,0)}}},r=new function(){let n=!1,i=!1,r=null,a=null,o=null;return{setReversed:function(e){if(i!==e){const n=t.get("EXT_clip_control");e?n.clipControlEXT(n.LOWER_LEFT_EXT,n.ZERO_TO_ONE_EXT):n.clipControlEXT(n.LOWER_LEFT_EXT,n.NEGATIVE_ONE_TO_ONE_EXT),i=e;const r=o;o=null,this.setClear(r)}},getReversed:function(){return i},setTest:function(t){t?z(e.DEPTH_TEST):Y(e.DEPTH_TEST)},setMask:function(t){r===t||n||(e.depthMask(t),r=t)},setFunc:function(t){if(i&&(t=ga[t]),a!==t){switch(t){case tt:e.depthFunc(e.NEVER);break;case et:e.depthFunc(e.ALWAYS);break;case Je:e.depthFunc(e.LESS);break;case Ue:e.depthFunc(e.LEQUAL);break;case Qe:e.depthFunc(e.EQUAL);break;case $e:e.depthFunc(e.GEQUAL);break;case Ze:e.depthFunc(e.GREATER);break;case qe:e.depthFunc(e.NOTEQUAL);break;default:e.depthFunc(e.LEQUAL)}a=t}},setLocked:function(e){n=e},setClear:function(t){o!==t&&(i&&(t=1-t),e.clearDepth(t),o=t)},reset:function(){n=!1,r=null,a=null,o=null,i=!1}}},a=new function(){let t=!1,n=null,i=null,r=null,a=null,o=null,s=null,l=null,c=null;return{setTest:function(n){t||(n?z(e.STENCIL_TEST):Y(e.STENCIL_TEST))},setMask:function(i){n===i||t||(e.stencilMask(i),n=i)},setFunc:function(t,n,o){i===t&&r===n&&a===o||(e.stencilFunc(t,n,o),i=t,r=n,a=o)},setOp:function(t,n,i){o===t&&s===n&&l===i||(e.stencilOp(t,n,i),o=t,s=n,l=i)},setLocked:function(e){t=e},setClear:function(t){c!==t&&(e.clearStencil(t),c=t)},reset:function(){t=!1,n=null,i=null,r=null,a=null,o=null,s=null,l=null,c=null}}},o=new WeakMap,s=new WeakMap;let l={},d={},u=new WeakMap,f=[],p=null,m=!1,h=null,_=null,g=null,v=null,E=null,S=null,M=null,T=new n(0,0,0),x=0,A=!1,R=null,b=null,C=null,P=null,L=null;const U=e.getParameter(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let D=!1,N=0;const y=e.getParameter(e.VERSION);-1!==y.indexOf("WebGL")?(N=parseFloat(/^WebGL (\d)/.exec(y)[1]),D=N>=1):-1!==y.indexOf("OpenGL ES")&&(N=parseFloat(/^OpenGL ES (\d)/.exec(y)[1]),D=N>=2);let F=null,O={};const B=e.getParameter(e.SCISSOR_BOX),G=e.getParameter(e.VIEWPORT),H=(new X).fromArray(B),V=(new X).fromArray(G);function W(t,n,i,r){const a=new Uint8Array(4),o=e.createTexture();e.bindTexture(t,o),e.texParameteri(t,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(t,e.TEXTURE_MAG_FILTER,e.NEAREST);for(let o=0;on||r.height>n)&&(i=n/Math.max(r.width,r.height)),i<1){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof VideoFrame&&e instanceof VideoFrame){const n=Math.floor(i*r.width),a=Math.floor(i*r.height);void 0===f&&(f=g(n,a));const o=t?g(n,a):f;o.width=n,o.height=a;return o.getContext("2d").drawImage(e,0,0,n,a),E("WebGLRenderer: Texture has been resized from ("+r.width+"x"+r.height+") to ("+n+"x"+a+")."),o}return"data"in e&&E("WebGLRenderer: Image in DataTexture is too big ("+r.width+"x"+r.height+")."),e}return e}function S(e){return e.generateMipmaps}function A(t){e.generateMipmap(t)}function R(t){return t.isWebGLCubeRenderTarget?e.TEXTURE_CUBE_MAP:t.isWebGL3DRenderTarget?e.TEXTURE_3D:t.isWebGLArrayRenderTarget||t.isCompressedArrayTexture?e.TEXTURE_2D_ARRAY:e.TEXTURE_2D}function b(t,i,r,a,o=!1){if(null!==t){if(void 0!==e[t])return e[t];E("WebGLRenderer: Attempt to use non-existing WebGL internal format '"+t+"'")}let s=i;if(i===e.RED&&(r===e.FLOAT&&(s=e.R32F),r===e.HALF_FLOAT&&(s=e.R16F),r===e.UNSIGNED_BYTE&&(s=e.R8)),i===e.RED_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.R8UI),r===e.UNSIGNED_SHORT&&(s=e.R16UI),r===e.UNSIGNED_INT&&(s=e.R32UI),r===e.BYTE&&(s=e.R8I),r===e.SHORT&&(s=e.R16I),r===e.INT&&(s=e.R32I)),i===e.RG&&(r===e.FLOAT&&(s=e.RG32F),r===e.HALF_FLOAT&&(s=e.RG16F),r===e.UNSIGNED_BYTE&&(s=e.RG8)),i===e.RG_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RG8UI),r===e.UNSIGNED_SHORT&&(s=e.RG16UI),r===e.UNSIGNED_INT&&(s=e.RG32UI),r===e.BYTE&&(s=e.RG8I),r===e.SHORT&&(s=e.RG16I),r===e.INT&&(s=e.RG32I)),i===e.RGB_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGB8UI),r===e.UNSIGNED_SHORT&&(s=e.RGB16UI),r===e.UNSIGNED_INT&&(s=e.RGB32UI),r===e.BYTE&&(s=e.RGB8I),r===e.SHORT&&(s=e.RGB16I),r===e.INT&&(s=e.RGB32I)),i===e.RGBA_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGBA8UI),r===e.UNSIGNED_SHORT&&(s=e.RGBA16UI),r===e.UNSIGNED_INT&&(s=e.RGBA32UI),r===e.BYTE&&(s=e.RGBA8I),r===e.SHORT&&(s=e.RGBA16I),r===e.INT&&(s=e.RGBA32I)),i===e.RGB&&(r===e.UNSIGNED_INT_5_9_9_9_REV&&(s=e.RGB9_E5),r===e.UNSIGNED_INT_10F_11F_11F_REV&&(s=e.R11F_G11F_B10F)),i===e.RGBA){const t=o?me:p.getTransfer(a);r===e.FLOAT&&(s=e.RGBA32F),r===e.HALF_FLOAT&&(s=e.RGBA16F),r===e.UNSIGNED_BYTE&&(s=t===m?e.SRGB8_ALPHA8:e.RGBA8),r===e.UNSIGNED_SHORT_4_4_4_4&&(s=e.RGBA4),r===e.UNSIGNED_SHORT_5_5_5_1&&(s=e.RGB5_A1)}return s!==e.R16F&&s!==e.R32F&&s!==e.RG16F&&s!==e.RG32F&&s!==e.RGBA16F&&s!==e.RGBA32F||n.get("EXT_color_buffer_float"),s}function C(t,n){let i;return t?null===n||n===Le||n===Ct?i=e.DEPTH24_STENCIL8:n===T?i=e.DEPTH32F_STENCIL8:n===Pt&&(i=e.DEPTH24_STENCIL8,E("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===Le||n===Ct?i=e.DEPTH_COMPONENT24:n===T?i=e.DEPTH_COMPONENT32F:n===Pt&&(i=e.DEPTH_COMPONENT16),i}function P(e,t){return!0===S(e)||e.isFramebufferTexture&&e.minFilter!==Ce&&e.minFilter!==O?Math.log2(Math.max(t.width,t.height))+1:void 0!==e.mipmaps&&e.mipmaps.length>0?e.mipmaps.length:e.isCompressedTexture&&Array.isArray(e.image)?t.mipmaps.length:1}function L(e){const t=e.target;t.removeEventListener("dispose",L),function(e){const t=r.get(e);if(void 0===t.__webglInit)return;const n=e.source,i=h.get(n);if(i){const r=i[t.__cacheKey];r.usedTimes--,0===r.usedTimes&&D(e),0===Object.keys(i).length&&h.delete(n)}r.remove(e)}(t),t.isVideoTexture&&u.delete(t)}function U(t){const n=t.target;n.removeEventListener("dispose",U),function(t){const n=r.get(t);t.depthTexture&&(t.depthTexture.dispose(),r.remove(t.depthTexture));if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(n.__webglFramebuffer[t]))for(let i=0;i0&&a.__version!==t.version){const e=t.image;if(null===e)E("WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==e.complete)return void k(a,t,n);E("WebGLRenderer: Texture marked for update but image is incomplete")}}else t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null);i.bindTexture(e.TEXTURE_2D,a.__webglTexture,e.TEXTURE0+n)}const y={[pt]:e.REPEAT,[ft]:e.CLAMP_TO_EDGE,[ut]:e.MIRRORED_REPEAT},B={[Ce]:e.NEAREST,[gt]:e.NEAREST_MIPMAP_NEAREST,[_t]:e.NEAREST_MIPMAP_LINEAR,[O]:e.LINEAR,[ht]:e.LINEAR_MIPMAP_NEAREST,[mt]:e.LINEAR_MIPMAP_LINEAR},G={[xt]:e.NEVER,[Tt]:e.ALWAYS,[Mt]:e.LESS,[ae]:e.LEQUAL,[St]:e.EQUAL,[re]:e.GEQUAL,[Et]:e.GREATER,[vt]:e.NOTEQUAL};function H(t,i){if(i.type!==T||!1!==n.has("OES_texture_float_linear")||i.magFilter!==O&&i.magFilter!==ht&&i.magFilter!==_t&&i.magFilter!==mt&&i.minFilter!==O&&i.minFilter!==ht&&i.minFilter!==_t&&i.minFilter!==mt||E("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),e.texParameteri(t,e.TEXTURE_WRAP_S,y[i.wrapS]),e.texParameteri(t,e.TEXTURE_WRAP_T,y[i.wrapT]),t!==e.TEXTURE_3D&&t!==e.TEXTURE_2D_ARRAY||e.texParameteri(t,e.TEXTURE_WRAP_R,y[i.wrapR]),e.texParameteri(t,e.TEXTURE_MAG_FILTER,B[i.magFilter]),e.texParameteri(t,e.TEXTURE_MIN_FILTER,B[i.minFilter]),i.compareFunction&&(e.texParameteri(t,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(t,e.TEXTURE_COMPARE_FUNC,G[i.compareFunction])),!0===n.has("EXT_texture_filter_anisotropic")){if(i.magFilter===Ce)return;if(i.minFilter!==_t&&i.minFilter!==mt)return;if(i.type===T&&!1===n.has("OES_texture_float_linear"))return;if(i.anisotropy>1||r.get(i).__currentAnisotropy){const o=n.get("EXT_texture_filter_anisotropic");e.texParameterf(t,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(i.anisotropy,a.getMaxAnisotropy())),r.get(i).__currentAnisotropy=i.anisotropy}}}function V(t,n){let i=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",L));const r=n.source;let a=h.get(r);void 0===a&&(a={},h.set(r,a));const o=function(e){const t=[];return t.push(e.wrapS),t.push(e.wrapT),t.push(e.wrapR||0),t.push(e.magFilter),t.push(e.minFilter),t.push(e.anisotropy),t.push(e.internalFormat),t.push(e.format),t.push(e.type),t.push(e.generateMipmaps),t.push(e.premultiplyAlpha),t.push(e.flipY),t.push(e.unpackAlignment),t.push(e.colorSpace),t.join()}(n);if(o!==t.__cacheKey){void 0===a[o]&&(a[o]={texture:e.createTexture(),usedTimes:0},s.memory.textures++,i=!0),a[o].usedTimes++;const r=a[t.__cacheKey];void 0!==r&&(a[t.__cacheKey].usedTimes--,0===r.usedTimes&&D(n)),t.__cacheKey=o,t.__webglTexture=a[o].texture}return i}function W(e,t,n){return Math.floor(Math.floor(e/n)/t)}function k(t,n,s){let l=e.TEXTURE_2D;(n.isDataArrayTexture||n.isCompressedArrayTexture)&&(l=e.TEXTURE_2D_ARRAY),n.isData3DTexture&&(l=e.TEXTURE_3D);const c=V(t,n),d=n.source;i.bindTexture(l,t.__webglTexture,e.TEXTURE0+s);const u=r.get(d);if(d.version!==u.__version||!0===c){i.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),r=n.colorSpace===At?null:p.getPrimaries(n.colorSpace),f=n.colorSpace===At||t===r?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,f);let m=v(n.image,!1,a.maxTextureSize);m=Q(n,m);const h=o.convert(n.format,n.colorSpace),_=o.convert(n.type);let g,M=b(n.internalFormat,h,_,n.colorSpace,n.isVideoTexture);H(l,n);const T=n.mipmaps,R=!0!==n.isVideoTexture,L=void 0===u.__version||!0===c,U=d.dataReady,D=P(n,m);if(n.isDepthTexture)M=C(n.format===Rt,n.type),L&&(R?i.texStorage2D(e.TEXTURE_2D,1,M,m.width,m.height):i.texImage2D(e.TEXTURE_2D,0,M,m.width,m.height,0,h,_,null));else if(n.isDataTexture)if(T.length>0){R&&L&&i.texStorage2D(e.TEXTURE_2D,D,M,T[0].width,T[0].height);for(let t=0,n=T.length;te.start-t.start);let s=0;for(let e=1;e0){const r=bt(g.width,g.height,n.format,n.type);for(const a of n.layerUpdates){const n=g.data.subarray(a*r/g.data.BYTES_PER_ELEMENT,(a+1)*r/g.data.BYTES_PER_ELEMENT);i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,a,g.width,g.height,1,h,n)}n.clearLayerUpdates()}else i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,g.data)}else i.compressedTexImage3D(e.TEXTURE_2D_ARRAY,t,M,g.width,g.height,m.depth,0,g.data,0,0);else E("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else R?U&&i.texSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,_,g.data):i.texImage3D(e.TEXTURE_2D_ARRAY,t,M,g.width,g.height,m.depth,0,h,_,g.data)}else{R&&L&&i.texStorage2D(e.TEXTURE_2D,D,M,T[0].width,T[0].height);for(let t=0,r=T.length;t0){const t=bt(m.width,m.height,n.format,n.type);for(const r of n.layerUpdates){const n=m.data.subarray(r*t/m.data.BYTES_PER_ELEMENT,(r+1)*t/m.data.BYTES_PER_ELEMENT);i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,r,m.width,m.height,1,h,_,n)}n.clearLayerUpdates()}else i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)}else i.texImage3D(e.TEXTURE_2D_ARRAY,0,M,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isData3DTexture)R?(L&&i.texStorage3D(e.TEXTURE_3D,D,M,m.width,m.height,m.depth),U&&i.texSubImage3D(e.TEXTURE_3D,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)):i.texImage3D(e.TEXTURE_3D,0,M,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isFramebufferTexture){if(L)if(R)i.texStorage2D(e.TEXTURE_2D,D,M,m.width,m.height);else{let t=m.width,n=m.height;for(let r=0;r>=1,n>>=1}}else if(T.length>0){if(R&&L){const t=J(T[0]);i.texStorage2D(e.TEXTURE_2D,D,M,t.width,t.height)}for(let t=0,n=T.length;t>d),r=Math.max(1,n.height>>d);c===e.TEXTURE_3D||c===e.TEXTURE_2D_ARRAY?i.texImage3D(c,d,p,t,r,n.depth,0,u,f,null):i.texImage2D(c,d,p,t,r,0,u,f,null)}i.bindFramebuffer(e.FRAMEBUFFER,t),$(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,Z(n)):(c===e.TEXTURE_2D||c>=e.TEXTURE_CUBE_MAP_POSITIVE_X&&c<=e.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&e.framebufferTexture2D(e.FRAMEBUFFER,s,c,h.__webglTexture,d),i.bindFramebuffer(e.FRAMEBUFFER,null)}function X(t,n,i){if(e.bindRenderbuffer(e.RENDERBUFFER,t),n.depthBuffer){const r=n.depthTexture,a=r&&r.isDepthTexture?r.type:null,o=C(n.stencilBuffer,a),s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT;$(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,Z(n),o,n.width,n.height):i?e.renderbufferStorageMultisample(e.RENDERBUFFER,Z(n),o,n.width,n.height):e.renderbufferStorage(e.RENDERBUFFER,o,n.width,n.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,s,e.RENDERBUFFER,t)}else{const t=n.textures;for(let r=0;r{delete n.__boundDepthTexture,delete n.__depthDisposeCallback,e.removeEventListener("dispose",t)};e.addEventListener("dispose",t),n.__depthDisposeCallback=t}n.__boundDepthTexture=e}if(t.depthTexture&&!n.__autoAllocateDepthBuffer)if(a)for(let e=0;e<6;e++)Y(n.__webglFramebuffer[e],t,e);else{const e=t.texture.mipmaps;e&&e.length>0?Y(n.__webglFramebuffer[0],t,0):Y(n.__webglFramebuffer,t,0)}else if(a){n.__webglDepthbuffer=[];for(let r=0;r<6;r++)if(i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[r]),void 0===n.__webglDepthbuffer[r])n.__webglDepthbuffer[r]=e.createRenderbuffer(),X(n.__webglDepthbuffer[r],t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,a=n.__webglDepthbuffer[r];e.bindRenderbuffer(e.RENDERBUFFER,a),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,a)}}else{const r=t.texture.mipmaps;if(r&&r.length>0?i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[0]):i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer),void 0===n.__webglDepthbuffer)n.__webglDepthbuffer=e.createRenderbuffer(),X(n.__webglDepthbuffer,t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,r=n.__webglDepthbuffer;e.bindRenderbuffer(e.RENDERBUFFER,r),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,r)}}i.bindFramebuffer(e.FRAMEBUFFER,null)}const j=[],q=[];function Z(e){return Math.min(a.maxSamples,e.samples)}function $(e){const t=r.get(e);return e.samples>0&&!0===n.has("WEBGL_multisampled_render_to_texture")&&!1!==t.__useRenderToTexture}function Q(e,t){const n=e.colorSpace,i=e.format,r=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==F&&n!==At&&(p.getTransfer(n)===m?i===x&&r===M||E("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):w("WebGLTextures: Unsupported texture color space:",n)),t}function J(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?(d.width=e.naturalWidth||e.width,d.height=e.naturalHeight||e.height):"undefined"!=typeof VideoFrame&&e instanceof VideoFrame?(d.width=e.displayWidth,d.height=e.displayHeight):(d.width=e.width,d.height=e.height),d}this.allocateTextureUnit=function(){const e=I;return e>=a.maxTextures&&E("WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+a.maxTextures),I+=1,e},this.resetTextureUnits=function(){I=0},this.setTexture2D=N,this.setTexture2DArray=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?k(a,t,n):(t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null),i.bindTexture(e.TEXTURE_2D_ARRAY,a.__webglTexture,e.TEXTURE0+n))},this.setTexture3D=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?k(a,t,n):i.bindTexture(e.TEXTURE_3D,a.__webglTexture,e.TEXTURE0+n)},this.setTextureCube=function(t,n){const s=r.get(t);!0!==t.isCubeDepthTexture&&t.version>0&&s.__version!==t.version?function(t,n,s){if(6!==n.image.length)return;const l=V(t,n),c=n.source;i.bindTexture(e.TEXTURE_CUBE_MAP,t.__webglTexture,e.TEXTURE0+s);const d=r.get(c);if(c.version!==d.__version||!0===l){i.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),r=n.colorSpace===At?null:p.getPrimaries(n.colorSpace),u=n.colorSpace===At||t===r?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,u);const f=n.isCompressedTexture||n.image[0].isCompressedTexture,m=n.image[0]&&n.image[0].isDataTexture,h=[];for(let e=0;e<6;e++)h[e]=f||m?m?n.image[e].image:n.image[e]:v(n.image[e],!0,a.maxCubemapSize),h[e]=Q(n,h[e]);const _=h[0],g=o.convert(n.format,n.colorSpace),M=o.convert(n.type),T=b(n.internalFormat,g,M,n.colorSpace),R=!0!==n.isVideoTexture,C=void 0===d.__version||!0===l,L=c.dataReady;let U,D=P(n,_);if(H(e.TEXTURE_CUBE_MAP,n),f){R&&C&&i.texStorage2D(e.TEXTURE_CUBE_MAP,D,T,_.width,_.height);for(let t=0;t<6;t++){U=h[t].mipmaps;for(let r=0;r0&&D++;const t=J(h[0]);i.texStorage2D(e.TEXTURE_CUBE_MAP,D,T,t.width,t.height)}for(let t=0;t<6;t++)if(m){R?L&&i.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,h[t].width,h[t].height,g,M,h[t].data):i.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,T,h[t].width,h[t].height,0,g,M,h[t].data);for(let n=0;n1;if(u||(void 0===l.__webglTexture&&(l.__webglTexture=e.createTexture()),l.__version=n.version,s.memory.textures++),d){a.__webglFramebuffer=[];for(let t=0;t<6;t++)if(n.mipmaps&&n.mipmaps.length>0){a.__webglFramebuffer[t]=[];for(let i=0;i0){a.__webglFramebuffer=[];for(let t=0;t0&&!1===$(t)){a.__webglMultisampledFramebuffer=e.createFramebuffer(),a.__webglColorRenderbuffer=[],i.bindFramebuffer(e.FRAMEBUFFER,a.__webglMultisampledFramebuffer);for(let n=0;n0)for(let r=0;r0)for(let i=0;i0)if(!1===$(t)){const n=t.textures,a=t.width,o=t.height;let s=e.COLOR_BUFFER_BIT;const l=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,d=r.get(t),u=n.length>1;if(u)for(let t=0;t0?i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer[0]):i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer);for(let i=0;i= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}",uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new o(new h(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class Ta extends bn{constructor(e,n){super();const i=this;let a=null,o=1,s=null,l="local-floor",c=1,d=null,u=null,f=null,p=null,m=null,h=null;const _="undefined"!=typeof XRWebGLBinding,g=new Ma,v={},S=n.getContextAttributes();let T=null,A=null;const R=[],b=[],C=new t;let P=null;const U=new L;U.viewport=new X;const D=new L;D.viewport=new X;const w=[U,D],I=new Cn;let y=null,F=null;function O(e){const t=b.indexOf(e.inputSource);if(-1===t)return;const n=R[t];void 0!==n&&(n.update(e.inputSource,e.frame,d||s),n.dispatchEvent({type:e.type,data:e.inputSource}))}function B(){a.removeEventListener("select",O),a.removeEventListener("selectstart",O),a.removeEventListener("selectend",O),a.removeEventListener("squeeze",O),a.removeEventListener("squeezestart",O),a.removeEventListener("squeezeend",O),a.removeEventListener("end",B),a.removeEventListener("inputsourceschange",G);for(let e=0;e=0&&(b[i]=null,R[i].disconnect(n))}for(let t=0;t=b.length){b.push(n),i=e;break}if(null===b[e]){b[e]=n,i=e;break}}if(-1===i)break}const r=R[i];r&&r.connect(n)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getGripSpace()},this.getHand=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){o=e,!0===i.isPresenting&&E("WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){l=e,!0===i.isPresenting&&E("WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return d||s},this.setReferenceSpace=function(e){d=e},this.getBaseLayer=function(){return null!==p?p:m},this.getBinding=function(){return null===f&&_&&(f=new XRWebGLBinding(a,n)),f},this.getFrame=function(){return h},this.getSession=function(){return a},this.setSession=async function(t){if(a=t,null!==a){T=e.getRenderTarget(),a.addEventListener("select",O),a.addEventListener("selectstart",O),a.addEventListener("selectend",O),a.addEventListener("squeeze",O),a.addEventListener("squeezestart",O),a.addEventListener("squeezeend",O),a.addEventListener("end",B),a.addEventListener("inputsourceschange",G),!0!==S.xrCompatible&&await n.makeXRCompatible(),P=e.getPixelRatio(),e.getSize(C);if(_&&"createProjectionLayer"in XRWebGLBinding.prototype){let t=null,i=null,r=null;S.depth&&(r=S.stencil?n.DEPTH24_STENCIL8:n.DEPTH_COMPONENT24,t=S.stencil?Rt:be,i=S.stencil?Ct:Le);const s={colorFormat:n.RGBA8,depthFormat:r,scaleFactor:o};f=this.getBinding(),p=f.createProjectionLayer(s),a.updateRenderState({layers:[p]}),e.setPixelRatio(1),e.setSize(p.textureWidth,p.textureHeight,!1),A=new N(p.textureWidth,p.textureHeight,{format:x,type:M,depthTexture:new oe(p.textureWidth,p.textureHeight,i,void 0,void 0,void 0,void 0,void 0,void 0,t),stencilBuffer:S.stencil,colorSpace:e.outputColorSpace,samples:S.antialias?4:0,resolveDepthBuffer:!1===p.ignoreDepthValues,resolveStencilBuffer:!1===p.ignoreDepthValues})}else{const t={antialias:S.antialias,alpha:!0,depth:S.depth,stencil:S.stencil,framebufferScaleFactor:o};m=new XRWebGLLayer(a,n,t),a.updateRenderState({baseLayer:m}),e.setPixelRatio(1),e.setSize(m.framebufferWidth,m.framebufferHeight,!1),A=new N(m.framebufferWidth,m.framebufferHeight,{format:x,type:M,colorSpace:e.outputColorSpace,stencilBuffer:S.stencil,resolveDepthBuffer:!1===m.ignoreDepthValues,resolveStencilBuffer:!1===m.ignoreDepthValues})}A.isXRRenderTarget=!0,this.setFoveation(c),d=null,s=await a.requestReferenceSpace(l),z.setContext(a),z.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==a)return a.environmentBlendMode},this.getDepthTexture=function(){return g.getDepthTexture()};const H=new r,V=new r;function W(e,t){null===t?e.matrixWorld.copy(e.matrix):e.matrixWorld.multiplyMatrices(t.matrixWorld,e.matrix),e.matrixWorldInverse.copy(e.matrixWorld).invert()}this.updateCamera=function(e){if(null===a)return;let t=e.near,n=e.far;null!==g.texture&&(g.depthNear>0&&(t=g.depthNear),g.depthFar>0&&(n=g.depthFar)),I.near=D.near=U.near=t,I.far=D.far=U.far=n,y===I.near&&F===I.far||(a.updateRenderState({depthNear:I.near,depthFar:I.far}),y=I.near,F=I.far),I.layers.mask=6|e.layers.mask,U.layers.mask=-5&I.layers.mask,D.layers.mask=-3&I.layers.mask;const i=e.parent,r=I.cameras;W(I,i);for(let e=0;e0&&(e.alphaTest.value=i.alphaTest);const r=t.get(i),a=r.envMap,o=r.envMapRotation;a&&(e.envMap.value=a,xa.copy(o),xa.x*=-1,xa.y*=-1,xa.z*=-1,a.isCubeTexture&&!1===a.isRenderTargetTexture&&(xa.y*=-1,xa.z*=-1),e.envMapRotation.value.setFromMatrix4(Aa.makeRotationFromEuler(xa)),e.flipEnvMap.value=a.isCubeTexture&&!1===a.isRenderTargetTexture?-1:1,e.reflectivity.value=i.reflectivity,e.ior.value=i.ior,e.refractionRatio.value=i.refractionRatio),i.lightMap&&(e.lightMap.value=i.lightMap,e.lightMapIntensity.value=i.lightMapIntensity,n(i.lightMap,e.lightMapTransform)),i.aoMap&&(e.aoMap.value=i.aoMap,e.aoMapIntensity.value=i.aoMapIntensity,n(i.aoMap,e.aoMapTransform))}return{refreshFogUniforms:function(t,n){n.color.getRGB(t.fogColor.value,g(e)),n.isFog?(t.fogNear.value=n.near,t.fogFar.value=n.far):n.isFogExp2&&(t.fogDensity.value=n.density)},refreshMaterialUniforms:function(e,r,a,o,s){r.isMeshBasicMaterial?i(e,r):r.isMeshLambertMaterial?(i(e,r),r.envMap&&(e.envMapIntensity.value=r.envMapIntensity)):r.isMeshToonMaterial?(i(e,r),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}(e,r)):r.isMeshPhongMaterial?(i(e,r),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4)}(e,r),r.envMap&&(e.envMapIntensity.value=r.envMapIntensity)):r.isMeshStandardMaterial?(i(e,r),function(e,t){e.metalness.value=t.metalness,t.metalnessMap&&(e.metalnessMap.value=t.metalnessMap,n(t.metalnessMap,e.metalnessMapTransform));e.roughness.value=t.roughness,t.roughnessMap&&(e.roughnessMap.value=t.roughnessMap,n(t.roughnessMap,e.roughnessMapTransform));t.envMap&&(e.envMapIntensity.value=t.envMapIntensity)}(e,r),r.isMeshPhysicalMaterial&&function(e,t,i){e.ior.value=t.ior,t.sheen>0&&(e.sheenColor.value.copy(t.sheenColor).multiplyScalar(t.sheen),e.sheenRoughness.value=t.sheenRoughness,t.sheenColorMap&&(e.sheenColorMap.value=t.sheenColorMap,n(t.sheenColorMap,e.sheenColorMapTransform)),t.sheenRoughnessMap&&(e.sheenRoughnessMap.value=t.sheenRoughnessMap,n(t.sheenRoughnessMap,e.sheenRoughnessMapTransform)));t.clearcoat>0&&(e.clearcoat.value=t.clearcoat,e.clearcoatRoughness.value=t.clearcoatRoughness,t.clearcoatMap&&(e.clearcoatMap.value=t.clearcoatMap,n(t.clearcoatMap,e.clearcoatMapTransform)),t.clearcoatRoughnessMap&&(e.clearcoatRoughnessMap.value=t.clearcoatRoughnessMap,n(t.clearcoatRoughnessMap,e.clearcoatRoughnessMapTransform)),t.clearcoatNormalMap&&(e.clearcoatNormalMap.value=t.clearcoatNormalMap,n(t.clearcoatNormalMap,e.clearcoatNormalMapTransform),e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale),t.side===c&&e.clearcoatNormalScale.value.negate()));t.dispersion>0&&(e.dispersion.value=t.dispersion);t.iridescence>0&&(e.iridescence.value=t.iridescence,e.iridescenceIOR.value=t.iridescenceIOR,e.iridescenceThicknessMinimum.value=t.iridescenceThicknessRange[0],e.iridescenceThicknessMaximum.value=t.iridescenceThicknessRange[1],t.iridescenceMap&&(e.iridescenceMap.value=t.iridescenceMap,n(t.iridescenceMap,e.iridescenceMapTransform)),t.iridescenceThicknessMap&&(e.iridescenceThicknessMap.value=t.iridescenceThicknessMap,n(t.iridescenceThicknessMap,e.iridescenceThicknessMapTransform)));t.transmission>0&&(e.transmission.value=t.transmission,e.transmissionSamplerMap.value=i.texture,e.transmissionSamplerSize.value.set(i.width,i.height),t.transmissionMap&&(e.transmissionMap.value=t.transmissionMap,n(t.transmissionMap,e.transmissionMapTransform)),e.thickness.value=t.thickness,t.thicknessMap&&(e.thicknessMap.value=t.thicknessMap,n(t.thicknessMap,e.thicknessMapTransform)),e.attenuationDistance.value=t.attenuationDistance,e.attenuationColor.value.copy(t.attenuationColor));t.anisotropy>0&&(e.anisotropyVector.value.set(t.anisotropy*Math.cos(t.anisotropyRotation),t.anisotropy*Math.sin(t.anisotropyRotation)),t.anisotropyMap&&(e.anisotropyMap.value=t.anisotropyMap,n(t.anisotropyMap,e.anisotropyMapTransform)));e.specularIntensity.value=t.specularIntensity,e.specularColor.value.copy(t.specularColor),t.specularColorMap&&(e.specularColorMap.value=t.specularColorMap,n(t.specularColorMap,e.specularColorMapTransform));t.specularIntensityMap&&(e.specularIntensityMap.value=t.specularIntensityMap,n(t.specularIntensityMap,e.specularIntensityMapTransform))}(e,r,s)):r.isMeshMatcapMaterial?(i(e,r),function(e,t){t.matcap&&(e.matcap.value=t.matcap)}(e,r)):r.isMeshDepthMaterial?i(e,r):r.isMeshDistanceMaterial?(i(e,r),function(e,n){const i=t.get(n).light;e.referencePosition.value.setFromMatrixPosition(i.matrixWorld),e.nearDistance.value=i.shadow.camera.near,e.farDistance.value=i.shadow.camera.far}(e,r)):r.isMeshNormalMaterial?i(e,r):r.isLineBasicMaterial?(function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform))}(e,r),r.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,r)):r.isPointsMaterial?function(e,t,i,r){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*i,e.scale.value=.5*r,t.map&&(e.map.value=t.map,n(t.map,e.uvTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r,a,o):r.isSpriteMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.rotation.value=t.rotation,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r):r.isShadowMaterial?(e.color.value.copy(r.color),e.opacity.value=r.opacity):r.isShaderMaterial&&(r.uniformsNeedUpdate=!1)}}}function ba(e,t,n,i){let r={},a={},o=[];const s=e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS);function l(e,t,n,i){const r=e.value,a=t+"_"+n;if(void 0===i[a])return i[a]="number"==typeof r||"boolean"==typeof r?r:r.clone(),!0;{const e=i[a];if("number"==typeof r||"boolean"==typeof r){if(e!==r)return i[a]=r,!0}else if(!1===e.equals(r))return e.copy(r),!0}return!1}function c(e){const t={boundary:0,storage:0};return"number"==typeof e||"boolean"==typeof e?(t.boundary=4,t.storage=4):e.isVector2?(t.boundary=8,t.storage=8):e.isVector3||e.isColor?(t.boundary=16,t.storage=12):e.isVector4?(t.boundary=16,t.storage=16):e.isMatrix3?(t.boundary=48,t.storage=48):e.isMatrix4?(t.boundary=64,t.storage=64):e.isTexture?E("WebGLRenderer: Texture samplers can not be part of an uniforms group."):E("WebGLRenderer: Unsupported uniform value type.",e),t}function d(t){const n=t.target;n.removeEventListener("dispose",d);const i=o.indexOf(n.__bindingPointIndex);o.splice(i,1),e.deleteBuffer(r[n.id]),delete r[n.id],delete a[n.id]}return{bind:function(e,t){const n=t.program;i.uniformBlockBinding(e,n)},update:function(n,u){let f=r[n.id];void 0===f&&(!function(e){const t=e.uniforms;let n=0;const i=16;for(let e=0,r=t.length;e0&&(n+=i-r);e.__size=n,e.__cache={}}(n),f=function(t){const n=function(){for(let e=0;e0),f=!!n.morphAttributes.position,p=!!n.morphAttributes.normal,m=!!n.morphAttributes.color;let h=U;i.toneMapped&&(null!==k&&!0!==k.isXRRenderTarget||(h=B.toneMapping));const _=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,g=void 0!==_?_.length:0,v=Se.get(i),E=L.state.lights;if(!0===se&&(!0===le||e!==Y)){const t=e===Y&&i.id===z;Ie.setState(i,e,t)}let M=!1;i.version===v.__version?v.needsLights&&v.lightsStateVersion!==E.state.version||v.outputColorSpace!==s||r.isBatchedMesh&&!1===v.batching?M=!0:r.isBatchedMesh||!0!==v.batching?r.isBatchedMesh&&!0===v.batchingColor&&null===r.colorTexture||r.isBatchedMesh&&!1===v.batchingColor&&null!==r.colorTexture||r.isInstancedMesh&&!1===v.instancing?M=!0:r.isInstancedMesh||!0!==v.instancing?r.isSkinnedMesh&&!1===v.skinning?M=!0:r.isSkinnedMesh||!0!==v.skinning?r.isInstancedMesh&&!0===v.instancingColor&&null===r.instanceColor||r.isInstancedMesh&&!1===v.instancingColor&&null!==r.instanceColor||r.isInstancedMesh&&!0===v.instancingMorph&&null===r.morphTexture||r.isInstancedMesh&&!1===v.instancingMorph&&null!==r.morphTexture||v.envMap!==c||!0===i.fog&&v.fog!==a?M=!0:void 0===v.numClippingPlanes||v.numClippingPlanes===Ie.numPlanes&&v.numIntersection===Ie.numIntersection?(v.vertexAlphas!==d||v.vertexTangents!==u||v.morphTargets!==f||v.morphNormals!==p||v.morphColors!==m||v.toneMapping!==h||v.morphTargetsCount!==g)&&(M=!0):M=!0:M=!0:M=!0:M=!0:(M=!0,v.__version=i.version);let T=v.currentProgram;!0===M&&(T=ot(i,t,r));let x=!1,A=!1,R=!1;const b=T.getUniforms(),C=v.uniforms;ve.useProgram(T.program)&&(x=!0,A=!0,R=!0);i.id!==z&&(z=i.id,A=!0);if(x||Y!==e){ve.buffers.depth.getReversed()&&!0!==e.reversedDepth&&(e._reversedDepth=!0,e.updateProjectionMatrix()),b.setValue(We,"projectionMatrix",e.projectionMatrix),b.setValue(We,"viewMatrix",e.matrixWorldInverse);const t=b.map.cameraPosition;void 0!==t&&t.setValue(We,de.setFromMatrixPosition(e.matrixWorld)),ge.logarithmicDepthBuffer&&b.setValue(We,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&b.setValue(We,"isOrthographic",!0===e.isOrthographicCamera),Y!==e&&(Y=e,A=!0,R=!0)}v.needsLights&&(E.state.directionalShadowMap.length>0&&b.setValue(We,"directionalShadowMap",E.state.directionalShadowMap,xe),E.state.spotShadowMap.length>0&&b.setValue(We,"spotShadowMap",E.state.spotShadowMap,xe),E.state.pointShadowMap.length>0&&b.setValue(We,"pointShadowMap",E.state.pointShadowMap,xe));if(r.isSkinnedMesh){b.setOptional(We,r,"bindMatrix"),b.setOptional(We,r,"bindMatrixInverse");const e=r.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),b.setValue(We,"boneTexture",e.boneTexture,xe))}r.isBatchedMesh&&(b.setOptional(We,r,"batchingTexture"),b.setValue(We,"batchingTexture",r._matricesTexture,xe),b.setOptional(We,r,"batchingIdTexture"),b.setValue(We,"batchingIdTexture",r._indirectTexture,xe),b.setOptional(We,r,"batchingColorTexture"),null!==r._colorsTexture&&b.setValue(We,"batchingColorTexture",r._colorsTexture,xe));const P=n.morphAttributes;void 0===P.position&&void 0===P.normal&&void 0===P.color||Fe.update(r,n,T);(A||v.receiveShadow!==r.receiveShadow)&&(v.receiveShadow=r.receiveShadow,b.setValue(We,"receiveShadow",r.receiveShadow));(i.isMeshStandardMaterial||i.isMeshLambertMaterial||i.isMeshPhongMaterial)&&null===i.envMap&&null!==t.environment&&(C.envMapIntensity.value=t.environmentIntensity);void 0!==C.dfgLUT&&(C.dfgLUT.value=(null===Pa&&(Pa=new Un(Ca,16,16,Me,S),Pa.name="DFG_LUT",Pa.minFilter=O,Pa.magFilter=O,Pa.wrapS=ft,Pa.wrapT=ft,Pa.generateMipmaps=!1,Pa.needsUpdate=!0),Pa));A&&(b.setValue(We,"toneMappingExposure",B.toneMappingExposure),v.needsLights&&(w=R,(D=C).ambientLightColor.needsUpdate=w,D.lightProbe.needsUpdate=w,D.directionalLights.needsUpdate=w,D.directionalLightShadows.needsUpdate=w,D.pointLights.needsUpdate=w,D.pointLightShadows.needsUpdate=w,D.spotLights.needsUpdate=w,D.spotLightShadows.needsUpdate=w,D.rectAreaLights.needsUpdate=w,D.hemisphereLights.needsUpdate=w),a&&!0===i.fog&&Ue.refreshFogUniforms(C,a),Ue.refreshMaterialUniforms(C,i,ee,J,L.state.transmissionRenderTarget[e.id]),Ar.upload(We,st(v),C,xe));var D,w;i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(Ar.upload(We,st(v),C,xe),i.uniformsNeedUpdate=!1);i.isSpriteMaterial&&b.setValue(We,"center",r.center);if(b.setValue(We,"modelViewMatrix",r.modelViewMatrix),b.setValue(We,"normalMatrix",r.normalMatrix),b.setValue(We,"modelMatrix",r.matrixWorld),i.isShaderMaterial||i.isRawShaderMaterial){const e=i.uniformsGroups;for(let t=0,n=e.length;t{function n(){i.forEach(function(e){Se.get(e).currentProgram.isReady()&&i.delete(e)}),0!==i.size?setTimeout(n,10):t(e)}null!==he.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)})};let $e=null;function Qe(){et.stop()}function Je(){et.start()}const et=new On;function tt(e,t,n,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)n=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)L.pushLight(e),e.castShadow&&L.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||oe.intersectsSprite(e)){i&&ue.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ce);const t=Ce.update(e),r=e.material;r.visible&&P.push(e,t,r,n,ue.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||oe.intersectsObject(e))){const t=Ce.update(e),r=e.material;if(i&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),ue.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),ue.copy(t.boundingSphere.center)),ue.applyMatrix4(e.matrixWorld).applyMatrix4(ce)),Array.isArray(r)){const i=t.groups;for(let a=0,o=i.length;a0&&rt(r,t,n),a.length>0&&rt(a,t,n),o.length>0&&rt(o,t,n),ve.buffers.depth.setTest(!0),ve.buffers.depth.setMask(!0),ve.buffers.color.setMask(!0),ve.setPolygonOffset(!1)}function it(e,t,n,i){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;if(void 0===L.state.transmissionRenderTarget[i.id]){const e=he.has("EXT_color_buffer_half_float")||he.has("EXT_color_buffer_float");L.state.transmissionRenderTarget[i.id]=new N(1,1,{generateMipmaps:!0,type:e?S:M,minFilter:mt,samples:ge.samples,stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:p.workingColorSpace})}const r=L.state.transmissionRenderTarget[i.id],a=i.viewport||K;r.setSize(a.z*B.transmissionResolutionScale,a.w*B.transmissionResolutionScale);const s=B.getRenderTarget(),l=B.getActiveCubeFace(),d=B.getActiveMipmapLevel();B.setRenderTarget(r),B.getClearColor(Z),$=B.getClearAlpha(),$<1&&B.setClearColor(16777215,.5),B.clear(),pe&&ye.render(n);const u=B.toneMapping;B.toneMapping=U;const f=i.viewport;if(void 0!==i.viewport&&(i.viewport=void 0),L.setupLightsView(i),!0===se&&Ie.setGlobalState(B.clippingPlanes,i),rt(e,n,i),xe.updateMultisampleRenderTarget(r),xe.updateRenderTargetMipmap(r),!1===he.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let r=0,a=t.length;r0)for(let t=0,a=r.length;t0&&it(n,i,e,t),pe&&ye.render(e),nt(P,e,t)}null!==k&&0===W&&(xe.updateMultisampleRenderTarget(k),xe.updateRenderTargetMipmap(k)),i&&y.end(B),!0===e.isScene&&e.onAfterRender(B,e,t),He.resetDefaultState(),z=-1,Y=null,I.pop(),I.length>0?(L=I[I.length-1],!0===se&&Ie.setGlobalState(B.clippingPlanes,L.state.camera)):L=null,D.pop(),P=D.length>0?D[D.length-1]:null},this.getActiveCubeFace=function(){return H},this.getActiveMipmapLevel=function(){return W},this.getRenderTarget=function(){return k},this.setRenderTargetTextures=function(e,t,n){const i=Se.get(e);i.__autoAllocateDepthBuffer=!1===e.resolveDepthBuffer,!1===i.__autoAllocateDepthBuffer&&(i.__useRenderToTexture=!1),Se.get(e.texture).__webglTexture=t,Se.get(e.depthTexture).__webglTexture=i.__autoAllocateDepthBuffer?void 0:n,i.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(e,t){const n=Se.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const ct=We.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){k=e,H=t,W=n;let i=null,r=!1,a=!1;if(e){const o=Se.get(e);if(void 0!==o.__useDefaultFramebuffer)return ve.bindFramebuffer(We.FRAMEBUFFER,o.__webglFramebuffer),K.copy(e.viewport),j.copy(e.scissor),q=e.scissorTest,ve.viewport(K),ve.scissor(j),ve.setScissorTest(q),void(z=-1);if(void 0===o.__webglFramebuffer)xe.setupRenderTarget(e);else if(o.__hasExternalTextures)xe.rebindTextures(e,Se.get(e.texture).__webglTexture,Se.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(o.__boundDepthTexture!==t){if(null!==t&&Se.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");xe.setupDepthRenderbuffer(e)}}const s=e.texture;(s.isData3DTexture||s.isDataArrayTexture||s.isCompressedArrayTexture)&&(a=!0);const l=Se.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(i=Array.isArray(l[t])?l[t][n]:l[t],r=!0):i=e.samples>0&&!1===xe.useMultisampledRTT(e)?Se.get(e).__webglMultisampledFramebuffer:Array.isArray(l)?l[n]:l,K.copy(e.viewport),j.copy(e.scissor),q=e.scissorTest}else K.copy(ie).multiplyScalar(ee).floor(),j.copy(re).multiplyScalar(ee).floor(),q=ae;0!==n&&(i=ct);if(ve.bindFramebuffer(We.FRAMEBUFFER,i)&&ve.drawBuffers(e,i),ve.viewport(K),ve.scissor(j),ve.setScissorTest(q),r){const i=Se.get(e.texture);We.framebufferTexture2D(We.FRAMEBUFFER,We.COLOR_ATTACHMENT0,We.TEXTURE_CUBE_MAP_POSITIVE_X+t,i.__webglTexture,n)}else if(a){const i=t;for(let t=0;t1&&We.readBuffer(We.COLOR_ATTACHMENT0+s),!ge.textureFormatReadable(l))return void w("WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!ge.textureTypeReadable(c))return void w("WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r&&We.readPixels(t,n,i,r,Ge.convert(l),Ge.convert(c),a)}finally{const e=null!==k?Se.get(k).__webglFramebuffer:null;ve.bindFramebuffer(We.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,i,r,a,o,s=0){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let l=Se.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(l=l[o]),l){if(t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r){ve.bindFramebuffer(We.FRAMEBUFFER,l);const o=e.textures[s],c=o.format,d=o.type;if(e.textures.length>1&&We.readBuffer(We.COLOR_ATTACHMENT0+s),!ge.textureFormatReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ge.textureTypeReadable(d))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const u=We.createBuffer();We.bindBuffer(We.PIXEL_PACK_BUFFER,u),We.bufferData(We.PIXEL_PACK_BUFFER,a.byteLength,We.STREAM_READ),We.readPixels(t,n,i,r,Ge.convert(c),Ge.convert(d),0);const f=null!==k?Se.get(k).__webglFramebuffer:null;ve.bindFramebuffer(We.FRAMEBUFFER,f);const p=We.fenceSync(We.SYNC_GPU_COMMANDS_COMPLETE,0);return We.flush(),await Fn(We,p,4),We.bindBuffer(We.PIXEL_PACK_BUFFER,u),We.getBufferSubData(We.PIXEL_PACK_BUFFER,0,a),We.deleteBuffer(u),We.deleteSync(p),a}throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(e,t=null,n=0){const i=Math.pow(2,-n),r=Math.floor(e.image.width*i),a=Math.floor(e.image.height*i),o=null!==t?t.x:0,s=null!==t?t.y:0;xe.setTexture2D(e,0),We.copyTexSubImage2D(We.TEXTURE_2D,n,0,0,o,s,r,a),ve.unbindTexture()};const dt=We.createFramebuffer(),ut=We.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,i=null,r=0,a=0){let o,s,l,c,d,u,f,p,m;const h=e.isCompressedTexture?e.mipmaps[a]:e.image;if(null!==n)o=n.max.x-n.min.x,s=n.max.y-n.min.y,l=n.isBox3?n.max.z-n.min.z:1,c=n.min.x,d=n.min.y,u=n.isBox3?n.min.z:0;else{const t=Math.pow(2,-r);o=Math.floor(h.width*t),s=Math.floor(h.height*t),l=e.isDataArrayTexture?h.depth:e.isData3DTexture?Math.floor(h.depth*t):1,c=0,d=0,u=0}null!==i?(f=i.x,p=i.y,m=i.z):(f=0,p=0,m=0);const _=Ge.convert(t.format),g=Ge.convert(t.type);let v;t.isData3DTexture?(xe.setTexture3D(t,0),v=We.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(xe.setTexture2DArray(t,0),v=We.TEXTURE_2D_ARRAY):(xe.setTexture2D(t,0),v=We.TEXTURE_2D),We.pixelStorei(We.UNPACK_FLIP_Y_WEBGL,t.flipY),We.pixelStorei(We.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),We.pixelStorei(We.UNPACK_ALIGNMENT,t.unpackAlignment);const E=We.getParameter(We.UNPACK_ROW_LENGTH),S=We.getParameter(We.UNPACK_IMAGE_HEIGHT),M=We.getParameter(We.UNPACK_SKIP_PIXELS),T=We.getParameter(We.UNPACK_SKIP_ROWS),x=We.getParameter(We.UNPACK_SKIP_IMAGES);We.pixelStorei(We.UNPACK_ROW_LENGTH,h.width),We.pixelStorei(We.UNPACK_IMAGE_HEIGHT,h.height),We.pixelStorei(We.UNPACK_SKIP_PIXELS,c),We.pixelStorei(We.UNPACK_SKIP_ROWS,d),We.pixelStorei(We.UNPACK_SKIP_IMAGES,u);const A=e.isDataArrayTexture||e.isData3DTexture,R=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=Se.get(e),i=Se.get(t),h=Se.get(n.__renderTarget),_=Se.get(i.__renderTarget);ve.bindFramebuffer(We.READ_FRAMEBUFFER,h.__webglFramebuffer),ve.bindFramebuffer(We.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;n} [promises=null] - An array of compilation promises which is only relevant in context of `Renderer.compileAsync()`. - * @return {RenderPipeline} The render pipeline. + * @return {RenderObjectPipeline} The render pipeline. */ getForRender( renderObject, promises = null ) { @@ -31057,7 +31057,7 @@ class Pipelines extends DataMap { * @param {ProgrammableStage} stageFragment - The programmable stage representing the fragment shader. * @param {string} cacheKey - The cache key. * @param {?Array} promises - An array of compilation promises which is only relevant in context of `Renderer.compileAsync()`. - * @return {RenderPipeline} The render pipeline. + * @return {RenderObjectPipeline} The render pipeline. */ _getRenderPipeline( renderObject, stageVertex, stageFragment, cacheKey, promises ) { @@ -31069,7 +31069,7 @@ class Pipelines extends DataMap { if ( pipeline === undefined ) { - pipeline = new RenderPipeline( cacheKey, stageVertex, stageFragment ); + pipeline = new RenderObjectPipeline( cacheKey, stageVertex, stageFragment ); this.caches.set( cacheKey, pipeline ); @@ -52857,6 +52857,38 @@ class NodeFunctionInput { NodeFunctionInput.isNodeFunctionInput = true; +/** + * Module for representing ambient lights as nodes. + * + * @augments AnalyticLightNode + */ +class AmbientLightNode extends AnalyticLightNode { + + static get type() { + + return 'AmbientLightNode'; + + } + + /** + * Constructs a new ambient light node. + * + * @param {?AmbientLight} [light=null] - The ambient light source. + */ + constructor( light = null ) { + + super( light ); + + } + + setup( { context } ) { + + context.irradiance.addAssign( this.colorNode ); + + } + +} + /** * Module for representing directional lights as nodes. * @@ -52892,123 +52924,78 @@ class DirectionalLightNode extends AnalyticLightNode { } -const _matrix41 = /*@__PURE__*/ new Matrix4(); -const _matrix42 = /*@__PURE__*/ new Matrix4(); - -let _ltcLib = null; - /** - * Module for representing rect area lights as nodes. + * Module for representing hemisphere lights as nodes. * * @augments AnalyticLightNode */ -class RectAreaLightNode extends AnalyticLightNode { +class HemisphereLightNode extends AnalyticLightNode { static get type() { - return 'RectAreaLightNode'; + return 'HemisphereLightNode'; } /** - * Constructs a new rect area light node. + * Constructs a new hemisphere light node. * - * @param {?RectAreaLight} [light=null] - The rect area light source. + * @param {?HemisphereLight} [light=null] - The hemisphere light source. */ constructor( light = null ) { super( light ); /** - * Uniform node representing the half height of the are light. + * Uniform node representing the light's position. * * @type {UniformNode} */ - this.halfHeight = uniform( new Vector3() ).setGroup( renderGroup ); + this.lightPositionNode = lightPosition( light ); /** - * Uniform node representing the half width of the are light. + * A node representing the light's direction. * - * @type {UniformNode} + * @type {Node} */ - this.halfWidth = uniform( new Vector3() ).setGroup( renderGroup ); + this.lightDirectionNode = this.lightPositionNode.normalize(); /** - * The `updateType` is set to `NodeUpdateType.RENDER` since the light - * relies on `viewMatrix` which might vary per render call. + * Uniform node representing the light's ground color. * - * @type {string} - * @default 'render' + * @type {UniformNode} */ - this.updateType = NodeUpdateType.RENDER; + this.groundColorNode = uniform( new Color() ).setGroup( renderGroup ); } /** - * Overwritten to updated rect area light specific uniforms. + * Overwritten to updated hemisphere light specific uniforms. * * @param {NodeFrame} frame - A reference to the current node frame. */ update( frame ) { - super.update( frame ); - const { light } = this; - const viewMatrix = frame.camera.matrixWorldInverse; - - _matrix42.identity(); - _matrix41.copy( light.matrixWorld ); - _matrix41.premultiply( viewMatrix ); - _matrix42.extractRotation( _matrix41 ); + super.update( frame ); - this.halfWidth.value.set( light.width * 0.5, 0.0, 0.0 ); - this.halfHeight.value.set( 0.0, light.height * 0.5, 0.0 ); + this.lightPositionNode.object3d = light; - this.halfWidth.value.applyMatrix4( _matrix42 ); - this.halfHeight.value.applyMatrix4( _matrix42 ); + this.groundColorNode.value.copy( light.groundColor ).multiplyScalar( light.intensity ); } - setupDirectRectArea( builder ) { - - let ltc_1, ltc_2; - - if ( builder.isAvailable( 'float32Filterable' ) ) { - - ltc_1 = texture( _ltcLib.LTC_FLOAT_1 ); - ltc_2 = texture( _ltcLib.LTC_FLOAT_2 ); - - } else { - - ltc_1 = texture( _ltcLib.LTC_HALF_1 ); - ltc_2 = texture( _ltcLib.LTC_HALF_2 ); - - } - - const { colorNode, light } = this; - - const lightPosition = lightViewPosition( light ); + setup( builder ) { - return { - lightColor: colorNode, - lightPosition, - halfWidth: this.halfWidth, - halfHeight: this.halfHeight, - ltc_1, - ltc_2 - }; + const { colorNode, groundColorNode, lightDirectionNode } = this; - } + const dotNL = normalWorld.dot( lightDirectionNode ); + const hemiDiffuseWeight = dotNL.mul( 0.5 ).add( 0.5 ); - /** - * Used to configure the internal BRDF approximation texture data. - * - * @param {RectAreaLightTexturesLib} ltc - The BRDF approximation texture data. - */ - static setLTC( ltc ) { + const irradiance = mix( groundColorNode, colorNode, hemiDiffuseWeight ); - _ltcLib = ltc; + builder.context.irradiance.addAssign( irradiance ); } @@ -53217,6 +53204,72 @@ class IESSpotLightNode extends SpotLightNode { } +/** + * Module for representing light probes as nodes. + * + * @augments AnalyticLightNode + */ +class LightProbeNode extends AnalyticLightNode { + + static get type() { + + return 'LightProbeNode'; + + } + + /** + * Constructs a new light probe node. + * + * @param {?LightProbe} [light=null] - The light probe. + */ + constructor( light = null ) { + + super( light ); + + const array = []; + + for ( let i = 0; i < 9; i ++ ) array.push( new Vector3() ); + + /** + * Light probe represented as a uniform of spherical harmonics. + * + * @type {UniformArrayNode} + */ + this.lightProbe = uniformArray( array ); + + } + + /** + * Overwritten to updated light probe specific uniforms. + * + * @param {NodeFrame} frame - A reference to the current node frame. + */ + update( frame ) { + + const { light } = this; + + super.update( frame ); + + // + + for ( let i = 0; i < 9; i ++ ) { + + this.lightProbe.array[ i ].copy( light.sh.coefficients[ i ] ).multiplyScalar( light.intensity ); + + } + + } + + setup( builder ) { + + const irradiance = getShIrradianceAt( normalWorld, this.lightProbe ); + + builder.context.irradiance.addAssign( irradiance ); + + } + +} + const sdBox = /*@__PURE__*/ Fn( ( [ p, b ] ) => { const d = p.abs().sub( b ); @@ -53299,176 +53352,123 @@ class ProjectorLightNode extends SpotLightNode { } -/** - * Module for representing ambient lights as nodes. - * - * @augments AnalyticLightNode - */ -class AmbientLightNode extends AnalyticLightNode { - - static get type() { - - return 'AmbientLightNode'; - - } - - /** - * Constructs a new ambient light node. - * - * @param {?AmbientLight} [light=null] - The ambient light source. - */ - constructor( light = null ) { - - super( light ); - - } - - setup( { context } ) { - - context.irradiance.addAssign( this.colorNode ); - - } +const _matrix41 = /*@__PURE__*/ new Matrix4(); +const _matrix42 = /*@__PURE__*/ new Matrix4(); -} +let _ltcLib = null; /** - * Module for representing hemisphere lights as nodes. + * Module for representing rect area lights as nodes. * * @augments AnalyticLightNode */ -class HemisphereLightNode extends AnalyticLightNode { +class RectAreaLightNode extends AnalyticLightNode { static get type() { - return 'HemisphereLightNode'; + return 'RectAreaLightNode'; } /** - * Constructs a new hemisphere light node. + * Constructs a new rect area light node. * - * @param {?HemisphereLight} [light=null] - The hemisphere light source. + * @param {?RectAreaLight} [light=null] - The rect area light source. */ constructor( light = null ) { super( light ); /** - * Uniform node representing the light's position. + * Uniform node representing the half height of the are light. * * @type {UniformNode} */ - this.lightPositionNode = lightPosition( light ); + this.halfHeight = uniform( new Vector3() ).setGroup( renderGroup ); /** - * A node representing the light's direction. + * Uniform node representing the half width of the are light. * - * @type {Node} + * @type {UniformNode} */ - this.lightDirectionNode = this.lightPositionNode.normalize(); + this.halfWidth = uniform( new Vector3() ).setGroup( renderGroup ); /** - * Uniform node representing the light's ground color. + * The `updateType` is set to `NodeUpdateType.RENDER` since the light + * relies on `viewMatrix` which might vary per render call. * - * @type {UniformNode} + * @type {string} + * @default 'render' */ - this.groundColorNode = uniform( new Color() ).setGroup( renderGroup ); + this.updateType = NodeUpdateType.RENDER; } /** - * Overwritten to updated hemisphere light specific uniforms. + * Overwritten to updated rect area light specific uniforms. * * @param {NodeFrame} frame - A reference to the current node frame. */ update( frame ) { - const { light } = this; - super.update( frame ); - this.lightPositionNode.object3d = light; - - this.groundColorNode.value.copy( light.groundColor ).multiplyScalar( light.intensity ); - - } - - setup( builder ) { + const { light } = this; - const { colorNode, groundColorNode, lightDirectionNode } = this; + const viewMatrix = frame.camera.matrixWorldInverse; - const dotNL = normalWorld.dot( lightDirectionNode ); - const hemiDiffuseWeight = dotNL.mul( 0.5 ).add( 0.5 ); + _matrix42.identity(); + _matrix41.copy( light.matrixWorld ); + _matrix41.premultiply( viewMatrix ); + _matrix42.extractRotation( _matrix41 ); - const irradiance = mix( groundColorNode, colorNode, hemiDiffuseWeight ); + this.halfWidth.value.set( light.width * 0.5, 0.0, 0.0 ); + this.halfHeight.value.set( 0.0, light.height * 0.5, 0.0 ); - builder.context.irradiance.addAssign( irradiance ); + this.halfWidth.value.applyMatrix4( _matrix42 ); + this.halfHeight.value.applyMatrix4( _matrix42 ); } -} + setupDirectRectArea( builder ) { -/** - * Module for representing light probes as nodes. - * - * @augments AnalyticLightNode - */ -class LightProbeNode extends AnalyticLightNode { + let ltc_1, ltc_2; - static get type() { + if ( builder.isAvailable( 'float32Filterable' ) ) { - return 'LightProbeNode'; + ltc_1 = texture( _ltcLib.LTC_FLOAT_1 ); + ltc_2 = texture( _ltcLib.LTC_FLOAT_2 ); - } + } else { - /** - * Constructs a new light probe node. - * - * @param {?LightProbe} [light=null] - The light probe. - */ - constructor( light = null ) { + ltc_1 = texture( _ltcLib.LTC_HALF_1 ); + ltc_2 = texture( _ltcLib.LTC_HALF_2 ); - super( light ); + } - const array = []; + const { colorNode, light } = this; - for ( let i = 0; i < 9; i ++ ) array.push( new Vector3() ); + const lightPosition = lightViewPosition( light ); - /** - * Light probe represented as a uniform of spherical harmonics. - * - * @type {UniformArrayNode} - */ - this.lightProbe = uniformArray( array ); + return { + lightColor: colorNode, + lightPosition, + halfWidth: this.halfWidth, + halfHeight: this.halfHeight, + ltc_1, + ltc_2 + }; } /** - * Overwritten to updated light probe specific uniforms. + * Used to configure the internal BRDF approximation texture data. * - * @param {NodeFrame} frame - A reference to the current node frame. + * @param {RectAreaLightTexturesLib} ltc - The BRDF approximation texture data. */ - update( frame ) { - - const { light } = this; - - super.update( frame ); - - // - - for ( let i = 0; i < 9; i ++ ) { - - this.lightProbe.array[ i ].copy( light.sh.coefficients[ i ] ).multiplyScalar( light.intensity ); - - } - - } - - setup( builder ) { - - const irradiance = getShIrradianceAt( normalWorld, this.lightProbe ); + static setLTC( ltc ) { - builder.context.irradiance.addAssign( irradiance ); + _ltcLib = ltc; } @@ -53758,7 +53758,7 @@ const _cacheKeyValues = []; * @private * @augments DataMap */ -class Nodes extends DataMap { +class NodeManager extends DataMap { /** * Constructs a new nodes management component. @@ -57523,7 +57523,7 @@ class Renderer { * A reference to a renderer module for managing node related logic. * * @private - * @type {?Nodes} + * @type {?NodeManager} * @default null */ this._nodes = null; @@ -57977,7 +57977,7 @@ class Renderer { } - this._nodes = new Nodes( this, backend ); + this._nodes = new NodeManager( this, backend ); this._animation = new Animation( this, this._nodes, this.info ); this._attributes = new Attributes( backend ); this._background = new Background( this, this._nodes ); @@ -82360,4 +82360,4 @@ class ClippingGroup extends Group { } -export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayCamera, ArrayElementNode, ArrayNode, AssignNode, AttributeNode, BackSide, BasicEnvironmentNode, BasicShadowMap, BatchNode, BitcastNode, BlendMode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CanvasTarget, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, CodeNode, Color, ColorManagement, ColorSpaceNode, Compatibility, ComputeNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeDepthTexture, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CylinderGeometry, DataArrayTexture, DataTexture, DebugNode, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, EventNode, ExpressionNode, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FrustumArray, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InspectorBase, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, IsolateNode, JoinNode, KeepStencilOp, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, LightProbe, LightProbeNode, Lighting, LightingContextNode, LightingModel, LightingNode, LightsNode, Line2NodeMaterial, LineBasicMaterial, LineBasicNodeMaterial, LineDashedMaterial, LineDashedNodeMaterial, LinearFilter, LinearMipMapLinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoopNode, MRTNode, Material, MaterialBlending, MaterialLoader, MaterialNode, MaterialReferenceNode, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, MemberNode, Mesh, MeshBasicMaterial, MeshBasicNodeMaterial, MeshLambertMaterial, MeshLambertNodeMaterial, MeshMatcapMaterial, MeshMatcapNodeMaterial, MeshNormalMaterial, MeshNormalNodeMaterial, MeshPhongMaterial, MeshPhongNodeMaterial, MeshPhysicalMaterial, MeshPhysicalNodeMaterial, MeshSSSNodeMaterial, MeshStandardMaterial, MeshStandardNodeMaterial, MeshToonMaterial, MeshToonNodeMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, ModelNode, MorphNode, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoNormalPacking, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalGAPacking, NormalMapNode, NormalRGPacking, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, OutputStructNode, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PMREMNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PlaneGeometry, PointLight, PointLightNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, PosterizeNode, ProjectorLight, ProjectorLightNode, PropertyNode, QuadMesh, Quaternion, R11_EAC_Format, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RG11_EAC_Format, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGBIntegerFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RTTNode, RangeNode, RectAreaLight, RectAreaLightNode, RedFormat, RedIntegerFormat, ReferenceNode, ReflectorNode, ReinhardToneMapping, RemapNode, RenderOutputNode, RenderTarget, RendererReferenceNode, RendererUtils, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RotateNode, SIGNED_R11_EAC_Format, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SIGNED_RG11_EAC_Format, SRGBColorSpace, SRGBTransfer, Scene, SceneNode, ScreenNode, ScriptableNode, ScriptableValueNode, SetNode, ShadowBaseNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, Sphere, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StaticDrawUsage, Storage3DTexture, StorageArrayElementNode, StorageArrayTexture, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, StructNode, StructTypeNode, SubBuildNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, TimestampQuery, ToneMappingNode, ToonOutlinePassNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, UserDataNode, VSMShadowMap, VarNode, VaryingNode, Vector2, Vector3, Vector4, VertexColorNode, ViewportDepthNode, ViewportDepthTextureNode, ViewportSharedTextureNode, ViewportTextureNode, VolumeNodeMaterial, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGPUCoordinateSystem, WebGPURenderer, WebXRController, ZeroFactor, ZeroStencilOp, createCanvasElement, defaultBuildStages, defaultShaderStages, error, log$1 as log, shaderStages, vectorComponents, warn, warnOnce }; +export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayCamera, ArrayElementNode, ArrayNode, AssignNode, AtomicFunctionNode, AttributeNode, BackSide, BarrierNode, BasicEnvironmentNode, BasicLightMapNode, BasicShadowMap, BatchNode, BitcastNode, BitcountNode, BlendMode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BuiltinNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CanvasTarget, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, ClippingNode, CodeNode, Color, ColorManagement, ColorSpaceNode, Compatibility, ComputeBuiltinNode, ComputeNode, ConditionalNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeDepthTexture, CubeMapNode, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CylinderGeometry, DataArrayTexture, DataTexture, DebugNode, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, EventNode, ExpressionNode, FileLoader, FlipNode, Float16BufferAttribute, Float32BufferAttribute, FloatType, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FrustumArray, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InputNode, InspectorBase, InspectorNode, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, IsolateNode, JoinNode, KeepStencilOp, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, LightProbe, LightProbeNode, Lighting, LightingContextNode, LightingModel, LightingNode, LightsNode, Line2NodeMaterial, LineBasicMaterial, LineBasicNodeMaterial, LineDashedMaterial, LineDashedNodeMaterial, LinearFilter, LinearMipMapLinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoopNode, MRTNode, Material, MaterialBlending, MaterialLoader, MaterialNode, MaterialReferenceNode, MathNode, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, MemberNode, Mesh, MeshBasicMaterial, MeshBasicNodeMaterial, MeshLambertMaterial, MeshLambertNodeMaterial, MeshMatcapMaterial, MeshMatcapNodeMaterial, MeshNormalMaterial, MeshNormalNodeMaterial, MeshPhongMaterial, MeshPhongNodeMaterial, MeshPhysicalMaterial, MeshPhysicalNodeMaterial, MeshSSSNodeMaterial, MeshStandardMaterial, MeshStandardNodeMaterial, MeshToonMaterial, MeshToonNodeMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, ModelNode, MorphNode, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoNormalPacking, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalGAPacking, NormalMapNode, NormalRGPacking, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OperatorNode, OrthographicCamera, OutputStructNode, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PMREMNode, PackFloatNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PlaneGeometry, PointLight, PointLightNode, PointShadowNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, PosterizeNode, ProjectorLight, ProjectorLightNode, PropertyNode, QuadMesh, Quaternion, R11_EAC_Format, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RG11_EAC_Format, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGBIntegerFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RTTNode, RangeNode, RectAreaLight, RectAreaLightNode, RedFormat, RedIntegerFormat, ReferenceBaseNode, ReferenceNode, ReflectorNode, ReinhardToneMapping, RemapNode, RenderOutputNode, RenderTarget, RendererReferenceNode, RendererUtils, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RotateNode, SIGNED_R11_EAC_Format, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SIGNED_RG11_EAC_Format, SRGBColorSpace, SRGBTransfer, SampleNode, Scene, SceneNode, ScreenNode, ScriptableNode, ScriptableValueNode, SetNode, ShadowBaseNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, Sphere, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StaticDrawUsage, Storage3DTexture, StorageArrayElementNode, StorageArrayTexture, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, StructNode, StructTypeNode, SubBuildNode, SubgroupFunctionNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, TimestampQuery, ToneMappingNode, ToonOutlinePassNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnpackFloatNode, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, UserDataNode, VSMShadowMap, VarNode, VaryingNode, Vector2, Vector3, Vector4, VelocityNode, VertexColorNode, ViewportDepthNode, ViewportDepthTextureNode, ViewportSharedTextureNode, ViewportTextureNode, VolumeNodeMaterial, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGPUCoordinateSystem, WebGPURenderer, WebXRController, WorkgroupInfoNode, ZeroFactor, ZeroStencilOp, createCanvasElement, defaultBuildStages, defaultShaderStages, error, log$1 as log, shaderStages, vectorComponents, warn, warnOnce }; diff --git a/build/three.webgpu.min.js b/build/three.webgpu.min.js index cc3453c6f6e6a3..878ec5eb9c338b 100644 --- a/build/three.webgpu.min.js +++ b/build/three.webgpu.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2026 Three.js Authors * SPDX-License-Identifier: MIT */ -import{Color as e,Vector2 as t,Vector3 as r,Vector4 as s,Matrix2 as i,Matrix3 as n,Matrix4 as a,error as o,EventDispatcher as u,MathUtils as l,warn as d,WebGLCoordinateSystem as c,WebGPUCoordinateSystem as h,ColorManagement as p,SRGBTransfer as g,NoToneMapping as m,StaticDrawUsage as f,InterleavedBufferAttribute as y,InterleavedBuffer as b,DynamicDrawUsage as x,NoColorSpace as T,log as _,warnOnce as v,Texture as N,UnsignedIntType as S,IntType as R,Compatibility as E,LessCompare as A,NearestFilter as w,Sphere as C,BackSide as M,DoubleSide as B,Euler as L,CubeTexture as F,CubeReflectionMapping as P,CubeRefractionMapping as D,TangentSpaceNormalMap as U,NoNormalPacking as I,NormalRGPacking as O,NormalGAPacking as V,ObjectSpaceNormalMap as k,RGFormat as G,RED_GREEN_RGTC2_Format as z,RG11_EAC_Format as $,InstancedBufferAttribute as W,InstancedInterleavedBuffer as H,DataArrayTexture as q,FloatType as j,FramebufferTexture as X,LinearMipmapLinearFilter as K,DepthTexture as Y,Material as Q,LineBasicMaterial as Z,LineDashedMaterial as J,NoBlending as ee,MeshNormalMaterial as te,SRGBColorSpace as re,WebGLCubeRenderTarget as se,BoxGeometry as ie,Mesh as ne,Scene as ae,LinearFilter as oe,CubeCamera as ue,EquirectangularReflectionMapping as le,EquirectangularRefractionMapping as de,AddOperation as ce,MixOperation as he,MultiplyOperation as pe,MeshBasicMaterial as ge,MeshLambertMaterial as me,MeshPhongMaterial as fe,DataTexture as ye,HalfFloatType as be,ClampToEdgeWrapping as xe,BufferGeometry as Te,OrthographicCamera as _e,PerspectiveCamera as ve,RenderTarget as Ne,LinearSRGBColorSpace as Se,RGBAFormat as Re,CubeUVReflectionMapping as Ee,BufferAttribute as Ae,MeshStandardMaterial as we,MeshPhysicalMaterial as Ce,MeshToonMaterial as Me,MeshMatcapMaterial as Be,SpriteMaterial as Le,PointsMaterial as Fe,ShadowMaterial as Pe,Uint32BufferAttribute as De,Uint16BufferAttribute as Ue,arrayNeedsUint32 as Ie,DepthStencilFormat as Oe,DepthFormat as Ve,UnsignedInt248Type as ke,UnsignedByteType as Ge,NormalBlending as ze,SrcAlphaFactor as $e,OneMinusSrcAlphaFactor as We,AddEquation as He,MaterialBlending as qe,Plane as je,Object3D as Xe,LinearMipMapLinearFilter as Ke,Float32BufferAttribute as Ye,UVMapping as Qe,VSMShadowMap as Ze,LessEqualCompare as Je,PCFShadowMap as et,PCFSoftShadowMap as tt,BasicShadowMap as rt,CubeDepthTexture as st,SphereGeometry as it,LinearMipmapNearestFilter as nt,NearestMipmapLinearFilter as at,Float16BufferAttribute as ot,REVISION as ut,ArrayCamera as lt,PlaneGeometry as dt,FrontSide as ct,CustomBlending as ht,ZeroFactor as pt,CylinderGeometry as gt,Quaternion as mt,WebXRController as ft,RAD2DEG as yt,FrustumArray as bt,Frustum as xt,RedIntegerFormat as Tt,RedFormat as _t,ShortType as vt,ByteType as Nt,UnsignedShortType as St,RGIntegerFormat as Rt,RGBIntegerFormat as Et,RGBFormat as At,RGBAIntegerFormat as wt,TimestampQuery as Ct,createCanvasElement as Mt,ReverseSubtractEquation as Bt,SubtractEquation as Lt,OneMinusDstAlphaFactor as Ft,OneMinusDstColorFactor as Pt,OneMinusSrcColorFactor as Dt,DstAlphaFactor as Ut,DstColorFactor as It,SrcAlphaSaturateFactor as Ot,SrcColorFactor as Vt,OneFactor as kt,CullFaceNone as Gt,CullFaceBack as zt,CullFaceFront as $t,MultiplyBlending as Wt,SubtractiveBlending as Ht,AdditiveBlending as qt,NotEqualDepth as jt,GreaterDepth as Xt,GreaterEqualDepth as Kt,EqualDepth as Yt,LessEqualDepth as Qt,LessDepth as Zt,AlwaysDepth as Jt,NeverDepth as er,UnsignedShort4444Type as tr,UnsignedShort5551Type as rr,UnsignedInt5999Type as sr,UnsignedInt101111Type as ir,AlphaFormat as nr,RGB_S3TC_DXT1_Format as ar,RGBA_S3TC_DXT1_Format as or,RGBA_S3TC_DXT3_Format as ur,RGBA_S3TC_DXT5_Format as lr,RGB_PVRTC_4BPPV1_Format as dr,RGB_PVRTC_2BPPV1_Format as cr,RGBA_PVRTC_4BPPV1_Format as hr,RGBA_PVRTC_2BPPV1_Format as pr,RGB_ETC1_Format as gr,RGB_ETC2_Format as mr,RGBA_ETC2_EAC_Format as fr,R11_EAC_Format as yr,SIGNED_R11_EAC_Format as br,SIGNED_RG11_EAC_Format as xr,RGBA_ASTC_4x4_Format as Tr,RGBA_ASTC_5x4_Format as _r,RGBA_ASTC_5x5_Format as vr,RGBA_ASTC_6x5_Format as Nr,RGBA_ASTC_6x6_Format as Sr,RGBA_ASTC_8x5_Format as Rr,RGBA_ASTC_8x6_Format as Er,RGBA_ASTC_8x8_Format as Ar,RGBA_ASTC_10x5_Format as wr,RGBA_ASTC_10x6_Format as Cr,RGBA_ASTC_10x8_Format as Mr,RGBA_ASTC_10x10_Format as Br,RGBA_ASTC_12x10_Format as Lr,RGBA_ASTC_12x12_Format as Fr,RGBA_BPTC_Format as Pr,RED_RGTC1_Format as Dr,SIGNED_RED_RGTC1_Format as Ur,SIGNED_RED_GREEN_RGTC2_Format as Ir,MirroredRepeatWrapping as Or,RepeatWrapping as Vr,NearestMipmapNearestFilter as kr,NotEqualCompare as Gr,GreaterCompare as zr,GreaterEqualCompare as $r,EqualCompare as Wr,AlwaysCompare as Hr,NeverCompare as qr,LinearTransfer as jr,getByteLength as Xr,isTypedArray as Kr,NotEqualStencilFunc as Yr,GreaterStencilFunc as Qr,GreaterEqualStencilFunc as Zr,EqualStencilFunc as Jr,LessEqualStencilFunc as es,LessStencilFunc as ts,AlwaysStencilFunc as rs,NeverStencilFunc as ss,DecrementWrapStencilOp as is,IncrementWrapStencilOp as ns,DecrementStencilOp as as,IncrementStencilOp as os,InvertStencilOp as us,ReplaceStencilOp as ls,ZeroStencilOp as ds,KeepStencilOp as cs,MaxEquation as hs,MinEquation as ps,SpotLight as gs,PointLight as ms,DirectionalLight as fs,RectAreaLight as ys,AmbientLight as bs,HemisphereLight as xs,LightProbe as Ts,LinearToneMapping as _s,ReinhardToneMapping as vs,CineonToneMapping as Ns,ACESFilmicToneMapping as Ss,AgXToneMapping as Rs,NeutralToneMapping as Es,Group as As,Loader as ws,FileLoader as Cs,MaterialLoader as Ms,ObjectLoader as Bs}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,Camera,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,ConstantAlphaFactor,ConstantColorFactor,Controls,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CustomToneMapping,Cylindrical,Data3DTexture,DataTextureLoader,DataUtils,DefaultLoadingManager,DetachedBindMode,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,ExternalTexture,ExtrudeGeometry,Fog,FogExp2,GLBufferAttribute,GLSL1,GLSL3,GridHelper,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,InstancedBufferGeometry,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,InterpolationSamplingMode,InterpolationSamplingType,KeyframeTrack,LOD,LatheGeometry,Layers,Light,Line,Line3,LineCurve,LineCurve3,LineLoop,LineSegments,LinearInterpolant,LinearMipMapNearestFilter,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,MeshDepthMaterial,MeshDistanceMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NormalAnimationBlendMode,NumberKeyframeTrack,OctahedronGeometry,OneMinusConstantAlphaFactor,OneMinusConstantColorFactor,Path,PlaneHelper,PointLightHelper,Points,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGB_BPTC_SIGNED_Format,RGB_BPTC_UNSIGNED_Format,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RenderTarget3D,RingGeometry,ShaderMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Spherical,SphericalHarmonics3,SplineCurve,SpotLightHelper,Sprite,StaticCopyUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,Timer,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGLRenderTarget,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding,getConsoleFunction,setConsoleFunction}from"./three.core.min.js";const Ls=["alphaMap","alphaTest","anisotropy","anisotropyMap","anisotropyRotation","aoMap","aoMapIntensity","attenuationColor","attenuationDistance","bumpMap","clearcoat","clearcoatMap","clearcoatNormalMap","clearcoatNormalScale","clearcoatRoughness","color","dispersion","displacementMap","emissive","emissiveIntensity","emissiveMap","envMap","envMapIntensity","gradientMap","ior","iridescence","iridescenceIOR","iridescenceMap","iridescenceThicknessMap","lightMap","lightMapIntensity","map","matcap","metalness","metalnessMap","normalMap","normalScale","opacity","roughness","roughnessMap","sheen","sheenColor","sheenColorMap","sheenRoughnessMap","shininess","specular","specularColor","specularColorMap","specularIntensity","specularIntensityMap","specularMap","thickness","transmission","transmissionMap"],Fs=new WeakMap;class Ps{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=Ls,this.renderId=0}firstInitialization(e){return!1===this.renderObjects.has(e)&&(this.getRenderObjectData(e),!0)}needsVelocity(e){const t=e.getMRT();return null!==t&&t.has("velocity")}getRenderObjectData(e){let t=this.renderObjects.get(e);if(void 0===t){const{geometry:r,material:s,object:i}=e;if(t={material:this.getMaterialData(s),geometry:{id:r.id,attributes:this.getAttributesData(r.attributes),indexVersion:r.index?r.index.version:null,drawRange:{start:r.drawRange.start,count:r.drawRange.count}},worldMatrix:i.matrixWorld.clone()},i.center&&(t.center=i.center.clone()),i.morphTargetInfluences&&(t.morphTargetInfluences=i.morphTargetInfluences.slice()),null!==e.bundle&&(t.version=e.bundle.version),t.material.transmission>0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}t.lights=this.getLightsData(e.lightsNode.getLights()),this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const Us=e=>Ds(e),Is=e=>Ds(e),Os=(...e)=>Ds(e),Vs=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),ks=new WeakMap;function Gs(e){return Vs.get(e)}function zs(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function $s(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Ws(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Hs(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function qs(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function js(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Ys(u[0]):null}function Xs(e){let t=ks.get(e);return void 0===t&&(t={},ks.set(e,t)),t}function Ks(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Qs=Object.freeze({__proto__:null,arrayBufferToBase64:Ks,base64ToArrayBuffer:Ys,getAlignmentFromType:Hs,getDataFromObject:Xs,getLengthFromType:$s,getMemoryLengthFromType:Ws,getTypeFromLength:Gs,getTypedArrayFromType:zs,getValueFromType:js,getValueType:qs,hash:Os,hashArray:Is,hashString:Us});const Zs={VERTEX:"vertex",FRAGMENT:"fragment"},Js={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},ei={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ti={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ri=["fragment","vertex"],si=["setup","analyze","generate"],ii=[...ri,"compute"],ni=["x","y","z","w"],ai={analyze:"setup",generate:"analyze"};let oi=0;class ui extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Js.NONE,this.updateBeforeType=Js.NONE,this.updateAfterType=Js.NONE,this.uuid=l.generateUUID(),this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:oi++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this),this}onFrameUpdate(e){return this.onUpdate(e,Js.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Js.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Js.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.7,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class li extends ui{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}getMemberType(e,t){return this.node.getMemberType(e,t)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class di extends ui{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class ci extends ui{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class hi extends ci{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce((t,r)=>t+e.getTypeLength(r.getNodeType(e)),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const pi=ni.join("");class gi extends ui{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(ni.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}getScope(){return this.node.getScope()}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===pi.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class mi extends ci{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");ui.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==_i?_i.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn()."),this;{const t=vi.get("assign");return this.addToStack(t(...e))}},ui.prototype.toVarIntent=function(){return this},ui.prototype.get=function(e){return new Ti(this,e)};const Ri={};function Ei(e,t,r){Ri[e]=Ri[t]=Ri[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new gi(this,e),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();ui.prototype["set"+s]=ui.prototype["set"+i]=ui.prototype["set"+n]=function(t){const r=Si(e);return new mi(this,r,Zi(t))},ui.prototype["flip"+s]=ui.prototype["flip"+i]=ui.prototype["flip"+n]=function(){const t=Si(e);return new fi(this,t)}}const Ai=["x","y","z","w"],wi=["r","g","b","a"],Ci=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ai[e],r=wi[e],s=Ci[e];Ei(t,r,s);for(let i=0;i<4;i++){t=Ai[e]+Ai[i],r=wi[e]+wi[i],s=Ci[e]+Ci[i],Ei(t,r,s);for(let n=0;n<4;n++){t=Ai[e]+Ai[i]+Ai[n],r=wi[e]+wi[i]+wi[n],s=Ci[e]+Ci[i]+Ci[n],Ei(t,r,s);for(let a=0;a<4;a++)t=Ai[e]+Ai[i]+Ai[n]+Ai[a],r=wi[e]+wi[i]+wi[n]+wi[a],s=Ci[e]+Ci[i]+Ci[n]+Ci[a],Ei(t,r,s)}}}for(let e=0;e<32;e++)Ri[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new li(this,new xi(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};Object.defineProperties(ui.prototype,Ri);const Mi=new WeakMap,Bi=function(e,t=null){for(const r in e)e[r]=Zi(e[r],t);return e},Li=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...tn(d(t)))):null!==r?(r=Zi(r),n=(...s)=>i(new e(t,...tn(d(s)),r))):n=(...r)=>i(new e(t,...tn(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Pi=function(e,...t){return new e(...tn(t))};class Di extends ui{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=Mi.get(e.constructor);void 0===s&&(s=new WeakMap,Mi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Zi(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;en(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=Zi(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return en(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield Zi(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof ui&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=Zi(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=Zi(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e),o=e.fnCall;if(e.fnCall=this,"setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return e.fnCall=o,r}}class Ui extends ui{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Di(this,e)}setup(){return this.call()}}const Ii=[!1,!0],Oi=[0,1,2,3],Vi=[-1,-2],ki=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Gi=new Map;for(const e of Ii)Gi.set(e,new xi(e));const zi=new Map;for(const e of Oi)zi.set(e,new xi(e,"uint"));const $i=new Map([...zi].map(e=>new xi(e.value,"int")));for(const e of Vi)$i.set(e,new xi(e,"int"));const Wi=new Map([...$i].map(e=>new xi(e.value)));for(const e of ki)Wi.set(e,new xi(e));for(const e of ki)Wi.set(-e,new xi(-e));const Hi={bool:Gi,uint:zi,ints:$i,float:Wi},qi=new Map([...Gi,...Wi]),ji=(e,t)=>qi.has(e)?qi.get(e):!0===e.isNode?e:new xi(e,t),Xi=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`),new xi(0,e);if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[js(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Ji(t.get(r[0]));if(1===r.length){const t=ji(r[0],e);return t.nodeType===e?Ji(t):Ji(new di(t,e))}const s=r.map(e=>ji(e));return Ji(new hi(s,e))}},Ki=e=>"object"==typeof e&&null!==e?e.value:e,Yi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Qi(e,t){return new Ui(e,t)}const Zi=(e,t=null)=>function(e,t=null){const r=qs(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Zi(ji(e,t)):"shader"===r?e.isFn?e:un(e):e}(e,t),Ji=(e,t=null)=>Zi(e,t).toVarIntent(),en=(e,t=null)=>new Bi(e,t),tn=(e,t=null)=>new Li(e,t),rn=(e,t=null,r=null,s=null)=>new Fi(e,t,r,s),sn=(e,...t)=>new Pi(e,...t),nn=(e,t=null,r=null,s={})=>new Fi(e,t,r,{...s,intent:!0});let an=0;class on extends ui{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type."),t=null)),this.shaderNode=new Qi(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+an++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function un(e,t=null){const r=new on(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const ln=e=>{_i=e},dn=()=>_i,cn=(...e)=>_i.If(...e);function hn(e){return _i&&_i.addToStack(e),e}Ni("toStack",hn);const pn=new Xi("color"),gn=new Xi("float",Hi.float),mn=new Xi("int",Hi.ints),fn=new Xi("uint",Hi.uint),yn=new Xi("bool",Hi.bool),bn=new Xi("vec2"),xn=new Xi("ivec2"),Tn=new Xi("uvec2"),_n=new Xi("bvec2"),vn=new Xi("vec3"),Nn=new Xi("ivec3"),Sn=new Xi("uvec3"),Rn=new Xi("bvec3"),En=new Xi("vec4"),An=new Xi("ivec4"),wn=new Xi("uvec4"),Cn=new Xi("bvec4"),Mn=new Xi("mat2"),Bn=new Xi("mat3"),Ln=new Xi("mat4");Ni("toColor",pn),Ni("toFloat",gn),Ni("toInt",mn),Ni("toUint",fn),Ni("toBool",yn),Ni("toVec2",bn),Ni("toIVec2",xn),Ni("toUVec2",Tn),Ni("toBVec2",_n),Ni("toVec3",vn),Ni("toIVec3",Nn),Ni("toUVec3",Sn),Ni("toBVec3",Rn),Ni("toVec4",En),Ni("toIVec4",An),Ni("toUVec4",wn),Ni("toBVec4",Cn),Ni("toMat2",Mn),Ni("toMat3",Bn),Ni("toMat4",Ln);const Fn=rn(li).setParameterLength(2),Pn=(e,t)=>Zi(new di(Zi(e),t));Ni("element",Fn),Ni("convert",Pn);Ni("append",e=>(d("TSL: .append() has been renamed to .toStack()."),hn(e)));class Dn extends ui{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}customCacheKey(){return Us(this.type+":"+(this.name||"")+":"+(this.varying?"1":"0"))}getHash(e){return this.name||super.getHash(e)}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const Un=(e,t)=>new Dn(e,t),In=(e,t)=>new Dn(e,t,!0),On=sn(Dn,"vec4","DiffuseColor"),Vn=sn(Dn,"vec3","DiffuseContribution"),kn=sn(Dn,"vec3","EmissiveColor"),Gn=sn(Dn,"float","Roughness"),zn=sn(Dn,"float","Metalness"),$n=sn(Dn,"float","Clearcoat"),Wn=sn(Dn,"float","ClearcoatRoughness"),Hn=sn(Dn,"vec3","Sheen"),qn=sn(Dn,"float","SheenRoughness"),jn=sn(Dn,"float","Iridescence"),Xn=sn(Dn,"float","IridescenceIOR"),Kn=sn(Dn,"float","IridescenceThickness"),Yn=sn(Dn,"float","AlphaT"),Qn=sn(Dn,"float","Anisotropy"),Zn=sn(Dn,"vec3","AnisotropyT"),Jn=sn(Dn,"vec3","AnisotropyB"),ea=sn(Dn,"color","SpecularColor"),ta=sn(Dn,"color","SpecularColorBlended"),ra=sn(Dn,"float","SpecularF90"),sa=sn(Dn,"float","Shininess"),ia=sn(Dn,"vec4","Output"),na=sn(Dn,"float","dashSize"),aa=sn(Dn,"float","gapSize"),oa=sn(Dn,"float","pointWidth"),ua=sn(Dn,"float","IOR"),la=sn(Dn,"float","Transmission"),da=sn(Dn,"float","Thickness"),ca=sn(Dn,"float","AttenuationDistance"),ha=sn(Dn,"color","AttenuationColor"),pa=sn(Dn,"float","Dispersion");class ga extends ui{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const ma=e=>new ga(e),fa=(e,t=0)=>new ga(e,!0,t),ya=fa("frame"),ba=fa("render"),xa=ma("object");class Ta extends yi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=xa}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),t}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const _a=(e,t)=>{const r=Yi(t||e);if(r===e&&(e=js(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new Ta(e,r)};class va extends ci{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const Na=(...e)=>{let t;if(1===e.length){const r=e[0];t=new va(null,r.length,r)}else{const r=e[0],s=e[1];t=new va(r,s)}return Zi(t)};Ni("toArray",(e,t)=>Na(Array(t).fill(e)));class Sa extends ci{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return ni.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.build(e),a=r.getNodeType(e),o=s.build(e,a),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=n);else if(i){const s=e.getVarFromNode(this,null,a),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)o("TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?tn(t):en(t[0]),new Ea(Zi(e),t));Ni("call",Aa);const wa={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ca extends ci{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ca(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const Ma=nn(Ca,"+").setParameterLength(2,1/0).setName("add"),Ba=nn(Ca,"-").setParameterLength(2,1/0).setName("sub"),La=nn(Ca,"*").setParameterLength(2,1/0).setName("mul"),Fa=nn(Ca,"/").setParameterLength(2,1/0).setName("div"),Pa=nn(Ca,"%").setParameterLength(2).setName("mod"),Da=nn(Ca,"==").setParameterLength(2).setName("equal"),Ua=nn(Ca,"!=").setParameterLength(2).setName("notEqual"),Ia=nn(Ca,"<").setParameterLength(2).setName("lessThan"),Oa=nn(Ca,">").setParameterLength(2).setName("greaterThan"),Va=nn(Ca,"<=").setParameterLength(2).setName("lessThanEqual"),ka=nn(Ca,">=").setParameterLength(2).setName("greaterThanEqual"),Ga=nn(Ca,"&&").setParameterLength(2,1/0).setName("and"),za=nn(Ca,"||").setParameterLength(2,1/0).setName("or"),$a=nn(Ca,"!").setParameterLength(1).setName("not"),Wa=nn(Ca,"^^").setParameterLength(2).setName("xor"),Ha=nn(Ca,"&").setParameterLength(2).setName("bitAnd"),qa=nn(Ca,"~").setParameterLength(1).setName("bitNot"),ja=nn(Ca,"|").setParameterLength(2).setName("bitOr"),Xa=nn(Ca,"^").setParameterLength(2).setName("bitXor"),Ka=nn(Ca,"<<").setParameterLength(2).setName("shiftLeft"),Ya=nn(Ca,">>").setParameterLength(2).setName("shiftRight"),Qa=un(([e])=>(e.addAssign(1),e)),Za=un(([e])=>(e.subAssign(1),e)),Ja=un(([e])=>{const t=mn(e).toConst();return e.addAssign(1),t}),eo=un(([e])=>{const t=mn(e).toConst();return e.subAssign(1),t});Ni("add",Ma),Ni("sub",Ba),Ni("mul",La),Ni("div",Fa),Ni("mod",Pa),Ni("equal",Da),Ni("notEqual",Ua),Ni("lessThan",Ia),Ni("greaterThan",Oa),Ni("lessThanEqual",Va),Ni("greaterThanEqual",ka),Ni("and",Ga),Ni("or",za),Ni("not",$a),Ni("xor",Wa),Ni("bitAnd",Ha),Ni("bitNot",qa),Ni("bitOr",ja),Ni("bitXor",Xa),Ni("shiftLeft",Ka),Ni("shiftRight",Ya),Ni("incrementBefore",Qa),Ni("decrementBefore",Za),Ni("increment",Ja),Ni("decrement",eo);const to=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),Pa(mn(e),mn(t)));Ni("modInt",to);class ro extends ci{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===ro.MAX||e===ro.MIN)&&arguments.length>3){let i=new ro(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===ro.LENGTH||t===ro.DISTANCE||t===ro.DOT?"float":t===ro.CROSS?"vec3":t===ro.ALL||t===ro.ANY?"bool":t===ro.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===ro.ONE_MINUS)i=Ba(1,t);else if(s===ro.RECIPROCAL)i=Fa(1,t);else if(s===ro.DIFFERENCE)i=Mo(Ba(t,r));else if(s===ro.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=En(vn(n),0):s=En(vn(s),0);const a=La(s,n).xyz;i=vo(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.generate(e,t);let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===ro.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===ro.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===ro.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==ro.MIN&&r!==ro.MAX?r===ro.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===ro.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===ro.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==ro.DFDX&&r!==ro.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}ro.ALL="all",ro.ANY="any",ro.RADIANS="radians",ro.DEGREES="degrees",ro.EXP="exp",ro.EXP2="exp2",ro.LOG="log",ro.LOG2="log2",ro.SQRT="sqrt",ro.INVERSE_SQRT="inversesqrt",ro.FLOOR="floor",ro.CEIL="ceil",ro.NORMALIZE="normalize",ro.FRACT="fract",ro.SIN="sin",ro.COS="cos",ro.TAN="tan",ro.ASIN="asin",ro.ACOS="acos",ro.ATAN="atan",ro.ABS="abs",ro.SIGN="sign",ro.LENGTH="length",ro.NEGATE="negate",ro.ONE_MINUS="oneMinus",ro.DFDX="dFdx",ro.DFDY="dFdy",ro.ROUND="round",ro.RECIPROCAL="reciprocal",ro.TRUNC="trunc",ro.FWIDTH="fwidth",ro.TRANSPOSE="transpose",ro.DETERMINANT="determinant",ro.INVERSE="inverse",ro.EQUALS="equals",ro.MIN="min",ro.MAX="max",ro.STEP="step",ro.REFLECT="reflect",ro.DISTANCE="distance",ro.DIFFERENCE="difference",ro.DOT="dot",ro.CROSS="cross",ro.POW="pow",ro.TRANSFORM_DIRECTION="transformDirection",ro.MIX="mix",ro.CLAMP="clamp",ro.REFRACT="refract",ro.SMOOTHSTEP="smoothstep",ro.FACEFORWARD="faceforward";const so=gn(1e-6),io=gn(1e6),no=gn(Math.PI),ao=gn(2*Math.PI),oo=gn(2*Math.PI),uo=gn(.5*Math.PI),lo=nn(ro,ro.ALL).setParameterLength(1),co=nn(ro,ro.ANY).setParameterLength(1),ho=nn(ro,ro.RADIANS).setParameterLength(1),po=nn(ro,ro.DEGREES).setParameterLength(1),go=nn(ro,ro.EXP).setParameterLength(1),mo=nn(ro,ro.EXP2).setParameterLength(1),fo=nn(ro,ro.LOG).setParameterLength(1),yo=nn(ro,ro.LOG2).setParameterLength(1),bo=nn(ro,ro.SQRT).setParameterLength(1),xo=nn(ro,ro.INVERSE_SQRT).setParameterLength(1),To=nn(ro,ro.FLOOR).setParameterLength(1),_o=nn(ro,ro.CEIL).setParameterLength(1),vo=nn(ro,ro.NORMALIZE).setParameterLength(1),No=nn(ro,ro.FRACT).setParameterLength(1),So=nn(ro,ro.SIN).setParameterLength(1),Ro=nn(ro,ro.COS).setParameterLength(1),Eo=nn(ro,ro.TAN).setParameterLength(1),Ao=nn(ro,ro.ASIN).setParameterLength(1),wo=nn(ro,ro.ACOS).setParameterLength(1),Co=nn(ro,ro.ATAN).setParameterLength(1,2),Mo=nn(ro,ro.ABS).setParameterLength(1),Bo=nn(ro,ro.SIGN).setParameterLength(1),Lo=nn(ro,ro.LENGTH).setParameterLength(1),Fo=nn(ro,ro.NEGATE).setParameterLength(1),Po=nn(ro,ro.ONE_MINUS).setParameterLength(1),Do=nn(ro,ro.DFDX).setParameterLength(1),Uo=nn(ro,ro.DFDY).setParameterLength(1),Io=nn(ro,ro.ROUND).setParameterLength(1),Oo=nn(ro,ro.RECIPROCAL).setParameterLength(1),Vo=nn(ro,ro.TRUNC).setParameterLength(1),ko=nn(ro,ro.FWIDTH).setParameterLength(1),Go=nn(ro,ro.TRANSPOSE).setParameterLength(1),zo=nn(ro,ro.DETERMINANT).setParameterLength(1),$o=nn(ro,ro.INVERSE).setParameterLength(1),Wo=nn(ro,ro.MIN).setParameterLength(2,1/0),Ho=nn(ro,ro.MAX).setParameterLength(2,1/0),qo=nn(ro,ro.STEP).setParameterLength(2),jo=nn(ro,ro.REFLECT).setParameterLength(2),Xo=nn(ro,ro.DISTANCE).setParameterLength(2),Ko=nn(ro,ro.DIFFERENCE).setParameterLength(2),Yo=nn(ro,ro.DOT).setParameterLength(2),Qo=nn(ro,ro.CROSS).setParameterLength(2),Zo=nn(ro,ro.POW).setParameterLength(2),Jo=e=>La(e,e),eu=e=>La(e,e,e),tu=e=>La(e,e,e,e),ru=nn(ro,ro.TRANSFORM_DIRECTION).setParameterLength(2),su=e=>La(Bo(e),Zo(Mo(e),1/3)),iu=e=>Yo(e,e),nu=nn(ro,ro.MIX).setParameterLength(3),au=(e,t=0,r=1)=>Zi(new ro(ro.CLAMP,Zi(e),Zi(t),Zi(r))),ou=e=>au(e),uu=nn(ro,ro.REFRACT).setParameterLength(3),lu=nn(ro,ro.SMOOTHSTEP).setParameterLength(3),du=nn(ro,ro.FACEFORWARD).setParameterLength(3),cu=un(([e])=>{const t=Yo(e.xy,bn(12.9898,78.233)),r=Pa(t,no);return No(So(r).mul(43758.5453))}),hu=(e,t,r)=>nu(t,r,e),pu=(e,t,r)=>lu(t,r,e),gu=(e,t)=>qo(t,e),mu=du,fu=xo;Ni("all",lo),Ni("any",co),Ni("radians",ho),Ni("degrees",po),Ni("exp",go),Ni("exp2",mo),Ni("log",fo),Ni("log2",yo),Ni("sqrt",bo),Ni("inverseSqrt",xo),Ni("floor",To),Ni("ceil",_o),Ni("normalize",vo),Ni("fract",No),Ni("sin",So),Ni("cos",Ro),Ni("tan",Eo),Ni("asin",Ao),Ni("acos",wo),Ni("atan",Co),Ni("abs",Mo),Ni("sign",Bo),Ni("length",Lo),Ni("lengthSq",iu),Ni("negate",Fo),Ni("oneMinus",Po),Ni("dFdx",Do),Ni("dFdy",Uo),Ni("round",Io),Ni("reciprocal",Oo),Ni("trunc",Vo),Ni("fwidth",ko),Ni("min",Wo),Ni("max",Ho),Ni("step",gu),Ni("reflect",jo),Ni("distance",Xo),Ni("dot",Yo),Ni("cross",Qo),Ni("pow",Zo),Ni("pow2",Jo),Ni("pow3",eu),Ni("pow4",tu),Ni("transformDirection",ru),Ni("mix",hu),Ni("clamp",au),Ni("refract",uu),Ni("smoothstep",pu),Ni("faceForward",du),Ni("difference",Ko),Ni("saturate",ou),Ni("cbrt",su),Ni("transpose",Go),Ni("determinant",zo),Ni("inverse",$o),Ni("rand",cu);class yu extends ui{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return e.flowBuildStage(this,"setup"),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.context.uniformFlow,a=e.getNodeProperties(this);a.condNode=t,a.ifNode=n?r:r.context({nodeBlock:r}),a.elseNode=s?n?s:s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?Un(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const bu=rn(yu).setParameterLength(2,3);Ni("select",bu);class xu extends ui{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const Tu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new xu(r,t)},_u=e=>Tu(e,{uniformFlow:!0}),vu=(e,t)=>Tu(e,{nodeName:t});function Nu(e,t,r=null){return Tu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function Su(e,t=null){return Tu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Ru(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),vu(e,t)}Ni("context",Tu),Ni("label",Ru),Ni("uniformFlow",_u),Ni("setName",vu),Ni("builtinShadowContext",(e,t,r)=>Nu(t,r,e)),Ni("builtinAOContext",(e,t)=>Su(t,e));class Eu extends ui{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.');return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Au=rn(Eu),wu=(e,t=null)=>Au(e,t).toStack(),Cu=(e,t=null)=>Au(e,t,!0).toStack(),Mu=e=>Au(e).setIntent(!0).toStack();Ni("toVar",wu),Ni("toConst",Cu),Ni("toVarIntent",Mu);class Bu extends ui{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const Lu=(e,t,r=null)=>Zi(new Bu(Zi(e),t,r));class Fu extends ui{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=Lu(e,"VERTEX"),this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null,this.global=!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),t.node=Lu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Zs.VERTEX);e.flowNodeFromShaderStage(Zs.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Pu=rn(Fu).setParameterLength(1,2),Du=e=>Pu(e);Ni("toVarying",Pu),Ni("toVertexStage",Du);const Uu=un(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return nu(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Iu=un(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return nu(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ou="WorkingColorSpace";class Vu extends ci{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===Ou?p.workingColorSpace:"OutputColorSpace"===t?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=En(Uu(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=En(Bn(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=En(Iu(i.rgb),i.a)),i):i}}const ku=(e,t)=>Zi(new Vu(Zi(e),Ou,t)),Gu=(e,t)=>Zi(new Vu(Zi(e),t,Ou));Ni("workingToColorSpace",ku),Ni("colorSpaceToWorking",Gu);let zu=class extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class $u extends ui{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Js.OBJECT}setGroup(e){return this.group=e,this}element(e){return new zu(this,Zi(e))}setNodeType(e){const t=_a(null,e);null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew Wu(e,t,r);class qu extends ci{static get type(){return"ToneMappingNode"}constructor(e,t=Xu,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Os(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=En(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const ju=(e,t,r)=>Zi(new qu(e,Zi(t),Zi(r))),Xu=Hu("toneMappingExposure","float");Ni("toneMapping",(e,t,r)=>ju(t,r,e));const Ku=new WeakMap;function Yu(e,t){let r=Ku.get(e);return void 0===r&&(r=new b(e,t),Ku.set(e,r)),r}class Qu extends yi{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Yu(s.array,i):Yu(s,i);const o=new y(a,r,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=Pu(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}function Zu(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Bn(new Qu(e,"vec3",9,0).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,3).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Ln(new Qu(e,"vec4",16,0).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,4).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,8).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Qu(e,t,r,s).setUsage(i)}const Ju=(e,t=null,r=0,s=0)=>Zu(e,t,r,s),el=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,f,!0),tl=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x,!0);Ni("toAttribute",e=>Ju(e.value));class rl extends ui{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Js.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const sl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;esl(e,r).setCount(t);Ni("compute",il),Ni("computeKernel",sl);class nl extends ui{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const al=e=>new nl(Zi(e));function ol(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),al(e).setParent(t)}Ni("cache",ol),Ni("isolate",al);class ul extends ui{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const ll=rn(ul).setParameterLength(2);Ni("bypass",ll);class dl extends ui{static get type(){return"RemapNode"}constructor(e,t,r,s=gn(0),i=gn(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const cl=rn(dl,null,null,{doClamp:!1}).setParameterLength(3,5),hl=rn(dl).setParameterLength(3,5);Ni("remap",cl),Ni("remapClamp",hl);class pl extends ui{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const gl=rn(pl).setParameterLength(1,2),ml=e=>(e?bu(e,gl("discard")):gl("discard")).toStack();Ni("discard",ml);class fl extends ci{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const yl=(e,t=null,r=null)=>Zi(new fl(Zi(e),t,r));Ni("renderOutput",yl);class bl extends ci{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e);if(null!==t)t(e,r);else{const t="--- TSL debug - "+e.shaderStage+" shader ---",s="-".repeat(t.length);let i="";i+="// #"+t+"#\n",i+=e.flow.code.replace(/^\t/gm,"")+"\n",i+="/* ... */ "+r+" /* ... */\n",i+="// #"+s+"#\n",_(i)}return r}}const xl=(e,t=null)=>Zi(new bl(Zi(e),t)).toStack();Ni("debug",xl);class Tl{constructor(){this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class _l extends ui{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=Js.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}getNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==Tl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function vl(e,t="",r=null){return(e=Zi(e)).before(new _l(e,t,r))}Ni("toInspector",vl);class Nl extends ui{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return Pu(this).build(e,r)}return d(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Sl=(e,t=null)=>new Nl(e,t),Rl=(e=0)=>Sl("uv"+(e>0?e:""),"vec2");class El extends ui{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const Al=rn(El).setParameterLength(1,2);class wl extends Ta{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Js.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const Cl=rn(wl).setParameterLength(1),Ml=new N;class Bl extends Ta{static get type(){return"TextureNode"}constructor(e=Ml,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Js.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Rl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=_a(this.value.matrix)),this._matrixUniform.mul(vn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=_a(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(mn(Al(this,this.levelNode).y).sub(t.y).sub(1)),t)),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");const s=un(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?Js.OBJECT:Js.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;null!==this.compareNode&&(e.renderer.hasCompatibility(E.TEXTURE_COMPARE)?n=this.compareNode:(null!==this.value.compareFunction&&this.value.compareFunction!==A&&v('TSL: Only "LessCompare" is supported for depth texture comparison fallback.'),a=this.compareNode)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:u,compareNode:l,compareStepNode:d,depthNode:c,gradNode:h,offsetNode:p}=s,g=this.generateUV(e,t),m=r?r.build(e,"float"):null,f=u?u.build(e,"float"):null,y=c?c.build(e,"int"):null,b=l?l.build(e,"float"):null,x=d?d.build(e,"float"):null,T=h?[h[0].build(e,"vec2"),h[1].build(e,"vec2")]:null,_=p?this.generateOffset(e,p):null,v=e.getVarFromNode(this);o=e.getPropertyName(v);let N=this.generateSnippet(e,i,g,m,f,y,b,T,_);null!==x&&(N=qo(gl(x,"float"),gl(N,a)).build(e,a)),e.addLineFlowCode(`${o} = ${N}`,this),n.snippet=N,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=Gu(gl(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Zi(e).mul(Cl(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===w||r.magFilter===w)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Zi(t)}level(e){const t=this.clone();return t.levelNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}size(e){return Al(this,e)}bias(e){const t=this.clone();return t.biasNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Zi(e),Zi(t)],r.referenceNode=this.getBase(),Zi(r)}depth(e){const t=this.clone();return t.depthNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}offset(e){const t=this.clone();return t.offsetNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}const Ll=rn(Bl).setParameterLength(1,4).setName("texture"),Fl=(e=Ml,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Zi(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=Ll(e,t,r,s),i},Pl=(...e)=>Fl(...e).setSampler(!1);class Dl extends Ta{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Ul=(e,t,r)=>new Dl(e,t,r);class Il extends li{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class Ol extends Dl{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?qs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Js.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rnew Ol(e,t);const kl=rn(class extends ui{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);let Gl,zl;class $l extends ui{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}getNodeType(){return this.scope===$l.DPR?"float":this.scope===$l.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Js.NONE;return this.scope!==$l.SIZE&&this.scope!==$l.VIEWPORT&&this.scope!==$l.DPR||(e=Js.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===$l.VIEWPORT?null!==t?zl.copy(t.viewport):(e.getViewport(zl),zl.multiplyScalar(e.getPixelRatio())):this.scope===$l.DPR?this._output.value=e.getPixelRatio():null!==t?(Gl.width=t.width,Gl.height=t.height):e.getDrawingBufferSize(Gl)}setup(){const e=this.scope;let r=null;return r=e===$l.SIZE?_a(Gl||(Gl=new t)):e===$l.VIEWPORT?_a(zl||(zl=new s)):e===$l.DPR?_a(1):bn(jl.div(ql)),this._output=r,r}generate(e){if(this.scope===$l.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(ql).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}$l.COORDINATE="coordinate",$l.VIEWPORT="viewport",$l.SIZE="size",$l.UV="uv",$l.DPR="dpr";const Wl=sn($l,$l.DPR),Hl=sn($l,$l.UV),ql=sn($l,$l.SIZE),jl=sn($l,$l.COORDINATE),Xl=sn($l,$l.VIEWPORT),Kl=Xl.zw,Yl=jl.sub(Xl.xy),Ql=Yl.div(Kl),Zl=un(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),ql),"vec2").once()(),Jl=_a(0,"uint").setName("u_cameraIndex").setGroup(fa("cameraIndex")).toVarying("v_cameraIndex"),ed=_a("float").setName("cameraNear").setGroup(ba).onRenderUpdate(({camera:e})=>e.near),td=_a("float").setName("cameraFar").setGroup(ba).onRenderUpdate(({camera:e})=>e.far),rd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Vl(r).setGroup(ba).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraProjectionMatrix")}else t=_a("mat4").setName("cameraProjectionMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),sd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=Vl(r).setGroup(ba).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraProjectionMatrixInverse")}else t=_a("mat4").setName("cameraProjectionMatrixInverse").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),id=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Vl(r).setGroup(ba).setName("cameraViewMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraViewMatrix")}else t=_a("mat4").setName("cameraViewMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),nd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);t=Vl(r).setGroup(ba).setName("cameraWorldMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraWorldMatrix")}else t=_a("mat4").setName("cameraWorldMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorld);return t}).once()(),ad=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);t=Vl(r).setGroup(ba).setName("cameraNormalMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraNormalMatrix")}else t=_a("mat3").setName("cameraNormalMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.normalMatrix);return t}).once()(),od=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld));return t}).once()(),ud=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);t=Vl(r,"vec4").setGroup(ba).setName("cameraViewports").element(Jl).toConst("cameraViewport")}else t=En(0,0,ql.x,ql.y).toConst("cameraViewport");return t}).once()(),ld=new C;class dd extends ui{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Js.OBJECT,this.uniformNode=new Ta(null)}getNodeType(){const e=this.scope;return e===dd.WORLD_MATRIX?"mat4":e===dd.POSITION||e===dd.VIEW_POSITION||e===dd.DIRECTION||e===dd.SCALE?"vec3":e===dd.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===dd.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===dd.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===dd.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===dd.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===dd.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===dd.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),ld.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=ld.radius}}generate(e){const t=this.scope;return t===dd.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===dd.POSITION||t===dd.VIEW_POSITION||t===dd.DIRECTION||t===dd.SCALE?this.uniformNode.nodeType="vec3":t===dd.RADIUS&&(this.uniformNode.nodeType="float"),this.uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}dd.WORLD_MATRIX="worldMatrix",dd.POSITION="position",dd.SCALE="scale",dd.VIEW_POSITION="viewPosition",dd.DIRECTION="direction",dd.RADIUS="radius";const cd=rn(dd,dd.DIRECTION).setParameterLength(1),hd=rn(dd,dd.WORLD_MATRIX).setParameterLength(1),pd=rn(dd,dd.POSITION).setParameterLength(1),gd=rn(dd,dd.SCALE).setParameterLength(1),md=rn(dd,dd.VIEW_POSITION).setParameterLength(1),fd=rn(dd,dd.RADIUS).setParameterLength(1);class yd extends dd{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const bd=sn(yd,yd.DIRECTION),xd=sn(yd,yd.WORLD_MATRIX),Td=sn(yd,yd.POSITION),_d=sn(yd,yd.SCALE),vd=sn(yd,yd.VIEW_POSITION),Nd=sn(yd,yd.RADIUS),Sd=_a(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Rd=_a(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Ed=un(e=>e.context.modelViewMatrix||Ad).once()().toVar("modelViewMatrix"),Ad=id.mul(xd),wd=un(e=>(e.context.isHighPrecisionModelViewMatrix=!0,_a("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Cd=un(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return _a("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),Md=un(e=>"fragment"!==e.shaderStage?(v("TSL: `clipSpace` is only available in fragment stage."),En()):e.context.clipSpace.toVarying("v_clipSpace")).once()(),Bd=Sl("position","vec3"),Ld=Bd.toVarying("positionLocal"),Fd=Bd.toVarying("positionPrevious"),Pd=un(e=>xd.mul(Ld).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Dd=un(()=>Ld.transformDirection(xd).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Ud=un(e=>{if("fragment"===e.shaderStage&&e.material.vertexNode){const e=sd.mul(Md);return e.xyz.div(e.w).toVar("positionView")}return e.context.setupPositionView().toVarying("v_positionView")},"vec3").once(["POSITION","VERTEX"])(),Id=un(e=>{let t;return t=e.camera.isOrthographicCamera?vn(0,0,1):Ud.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class Od extends ui{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===M?"false":e.getFrontFacing()}}const Vd=sn(Od),kd=gn(Vd).mul(2).sub(1),Gd=un(([e],{material:t})=>{const r=t.side;return r===M?e=e.mul(-1):r===B&&(e=e.mul(kd)),e}),zd=Sl("normal","vec3"),$d=un(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),vn(0,1,0)):zd,"vec3").once()().toVar("normalLocal"),Wd=Ud.dFdx().cross(Ud.dFdy()).normalize().toVar("normalFlat"),Hd=un(e=>{let t;return t=!0===e.material.flatShading?Wd:Qd($d).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),qd=un(e=>{let t=Hd.transformDirection(id);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),jd=un(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=Hd,!0!==t.flatShading&&(s=Gd(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),Xd=jd.transformDirection(id).toVar("normalWorld"),Kd=un(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?jd:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),Yd=un(([e,t=xd])=>{const r=Bn(t),s=e.div(vn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),Qd=un(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=Sd.mul(e);return id.transformDirection(s)}),Zd=un(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),jd)).once(["NORMAL","VERTEX"])(),Jd=un(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),Xd)).once(["NORMAL","VERTEX"])(),ec=un(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),Kd)).once(["NORMAL","VERTEX"])(),tc=new L,rc=new a,sc=_a(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),ic=_a(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),nc=_a(new a).onReference(function(e){return e.material}).onObjectUpdate(function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(tc.copy(r),rc.makeRotationFromEuler(tc)):rc.identity(),rc}),ac=Id.negate().reflect(jd),oc=Id.negate().refract(jd,sc),uc=ac.transformDirection(id).toVar("reflectVector"),lc=oc.transformDirection(id).toVar("reflectVector"),dc=new F;class cc extends Bl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===P?uc:e.mapping===D?lc:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),vn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?vn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=vn(t.x.negate(),t.yz)),nc.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const hc=rn(cc).setParameterLength(1,4).setName("cubeTexture"),pc=(e=dc,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Zi(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=hc(e,t,r,s),i};class gc extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class mc extends ui{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Js.OBJECT}element(e){return new gc(this,Zi(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Ul(null,e,this.count):Array.isArray(this.getValueFromReference())?Vl(null,e):"texture"===e?Fl(null):"cubeTexture"===e?pc(null):_a(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew mc(e,t,r),yc=(e,t,r,s)=>new mc(e,t,s,r);class bc extends mc{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const xc=(e,t,r=null)=>new bc(e,t,r),Tc=Rl(),_c=Ud.dFdx(),vc=Ud.dFdy(),Nc=Tc.dFdx(),Sc=Tc.dFdy(),Rc=jd,Ec=vc.cross(Rc),Ac=Rc.cross(_c),wc=Ec.mul(Nc.x).add(Ac.mul(Sc.x)),Cc=Ec.mul(Nc.y).add(Ac.mul(Sc.y)),Mc=wc.dot(wc).max(Cc.dot(Cc)),Bc=Mc.equal(0).select(0,Mc.inverseSqrt()),Lc=wc.mul(Bc).toVar("tangentViewFrame"),Fc=Cc.mul(Bc).toVar("bitangentViewFrame"),Pc=Sl("tangent","vec4"),Dc=Pc.xyz.toVar("tangentLocal"),Uc=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Ed.mul(En(Dc,0)).xyz.toVarying("v_tangentView").normalize():Lc,!0!==r.flatShading&&(s=Gd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Ic=Uc.transformDirection(id).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Oc=un(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(Pc.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),Vc=Oc(zd.cross(Pc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),kc=Oc($d.cross(Dc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Gc=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Oc(jd.cross(Uc),"v_bitangentView").normalize():Fc,!0!==r.flatShading&&(s=Gd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),zc=Oc(Xd.cross(Ic),"v_bitangentWorld").normalize().toVar("bitangentWorld"),$c=Bn(Uc,Gc,jd).toVar("TBNViewMatrix"),Wc=Id.mul($c),Hc=un(()=>{let e=Jn.cross(Id);return e=e.cross(Jn).normalize(),e=nu(e,jd,Qn.mul(Gn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),qc=e=>Zi(e).mul(.5).add(.5),jc=e=>vn(e,bo(ou(gn(1).sub(Yo(e,e)))));class Xc extends ci{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=U,this.unpackNormalMode=I}setup({material:e}){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===U?s===O?i=jc(i.xy):s===V?i=jc(i.yw):s!==I&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==I&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.flatShading&&(t=Gd(t)),i=vn(i.xy.mul(t),i.z)}let n=null;return t===k?n=Qd(i):t===U?n=$c.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=jd),n}}const Kc=rn(Xc).setParameterLength(1,2),Yc=un(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Rl()),forceUVContext:!0}),s=gn(r(e=>e));return bn(gn(r(e=>e.add(e.dFdx()))).sub(s),gn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),Qc=un(e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(kd),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class Zc extends ci{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Yc({textureNode:this.textureNode,bumpScale:e});return Qc({surf_pos:Ud,surf_norm:jd,dHdxy:t})}}const Jc=rn(Zc).setParameterLength(1,2),eh=new Map;class th extends ui{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=eh.get(e);return void 0===r&&(r=xc(e,t),eh.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===th.COLOR){const e=void 0!==t.color?this.getColor(r):vn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===th.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===th.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:gn(1);else if(r===th.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===th.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===th.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===th.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===th.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===th.NORMAL)t.normalMap?(s=Kc(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=G&&t.normalMap.format!=z&&t.normalMap.format!=$||(s.unpackNormalMode=O)):s=t.bumpMap?Jc(this.getTexture("bump").r,this.getFloat("bumpScale")):jd;else if(r===th.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===th.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===th.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Kc(this.getTexture(r),this.getCache(r+"Scale","vec2")):jd;else if(r===th.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===th.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===th.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Mn(Vh.x,Vh.y,Vh.y.negate(),Vh.x).mul(e.rg.mul(2).sub(bn(1)).normalize().mul(e.b))}else s=Vh;else if(r===th.IRIDESCENCE_THICKNESS){const e=fc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=fc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===th.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===th.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===th.IOR)s=this.getFloat(r);else if(r===th.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===th.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===th.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):gn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}th.ALPHA_TEST="alphaTest",th.COLOR="color",th.OPACITY="opacity",th.SHININESS="shininess",th.SPECULAR="specular",th.SPECULAR_STRENGTH="specularStrength",th.SPECULAR_INTENSITY="specularIntensity",th.SPECULAR_COLOR="specularColor",th.REFLECTIVITY="reflectivity",th.ROUGHNESS="roughness",th.METALNESS="metalness",th.NORMAL="normal",th.CLEARCOAT="clearcoat",th.CLEARCOAT_ROUGHNESS="clearcoatRoughness",th.CLEARCOAT_NORMAL="clearcoatNormal",th.EMISSIVE="emissive",th.ROTATION="rotation",th.SHEEN="sheen",th.SHEEN_ROUGHNESS="sheenRoughness",th.ANISOTROPY="anisotropy",th.IRIDESCENCE="iridescence",th.IRIDESCENCE_IOR="iridescenceIOR",th.IRIDESCENCE_THICKNESS="iridescenceThickness",th.IOR="ior",th.TRANSMISSION="transmission",th.THICKNESS="thickness",th.ATTENUATION_DISTANCE="attenuationDistance",th.ATTENUATION_COLOR="attenuationColor",th.LINE_SCALE="scale",th.LINE_DASH_SIZE="dashSize",th.LINE_GAP_SIZE="gapSize",th.LINE_WIDTH="linewidth",th.LINE_DASH_OFFSET="dashOffset",th.POINT_SIZE="size",th.DISPERSION="dispersion",th.LIGHT_MAP="light",th.AO="ao";const rh=sn(th,th.ALPHA_TEST),sh=sn(th,th.COLOR),ih=sn(th,th.SHININESS),nh=sn(th,th.EMISSIVE),ah=sn(th,th.OPACITY),oh=sn(th,th.SPECULAR),uh=sn(th,th.SPECULAR_INTENSITY),lh=sn(th,th.SPECULAR_COLOR),dh=sn(th,th.SPECULAR_STRENGTH),ch=sn(th,th.REFLECTIVITY),hh=sn(th,th.ROUGHNESS),ph=sn(th,th.METALNESS),gh=sn(th,th.NORMAL),mh=sn(th,th.CLEARCOAT),fh=sn(th,th.CLEARCOAT_ROUGHNESS),yh=sn(th,th.CLEARCOAT_NORMAL),bh=sn(th,th.ROTATION),xh=sn(th,th.SHEEN),Th=sn(th,th.SHEEN_ROUGHNESS),_h=sn(th,th.ANISOTROPY),vh=sn(th,th.IRIDESCENCE),Nh=sn(th,th.IRIDESCENCE_IOR),Sh=sn(th,th.IRIDESCENCE_THICKNESS),Rh=sn(th,th.TRANSMISSION),Eh=sn(th,th.THICKNESS),Ah=sn(th,th.IOR),wh=sn(th,th.ATTENUATION_DISTANCE),Ch=sn(th,th.ATTENUATION_COLOR),Mh=sn(th,th.LINE_SCALE),Bh=sn(th,th.LINE_DASH_SIZE),Lh=sn(th,th.LINE_GAP_SIZE),Fh=sn(th,th.LINE_WIDTH),Ph=sn(th,th.LINE_DASH_OFFSET),Dh=sn(th,th.POINT_SIZE),Uh=sn(th,th.DISPERSION),Ih=sn(th,th.LIGHT_MAP),Oh=sn(th,th.AO),Vh=_a(new t).onReference(function(e){return e.material}).onRenderUpdate(function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}),kh=un(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class Gh extends li{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const zh=rn(Gh).setParameterLength(2);class $h extends Dl{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Gs(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ti.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return zh(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ti.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Ju(this.value),this._varying=Pu(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const Wh=(e,t=null,r=0)=>new $h(e,t,r);class Hh extends ui{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===Hh.VERTEX)s=e.getVertexIndex();else if(r===Hh.INSTANCE)s=e.getInstanceIndex();else if(r===Hh.DRAW)s=e.getDrawIndex();else if(r===Hh.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Hh.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Hh.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Pu(this).build(e,t)}return i}}Hh.VERTEX="vertex",Hh.INSTANCE="instance",Hh.SUBGROUP="subgroup",Hh.INVOCATION_LOCAL="invocationLocal",Hh.INVOCATION_SUBGROUP="invocationSubgroup",Hh.DRAW="draw";const qh=sn(Hh,Hh.VERTEX),jh=sn(Hh,Hh.INSTANCE),Xh=sn(Hh,Hh.SUBGROUP),Kh=sn(Hh,Hh.INVOCATION_SUBGROUP),Yh=sn(Hh,Hh.INVOCATION_LOCAL),Qh=sn(Hh,Hh.DRAW);class Zh extends ui{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Js.FRAME,this.buffer=null,this.bufferColor=null,this.previousInstanceMatrixNode=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){let{instanceMatrixNode:t,instanceColorNode:r}=this;null===t&&(t=this._createInstanceMatrixNode(!0,e),this.instanceMatrixNode=t);const{instanceColor:s,isStorageColor:i}=this;if(s&&null===r){if(i)r=Wh(s,"vec3",Math.max(s.count,1)).element(jh);else{const e=new W(s.array,3),t=s.usage===x?tl:el;this.bufferColor=e,r=vn(t(e,"vec3",3,0))}this.instanceColorNode=r}const n=t.mul(Ld).xyz;if(Ld.assign(n),e.needsPreviousData()&&Fd.assign(this.getPreviousInstancedPosition(e)),e.hasGeometryAttribute("normal")){const e=Yd($d,t);$d.assign(e)}null!==this.instanceColorNode&&In("vec3","vInstanceColor").assign(this.instanceColorNode)}update(e){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)),null!==this.previousInstanceMatrixNode&&e.object.previousInstanceMatrix.array.set(this.instanceMatrix.array)}getPreviousInstancedPosition(e){const t=e.object;return null===this.previousInstanceMatrixNode&&(t.previousInstanceMatrix=this.instanceMatrix.clone(),this.previousInstanceMatrixNode=this._createInstanceMatrixNode(!1,e)),this.previousInstanceMatrixNode.mul(Fd).xyz}_createInstanceMatrixNode(e,t){let r;const{instanceMatrix:s}=this,{count:i}=s;if(this.isStorageMatrix)r=Wh(s,"mat4",Math.max(i,1)).element(jh);else{if(i<=(!0===t.renderer.backend.isWebGPUBackend?1e3:250))r=Ul(s.array,"mat4",Math.max(i,1)).element(jh);else{const t=new H(s.array,16,1);!0===e&&(this.buffer=t);const i=s.usage===x?tl:el,n=[i(t,"vec4",16,0),i(t,"vec4",16,4),i(t,"vec4",16,8),i(t,"vec4",16,12)];r=Ln(...n)}}return r}}const Jh=rn(Zh).setParameterLength(2,3);class ep extends Zh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const tp=rn(ep).setParameterLength(1);class rp extends ui{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=jh:this.batchingIdNode=Qh);const t=un(([e])=>{const t=mn(Al(Pl(this.batchMesh._indirectTexture),0).x).toConst(),r=mn(e).mod(t).toConst(),s=mn(e).div(t).toConst();return Pl(this.batchMesh._indirectTexture,xn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(mn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=mn(Al(Pl(s),0).x).toConst(),n=gn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Ln(Pl(s,xn(a,o)),Pl(s,xn(a.add(1),o)),Pl(s,xn(a.add(2),o)),Pl(s,xn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=un(([e])=>{const t=mn(Al(Pl(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Pl(l,xn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);In("vec3","vBatchColor").assign(t)}const d=Bn(u);Ld.assign(u.mul(Ld));const c=$d.div(vn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;$d.assign(h),e.hasGeometryAttribute("tangent")&&Dc.mulAssign(d)}}const sp=rn(rp).setParameterLength(1),ip=new WeakMap;class np extends ui{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Js.OBJECT,this.skinIndexNode=Sl("skinIndex","uvec4"),this.skinWeightNode=Sl("skinWeight","vec4"),this.bindMatrixNode=fc("bindMatrix","mat4"),this.bindMatrixInverseNode=fc("bindMatrixInverse","mat4"),this.boneMatricesNode=yc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Ld,this.toPositionNode=Ld,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=Ma(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormalAndTangent(e=this.boneMatricesNode,t=$d,r=Dc){const{skinIndexNode:s,skinWeightNode:i,bindMatrixNode:n,bindMatrixInverseNode:a}=this,o=e.element(s.x),u=e.element(s.y),l=e.element(s.z),d=e.element(s.w);let c=Ma(i.x.mul(o),i.y.mul(u),i.z.mul(l),i.w.mul(d));c=a.mul(c).mul(n);return{skinNormal:c.transformDirection(t).xyz,skinTangent:c.transformDirection(r).xyz}}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=yc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Fd)}setup(e){e.needsPreviousData()&&Fd.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const{skinNormal:t,skinTangent:r}=this.getSkinnedNormalAndTangent();$d.assign(t),e.hasGeometryAttribute("tangent")&&Dc.assign(r)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;ip.get(t)!==e.frameId&&(ip.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const ap=e=>new np(e);class op extends ui{static get type(){return"LoopNode"}constructor(e=[]){super("void"),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew op(tn(e,"int")).toStack(),lp=()=>gl("break").toStack(),dp=new WeakMap,cp=new s,hp=un(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=mn(qh).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Pl(e,xn(u,o)).depth(i).xyz.mul(t)});class pp extends ui{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=_a(1),this.updateType=Js.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=dp.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new q(m,h,p,a);f.type=j,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=gn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Pl(this.mesh.morphTexture,xn(mn(e).add(1),mn(jh))).r):t.assign(fc("morphTargetInfluences","float").element(e).toVar()),cn(t.notEqual(0),()=>{!0===s&&Ld.addAssign(hp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(0)})),!0===i&&$d.addAssign(hp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(1)}))})})}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce((e,t)=>e+t,0)}}const gp=rn(pp).setParameterLength(1);class mp extends ui{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class fp extends mp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class yp extends xu{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:vn().toVar("directDiffuse"),directSpecular:vn().toVar("directSpecular"),indirectDiffuse:vn().toVar("indirectDiffuse"),indirectSpecular:vn().toVar("indirectSpecular")};return{radiance:vn().toVar("radiance"),irradiance:vn().toVar("irradiance"),iblIrradiance:vn().toVar("iblIrradiance"),ambientOcclusion:gn(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const bp=rn(yp);class xp extends mp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const Tp=new t;class _p extends Bl{static get type(){return"ViewportTextureNode"}constructor(e=Hl,t=null,r=null){let s=null;null===r?(s=new X,s.minFilter=K,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Js.RENDER,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer.getRenderTarget();return this.value=this.getTextureForReference(t),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(Tp):Tp.set(r.width,r.height);const s=this.getTextureForReference(r);s.image.width===Tp.width&&s.image.height===Tp.height||(s.image.width=Tp.width,s.image.height=Tp.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const vp=rn(_p).setParameterLength(0,3),Np=rn(_p,null,null,{generateMipmaps:!0}).setParameterLength(0,3),Sp=Np(),Rp=(e=Hl,t=null)=>Sp.sample(e,t);let Ep=null;class Ap extends _p{static get type(){return"ViewportDepthTextureNode"}constructor(e=Hl,t=null){null===Ep&&(Ep=new Y),super(e,t,Ep)}getTextureForReference(){return Ep}}const wp=rn(Ap).setParameterLength(0,2);class Cp extends ui{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Cp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Cp.DEPTH_BASE)null!==r&&(s=Pp().assign(r));else if(t===Cp.DEPTH)s=e.isPerspectiveCamera?Bp(Ud.z,ed,td):Mp(Ud.z,ed,td);else if(t===Cp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Lp(r,ed,td);s=Mp(e,ed,td)}else s=r;else s=Mp(Ud.z,ed,td);return s}}Cp.DEPTH_BASE="depthBase",Cp.DEPTH="depth",Cp.LINEAR_DEPTH="linearDepth";const Mp=(e,t,r)=>e.add(t).div(t.sub(r)),Bp=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Lp=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Fp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=yo(e.negate().div(t)),i=yo(r.div(t));return s.div(i)},Pp=rn(Cp,Cp.DEPTH_BASE),Dp=sn(Cp,Cp.DEPTH),Up=rn(Cp,Cp.LINEAR_DEPTH).setParameterLength(0,1),Ip=Up(wp());Dp.assign=e=>Pp(e);class Op extends ui{static get type(){return"ClippingNode"}constructor(e=Op.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===Op.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Op.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return un(()=>{const r=gn().toVar("distanceToPlane"),s=gn().toVar("distanceToGradient"),i=gn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Vl(t).setGroup(ba);up(n,({i:t})=>{const n=e.element(t);r.assign(Ud.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(lu(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Vl(e).setGroup(ba),n=gn(1).toVar("intersectionClipOpacity");up(a,({i:e})=>{const i=t.element(e);r.assign(Ud.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(lu(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}On.a.mulAssign(i),On.a.equal(0).discard()})()}setupDefault(e,t){return un(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Vl(t).setGroup(ba);up(r,({i:t})=>{const r=e.element(t);Ud.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Vl(e).setGroup(ba),r=yn(!0).toVar("clipped");up(s,({i:e})=>{const s=t.element(e);r.assign(Ud.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),un(()=>{const s=Vl(e).setGroup(ba),i=kl(t.getClipDistance());up(r,({i:e})=>{const t=s.element(e),r=Ud.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}Op.ALPHA_TO_COVERAGE="alphaToCoverage",Op.DEFAULT="default",Op.HARDWARE="hardware";const Vp=un(([e])=>No(La(1e4,So(La(17,e.x).add(La(.1,e.y)))).mul(Ma(.1,Mo(So(La(13,e.y).add(e.x))))))),kp=un(([e])=>Vp(bn(Vp(e.xy),e.z))),Gp=un(([e])=>{const t=Ho(Lo(Do(e.xyz)),Lo(Uo(e.xyz))),r=gn(1).div(gn(.05).mul(t)).toVar("pixScale"),s=bn(mo(To(yo(r))),mo(_o(yo(r)))),i=bn(kp(To(s.x.mul(e.xyz))),kp(To(s.y.mul(e.xyz)))),n=No(yo(r)),a=Ma(La(n.oneMinus(),i.x),La(n,i.y)),o=Wo(n,n.oneMinus()),u=vn(a.mul(a).div(La(2,o).mul(Ba(1,o))),a.sub(La(.5,o)).div(Ba(1,o)),Ba(1,Ba(1,a).mul(Ba(1,a)).div(La(2,o).mul(Ba(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return au(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class zp extends Nl{static get type(){return"VertexColorNode"}constructor(e){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}const $p=(e=0)=>new zp(e),Wp=un(([e,t])=>Wo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Hp=un(([e,t])=>Wo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),qp=un(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),jp=un(([e,t])=>nu(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),qo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Xp=un(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return En(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)}).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),Kp=un(([e])=>En(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),Yp=un(([e])=>(cn(e.a.equal(0),()=>En(0)),En(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class Qp extends Q{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.maskNode=null,this.maskShadowNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,this.contextNode=null}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Us(t.slice(0,-4)),r.getCacheKey());return this.type+Is(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Lu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=this.setupVertex(e),i=Lu(this.vertexNode||s,"VERTEX");let n;e.context.clipSpace=i,e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==a&&e.stack.addToStack(a);const i=En(s,On.a).max(0);n=this.setupOutput(e,i),ia.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&ia.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=En(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.currentSamples;this.alphaToCoverage&&t>1?s=new Op(Op.ALPHA_TO_COVERAGE):e.stack.addToStack(new Op)}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.addToStack(new Op(Op.HARDWARE)),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Fp(Ud.z,ed,td):Mp(Ud.z,ed,td))}null!==s&&Dp.assign(s).toStack()}setupPositionView(){return Ed.mul(Ld).xyz}setupModelViewProjection(){return rd.mul(Ud)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.position=e.removeStack(),kh}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&gp(t).toStack(),!0===t.isSkinnedMesh&&ap(t).toStack(),this.displacementMap){const e=xc("displacementMap","texture"),t=xc("displacementScale","float"),r=xc("displacementBias","float");Ld.addAssign($d.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&sp(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&tp(t).toStack(),null!==this.positionNode&&Ld.assign(Lu(this.positionNode,"POSITION","vec3")),Ld}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&yn(this.maskNode).not().discard();let s=this.colorNode?En(this.colorNode):sh;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul($p())),t.instanceColor){s=In("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=In("vec3","vBatchColor").mul(s)}On.assign(s);const i=this.opacityNode?gn(this.opacityNode):ah;On.a.assign(On.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?gn(this.alphaTestNode):rh,!0===this.alphaToCoverage?(On.a=lu(n,n.add(ko(On.a)),On.a),On.a.lessThanEqual(0).discard()):On.a.lessThanEqual(n).discard()),!0===this.alphaHash&&On.a.lessThan(Gp(Ld)).discard(),e.isOpaque()&&On.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?vn(0):On.rgb}setupNormal(){return this.normalNode?vn(this.normalNode):gh}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?xc("envMap","cubeTexture"):xc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new xp(Ih)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=Oh),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new fp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=bp(n,t,r,s)}else null!==r&&(a=vn(null!==s?nu(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(kn.assign(vn(i||nh)),a=a.add(kn)),a}setupFog(e,t){const r=e.fogNode;return r&&(ia.assign(t),t=En(r.toVar())),t}setupPremultipliedAlpha(e,t){return Kp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=Q.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.maskNode=e.maskNode,this.maskShadowNode=e.maskShadowNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,this.contextNode=e.contextNode,super.copy(e)}}const Zp=new Z;class Jp extends Qp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(Zp),this.setValues(e)}}const eg=new J;class tg extends Qp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(eg),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?gn(this.offsetNode):Ph,t=this.dashScaleNode?gn(this.dashScaleNode):Mh,r=this.dashSizeNode?gn(this.dashSizeNode):Bh,s=this.gapSizeNode?gn(this.gapSizeNode):Lh;na.assign(r),aa.assign(s);const i=Pu(Sl("lineDistance").mul(t));(e?i.add(e):i).mod(na.add(aa)).greaterThan(na).discard()}}const rg=new J;class sg extends Qp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(rg),this.vertexColors=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=ee,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.vertexColors,i=this._useDash,n=this._useWorldUnits,a=un(({start:e,end:t})=>{const r=rd.element(2).element(2),s=rd.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return En(nu(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=un(()=>{const e=Sl("instanceStart"),t=Sl("instanceEnd"),r=En(Ed.mul(En(e,1))).toVar("start"),s=En(Ed.mul(En(t,1))).toVar("end");if(i){const e=this.dashScaleNode?gn(this.dashScaleNode):Mh,t=this.offsetNode?gn(this.offsetNode):Ph,r=Sl("instanceDistanceStart"),s=Sl("instanceDistanceEnd");let i=Bd.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),In("float","lineDistance").assign(i)}n&&(In("vec3","worldStart").assign(r.xyz),In("vec3","worldEnd").assign(s.xyz));const o=Xl.z.div(Xl.w),u=rd.element(2).element(3).equal(-1);cn(u,()=>{cn(r.z.lessThan(0).and(s.z.greaterThan(0)),()=>{s.assign(a({start:r,end:s}))}).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),()=>{r.assign(a({start:s,end:r}))})});const l=rd.mul(r),d=rd.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=En().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=nu(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=In("vec4","worldPos");o.assign(Bd.y.lessThan(.5).select(r,s));const u=Fh.mul(.5);o.addAssign(En(Bd.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(En(Bd.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(En(a.mul(u),0)),cn(Bd.y.greaterThan(1).or(Bd.y.lessThan(0)),()=>{o.subAssign(En(a.mul(2).mul(u),0))})),g.assign(rd.mul(o));const l=vn().toVar();l.assign(Bd.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=bn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Bd.x.lessThan(0).select(e.negate(),e)),cn(Bd.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(Bd.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Fh)),e.assign(e.div(Xl.w.div(Wl))),g.assign(Bd.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(En(e,0,0)))}return g})();const o=un(({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return bn(h,p)});if(this.colorNode=un(()=>{const e=Rl();if(i){const t=this.dashSizeNode?gn(this.dashSizeNode):Bh,r=this.gapSizeNode?gn(this.gapSizeNode):Lh;na.assign(t),aa.assign(r);const s=In("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(na.add(aa)).greaterThan(na).discard()}const a=gn(1).toVar("alpha");if(n){const e=In("vec3","worldStart"),s=In("vec3","worldEnd"),n=In("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:vn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Fh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(lu(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=gn(s.fwidth()).toVar("dlen");cn(e.y.abs().greaterThan(1),()=>{a.assign(lu(i.oneMinus(),i.add(1),s).oneMinus())})}else cn(e.y.abs().greaterThan(1),()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()});let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Sl("instanceColorStart"),t=Sl("instanceColorEnd");u=Bd.y.lessThan(.5).select(e,t).mul(sh)}else u=sh;return En(u,a)})(),this.transparent){const e=this.opacityNode?gn(this.opacityNode):ah;this.outputNode=En(this.colorNode.rgb.mul(e).add(Rp().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const ig=new te;class ng extends Qp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(ig),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?gn(this.opacityNode):ah;On.assign(Gu(En(qc(jd),e),re))}}const ag=un(([e=Dd])=>{const t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return bn(t,r)});class og extends se{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new ie(5,5,5),n=ag(Dd),a=new Qp;a.colorNode=Fl(t,n,0),a.side=M,a.blending=ee;const o=new ne(i,a),u=new ae;u.add(o),t.minFilter===K&&(t.minFilter=oe);const l=new ue(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const ug=new WeakMap;class lg extends ci{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=pc(null);const t=new F;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Js.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===le||r===de){if(ug.has(e)){const t=ug.get(e);cg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new og(r.height);s.fromEquirectangularTexture(t,e),cg(s.texture,e.mapping),this._cubeTexture=s.texture,ug.set(e,s.texture),e.addEventListener("dispose",dg)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function dg(e){const t=e.target;t.removeEventListener("dispose",dg);const r=ug.get(t);void 0!==r&&(ug.delete(t),r.dispose())}function cg(e,t){t===le?e.mapping=P:t===de&&(e.mapping=D)}const hg=rn(lg).setParameterLength(1);class pg extends mp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=hg(this.envNode)}}class gg extends mp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=gn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class mg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class fg extends mg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(En(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(En(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(On.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case pe:s.rgb.assign(nu(s.rgb,s.rgb.mul(i.rgb),dh.mul(ch)));break;case he:s.rgb.assign(nu(s.rgb,i.rgb,dh.mul(ch)));break;case ce:s.rgb.addAssign(i.rgb.mul(dh.mul(ch)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const yg=new ge;class bg extends Qp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(yg),this.setValues(e)}setupNormal(){return Gd(Hd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new gg(Ih)),t}setupOutgoingLight(){return On.rgb}setupLightingModel(){return new fg}}const xg=un(({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))}),Tg=un(e=>e.diffuseColor.mul(1/Math.PI)),_g=un(({dotNH:e})=>sa.mul(gn(.5)).add(1).mul(gn(1/Math.PI)).mul(e.pow(sa))),vg=un(({lightDirection:e})=>{const t=e.add(Id).normalize(),r=jd.dot(t).clamp(),s=Id.dot(t).clamp(),i=xg({f0:ea,f90:1,dotVH:s}),n=gn(.25),a=_g({dotNH:r});return i.mul(n).mul(a)});class Ng extends fg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=jd.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Tg({diffuseColor:On.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(vg({lightDirection:e})).mul(dh))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Tg({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const Sg=new me;class Rg extends Qp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Sg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightingModel(){return new Ng(!1)}}const Eg=new fe;class Ag extends Qp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Eg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightingModel(){return new Ng}setupVariants(){const e=(this.shininessNode?gn(this.shininessNode):ih).max(1e-4);sa.assign(e);const t=this.specularNode||oh;ea.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const wg=un(e=>{if(!1===e.geometry.hasAttribute("normal"))return gn(0);const t=Hd.dFdx().abs().max(Hd.dFdy().abs());return t.x.max(t.y).max(t.z)}),Cg=un(e=>{const{roughness:t}=e,r=wg();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),Mg=un(({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return Fa(.5,i.add(n).max(so))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Bg=un(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(vn(e.mul(r),t.mul(s),a).length()),l=a.mul(vn(e.mul(i),t.mul(n),o).length());return Fa(.5,u.add(l))}).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),Lg=un(({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)}).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Fg=gn(1/Math.PI),Pg=un(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=vn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Fg.mul(n.mul(u.pow2()))}).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),Dg=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=jd,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Id).normalize(),d=n.dot(e).clamp(),c=n.dot(Id).clamp(),h=n.dot(l).clamp(),p=Id.dot(l).clamp();let g,m,f=xg({f0:t,f90:r,dotVH:p});if(Ki(a)&&(f=jn.mix(f,i)),Ki(o)){const t=Zn.dot(e),r=Zn.dot(Id),s=Zn.dot(l),i=Jn.dot(e),n=Jn.dot(Id),a=Jn.dot(l);g=Bg({alphaT:Yn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Pg({alphaT:Yn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=Mg({alpha:u,dotNL:d,dotNV:c}),m=Lg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),Ug=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let Ig=null;const Og=un(({roughness:e,dotNV:t})=>{null===Ig&&(Ig=new ye(Ug,16,16,G,be),Ig.name="DFG_LUT",Ig.minFilter=oe,Ig.magFilter=oe,Ig.wrapS=xe,Ig.wrapT=xe,Ig.generateMipmaps=!1,Ig.needsUpdate=!0);const r=bn(e,t);return Fl(Ig,r).rg}),Vg=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Dg({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=jd.dot(e).clamp(),l=jd.dot(Id).clamp(),d=Og({roughness:s,dotNV:l}),c=Og({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=gn(1).sub(g),y=gn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(gn(1).sub(f.mul(y).mul(b).mul(b)).add(so)),T=f.mul(y),_=x.mul(T);return o.add(_)}),kg=un(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Og({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),Gg=un(({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(vn(t).mul(n)).div(n.oneMinus())}).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),zg=un(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=gn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return gn(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)}).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),$g=un(({dotNV:e,dotNL:t})=>gn(1).div(gn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Wg=un(({lightDirection:e})=>{const t=e.add(Id).normalize(),r=jd.dot(e).clamp(),s=jd.dot(Id).clamp(),i=jd.dot(t).clamp(),n=zg({roughness:qn,dotNH:i}),a=$g({dotNV:s,dotNL:r});return Hn.mul(n).mul(a)}),Hg=un(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=bn(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i}).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),qg=un(({f:e})=>{const t=e.length();return Ho(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),jg=un(({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,Ho(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)}).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Xg=un(({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=vn().toVar();return cn(d.dot(r.sub(i)).greaterThanEqual(0),()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(Bn(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=vn(0).toVar();f.addAssign(jg({v1:h,v2:p})),f.addAssign(jg({v1:p,v2:g})),f.addAssign(jg({v1:g,v2:m})),f.addAssign(jg({v1:m,v2:h})),c.assign(vn(qg({f:f})))}),c}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Kg=un(({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=vn().toVar();return cn(o.dot(e.sub(t)).greaterThanEqual(0),()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=vn(0).toVar();d.addAssign(jg({v1:n,v2:a})),d.addAssign(jg({v1:a,v2:o})),d.addAssign(jg({v1:o,v2:l})),d.addAssign(jg({v1:l,v2:n})),u.assign(vn(qg({f:d.abs()})))}),u}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Yg=1/6,Qg=e=>La(Yg,La(e,La(e,e.negate().add(3)).sub(3)).add(1)),Zg=e=>La(Yg,La(e,La(e,La(3,e).sub(6))).add(4)),Jg=e=>La(Yg,La(e,La(e,La(-3,e).add(3)).add(3)).add(1)),em=e=>La(Yg,Zo(e,3)),tm=e=>Qg(e).add(Zg(e)),rm=e=>Jg(e).add(em(e)),sm=e=>Ma(-1,Zg(e).div(Qg(e).add(Zg(e)))),im=e=>Ma(1,em(e).div(Jg(e).add(em(e)))),nm=(e,t,r)=>{const s=e.uvNode,i=La(s,t.zw).add(.5),n=To(i),a=No(i),o=tm(a.x),u=rm(a.x),l=sm(a.x),d=im(a.x),c=sm(a.y),h=im(a.y),p=bn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=bn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=bn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=bn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=tm(a.y).mul(Ma(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=rm(a.y).mul(Ma(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},am=un(([e,t])=>{const r=bn(e.size(mn(t))),s=bn(e.size(mn(t.add(1)))),i=Fa(1,r),n=Fa(1,s),a=nm(e,En(i,r),To(t)),o=nm(e,En(n,s),_o(t));return No(t).mix(a,o)}),om=un(([e,t])=>{const r=t.mul(Cl(e));return am(e,r)}),um=un(([e,t,r,s,i])=>{const n=vn(uu(t.negate(),vo(e),Fa(1,s))),a=vn(Lo(i[0].xyz),Lo(i[1].xyz),Lo(i[2].xyz));return vo(n).mul(r.mul(a))}).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),lm=un(([e,t])=>e.mul(au(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),dm=Np(),cm=Rp(),hm=un(([e,t,r],{material:s})=>{const i=(s.side===M?dm:cm).sample(e),n=yo(ql.x).mul(lm(t,r));return am(i,n)}),pm=un(([e,t,r])=>(cn(r.notEqual(0),()=>{const s=fo(t).negate().div(r);return go(s.negate().mul(e))}),vn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),gm=un(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=En().toVar(),f=vn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=vn(d.sub(i),d,d.add(i));up({start:0,end:3},({i:i})=>{const d=n.element(i),g=um(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(En(y,1))),x=bn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(bn(x.x,x.y.oneMinus()));const T=hm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(pm(Lo(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=um(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(En(n,1))),y=bn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(bn(y.x,y.y.oneMinus())),m=hm(y,r,d),f=s.mul(pm(Lo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=vn(kg({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return En(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),mm=Bn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),fm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),ym=un(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=nu(e,t,lu(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();cn(a.lessThan(0),()=>vn(1));const o=a.sqrt(),u=fm(n,e),l=xg({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=gn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return vn(1).add(t).div(vn(1).sub(t))})(i.clamp(0,.9999)),g=fm(p,n.toVec3()),m=xg({f0:g,f90:1,dotVH:o}),f=vn(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),b=vn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(vn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return up({start:1,end:2,condition:"<=",name:"m"},({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=vn(54856e-17,44201e-17,52481e-17),i=vn(1681e3,1795300,2208400),n=vn(43278e5,93046e5,66121e5),a=gn(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=vn(o.x.add(a),o.y,o.z).div(1.0685e-7),mm.mul(o)})(gn(e).mul(y),gn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(vn(0))}).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),bm=un(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=gn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=gn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),xm=vn(.04),Tm=gn(1);class _m extends mg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=vn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=vn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=vn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=vn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=vn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=jd.dot(Id).clamp(),t=ym({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:ea}),r=ym({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:On.rgb});this.iridescenceFresnel=nu(t,r,zn),this.iridescenceF0Dielectric=Gg({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=Gg({f:r,f90:1,dotVH:e}),this.iridescenceF0=nu(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,zn)}if(!0===this.transmission){const t=Pd,r=od.sub(Pd).normalize(),s=Xd,i=e.context;i.backdrop=gm(s,r,Gn,Vn,ta,ra,t,xd,id,rd,ua,da,ha,ca,this.dispersion?pa:null),i.backdropAlpha=la,On.a.mulAssign(nu(1,i.backdrop.a,la))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=jd.dot(Id).clamp(),a=Og({roughness:Gn,dotNV:n}),o=i?jn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=jd.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(Wg({lightDirection:e})));const t=bm({normal:jd,viewDir:Id,roughness:qn}),r=bm({normal:jd,viewDir:e,roughness:qn}),i=Hn.r.max(Hn.g).max(Hn.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=Kd.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Dg({lightDirection:e,f0:xm,f90:Tm,roughness:Wn,normalView:Kd})))}r.directDiffuse.addAssign(s.mul(Tg({diffuseColor:Vn}))),r.directSpecular.addAssign(s.mul(Vg({lightDirection:e,f0:ta,f90:1,roughness:Gn,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=jd,h=Id,p=Ud.toVar(),g=Hg({N:c,V:h,roughness:Gn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Bn(vn(m.x,0,m.y),vn(0,1,0),vn(m.z,0,m.w)).toVar(),b=ta.mul(f.x).add(ta.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(Xg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Vn).mul(Xg({N:c,V:h,P:p,mInv:Bn(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context,s=t.mul(Tg({diffuseColor:Vn})).toVar();if(!0===this.sheen){const e=bm({normal:jd,viewDir:Id,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(Hn,bm({normal:jd,viewDir:Id,roughness:qn}))),!0===this.clearcoat){const e=Kd.dot(Id).clamp(),t=kg({dotNV:e,specularColor:xm,specularF90:Tm,roughness:Wn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=vn().toVar("singleScatteringDielectric"),n=vn().toVar("multiScatteringDielectric"),a=vn().toVar("singleScatteringMetallic"),o=vn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ra,ea,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ra,On.rgb,this.iridescenceF0Metallic);const u=nu(i,a,zn),l=nu(n,o,zn),d=i.add(n),c=Vn.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=bm({normal:jd,viewDir:Id,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=jd.dot(Id).clamp().add(t),i=Gn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Kd.dot(Id).clamp(),r=xg({dotVH:e,f0:xm,f90:Tm}),s=t.mul($n.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul($n));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const vm=gn(1),Nm=gn(-2),Sm=gn(.8),Rm=gn(-1),Em=gn(.4),Am=gn(2),wm=gn(.305),Cm=gn(3),Mm=gn(.21),Bm=gn(4),Lm=gn(4),Fm=gn(16),Pm=un(([e])=>{const t=vn(Mo(e)).toVar(),r=gn(-1).toVar();return cn(t.x.greaterThan(t.z),()=>{cn(t.x.greaterThan(t.y),()=>{r.assign(bu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}).Else(()=>{cn(t.z.greaterThan(t.y),()=>{r.assign(bu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Dm=un(([e,t])=>{const r=bn().toVar();return cn(t.equal(0),()=>{r.assign(bn(e.z,e.y).div(Mo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(bn(e.x.negate(),e.z.negate()).div(Mo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(bn(e.x.negate(),e.y).div(Mo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(bn(e.z.negate(),e.y).div(Mo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(bn(e.x.negate(),e.z).div(Mo(e.y)))}).Else(()=>{r.assign(bn(e.x,e.y).div(Mo(e.z)))}),La(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Um=un(([e])=>{const t=gn(0).toVar();return cn(e.greaterThanEqual(Sm),()=>{t.assign(vm.sub(e).mul(Rm.sub(Nm)).div(vm.sub(Sm)).add(Nm))}).ElseIf(e.greaterThanEqual(Em),()=>{t.assign(Sm.sub(e).mul(Am.sub(Rm)).div(Sm.sub(Em)).add(Rm))}).ElseIf(e.greaterThanEqual(wm),()=>{t.assign(Em.sub(e).mul(Cm.sub(Am)).div(Em.sub(wm)).add(Am))}).ElseIf(e.greaterThanEqual(Mm),()=>{t.assign(wm.sub(e).mul(Bm.sub(Cm)).div(wm.sub(Mm)).add(Cm))}).Else(()=>{t.assign(gn(-2).mul(yo(La(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Im=un(([e,t])=>{const r=e.toVar();r.assign(La(2,r).sub(1));const s=vn(r,1).toVar();return cn(t.equal(0),()=>{s.assign(s.zyx)}).ElseIf(t.equal(1),()=>{s.assign(s.xzy),s.xz.mulAssign(-1)}).ElseIf(t.equal(2),()=>{s.x.mulAssign(-1)}).ElseIf(t.equal(3),()=>{s.assign(s.zyx),s.xz.mulAssign(-1)}).ElseIf(t.equal(4),()=>{s.assign(s.xzy),s.xy.mulAssign(-1)}).ElseIf(t.equal(5),()=>{s.z.mulAssign(-1)}),s}).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),Om=un(([e,t,r,s,i,n])=>{const a=gn(r),o=vn(t),u=au(Um(a),Nm,n),l=No(u),d=To(u),c=vn(Vm(e,o,d,s,i,n)).toVar();return cn(l.notEqual(0),()=>{const t=vn(Vm(e,o,d.add(1),s,i,n)).toVar();c.assign(nu(c,t,l))}),c}),Vm=un(([e,t,r,s,i,n])=>{const a=gn(r).toVar(),o=vn(t),u=gn(Pm(o)).toVar(),l=gn(Ho(Lm.sub(a),0)).toVar();a.assign(Ho(a,Lm));const d=gn(mo(a)).toVar(),c=bn(Dm(o,u).mul(d.sub(2)).add(1)).toVar();return cn(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(La(3,Fm))),c.y.addAssign(La(4,mo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(bn(),bn())}),km=un(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Ro(s),l=r.mul(u).add(i.cross(r).mul(So(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Vm(e,l,t,n,a,o)}),Gm=un(({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=vn(bu(t,r,Qo(r,s))).toVar();cn(h.equal(vn(0)),()=>{h.assign(vn(s.z,0,s.x.negate()))}),h.assign(vo(h));const p=vn().toVar();return p.addAssign(i.element(0).mul(km({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),up({start:mn(1),end:e},({i:e})=>{cn(e.greaterThanEqual(n),()=>{lp()});const t=gn(a.mul(gn(e))).toVar();p.addAssign(i.element(e).mul(km({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(km({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),En(p,1)}),zm=un(([e])=>{const t=fn(e).toVar();return t.assign(t.shiftLeft(fn(16)).bitOr(t.shiftRight(fn(16)))),t.assign(t.bitAnd(fn(1431655765)).shiftLeft(fn(1)).bitOr(t.bitAnd(fn(2863311530)).shiftRight(fn(1)))),t.assign(t.bitAnd(fn(858993459)).shiftLeft(fn(2)).bitOr(t.bitAnd(fn(3435973836)).shiftRight(fn(2)))),t.assign(t.bitAnd(fn(252645135)).shiftLeft(fn(4)).bitOr(t.bitAnd(fn(4042322160)).shiftRight(fn(4)))),t.assign(t.bitAnd(fn(16711935)).shiftLeft(fn(8)).bitOr(t.bitAnd(fn(4278255360)).shiftRight(fn(8)))),gn(t).mul(2.3283064365386963e-10)}),$m=un(([e,t])=>bn(gn(e).div(gn(t)),zm(e))),Wm=un(([e,t,r])=>{const s=r.mul(r).toConst(),i=vn(1,0,0).toConst(),n=Qo(t,i).toConst(),a=bo(e.x).toConst(),o=La(2,3.14159265359).mul(e.y).toConst(),u=a.mul(Ro(o)).toConst(),l=a.mul(So(o)).toVar(),d=La(.5,t.z.add(1)).toConst();l.assign(d.oneMinus().mul(bo(u.mul(u).oneMinus())).add(d.mul(l)));const c=i.mul(u).add(n.mul(l)).add(t.mul(bo(Ho(0,u.mul(u).add(l.mul(l)).oneMinus()))));return vo(vn(s.mul(c.x),s.mul(c.y),Ho(0,c.z)))}),Hm=un(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=vn(s).toVar(),l=vn(0).toVar(),d=gn(0).toVar();return cn(e.lessThan(.001),()=>{l.assign(Vm(r,u,t,n,a,o))}).Else(()=>{const s=bu(Mo(u.z).lessThan(.999),vn(0,0,1),vn(1,0,0)),c=vo(Qo(s,u)).toVar(),h=Qo(u,c).toVar();up({start:fn(0),end:i},({i:s})=>{const p=$m(s,i),g=Wm(p,vn(0,0,1),e),m=vo(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=vo(m.mul(Yo(u,m).mul(2)).sub(u)),y=Ho(Yo(u,f),0);cn(y.greaterThan(0),()=>{const e=Vm(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),cn(d.greaterThan(0),()=>{l.assign(l.div(d))})}),En(l,1)}),qm=[.125,.215,.35,.446,.526,.582],jm=20,Xm=new _e(-1,1,1,-1,0,1),Km=new ve(90,1),Ym=new e;let Qm=null,Zm=0,Jm=0;const ef=new r,tf=new WeakMap,rf=[3,1,5,0,4,2],sf=Im(Rl(),Sl("faceIndex")).normalize(),nf=vn(sf.x,sf.y,sf.z);class af{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=ef,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Qm=this._renderer.getRenderTarget(),Zm=this._renderer.getActiveCubeFace(),Jm=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" instead.'),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=df(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=cf(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===P||e.mapping===D?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=qm[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=rf[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Te;T.setAttribute("position",new Ae(y,g)),T.setAttribute("uv",new Ae(b,m)),T.setAttribute("faceIndex",new Ae(x,f)),s.push(new ne(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=Vl(new Array(jm).fill(0)),n=_a(new r(0,1,0)),a=_a(0),o=gn(jm),u=_a(0),l=_a(1),d=Fl(),c=_a(0),h=gn(1/t),p=gn(1/s),g=gn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:nf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=lf("blur");return f.fragmentNode=Gm({...m,latitudinal:u.equal(1)}),tf.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Fl(),i=_a(0),n=_a(0),a=gn(1/t),o=gn(1/r),u=gn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=lf("ggx");return d.fragmentNode=Hm({...l,N_immutable:nf,GGX_SAMPLES:fn(512)}),tf.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ne(new Te,e);await this._renderer.compile(t,Xm)}_sceneToCubeUV(e,t,r,s,i){const n=Km;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Ym),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ne(new ie,new ge({name:"PMREM.Background",side:M,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(Ym),h=!0),u.setRenderTarget(s),u.clear(),h&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;uf(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===P||e.mapping===D;s?null===this._cubemapMaterial&&(this._cubemapMaterial=df(e)):null===this._equirectMaterial&&(this._equirectMaterial=cf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;uf(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Xm)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,uf(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,Xm),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,uf(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,Xm)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=tf.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):jm;f>jm&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),4*(this._cubeSize-T),3*T,2*T),u.setRenderTarget(t),u.render(c,Xm)}}function of(e,t){const r=new Ne(e,t,{magFilter:oe,minFilter:oe,generateMipmaps:!1,type:be,format:Re,colorSpace:Se});return r.texture.mapping=Ee,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function uf(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function lf(e){const t=new Qp;return t.depthTest=!1,t.depthWrite=!1,t.blending=ee,t.name=`PMREM_${e}`,t}function df(e){const t=lf("cubemap");return t.fragmentNode=pc(e,nf),t}function cf(e){const t=lf("equirect");return t.fragmentNode=Fl(e,ag(nf),0),t}const hf=new WeakMap;function pf(e,t,r){const s=function(e){let t=hf.get(e);void 0===t&&(t=new WeakMap,hf.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class gf extends ci{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new N;s.isRenderTargetTexture=!0,this._texture=Fl(s),this._width=_a(0),this._height=_a(0),this._maxMip=_a(0),this.updateBeforeType=Js.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:pf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new af(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=nc.mul(vn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Om(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const mf=rn(gf).setParameterLength(1,3),ff=new WeakMap;class yf extends mp{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=ff.get(e);void 0===s&&(s=mf(e),ff.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Hc:jd,i=r.context(bf(Gn,s)).mul(ic),n=r.context(xf(Xd)).mul(Math.PI).mul(ic),a=al(i),o=al(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(bf(Wn,Kd)).mul(ic),t=al(e);u.addAssign(t)}}}const bf=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Id.negate().reflect(t),r=tu(e).mix(r,t).normalize(),r=r.transformDirection(id)),r),getTextureLevel:()=>e}},xf=e=>({getUV:()=>e,getTextureLevel:()=>gn(1)}),Tf=new we;class _f extends Qp{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(Tf),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new yf(t):null}setupLightingModel(){return new _m}setupSpecular(){const e=nu(vn(.04),On.rgb,zn);ea.assign(vn(.04)),ta.assign(e),ra.assign(1)}setupVariants(){const e=this.metalnessNode?gn(this.metalnessNode):ph;zn.assign(e);let t=this.roughnessNode?gn(this.roughnessNode):hh;t=Cg({roughness:t}),Gn.assign(t),this.setupSpecular(),Vn.assign(On.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const vf=new Ce;class Nf extends _f{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(vf),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?gn(this.iorNode):Ah;ua.assign(e),ea.assign(Wo(Jo(ua.sub(1).div(ua.add(1))).mul(lh),vn(1)).mul(uh)),ta.assign(nu(ea,On.rgb,zn)),ra.assign(nu(uh,1,zn))}setupLightingModel(){return new _m(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?gn(this.clearcoatNode):mh,t=this.clearcoatRoughnessNode?gn(this.clearcoatRoughnessNode):fh;$n.assign(e),Wn.assign(Cg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?vn(this.sheenNode):xh,t=this.sheenRoughnessNode?gn(this.sheenRoughnessNode):Th;Hn.assign(e),qn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?gn(this.iridescenceNode):vh,t=this.iridescenceIORNode?gn(this.iridescenceIORNode):Nh,r=this.iridescenceThicknessNode?gn(this.iridescenceThicknessNode):Sh;jn.assign(e),Xn.assign(t),Kn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?bn(this.anisotropyNode):_h).toVar();Qn.assign(e.length()),cn(Qn.equal(0),()=>{e.assign(bn(1,0))}).Else(()=>{e.divAssign(bn(Qn)),Qn.assign(Qn.saturate())}),Yn.assign(Qn.pow2().mix(Gn.pow2(),1)),Zn.assign($c[0].mul(e.x).add($c[1].mul(e.y))),Jn.assign($c[1].mul(e.x).sub($c[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?gn(this.transmissionNode):Rh,t=this.thicknessNode?gn(this.thicknessNode):Eh,r=this.attenuationDistanceNode?gn(this.attenuationDistanceNode):wh,s=this.attenuationColorNode?vn(this.attenuationColorNode):Ch;if(la.assign(e),da.assign(t),ca.assign(r),ha.assign(s),this.useDispersion){const e=this.dispersionNode?gn(this.dispersionNode):Uh;pa.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?vn(this.clearcoatNormalNode):yh}setup(e){e.context.setupClearcoatNormal=()=>Lu(this.setupClearcoatNormal(e),"NORMAL","vec3"),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class Sf extends _m{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(jd.mul(a)).normalize(),h=gn(Id.dot(c.negate()).saturate().pow(l).mul(d)),p=vn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Rf extends Nf{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=gn(.1),this.thicknessAmbientNode=gn(0),this.thicknessAttenuationNode=gn(.1),this.thicknessPowerNode=gn(2),this.thicknessScaleNode=gn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new Sf(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const Ef=un(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=bn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=xc("gradientMap","texture").context({getUV:()=>i});return vn(e.r)}{const e=i.fwidth().mul(.5);return nu(vn(.7),vn(1),lu(gn(.7).sub(e.x),gn(.7).add(e.x),i.x))}});class Af extends mg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Ef({normal:zd,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(Tg({diffuseColor:On.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Tg({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const wf=new Me;class Cf extends Qp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(wf),this.setValues(e)}setupLightingModel(){return new Af}}const Mf=un(()=>{const e=vn(Id.z,0,Id.x.negate()).normalize(),t=Id.cross(e);return bn(e.dot(jd),t.dot(jd)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Bf=new Be;class Lf extends Qp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Bf),this.setValues(e)}setupVariants(e){const t=Mf;let r;r=e.material.matcap?xc("matcap","texture").context({getUV:()=>t}):vn(nu(.2,.8,t.y)),On.rgb.mulAssign(r.rgb)}}class Ff extends ci{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return Mn(e,s,s.negate(),e).mul(r)}{const e=t,s=Ln(En(1,0,0,0),En(0,Ro(e.x),So(e.x).negate(),0),En(0,So(e.x),Ro(e.x),0),En(0,0,0,1)),i=Ln(En(Ro(e.y),0,So(e.y),0),En(0,1,0,0),En(So(e.y).negate(),0,Ro(e.y),0),En(0,0,0,1)),n=Ln(En(Ro(e.z),So(e.z).negate(),0,0),En(So(e.z),Ro(e.z),0,0),En(0,0,1,0),En(0,0,0,1));return s.mul(i).mul(n).mul(En(r,1)).xyz}}}const Pf=rn(Ff).setParameterLength(2),Df=new Le;class Uf extends Qp{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(Df),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=Ed.mul(vn(s||0));let u=bn(xd[0].xyz.length(),xd[1].xyz.length());null!==n&&(u=u.mul(bn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=Bd.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new $u(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=gn(i||bh),c=Pf(l,d);return En(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const If=new Fe,Of=new t;class Vf extends Uf{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(If),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Ed.mul(vn(e||Ld)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?bn(n):Dh;u=u.mul(Wl),r.isPerspectiveCamera&&!0===a&&(u=u.mul(kf.div(Ud.z.negate()))),i&&i.isNode&&(u=u.mul(bn(i)));let l=Bd.xy;if(s&&s.isNode){const e=gn(s);l=Pf(l,e)}return l=l.mul(u),l=l.div(Kl.div(2)),l=l.mul(o.w),o=o.add(En(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const kf=_a(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(Of);this.value=.5*t.y});class Gf extends mg{constructor(){super(),this.shadowNode=gn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){On.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(On.rgb)}}const zf=new Pe;class $f extends Qp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(zf),this.setValues(e)}setupLightingModel(){return new Gf}}const Wf=Un("vec3"),Hf=Un("vec3"),qf=Un("vec3");class jf extends mg{constructor(){super()}start(e){const{material:t}=e,r=Un("vec3"),s=Un("vec3");cn(od.sub(Pd).length().greaterThan(Nd.mul(2)),()=>{r.assign(od),s.assign(Pd)}).Else(()=>{r.assign(Pd),s.assign(od)});const i=s.sub(r),n=_a("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=gn(0).toVar(),l=vn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),up(n,()=>{const s=r.add(o.mul(u)),i=id.mul(En(s,1)).xyz;let n;null!==t.depthNode&&(Hf.assign(Up(Bp(i.z,ed,td))),e.context.sceneDepthNode=Up(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,Wf.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&Wf.mulAssign(n);const d=Wf.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),qf.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?cn(r.greaterThanEqual(Hf),()=>{Wf.addAssign(e)}):Wf.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(Kg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(qf)}}class Xf extends Qp{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=M,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new jf}}class Kf{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,this._context="undefined"!=typeof self?self:null,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class Yf{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getIndirectOffset(){return this._geometries.getIndirectOffset(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.id),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Us(s)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=Os(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Os(e,1)),e=Os(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const Jf=[];class ey{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);Jf[0]=e,Jf[1]=t,Jf[2]=n,Jf[3]=i;let l=u.get(Jf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Jf,l)):(l.camera=s,l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),Jf[0]=null,Jf[1]=null,Jf[2]=null,Jf[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Yf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Zf(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class ty{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const ry=1,sy=2,iy=3,ny=4,ay=16;class oy extends ty{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===ry?this.backend.createAttribute(e):t===sy?this.backend.createIndexAttribute(e):t===iy?this.backend.createStorageAttribute(e):t===ny&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,iy):this.updateAttribute(e,ry);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,sy);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,ny)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndirectOffset(e){return e.geometry.indirectOffset}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=ly(t),e.set(t,r)):r.version!==uy(t)&&(this.attributes.delete(r),r=ly(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class cy{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):o("WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class hy{constructor(e){this.cacheKey=e,this.usedTimes=0}}class py extends hy{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class gy extends hy{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let my=0;class fy{constructor(e,t,r,s=null,i=null){this.id=my++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class yy extends ty{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new fy(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new fy(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new fy(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new gy(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new py(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class by extends ty{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ny:iy;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ny:iy;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0,i=!1));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture&&!0===o.mipmapsAutoUpdate){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0,i=!1)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function xy(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function Ty(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function _y(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===B&&!1===e.forceSinglePass}class vy{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(_y(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(_y(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||xy),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Ty),this.transparent.length>1&&this.transparent.sort(t||Ty)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new Y,l.format=e.stencilBuffer?Oe:Ve,l.type=e.stencilBuffer?ke:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,l.isArrayTexture=!0===e.multiview&&a.depth>1,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:Ge}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,this.info.memory.textures++,e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=Cy){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1)):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput(e)?this.outputNode.build(e,...t):super.build(e,...t),ln(r),e.removeActiveStack(this),o}}const Py=rn(Fy).setParameterLength(0,1);class Dy extends ui{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1})),this.name=t,this.isStructLayoutNode=!0}getLength(){const e=Float32Array.BYTES_PER_ELEMENT;let t=1,r=0;for(const s of this.membersLayout){const i=s.type,n=Ws(i),a=Hs(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}getMemberType(e,t){const r=this.membersLayout.find(e=>e.name===t);return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Uy extends ui{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.getMemberType(e,t)}_getChildren(){const e=super._getChildren(),t=e.find(e=>e.childNode===this.structTypeNode);return e.splice(e.indexOf(t),1),e.push(t),e}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structTypeNode.membersLayout,this.values)}`,this),t.name}}class Iy extends ui{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(){return"OutputType"}generate(e){const t=e.getDataFromNode(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;tnew Hy(e,"uint","float"),Xy={};class Ky extends ro{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(qy(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return fn;case"int":return mn;case"uvec2":return Tn;case"uvec3":return Sn;case"uvec4":return wn;case"ivec2":return xn;case"ivec3":return Nn;case"ivec4":return An}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t);const i=gn(s.bitAnd(Fo(s))),n=jy(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{cn(e.equal(fn(0)),()=>fn(32));const s=fn(0),i=fn(0);return this._resolveElementType(e,s,t),cn(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),cn(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),cn(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),cn(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),cn(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(fn(1)).bitAnd(fn(1431655765)))),s.assign(s.bitAnd(fn(858993459)).add(s.shiftRight(fn(2)).bitAnd(fn(858993459))));const i=s.add(s.shiftRight(fn(4))).bitAnd(fn(252645135)).mul(fn(16843009)).shiftRight(fn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return un(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}Ky.COUNT_TRAILING_ZEROS="countTrailingZeros",Ky.COUNT_LEADING_ZEROS="countLeadingZeros",Ky.COUNT_ONE_BITS="countOneBits";const Yy=nn(Ky,Ky.COUNT_TRAILING_ZEROS).setParameterLength(1),Qy=nn(Ky,Ky.COUNT_LEADING_ZEROS).setParameterLength(1),Zy=nn(Ky,Ky.COUNT_ONE_BITS).setParameterLength(1),Jy=un(([e])=>{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)}),eb=(e,t)=>Zo(La(4,e.mul(Ba(1,e))),t);class tb extends ci{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}getNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const rb=nn(tb,"snorm").setParameterLength(1),sb=nn(tb,"unorm").setParameterLength(1),ib=nn(tb,"float16").setParameterLength(1);class nb extends ci{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}getNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const ab=nn(nb,"snorm").setParameterLength(1),ob=nn(nb,"unorm").setParameterLength(1),ub=nn(nb,"float16").setParameterLength(1),lb=un(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),db=un(([e])=>vn(lb(e.z.add(lb(e.y.mul(1)))),lb(e.z.add(lb(e.x.mul(1)))),lb(e.y.add(lb(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),cb=un(([e,t,r])=>{const s=vn(e).toVar(),i=gn(1.4).toVar(),n=gn(0).toVar(),a=vn(s).toVar();return up({start:gn(0),end:gn(3),type:"float",condition:"<="},()=>{const e=vn(db(a.mul(2))).toVar();s.addAssign(e.add(r.mul(gn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=gn(lb(s.z.add(lb(s.x.add(lb(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)}),n}).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class hb extends ui{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}getNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const pb=rn(hb),gb=e=>(...t)=>pb(e,...t),mb=_a(0).setGroup(ba).onRenderUpdate(e=>e.time),fb=_a(0).setGroup(ba).onRenderUpdate(e=>e.deltaTime),yb=_a(0,"uint").setGroup(ba).onRenderUpdate(e=>e.frameId);const bb=un(([e,t,r=bn(.5)])=>Pf(e.sub(r),t).add(r)),xb=un(([e,t,r=bn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),Tb=un(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=xd.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=xd;const i=id.mul(s);return Ki(t)&&(i[0][0]=xd[0].length(),i[0][1]=0,i[0][2]=0),Ki(r)&&(i[1][0]=0,i[1][1]=xd[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,rd.mul(i).mul(Ld)}),_b=un(([e=null])=>{const t=Up();return Up(wp(e)).sub(t).lessThan(0).select(Hl,e)}),vb=un(([e,t=Rl(),r=gn(0)])=>{const s=e.x,i=e.y,n=r.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=e.reciprocal(),l=bn(a,o);return t.add(l).mul(u)}),Nb=un(([e,t=null,r=null,s=gn(1),i=Ld,n=$d])=>{let a=n.abs().normalize();a=a.div(a.dot(vn(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=Fl(d,o).mul(a.x),g=Fl(c,u).mul(a.y),m=Fl(h,l).mul(a.z);return Ma(p,g,m)}),Sb=new je,Rb=new r,Eb=new r,Ab=new r,wb=new a,Cb=new r(0,0,-1),Mb=new s,Bb=new r,Lb=new r,Fb=new s,Pb=new t,Db=new Ne,Ub=Hl.flipX();Db.depthTexture=new Y(1,1);let Ib=!1;class Ob extends Bl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Db.texture,Ub),this._reflectorBaseNode=e.reflector||new Vb(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Zi(new Ob({defaultTexture:Db.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class Vb extends ui{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Xe,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Js.RENDER:Js.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Pb),e.setSize(Math.round(Pb.width*r),Math.round(Pb.height*r))}setup(e){return this._updateResolution(Db,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new Ne(0,0,{type:be,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=Ke,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new Y),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&Ib)return!1;Ib=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Pb),this._updateResolution(o,s),Eb.setFromMatrixPosition(n.matrixWorld),Ab.setFromMatrixPosition(r.matrixWorld),wb.extractRotation(n.matrixWorld),Rb.set(0,0,1),Rb.applyMatrix4(wb),Bb.subVectors(Eb,Ab);let u=!1;if(!0===Bb.dot(Rb)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Ib=!1);u=!0}Bb.reflect(Rb).negate(),Bb.add(Eb),wb.extractRotation(r.matrixWorld),Cb.set(0,0,-1),Cb.applyMatrix4(wb),Cb.add(Ab),Lb.subVectors(Eb,Cb),Lb.reflect(Rb).negate(),Lb.add(Eb),a.coordinateSystem=r.coordinateSystem,a.position.copy(Bb),a.up.set(0,1,0),a.up.applyMatrix4(wb),a.up.reflect(Rb),a.lookAt(Lb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Sb.setFromNormalAndCoplanarPoint(Rb,Eb),Sb.applyMatrix4(a.matrixWorldInverse),Mb.set(Sb.normal.x,Sb.normal.y,Sb.normal.z,Sb.constant);const l=a.projectionMatrix;Fb.x=(Math.sign(Mb.x)+l.elements[8])/l.elements[0],Fb.y=(Math.sign(Mb.y)+l.elements[9])/l.elements[5],Fb.z=-1,Fb.w=(1+l.elements[10])/l.elements[14],Mb.multiplyScalar(1/Mb.dot(Fb));l.elements[2]=Mb.x,l.elements[6]=Mb.y,l.elements[10]=s.coordinateSystem===h?Mb.z-0:Mb.z+1-0,l.elements[14]=Mb.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,Ib=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const kb=new _e(-1,1,1,-1,0,1);class Gb extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Ye([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Ye(t,2))}}const zb=new Gb;class $b extends ne{constructor(e=null){super(zb,e),this.camera=kb,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,kb)}render(e){e.render(this,kb)}}const Wb=new t;class Hb extends Bl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new Ne(t,r,s);super(i.texture,Rl()),this.isRTTNode=!0,this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new $b(new Qp),this.updateBeforeType=Js.RENDER}get autoResize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoResize){const t=e.getPixelRatio(),r=e.getSize(Wb),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Bl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const qb=(e,...t)=>Zi(new Hb(Zi(e),...t)),jb=un(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=bn(e.x,e.y.oneMinus()).mul(2).sub(1),i=En(vn(e,t),1)):i=En(vn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=En(r.mul(i));return n.xyz.div(n.w)}),Xb=un(([e,t])=>{const r=t.mul(En(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return bn(s.x,s.y.oneMinus())}),Kb=un(([e,t,r])=>{const s=Al(Pl(t)),i=xn(e.mul(s)).toVar(),n=Pl(t,i).toVar(),a=Pl(t,i.sub(xn(2,0))).toVar(),o=Pl(t,i.sub(xn(1,0))).toVar(),u=Pl(t,i.add(xn(1,0))).toVar(),l=Pl(t,i.add(xn(2,0))).toVar(),d=Pl(t,i.add(xn(0,2))).toVar(),c=Pl(t,i.add(xn(0,1))).toVar(),h=Pl(t,i.sub(xn(0,1))).toVar(),p=Pl(t,i.sub(xn(0,2))).toVar(),g=Mo(Ba(gn(2).mul(o).sub(a),n)).toVar(),m=Mo(Ba(gn(2).mul(u).sub(l),n)).toVar(),f=Mo(Ba(gn(2).mul(c).sub(d),n)).toVar(),y=Mo(Ba(gn(2).mul(h).sub(p),n)).toVar(),b=jb(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(jb(e.sub(bn(gn(1).div(s.x),0)),o,r)),b.negate().add(jb(e.add(bn(gn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(jb(e.add(bn(0,gn(1).div(s.y))),c,r)),b.negate().add(jb(e.sub(bn(0,gn(1).div(s.y))),h,r)));return vo(Qo(x,T))}),Yb=un(([e])=>No(gn(52.9829189).mul(No(Yo(e,bn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),Qb=un(([e,t,r])=>{const s=gn(2.399963229728653),i=bo(gn(e).add(.5).div(gn(t))),n=gn(e).mul(s).add(r);return bn(Ro(n),So(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class Zb extends ui{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Rl())}sample(e){return this.callback(e)}}class Jb extends ui{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===Jb.OBJECT?this.updateType=Js.OBJECT:e===Jb.MATERIAL?this.updateType=Js.RENDER:e===Jb.BEFORE_OBJECT?this.updateBeforeType=Js.OBJECT:e===Jb.BEFORE_MATERIAL&&(this.updateBeforeType=Js.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}Jb.OBJECT="object",Jb.MATERIAL="material",Jb.BEFORE_OBJECT="beforeObject",Jb.BEFORE_MATERIAL="beforeMaterial";const ex=(e,t)=>new Jb(e,t).toStack();class tx extends W{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class rx extends Ae{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class sx extends ui{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const ix=sn(sx),nx=new L,ax=new a;class ox extends ui{static get type(){return"SceneNode"}constructor(e=ox.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===ox.BACKGROUND_BLURRINESS?s=fc("backgroundBlurriness","float",r):t===ox.BACKGROUND_INTENSITY?s=fc("backgroundIntensity","float",r):t===ox.BACKGROUND_ROTATION?s=_a("mat4").setName("backgroundRotation").setGroup(ba).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Qe?(nx.copy(r.backgroundRotation),nx.x*=-1,nx.y*=-1,nx.z*=-1,ax.makeRotationFromEuler(nx)):ax.identity(),ax}):o("SceneNode: Unknown scope:",t),s}}ox.BACKGROUND_BLURRINESS="backgroundBlurriness",ox.BACKGROUND_INTENSITY="backgroundIntensity",ox.BACKGROUND_ROTATION="backgroundRotation";const ux=sn(ox,ox.BACKGROUND_BLURRINESS),lx=sn(ox,ox.BACKGROUND_INTENSITY),dx=sn(ox,ox.BACKGROUND_ROTATION);class cx extends Bl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=ti.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(ti.READ_WRITE)}toReadOnly(){return this.setAccess(ti.READ_ONLY)}toWriteOnly(){return this.setAccess(ti.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e.mipLevel=this.mipLevel,e}}const hx=rn(cx).setParameterLength(1,3),px=un(({texture:e,uv:t})=>{const r=1e-4,s=vn().toVar();return cn(t.x.lessThan(r),()=>{s.assign(vn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(vn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(vn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(vn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(vn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(vn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(vn(-.01,0,0))).r.sub(e.sample(t.add(vn(r,0,0))).r),n=e.sample(t.add(vn(0,-.01,0))).r.sub(e.sample(t.add(vn(0,r,0))).r),a=e.sample(t.add(vn(0,0,-.01))).r.sub(e.sample(t.add(vn(0,0,r))).r);s.assign(vn(i,n,a))}),s.normalize()});class gx extends Bl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return vn(.5,.5,.5)}setUpdateMatrix(){}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return px({texture:this,uv:e})}}const mx=rn(gx).setParameterLength(1,3);class fx extends mc{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const yx=new WeakMap;class bx extends ci{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Js.OBJECT,this.updateAfterType=Js.OBJECT,this.previousModelWorldMatrix=_a(new a),this.previousProjectionMatrix=_a(new a).setGroup(ba),this.previousCameraViewMatrix=_a(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Tx(r);this.previousModelWorldMatrix.value.copy(s);const i=xx(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){Tx(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?rd:_a(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Ed).mul(Ld),s=this.previousProjectionMatrix.mul(t).mul(Fd),i=r.xy.div(r.w),n=s.xy.div(s.w);return Ba(i,n)}}function xx(e){let t=yx.get(e);return void 0===t&&(t={},yx.set(e,t)),t}function Tx(e,t=0){const r=xx(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const _x=sn(bx),vx=un(([e])=>Ex(e.rgb)),Nx=un(([e,t=gn(1)])=>t.mix(Ex(e.rgb),e.rgb)),Sx=un(([e,t=gn(1)])=>{const r=Ma(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return nu(e.rgb,s,i)}),Rx=un(([e,t=gn(1)])=>{const r=vn(.57735,.57735,.57735),s=t.cos();return vn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Yo(r,e.rgb).mul(s.oneMinus())))))}),Ex=(e,t=vn(p.getLuminanceCoefficients(new r)))=>Yo(e,t),Ax=un(([e,t=vn(1),s=vn(0),i=vn(1),n=gn(1),a=vn(p.getLuminanceCoefficients(new r,Se))])=>{const o=e.rgb.dot(vn(a)),u=Ho(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return cn(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),cn(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),cn(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),En(u.rgb,e.a)});class wx extends ci{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Cx=rn(wx).setParameterLength(2);let Mx=null;class Bx extends _p{static get type(){return"ViewportSharedTextureNode"}constructor(e=Hl,t=null){null===Mx&&(Mx=new X),super(e,t,Mx)}getTextureForReference(){return Mx}updateReference(){return this}}const Lx=rn(Bx).setParameterLength(0,2),Fx=new t;class Px extends Bl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Dx extends Px{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}class Ux extends ci{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new Y;i.isRenderTargetTexture=!0,i.name="depth";const n=new Ne(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:be,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=_a(0),this._cameraFar=_a(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Js.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=new Dx(this,e),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=new Dx(this,e,!0),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Lp(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Mp(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getOutputBufferType(),this.scope===Ux.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Fx.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Fx)),this._pixelRatio=i,this.setSize(Fx.width,Fx.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:Tu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Ux.COLOR="color",Ux.DEPTH="depth";class Ix extends Ux{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Ux.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)}),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Qp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=M;const t=$d.negate(),r=rd.mul(Ed),s=gn(1),i=r.mul(En(Ld,1)),n=r.mul(En(Ld.add(t),1)),a=vo(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=En(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Ox=un(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Vx=un(([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp()).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),kx=un(([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)}).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Gx=un(([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)}),zx=un(([e,t])=>{const r=Bn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Bn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Gx(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),$x=Bn(vn(1.6605,-.1246,-.0182),vn(-.5876,1.1329,-.1006),vn(-.0728,-.0083,1.1187)),Wx=Bn(vn(.6274,.0691,.0164),vn(.3293,.9195,.088),vn(.0433,.0113,.8956)),Hx=un(([e])=>{const t=vn(e).toVar(),r=vn(t.mul(t)).toVar(),s=vn(r.mul(r)).toVar();return gn(15.5).mul(s.mul(r)).sub(La(40.14,s.mul(t))).add(La(31.96,s).sub(La(6.868,r.mul(t))).add(La(.4298,r).add(La(.1191,t).sub(.00232))))}),qx=un(([e,t])=>{const r=vn(e).toVar(),s=Bn(vn(.856627153315983,.137318972929847,.11189821299995),vn(.0951212405381588,.761241990602591,.0767994186031903),vn(.0482516061458583,.101439036467562,.811302368396859)),i=Bn(vn(1.1271005818144368,-.1413297634984383,-.14132976349843826),vn(-.11060664309660323,1.157823702216272,-.11060664309660294),vn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=gn(-12.47393),a=gn(4.026069);return r.mulAssign(t),r.assign(Wx.mul(r)),r.assign(s.mul(r)),r.assign(Ho(r,1e-10)),r.assign(yo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(au(r,0,1)),r.assign(Hx(r)),r.assign(i.mul(r)),r.assign(Zo(Ho(vn(0),r),vn(2.2))),r.assign($x.mul(r)),r.assign(au(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),jx=un(([e,t])=>{const r=gn(.76),s=gn(.15);e=e.mul(t);const i=Wo(e.r,Wo(e.g,e.b)),n=bu(i.lessThan(.08),i.sub(La(6.25,i.mul(i))),.04);e.subAssign(n);const a=Ho(e.r,Ho(e.g,e.b));cn(a.lessThan(r),()=>e);const o=Ba(1,r),u=Ba(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=Ba(1,Fa(1,s.mul(a.sub(u)).add(1)));return nu(e,vn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class Xx extends ui{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const Kx=rn(Xx).setParameterLength(1,3);class Yx extends Xx{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const Qx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Zx extends ui{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new u,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:gn()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Ks(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Ys(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const Jx=rn(Zx).setParameterLength(1);class eT extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class tT{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const rT=new eT;class sT extends ui{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new eT,this._output=Jx(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=Jx(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=Jx(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new tT(this),t=rT.get("THREE"),r=rT.get("TSL"),s=this.getMethod(),i=[e,this._local,rT,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:gn()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[Us(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Is(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const iT=rn(sT).setParameterLength(1,2);function nT(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Ud.z).negate()}const aT=un(([e,t],r)=>{const s=nT(r);return lu(e,t,s)}),oT=un(([e],t)=>{const r=nT(t);return e.mul(e,r,r).negate().exp().oneMinus()}),uT=un(([e,t],r)=>{const s=nT(r),i=t.sub(Pd.y).max(0).toConst().mul(s).toConst();return e.mul(e,i,i).negate().exp().oneMinus()}),lT=un(([e,t])=>En(t.toFloat().mix(ia.rgb,e.toVec3()),ia.a));let dT=null,cT=null;class hT extends ui{static get type(){return"RangeNode"}constructor(e=gn(),t=gn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(qs(t.value)),i=e.getTypeLength(qs(r.value));return s>i?s:i}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Error('THREE.TSL: No "ConstNode" found in node graph.');return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(qs(a)),d=e.getTypeLength(qs(o));dT=dT||new s,cT=cT||new s,dT.setScalar(0),cT.setScalar(0),1===u?dT.setScalar(a):a.isColor?dT.set(a.r,a.g,a.b,1):dT.set(a.x,a.y,a.z||0,a.w||0),1===d?cT.setScalar(o):o.isColor?cT.set(o.r,o.g,o.b,1):cT.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew gT(e,t),fT=mT("numWorkgroups","uvec3"),yT=mT("workgroupId","uvec3"),bT=mT("globalId","uvec3"),xT=mT("localId","uvec3"),TT=mT("subgroupSize","uint");const _T=rn(class extends ui{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class vT extends li{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class NT extends ui{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new vT(this,e)}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class ST extends ui{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=gl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}ST.ATOMIC_LOAD="atomicLoad",ST.ATOMIC_STORE="atomicStore",ST.ATOMIC_ADD="atomicAdd",ST.ATOMIC_SUB="atomicSub",ST.ATOMIC_MAX="atomicMax",ST.ATOMIC_MIN="atomicMin",ST.ATOMIC_AND="atomicAnd",ST.ATOMIC_OR="atomicOr",ST.ATOMIC_XOR="atomicXor";const RT=rn(ST),ET=(e,t,r)=>RT(e,t,r).toStack();class AT extends ci{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}getNodeType(e){const t=this.method;return t===AT.SUBGROUP_ELECT?"bool":t===AT.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===AT.SUBGROUP_BROADCAST||r===AT.SUBGROUP_SHUFFLE||r===AT.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===AT.SUBGROUP_SHUFFLE_XOR||r===AT.SUBGROUP_SHUFFLE_DOWN||r===AT.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}AT.SUBGROUP_ELECT="subgroupElect",AT.SUBGROUP_BALLOT="subgroupBallot",AT.SUBGROUP_ADD="subgroupAdd",AT.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",AT.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",AT.SUBGROUP_MUL="subgroupMul",AT.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",AT.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",AT.SUBGROUP_AND="subgroupAnd",AT.SUBGROUP_OR="subgroupOr",AT.SUBGROUP_XOR="subgroupXor",AT.SUBGROUP_MIN="subgroupMin",AT.SUBGROUP_MAX="subgroupMax",AT.SUBGROUP_ALL="subgroupAll",AT.SUBGROUP_ANY="subgroupAny",AT.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",AT.QUAD_SWAP_X="quadSwapX",AT.QUAD_SWAP_Y="quadSwapY",AT.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",AT.SUBGROUP_BROADCAST="subgroupBroadcast",AT.SUBGROUP_SHUFFLE="subgroupShuffle",AT.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",AT.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",AT.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",AT.QUAD_BROADCAST="quadBroadcast";const wT=nn(AT,AT.SUBGROUP_ELECT).setParameterLength(0),CT=nn(AT,AT.SUBGROUP_BALLOT).setParameterLength(1),MT=nn(AT,AT.SUBGROUP_ADD).setParameterLength(1),BT=nn(AT,AT.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),LT=nn(AT,AT.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),FT=nn(AT,AT.SUBGROUP_MUL).setParameterLength(1),PT=nn(AT,AT.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),DT=nn(AT,AT.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),UT=nn(AT,AT.SUBGROUP_AND).setParameterLength(1),IT=nn(AT,AT.SUBGROUP_OR).setParameterLength(1),OT=nn(AT,AT.SUBGROUP_XOR).setParameterLength(1),VT=nn(AT,AT.SUBGROUP_MIN).setParameterLength(1),kT=nn(AT,AT.SUBGROUP_MAX).setParameterLength(1),GT=nn(AT,AT.SUBGROUP_ALL).setParameterLength(0),zT=nn(AT,AT.SUBGROUP_ANY).setParameterLength(0),$T=nn(AT,AT.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),WT=nn(AT,AT.QUAD_SWAP_X).setParameterLength(1),HT=nn(AT,AT.QUAD_SWAP_Y).setParameterLength(1),qT=nn(AT,AT.QUAD_SWAP_DIAGONAL).setParameterLength(1),jT=nn(AT,AT.SUBGROUP_BROADCAST).setParameterLength(2),XT=nn(AT,AT.SUBGROUP_SHUFFLE).setParameterLength(2),KT=nn(AT,AT.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),YT=nn(AT,AT.SUBGROUP_SHUFFLE_UP).setParameterLength(2),QT=nn(AT,AT.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),ZT=nn(AT,AT.QUAD_BROADCAST).setParameterLength(1);let JT;function e_(e){JT=JT||new WeakMap;let t=JT.get(e);return void 0===t&&JT.set(e,t={}),t}function t_(e){const t=e_(e);return t.shadowMatrix||(t.shadowMatrix=_a("mat4").setGroup(ba).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function r_(e,t=Pd){const r=t_(e).mul(t);return r.xyz.div(r.w)}function s_(e){const t=e_(e);return t.position||(t.position=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function i_(e){const t=e_(e);return t.targetPosition||(t.targetPosition=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function n_(e){const t=e_(e);return t.viewPosition||(t.viewPosition=_a(new r).setGroup(ba).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const a_=e=>id.transformDirection(s_(e).sub(i_(e))),o_=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},u_=new WeakMap,l_=[];class d_ extends ui{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Un("vec3","totalDiffuse"),this.totalSpecularNode=Un("vec3","totalSpecular"),this.outgoingLightNode=Un("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Zi(e));else{let s=null;if(null!==r&&(s=o_(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;u_.has(e)?s=u_.get(e):(s=new r(e),u_.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getNodeProperties(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=vn(null!==l?l.mix(g,u):u)),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class c_ extends ui{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Js.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){h_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Pd)}}const h_=Un("vec3","shadowPositionWorld");function p_(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function g_(e,t){return t=p_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function m_(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function f_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function y_(e,t){return t=f_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function b_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function x_(e,t,r){return r=y_(t,r=g_(e,r))}function T_(e,t,r){m_(e,r),b_(t,r)}var __=Object.freeze({__proto__:null,resetRendererAndSceneState:x_,resetRendererState:g_,resetSceneState:y_,restoreRendererAndSceneState:T_,restoreRendererState:m_,restoreSceneState:b_,saveRendererAndSceneState:function(e,t,r={}){return r=f_(t,r=p_(e,r))},saveRendererState:p_,saveSceneState:f_});const v_=new WeakMap,N_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),S_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=fc("mapSize","vec2",r).setGroup(ba),a=fc("radius","float",r).setGroup(ba),o=bn(1).div(n),u=a.mul(o.x),l=Yb(jl.xy).mul(6.28318530718);return Ma(i(t.xy.add(Qb(0,5,l).mul(u)),t.z),i(t.xy.add(Qb(1,5,l).mul(u)),t.z),i(t.xy.add(Qb(2,5,l).mul(u)),t.z),i(t.xy.add(Qb(3,5,l).mul(u)),t.z),i(t.xy.add(Qb(4,5,l).mul(u)),t.z)).mul(.2)}),R_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=fc("mapSize","vec2",r).setGroup(ba),a=bn(1).div(n),o=a.x,u=a.y,l=t.xy,d=No(l.mul(n).add(.5));return l.subAssign(d.mul(a)),Ma(i(l,t.z),i(l.add(bn(o,0)),t.z),i(l.add(bn(0,u)),t.z),i(l.add(a),t.z),nu(i(l.add(bn(o.negate(),0)),t.z),i(l.add(bn(o.mul(2),0)),t.z),d.x),nu(i(l.add(bn(o.negate(),u)),t.z),i(l.add(bn(o.mul(2),u)),t.z),d.x),nu(i(l.add(bn(0,u.negate())),t.z),i(l.add(bn(0,u.mul(2))),t.z),d.y),nu(i(l.add(bn(o,u.negate())),t.z),i(l.add(bn(o,u.mul(2))),t.z),d.y),nu(nu(i(l.add(bn(o.negate(),u.negate())),t.z),i(l.add(bn(o.mul(2),u.negate())),t.z),d.x),nu(i(l.add(bn(o.negate(),u.mul(2))),t.z),i(l.add(bn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),E_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e).sample(t.xy);e.isArrayTexture&&(s=s.depth(r)),s=s.rg;const i=s.x,n=Ho(1e-7,s.y.mul(s.y)),a=qo(t.z,i);cn(a.equal(1),()=>gn(1));const o=t.z.sub(i);let u=n.div(n.add(o.mul(o)));return u=au(Ba(u,.3).div(.65)),Ho(a,u)}),A_=e=>{let t=v_.get(e);return void 0===t&&(t=new Qp,t.colorNode=En(0,0,0,1),t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.blending=ee,t.fog=!1,v_.set(e,t)),t},w_=e=>{const t=v_.get(e);void 0!==t&&(t.dispose(),v_.delete(e))},C_=new Yf,M_=[],B_=(e,t,r,s)=>{M_[0]=e,M_[1]=t;let i=C_.get(M_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ze)&&(s&&(Xs(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,C_.set(M_,i)),M_[0]=null,M_[1]=null,i},L_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanVertical"),a=gn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));up({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(jl.xy,bn(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),F_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanHorizontal"),a=gn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));up({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(jl.xy,bn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(Ma(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),P_=[N_,S_,R_,E_];let D_;const U_=new $b;class I_ extends c_{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._currentShadowType=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n});return a.select(o,gn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=fc("bias","float",r).setGroup(ba);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===h&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=fc("near","float",r.camera).setGroup(ba),s=fc("far","float",r.camera).setGroup(ba);n=Fp(e.negate(),t,s)}return a=vn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return P_[e]}setupRenderTarget(e,t){const r=new Y(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=Je;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t,camera:r}=e,{light:s,shadow:i}=this,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(i,e),o=t.shadowMap.type;if(o===et||o===tt?(n.minFilter=oe,n.magFilter=oe):(n.minFilter=w,n.magFilter=w),i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),o===Ze&&!0!==i.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}));let t=Fl(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Fl(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const s=fc("blurSamples","float",i).setGroup(ba),o=fc("radius","float",i).setGroup(ba),u=fc("mapSize","vec2",i).setGroup(ba);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Qp);l.fragmentNode=L_({samples:s,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Qp),l.fragmentNode=F_({samples:s,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const u=fc("intensity","float",i).setGroup(ba),l=fc("normalBias","float",i).setGroup(ba),d=t_(s).mul(h_.add(Xd.mul(l))),c=this.setupShadowCoord(e,d),h=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===h)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const p=o===Ze&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,g=this.setupShadowFilter(e,{filterFn:h,shadowTexture:a.texture,depthTexture:p,shadowCoord:c,shadow:i,depthLayer:this.depthLayer});let m,f;!0===t.shadowMap.transmitted&&(a.texture.isCubeTexture?m=pc(a.texture,c.xyz):(m=Fl(a.texture,c),n.isArrayTexture&&(m=m.depth(this.depthLayer)))),f=m?nu(1,g.rgb.mix(m,1),u.mul(m.a)).toVar():nu(1,g,u).toVar(),this.shadowMap=a,this.shadow.map=a;const y=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return m&&f.toInspector(`${y} / Color`,()=>this.shadowMap.texture.isCubeTexture?pc(this.shadowMap.texture):Fl(this.shadowMap.texture)),f.toInspector(`${y} / Depth`,()=>this.shadowMap.texture.isCubeTexture?pc(this.shadowMap.texture).r.oneMinus():Pl(this.shadowMap.depthTexture,Rl().mul(Al(Fl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return un(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");D_=x_(i,n,D_),n.overrideMaterial=A_(r),i.setRenderObjectFunction(B_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===Ze&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,T_(i,n,D_)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),U_.material=this.vsmMaterialVertical,U_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),U_.material=this.vsmMaterialHorizontal,U_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,w_(this.light),this.shadowMap&&(this.shadowMap.dispose(),this.shadowMap=null),null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null)}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const O_=(e,t)=>new I_(e,t),V_=new e,k_=new a,G_=new r,z_=new r,$_=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],W_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],H_=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],q_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],j_=un(({depthTexture:e,bd3D:t,dp:r})=>pc(e,t).compare(r)),X_=un(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=fc("radius","float",s).setGroup(ba),n=fc("mapSize","vec2",s).setGroup(ba),a=i.div(n.x),o=Mo(t),u=vo(Qo(t,o.x.greaterThan(o.z).select(vn(0,1,0),vn(1,0,0)))),l=Qo(t,u),d=Yb(jl.xy).mul(6.28318530718),c=Qb(0,5,d),h=Qb(1,5,d),p=Qb(2,5,d),g=Qb(3,5,d),m=Qb(4,5,d);return pc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(pc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),K_=un(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toConst(),n=i.abs().toConst(),a=n.x.max(n.y).max(n.z),o=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.near),u=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.far),l=fc("bias","float",s).setGroup(ba),d=gn(1).toVar();return cn(a.sub(u).lessThanEqual(0).and(a.sub(o).greaterThanEqual(0)),()=>{const r=Bp(a.negate(),o,u);r.addAssign(l);const n=i.normalize();d.assign(e({depthTexture:t,bd3D:n,dp:r,shadow:s}))}),d});class Y_ extends I_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===rt?j_:X_}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return K_({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new st(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=Je;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?$_:H_,d=u?W_:q_;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(V_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),G_.setFromMatrixPosition(s.matrixWorld),a.position.copy(G_),z_.copy(a.position),z_.add(l[e]),a.up.copy(d[e]),a.lookAt(z_),a.updateMatrixWorld(),o.makeTranslation(-G_.x,-G_.y,-G_.z),k_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(k_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const Q_=(e,t)=>new Y_(e,t);class Z_ extends mp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||_a(this.color).setGroup(ba),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Js.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return n_(this.light).sub(e.context.positionView||Ud)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return O_(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Zi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const J_=un(({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)}),ev=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=J_({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class tv extends Z_{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(2).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return Q_(this.light)}setupDirect(e){return ev({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const rv=un(([e=Rl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),sv=un(([e=Rl()],{renderer:t,material:r})=>{const s=iu(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=gn(s.fwidth()).toVar();i=lu(e.oneMinus(),e.add(1),s).oneMinus()}else i=bu(s.greaterThan(1),0,1);return i}),iv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=yn(e).toVar();return bu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),nv=un(([e,t])=>{const r=yn(t).toVar(),s=gn(e).toVar();return bu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),av=un(([e])=>{const t=gn(e).toVar();return mn(To(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),ov=un(([e,t])=>{const r=gn(e).toVar();return t.assign(av(r)),r.sub(gn(t))}),uv=gb([un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=gn(s).toVar(),l=gn(r).toVar(),d=gn(t).toVar(),c=gn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=vn(s).toVar(),l=vn(r).toVar(),d=vn(t).toVar(),c=vn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),lv=gb([un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=gn(o).toVar(),m=gn(a).toVar(),f=gn(n).toVar(),y=gn(i).toVar(),b=gn(s).toVar(),x=gn(r).toVar(),T=gn(t).toVar(),_=gn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=vn(o).toVar(),m=vn(a).toVar(),f=vn(n).toVar(),y=vn(i).toVar(),b=vn(s).toVar(),x=vn(r).toVar(),T=vn(t).toVar(),_=vn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),dv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=fn(e).toVar(),a=fn(n.bitAnd(fn(7))).toVar(),o=gn(iv(a.lessThan(fn(4)),i,s)).toVar(),u=gn(La(2,iv(a.lessThan(fn(4)),s,i))).toVar();return nv(o,yn(a.bitAnd(fn(1)))).add(nv(u,yn(a.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),cv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=fn(e).toVar(),u=fn(o.bitAnd(fn(15))).toVar(),l=gn(iv(u.lessThan(fn(8)),a,n)).toVar(),d=gn(iv(u.lessThan(fn(4)),n,iv(u.equal(fn(12)).or(u.equal(fn(14))),a,i))).toVar();return nv(l,yn(u.bitAnd(fn(1)))).add(nv(d,yn(u.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),hv=gb([dv,cv]),pv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=Sn(e).toVar();return vn(hv(n.x,i,s),hv(n.y,i,s),hv(n.z,i,s))}).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),gv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=Sn(e).toVar();return vn(hv(o.x,a,n,i),hv(o.y,a,n,i),hv(o.z,a,n,i))}).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),mv=gb([pv,gv]),fv=un(([e])=>{const t=gn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),yv=un(([e])=>{const t=gn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),bv=gb([fv,un(([e])=>{const t=vn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),xv=gb([yv,un(([e])=>{const t=vn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Tv=un(([e,t])=>{const r=mn(t).toVar(),s=fn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(mn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),_v=un(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Tv(r,mn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,mn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,mn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Tv(r,mn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,mn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,mn(4))),t.addAssign(e)}),vv=un(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=fn(e).toVar();return s.bitXorAssign(i),s.subAssign(Tv(i,mn(14))),n.bitXorAssign(s),n.subAssign(Tv(s,mn(11))),i.bitXorAssign(n),i.subAssign(Tv(n,mn(25))),s.bitXorAssign(i),s.subAssign(Tv(i,mn(16))),n.bitXorAssign(s),n.subAssign(Tv(s,mn(4))),i.bitXorAssign(n),i.subAssign(Tv(n,mn(14))),s.bitXorAssign(i),s.subAssign(Tv(i,mn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),Nv=un(([e])=>{const t=fn(e).toVar();return gn(t).div(gn(fn(mn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Sv=un(([e])=>{const t=gn(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),Rv=gb([un(([e])=>{const t=mn(e).toVar(),r=fn(fn(1)).toVar(),s=fn(fn(mn(3735928559)).add(r.shiftLeft(fn(2))).add(fn(13))).toVar();return vv(s.add(fn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(fn(2)).toVar(),n=fn().toVar(),a=fn().toVar(),o=fn().toVar();return n.assign(a.assign(o.assign(fn(mn(3735928559)).add(i.shiftLeft(fn(2))).add(fn(13))))),n.addAssign(fn(s)),a.addAssign(fn(r)),vv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(fn(3)).toVar(),o=fn().toVar(),u=fn().toVar(),l=fn().toVar();return o.assign(u.assign(l.assign(fn(mn(3735928559)).add(a.shiftLeft(fn(2))).add(fn(13))))),o.addAssign(fn(n)),u.addAssign(fn(i)),l.addAssign(fn(s)),vv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),un(([e,t,r,s])=>{const i=mn(s).toVar(),n=mn(r).toVar(),a=mn(t).toVar(),o=mn(e).toVar(),u=fn(fn(4)).toVar(),l=fn().toVar(),d=fn().toVar(),c=fn().toVar();return l.assign(d.assign(c.assign(fn(mn(3735928559)).add(u.shiftLeft(fn(2))).add(fn(13))))),l.addAssign(fn(o)),d.addAssign(fn(a)),c.addAssign(fn(n)),_v(l,d,c),l.addAssign(fn(i)),vv(l,d,c)}).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),un(([e,t,r,s,i])=>{const n=mn(i).toVar(),a=mn(s).toVar(),o=mn(r).toVar(),u=mn(t).toVar(),l=mn(e).toVar(),d=fn(fn(5)).toVar(),c=fn().toVar(),h=fn().toVar(),p=fn().toVar();return c.assign(h.assign(p.assign(fn(mn(3735928559)).add(d.shiftLeft(fn(2))).add(fn(13))))),c.addAssign(fn(l)),h.addAssign(fn(u)),p.addAssign(fn(o)),_v(c,h,p),c.addAssign(fn(a)),h.addAssign(fn(n)),vv(c,h,p)}).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),Ev=gb([un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(Rv(s,r)).toVar(),n=Sn().toVar();return n.x.assign(i.bitAnd(mn(255))),n.y.assign(i.shiftRight(mn(8)).bitAnd(mn(255))),n.z.assign(i.shiftRight(mn(16)).bitAnd(mn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(Rv(n,i,s)).toVar(),o=Sn().toVar();return o.x.assign(a.bitAnd(mn(255))),o.y.assign(a.shiftRight(mn(8)).bitAnd(mn(255))),o.z.assign(a.shiftRight(mn(16)).bitAnd(mn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Av=gb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(ov(t.x,r)).toVar(),n=gn(ov(t.y,s)).toVar(),a=gn(Sv(i)).toVar(),o=gn(Sv(n)).toVar(),u=gn(uv(hv(Rv(r,s),i,n),hv(Rv(r.add(mn(1)),s),i.sub(1),n),hv(Rv(r,s.add(mn(1))),i,n.sub(1)),hv(Rv(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return bv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(ov(t.x,r)).toVar(),a=gn(ov(t.y,s)).toVar(),o=gn(ov(t.z,i)).toVar(),u=gn(Sv(n)).toVar(),l=gn(Sv(a)).toVar(),d=gn(Sv(o)).toVar(),c=gn(lv(hv(Rv(r,s,i),n,a,o),hv(Rv(r.add(mn(1)),s,i),n.sub(1),a,o),hv(Rv(r,s.add(mn(1)),i),n,a.sub(1),o),hv(Rv(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),hv(Rv(r,s,i.add(mn(1))),n,a,o.sub(1)),hv(Rv(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),hv(Rv(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),hv(Rv(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return xv(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),wv=gb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(ov(t.x,r)).toVar(),n=gn(ov(t.y,s)).toVar(),a=gn(Sv(i)).toVar(),o=gn(Sv(n)).toVar(),u=vn(uv(mv(Ev(r,s),i,n),mv(Ev(r.add(mn(1)),s),i.sub(1),n),mv(Ev(r,s.add(mn(1))),i,n.sub(1)),mv(Ev(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return bv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(ov(t.x,r)).toVar(),a=gn(ov(t.y,s)).toVar(),o=gn(ov(t.z,i)).toVar(),u=gn(Sv(n)).toVar(),l=gn(Sv(a)).toVar(),d=gn(Sv(o)).toVar(),c=vn(lv(mv(Ev(r,s,i),n,a,o),mv(Ev(r.add(mn(1)),s,i),n.sub(1),a,o),mv(Ev(r,s.add(mn(1)),i),n,a.sub(1),o),mv(Ev(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),mv(Ev(r,s,i.add(mn(1))),n,a,o.sub(1)),mv(Ev(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),mv(Ev(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),mv(Ev(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return xv(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),Cv=gb([un(([e])=>{const t=gn(e).toVar(),r=mn(av(t)).toVar();return Nv(Rv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar();return Nv(Rv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar();return Nv(Rv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=En(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar(),n=mn(av(t.w)).toVar();return Nv(Rv(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Mv=gb([un(([e])=>{const t=gn(e).toVar(),r=mn(av(t)).toVar();return vn(Nv(Rv(r,mn(0))),Nv(Rv(r,mn(1))),Nv(Rv(r,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar();return vn(Nv(Rv(r,s,mn(0))),Nv(Rv(r,s,mn(1))),Nv(Rv(r,s,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar();return vn(Nv(Rv(r,s,i,mn(0))),Nv(Rv(r,s,i,mn(1))),Nv(Rv(r,s,i,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=En(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar(),n=mn(av(t.w)).toVar();return vn(Nv(Rv(r,s,i,n,mn(0))),Nv(Rv(r,s,i,n,mn(1))),Nv(Rv(r,s,i,n,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Bv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=gn(0).toVar(),l=gn(1).toVar();return up(a,()=>{u.addAssign(l.mul(Av(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Lv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(0).toVar(),l=gn(1).toVar();return up(a,()=>{u.addAssign(l.mul(wv(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Fv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar();return bn(Bv(o,a,n,i),Bv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i))}).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Pv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(Lv(o,a,n,i)).toVar(),l=gn(Bv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i)).toVar();return En(u,l)}).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Dv=gb([un(([e,t,r,s,i,n,a])=>{const o=mn(a).toVar(),u=gn(n).toVar(),l=mn(i).toVar(),d=mn(s).toVar(),c=mn(r).toVar(),h=mn(t).toVar(),p=bn(e).toVar(),g=vn(Mv(bn(h.add(d),c.add(l)))).toVar(),m=bn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=bn(bn(gn(h),gn(c)).add(m)).toVar(),y=bn(f.sub(p)).toVar();return cn(o.equal(mn(2)),()=>Mo(y.x).add(Mo(y.y))),cn(o.equal(mn(3)),()=>Ho(Mo(y.x),Mo(y.y))),Yo(y,y)}).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),un(([e,t,r,s,i,n,a,o,u])=>{const l=mn(u).toVar(),d=gn(o).toVar(),c=mn(a).toVar(),h=mn(n).toVar(),p=mn(i).toVar(),g=mn(s).toVar(),m=mn(r).toVar(),f=mn(t).toVar(),y=vn(e).toVar(),b=vn(Mv(vn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=vn(vn(gn(f),gn(m),gn(g)).add(b)).toVar(),T=vn(x.sub(y)).toVar();return cn(l.equal(mn(2)),()=>Mo(T.x).add(Mo(T.y)).add(Mo(T.z))),cn(l.equal(mn(3)),()=>Ho(Mo(T.x),Mo(T.y),Mo(T.z))),Yo(T,T)}).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Uv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=gn(1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();l.assign(Wo(l,r))})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Iv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=bn(1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Ov=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=vn(1e6,1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.z.assign(l.y),l.y.assign(r)}).ElseIf(r.lessThan(l.z),()=>{l.z.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Vv=gb([Uv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=gn(1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(Wo(d,n))})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),kv=gb([Iv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=bn(1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Gv=gb([Ov,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=vn(1e6,1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.z.assign(d.y),d.y.assign(n)}).ElseIf(n.lessThan(d.z),()=>{d.z.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),zv=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=bn(t).toVar(),p=bn(r).toVar(),g=bn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(wv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(2)),()=>{N.assign(Gv(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Lv(vn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),$v=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=vn(t).toVar(),p=vn(r).toVar(),g=vn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(wv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(2)),()=>{N.assign(Gv(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Lv(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Wv=un(([e])=>{const t=e.y,r=e.z,s=vn().toVar();return cn(t.lessThan(1e-4),()=>{s.assign(vn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(To(i)).mul(6).toVar();const n=mn(Vo(i)),a=i.sub(gn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());cn(n.equal(mn(0)),()=>{s.assign(vn(r,l,o))}).ElseIf(n.equal(mn(1)),()=>{s.assign(vn(u,r,o))}).ElseIf(n.equal(mn(2)),()=>{s.assign(vn(o,r,l))}).ElseIf(n.equal(mn(3)),()=>{s.assign(vn(o,u,r))}).ElseIf(n.equal(mn(4)),()=>{s.assign(vn(l,o,r))}).Else(()=>{s.assign(vn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Hv=un(([e])=>{const t=vn(e).toVar(),r=gn(t.x).toVar(),s=gn(t.y).toVar(),i=gn(t.z).toVar(),n=gn(Wo(r,Wo(s,i))).toVar(),a=gn(Ho(r,Ho(s,i))).toVar(),o=gn(a.sub(n)).toVar(),u=gn().toVar(),l=gn().toVar(),d=gn().toVar();return d.assign(a),cn(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),cn(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{cn(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(Ma(2,i.sub(r).div(o)))}).Else(()=>{u.assign(Ma(4,r.sub(s).div(o)))}),u.mulAssign(1/6),cn(u.lessThan(0),()=>{u.addAssign(1)})}),vn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),qv=un(([e])=>{const t=vn(e).toVar(),r=Rn(Oa(t,vn(.04045))).toVar(),s=vn(t.div(12.92)).toVar(),i=vn(Zo(Ho(t.add(vn(.055)),vn(0)).div(1.055),vn(2.4))).toVar();return nu(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),jv=(e,t)=>{e=gn(e),t=gn(t);const r=bn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return lu(e.sub(r),e.add(r),t)},Xv=(e,t,r,s)=>nu(e,t,r[s].clamp()),Kv=(e,t,r,s,i)=>nu(e,t,jv(r,s[i])),Yv=un(([e,t,r])=>{const s=vo(e).toVar(),i=Ba(gn(.5).mul(t.sub(r)),Pd).div(s).toVar(),n=Ba(gn(-.5).mul(t.sub(r)),Pd).div(s).toVar(),a=vn().toVar();a.x=s.x.greaterThan(gn(0)).select(i.x,n.x),a.y=s.y.greaterThan(gn(0)).select(i.y,n.y),a.z=s.z.greaterThan(gn(0)).select(i.z,n.z);const o=Wo(a.x,a.y,a.z).toVar();return Pd.add(s.mul(o)).toVar().sub(r)}),Qv=un(([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(La(r,r).sub(La(s,s)))),n});var Zv=Object.freeze({__proto__:null,BRDF_GGX:Dg,BRDF_Lambert:Tg,BasicPointShadowFilter:j_,BasicShadowFilter:N_,Break:lp,Const:Cu,Continue:()=>gl("continue").toStack(),DFGLUT:Og,D_GGX:Lg,Discard:ml,EPSILON:so,F_Schlick:xg,Fn:un,HALF_PI:uo,INFINITY:io,If:cn,Loop:up,NodeAccess:ti,NodeShaderStage:Zs,NodeType:ei,NodeUpdateType:Js,OnBeforeMaterialUpdate:e=>ex(Jb.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>ex(Jb.BEFORE_OBJECT,e),OnMaterialUpdate:e=>ex(Jb.MATERIAL,e),OnObjectUpdate:e=>ex(Jb.OBJECT,e),PCFShadowFilter:S_,PCFSoftShadowFilter:R_,PI:no,PI2:ao,PointShadowFilter:X_,Return:()=>gl("return").toStack(),Schlick_to_F0:Gg,ScriptableNodeResources:rT,ShaderNode:Qi,Stack:hn,Switch:(...e)=>_i.Switch(...e),TBNViewMatrix:$c,TWO_PI:oo,VSMShadowFilter:E_,V_GGX_SmithCorrelated:Mg,Var:wu,VarIntent:Mu,abs:Mo,acesFilmicToneMapping:zx,acos:wo,add:Ma,addMethodChaining:Ni,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:qx,all:lo,alphaT:Yn,and:Ga,anisotropy:Qn,anisotropyB:Jn,anisotropyT:Zn,any:co,append:e=>(d("TSL: append() has been renamed to Stack()."),hn(e)),array:Na,arrayBuffer:e=>new xi(e,"ArrayBuffer"),asin:Ao,assign:Ra,atan:Co,atomicAdd:(e,t)=>ET(ST.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>ET(ST.ATOMIC_AND,e,t),atomicFunc:ET,atomicLoad:e=>ET(ST.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>ET(ST.ATOMIC_MAX,e,t),atomicMin:(e,t)=>ET(ST.ATOMIC_MIN,e,t),atomicOr:(e,t)=>ET(ST.ATOMIC_OR,e,t),atomicStore:(e,t)=>ET(ST.ATOMIC_STORE,e,t),atomicSub:(e,t)=>ET(ST.ATOMIC_SUB,e,t),atomicXor:(e,t)=>ET(ST.ATOMIC_XOR,e,t),attenuationColor:ha,attenuationDistance:ca,attribute:Sl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new rx(e,r,s);return Wh(i,t,e)},backgroundBlurriness:ux,backgroundIntensity:lx,backgroundRotation:dx,batch:sp,bentNormalView:Hc,billboarding:Tb,bitAnd:Ha,bitNot:qa,bitOr:ja,bitXor:Xa,bitangentGeometry:Vc,bitangentLocal:kc,bitangentView:Gc,bitangentWorld:zc,bitcast:qy,blendBurn:Wp,blendColor:Xp,blendDodge:Hp,blendOverlay:jp,blendScreen:qp,blur:Gm,bool:yn,buffer:Ul,bufferAttribute:Ju,builtin:kl,builtinAOContext:Su,builtinShadowContext:Nu,bumpMap:Jc,bvec2:_n,bvec3:Rn,bvec4:Cn,bypass:ll,cache:ol,call:Aa,cameraFar:td,cameraIndex:Jl,cameraNear:ed,cameraNormalMatrix:ad,cameraPosition:od,cameraProjectionMatrix:rd,cameraProjectionMatrixInverse:sd,cameraViewMatrix:id,cameraViewport:ud,cameraWorldMatrix:nd,cbrt:su,cdl:Ax,ceil:_o,checker:rv,cineonToneMapping:kx,clamp:au,clearcoat:$n,clearcoatNormalView:Kd,clearcoatRoughness:Wn,clipSpace:Md,code:Kx,color:pn,colorSpaceToWorking:Gu,colorToDirection:e=>Zi(e).mul(2).sub(1),compute:il,computeKernel:sl,computeSkinning:(e,t=null)=>{const r=new np(e);return r.positionNode=Wh(new W(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(jh).toVar(),r.skinIndexNode=Wh(new W(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(jh).toVar(),r.skinWeightNode=Wh(new W(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(jh).toVar(),r.bindMatrixNode=_a(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=_a(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Ul(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Zi(r)},context:Tu,convert:Pn,convertColorSpace:(e,t,r)=>Zi(new Vu(Zi(e),t,r)),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():qb(e,...t),cos:Ro,countLeadingZeros:Qy,countOneBits:Zy,countTrailingZeros:Yy,cross:Qo,cubeTexture:pc,cubeTextureBase:hc,dFdx:Do,dFdy:Uo,dashSize:na,debug:xl,decrement:eo,decrementBefore:Za,defaultBuildStages:si,defaultShaderStages:ri,defined:Ki,degrees:po,deltaTime:fb,densityFogFactor:oT,depth:Dp,depthPass:(e,t,r)=>new Ux(Ux.DEPTH,e,t,r),determinant:zo,difference:Ko,diffuseColor:On,diffuseContribution:Vn,directPointLight:ev,directionToColor:qc,directionToFaceDirection:Gd,dispersion:pa,disposeShadowMaterial:w_,distance:Xo,div:Fa,dot:Yo,drawIndex:Qh,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x),element:Fn,emissive:kn,equal:Da,equirectUV:ag,exp:go,exp2:mo,exponentialHeightFogFactor:uT,expression:gl,faceDirection:kd,faceForward:du,faceforward:mu,float:gn,floatBitsToInt:e=>new Hy(e,"int","float"),floatBitsToUint:jy,floor:To,fog:lT,fract:No,frameGroup:ya,frameId:yb,frontFacing:Vd,fwidth:ko,gain:(e,t)=>e.lessThan(.5)?eb(e.mul(2),t).div(2):Ba(1,eb(La(Ba(1,e),2),t).div(2)),gapSize:aa,getConstNodeType:Yi,getCurrentStack:dn,getDirection:Im,getDistanceAttenuation:J_,getGeometryRoughness:wg,getNormalFromDepth:Kb,getParallaxCorrectNormal:Yv,getRoughness:Cg,getScreenPosition:Xb,getShIrradianceAt:Qv,getShadowMaterial:A_,getShadowRenderObjectFunction:B_,getTextureIndex:zy,getViewPosition:jb,ggxConvolution:Hm,globalId:bT,glsl:(e,t)=>Kx(e,t,"glsl"),glslFn:(e,t)=>Qx(e,t,"glsl"),grayscale:vx,greaterThan:Oa,greaterThanEqual:ka,hash:Jy,highpModelNormalViewMatrix:Cd,highpModelViewMatrix:wd,hue:Rx,increment:Ja,incrementBefore:Qa,inspector:vl,instance:Jh,instanceIndex:jh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new tx(e,r,s);return Wh(i,t,e)},instancedBufferAttribute:el,instancedDynamicBufferAttribute:tl,instancedMesh:tp,int:mn,intBitsToFloat:e=>new Hy(e,"float","int"),interleavedGradientNoise:Yb,inverse:$o,inverseSqrt:xo,inversesqrt:fu,invocationLocalIndex:Yh,invocationSubgroupIndex:Kh,ior:ua,iridescence:jn,iridescenceIOR:Xn,iridescenceThickness:Kn,isolate:al,ivec2:xn,ivec3:Nn,ivec4:An,js:(e,t)=>Kx(e,t,"js"),label:Ru,length:Lo,lengthSq:iu,lessThan:Ia,lessThanEqual:Va,lightPosition:s_,lightProjectionUV:r_,lightShadowMatrix:t_,lightTargetDirection:a_,lightTargetPosition:i_,lightViewPosition:n_,lightingContext:bp,lights:(e=[])=>(new d_).setLights(e),linearDepth:Up,linearToneMapping:Ox,localId:xT,log:fo,log2:yo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(fo(r.div(t)));return gn(Math.E).pow(s).mul(t).negate()},luminance:Ex,mat2:Mn,mat3:Bn,mat4:Ln,matcapUV:Mf,materialAO:Oh,materialAlphaTest:rh,materialAnisotropy:_h,materialAnisotropyVector:Vh,materialAttenuationColor:Ch,materialAttenuationDistance:wh,materialClearcoat:mh,materialClearcoatNormal:yh,materialClearcoatRoughness:fh,materialColor:sh,materialDispersion:Uh,materialEmissive:nh,materialEnvIntensity:ic,materialEnvRotation:nc,materialIOR:Ah,materialIridescence:vh,materialIridescenceIOR:Nh,materialIridescenceThickness:Sh,materialLightMap:Ih,materialLineDashOffset:Ph,materialLineDashSize:Bh,materialLineGapSize:Lh,materialLineScale:Mh,materialLineWidth:Fh,materialMetalness:ph,materialNormal:gh,materialOpacity:ah,materialPointSize:Dh,materialReference:xc,materialReflectivity:ch,materialRefractionRatio:sc,materialRotation:bh,materialRoughness:hh,materialSheen:xh,materialSheenRoughness:Th,materialShininess:ih,materialSpecular:oh,materialSpecularColor:lh,materialSpecularIntensity:uh,materialSpecularStrength:dh,materialThickness:Eh,materialTransmission:Rh,max:Ho,maxMipLevel:Cl,mediumpModelViewMatrix:Ad,metalness:zn,min:Wo,mix:nu,mixElement:hu,mod:Pa,modInt:to,modelDirection:bd,modelNormalMatrix:Sd,modelPosition:Td,modelRadius:Nd,modelScale:_d,modelViewMatrix:Ed,modelViewPosition:vd,modelViewProjection:kh,modelWorldMatrix:xd,modelWorldMatrixInverse:Rd,morphReference:gp,mrt:Wy,mul:La,mx_aastep:jv,mx_add:(e,t=gn(0))=>Ma(e,t),mx_atan2:(e=gn(0),t=gn(1))=>Co(e,t),mx_cell_noise_float:(e=Rl())=>Cv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>gn(e).sub(r).mul(t).add(r),mx_divide:(e,t=gn(1))=>Fa(e,t),mx_fractal_noise_float:(e=Rl(),t=3,r=2,s=.5,i=1)=>Bv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Rl(),t=3,r=2,s=.5,i=1)=>Fv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Rl(),t=3,r=2,s=.5,i=1)=>Lv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Rl(),t=3,r=2,s=.5,i=1)=>Pv(e,mn(t),r,s).mul(i),mx_frame:()=>yb,mx_heighttonormal:(e,t)=>(e=vn(e),t=gn(t),Jc(e,t)),mx_hsvtorgb:Wv,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=gn(1))=>Ba(t,e),mx_modulo:(e,t=gn(1))=>Pa(e,t),mx_multiply:(e,t=gn(1))=>La(e,t),mx_noise_float:(e=Rl(),t=1,r=0)=>Av(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Rl(),t=1,r=0)=>wv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Rl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return En(wv(e),Av(e.add(bn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=bn(.5,.5),r=bn(1,1),s=gn(0),i=bn(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=bn(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=gn(1))=>Zo(e,t),mx_ramp4:(e,t,r,s,i=Rl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=nu(e,t,n),u=nu(r,s,n);return nu(o,u,a)},mx_ramplr:(e,t,r=Rl())=>Xv(e,t,r,"x"),mx_ramptb:(e,t,r=Rl())=>Xv(e,t,r,"y"),mx_rgbtohsv:Hv,mx_rotate2d:(e,t)=>{e=bn(e);const r=(t=gn(t)).mul(Math.PI/180);return Pf(e,r)},mx_rotate3d:(e,t,r)=>{e=vn(e),t=gn(t),r=vn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=gn(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=gn(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Rl())=>Kv(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Rl())=>Kv(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:qv,mx_subtract:(e,t=gn(0))=>Ba(e,t),mx_timer:()=>mb,mx_transform_uv:(e=1,t=0,r=Rl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>zv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>$v(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Rl(),t=1)=>Vv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec2:(e=Rl(),t=1)=>kv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec3:(e=Rl(),t=1)=>Gv(e.convert("vec2|vec3"),t,mn(1)),negate:Fo,neutralToneMapping:jx,nodeArray:tn,nodeImmutable:sn,nodeObject:Zi,nodeObjectIntent:Ji,nodeObjects:en,nodeProxy:rn,nodeProxyIntent:nn,normalFlat:Wd,normalGeometry:zd,normalLocal:$d,normalMap:Kc,normalView:jd,normalViewGeometry:Hd,normalWorld:Xd,normalWorldGeometry:qd,normalize:vo,not:$a,notEqual:Ua,numWorkgroups:fT,objectDirection:cd,objectGroup:xa,objectPosition:pd,objectRadius:fd,objectScale:gd,objectViewPosition:md,objectWorldMatrix:hd,oneMinus:Po,or:za,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=mb)=>e.fract(),oscSine:(e=mb)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=mb)=>e.fract().round(),oscTriangle:(e=mb)=>e.add(.5).fract().mul(2).sub(1).abs(),output:ia,outputStruct:Oy,overloadingFn:gb,packHalf2x16:ib,packSnorm2x16:rb,packUnorm2x16:sb,parabola:eb,parallaxDirection:Wc,parallaxUV:(e,t)=>e.sub(Wc.mul(t)),parameter:(e,t)=>new Ly(e,t),pass:(e,t,r)=>new Ux(Ux.COLOR,e,t,r),passTexture:(e,t)=>new Px(e,t),pcurve:(e,t,r)=>Zo(Fa(Zo(e,t),Ma(Zo(e,t),Zo(Ba(1,e),r))),1/t),perspectiveDepthToViewZ:Lp,pmremTexture:mf,pointShadow:Q_,pointUV:ix,pointWidth:oa,positionGeometry:Bd,positionLocal:Ld,positionPrevious:Fd,positionView:Ud,positionViewDirection:Id,positionWorld:Pd,positionWorldDirection:Dd,posterize:Cx,pow:Zo,pow2:Jo,pow3:eu,pow4:tu,premultiplyAlpha:Kp,property:Un,quadBroadcast:ZT,quadSwapDiagonal:qT,quadSwapX:WT,quadSwapY:HT,radians:ho,rand:cu,range:pT,rangeFogFactor:aT,reciprocal:Oo,reference:fc,referenceBuffer:yc,reflect:jo,reflectVector:uc,reflectView:ac,reflector:e=>new Ob(e),refract:uu,refractVector:lc,refractView:oc,reinhardToneMapping:Vx,remap:cl,remapClamp:hl,renderGroup:ba,renderOutput:yl,rendererReference:Hu,replaceDefaultUV:function(e,t=null){return Tu(t,{getUV:e})},rotate:Pf,rotateUV:bb,roughness:Gn,round:Io,rtt:qb,sRGBTransferEOTF:Uu,sRGBTransferOETF:Iu,sample:(e,t=null)=>new Zb(e,Zi(t)),sampler:e=>(!0===e.isNode?e:Fl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Fl(e)).convert("samplerComparison"),saturate:ou,saturation:Nx,screenCoordinate:jl,screenDPR:Wl,screenSize:ql,screenUV:Hl,scriptable:iT,scriptableValue:Jx,select:bu,setCurrentStack:ln,setName:vu,shaderStages:ii,shadow:O_,shadowPositionWorld:h_,shapeCircle:sv,sharedUniformGroup:fa,sheen:Hn,sheenRoughness:qn,shiftLeft:Ka,shiftRight:Ya,shininess:sa,sign:Bo,sin:So,sinc:(e,t)=>So(no.mul(t.mul(e).sub(1))).div(no.mul(t.mul(e).sub(1))),skinning:ap,smoothstep:lu,smoothstepElement:pu,specularColor:ea,specularColorBlended:ta,specularF90:ra,spherizeUV:xb,split:(e,t)=>Zi(new gi(Zi(e),t)),spritesheetUV:vb,sqrt:bo,stack:Py,step:qo,stepElement:gu,storage:Wh,storageBarrier:()=>_T("storage").toStack(),storageTexture:hx,string:(e="")=>new xi(e,"string"),struct:(e,t=null)=>{const r=new Dy(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;emx(e,t).level(r),texture3DLoad:(...e)=>mx(...e).setSampler(!1),textureBarrier:()=>_T("texture").toStack(),textureBicubic:om,textureBicubicLevel:am,textureCubeUV:Om,textureLevel:(e,t,r)=>Fl(e,t).level(r),textureLoad:Pl,textureSize:Al,textureStore:(e,t,r)=>{const s=hx(e,t,r);return null!==r&&s.toStack(),s},thickness:da,time:mb,toneMapping:ju,toneMappingExposure:Xu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Zi(new Ix(t,r,Zi(s),Zi(i),Zi(n))),transformDirection:ru,transformNormal:Yd,transformNormalToView:Qd,transformedClearcoatNormalView:ec,transformedNormalView:Zd,transformedNormalWorld:Jd,transmission:la,transpose:Go,triNoise3D:cb,triplanarTexture:(...e)=>Nb(...e),triplanarTextures:Nb,trunc:Vo,uint:fn,uintBitsToFloat:e=>new Hy(e,"float","uint"),uniform:_a,uniformArray:Vl,uniformCubeTexture:(e=dc)=>hc(e),uniformFlow:_u,uniformGroup:ma,uniformTexture:(e=Ml)=>Fl(e),unpackHalf2x16:ub,unpackNormal:jc,unpackSnorm2x16:ab,unpackUnorm2x16:ob,unpremultiplyAlpha:Yp,userData:(e,t,r)=>new fx(e,t,r),uv:Rl,uvec2:Tn,uvec3:Sn,uvec4:wn,varying:Pu,varyingProperty:In,vec2:bn,vec3:vn,vec4:En,vectorComponents:ni,velocity:_x,vertexColor:$p,vertexIndex:qh,vertexStage:Du,vibrance:Sx,viewZToLogarithmicDepth:Fp,viewZToOrthographicDepth:Mp,viewZToPerspectiveDepth:Bp,viewport:Xl,viewportCoordinate:Yl,viewportDepthTexture:wp,viewportLinearDepth:Ip,viewportMipTexture:Np,viewportOpaqueMipTexture:Rp,viewportResolution:Zl,viewportSafeUV:_b,viewportSharedTexture:Lx,viewportSize:Kl,viewportTexture:vp,viewportUV:Ql,vogelDiskSample:Qb,wgsl:(e,t)=>Kx(e,t,"wgsl"),wgslFn:(e,t)=>Qx(e,t,"wgsl"),workgroupArray:(e,t)=>new NT("Workgroup",e,t),workgroupBarrier:()=>_T("workgroup").toStack(),workgroupId:yT,workingToColorSpace:ku,xor:Wa});const Jv=new By;class eN extends ty{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(Jv),Jv.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(Jv),Jv.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;Jv.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=En(l).mul(lx).context({getUV:()=>dx.mul(qd),getTextureLevel:()=>ux}),p=rd.element(3).element(3).equal(1),g=Fa(1,rd.element(1).element(1)).mul(3),m=p.select(Ld.mul(g),Ld),f=Ed.mul(En(m,0));let y=rd.mul(En(f.xyz,1));y=y.setZ(y.w);const b=new Qp;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=M,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ne(new it(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=En(l).mul(lx),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?Jv.set(0,0,0,1):"alpha-blend"===a&&Jv.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=Jv.r,T.g=Jv.g,T.b=Jv.b,T.a=Jv.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let tN=0;class rN{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=tN++}}class sN{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new rN(t.name,[],t.index,t.bindingsReference);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class iN{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class nN{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class aN{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class oN extends aN{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class uN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let lN=0;class dN{constructor(e=null){this.id=lN++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class cN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class hN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class pN extends hN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class gN extends hN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class mN extends hN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class fN extends hN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class yN extends hN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class bN extends hN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class xN extends hN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class TN extends hN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class _N extends pN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class vN extends gN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class NN extends mN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class SN extends fN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class RN extends yN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class EN extends bN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class AN extends xN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class wN extends TN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let CN=0;const MN=new WeakMap,BN=new WeakMap,LN=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),FN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class PN{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.types={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=Py(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new dN,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:CN++})}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===ze&&!1===e.alphaToCoverage}getBindGroupsCache(){let e=BN.get(this.renderer);return void 0===e&&(e=new Yf,BN.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new Ne(e,t,r)}createCubeRenderTarget(e,t){return new og(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new rN(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new rN(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of ii)for(const s in r[e]){const i=r[e][s],n=t[s]||(t[s]=[]);for(const e of i)!1===n.includes(e)&&n.push(e)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order);for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${FN(n.r)}, ${FN(n.g)}, ${FN(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new iN(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===R)return"int";if(t===S)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=Gs(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return LN.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ot||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Py(this.stack);const e=dn();return this.stacks.push(e),ln(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,ln(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new iN("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const a=this.structs.index++;null===r&&(r="StructType"+a),n=new cN(r,t),this.structs[s].push(n),this.types[s][r]=e,i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new nN(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new aN(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new oN(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,d(`TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new uN("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new Yx,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new Ly(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new dN,this.stack=Py();for(const r of si)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){d("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){d("Abstract function.")}getVaryings(){d("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){d("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){d("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Qp),e.build(this)}else this.addFlow("compute",e);for(const e of si){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ii){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getSharedDataFromNode(e){let t=MN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new _N(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new vN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new NN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new SN(e);else if("color"===t)s=new RN(e);else if("mat2"===t)s=new EN(e);else if("mat3"===t)s=new AN(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new wN(e)}r.cache=s}return s}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,this.getTypeFromLength(i,this.getComponentType(t)),r)):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${ut} - Node System\n`}needsPreviousData(){const e=this.renderer.getMRT();return e&&e.has("velocity")||!0===Xs(this.object).useVelocity}}class DN{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===Js.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===Js.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class UN{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}UN.isNodeFunctionInput=!0;class IN extends Z_{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:a_(this.light),lightColor:e}}}const ON=new a,VN=new a;let kN=null;class GN extends Z_{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=_a(new r).setGroup(ba),this.halfWidth=_a(new r).setGroup(ba),this.updateType=Js.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;VN.identity(),ON.copy(t.matrixWorld),ON.premultiply(r),VN.extractRotation(ON),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(VN),this.halfHeight.value.applyMatrix4(VN)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Fl(kN.LTC_FLOAT_1),r=Fl(kN.LTC_FLOAT_2)):(t=Fl(kN.LTC_HALF_1),r=Fl(kN.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:n_(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){kN=e}}class zN extends Z_{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=_a(0).setGroup(ba),this.penumbraCosNode=_a(0).setGroup(ba),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(0).setGroup(ba),this.colorNode=_a(this.color).setGroup(ba)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e,t){const{coneCosNode:r,penumbraCosNode:s}=this;return lu(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=r_(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(a_(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=J_({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=Fl(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class $N extends zN{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=Fl(r,bn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const WN=un(([e,t])=>{const r=e.abs().sub(t);return Lo(Ho(r,0)).add(Wo(Ho(r.x,r.y),0))});class HN extends zN{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=gn(0),r=this.penumbraCosNode,s=t_(this.light).mul(e.context.positionWorld||Pd);return cn(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=WN(e.xy.sub(bn(.5)),bn(.5)),n=Fa(-1,Ba(1,wo(r)).sub(1));t.assign(ou(i.mul(-2).mul(n)))}),t}}class qN extends Z_{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class jN extends Z_{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=s_(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=_a(new e).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=Xd.dot(s).mul(.5).add(.5),n=nu(r,t,i);e.context.irradiance.addAssign(n)}}class XN extends Z_{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Vl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=Qv(Xd,this.lightProbe);e.context.irradiance.addAssign(t)}}class KN{parseFunction(){d("Abstract function.")}}class YN{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}YN.isNodeFunction=!0;const QN=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,ZN=/[a-z_0-9]+/gi,JN="#pragma main";class eS extends YN{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(JN),r=-1!==t?e.slice(t+12):e,s=r.match(QN);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=ZN.exec(i));)n.push(a);const o=[];let u=0;for(;u{const r=this.backend.createNodeBuilder(e.object,this.renderer);return r.scene=e.scene,r.material=t,r.camera=e.camera,r.context.material=t,r.lightsNode=e.lightsNode,r.environmentNode=this.getEnvironmentNode(e.scene),r.fogNode=this.getFogNode(e.scene),r.clippingContext=e.clippingContext,this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview&&r.enableMultiview(),r};let n=t(e.material);try{n.build()}catch(e){n=t(new Qp),n.build(),o("TSL: "+e)}r=this._createNodeBuilderState(n),s.set(i,r)}r.usedTimes++,t.nodeBuilderState=r}return r}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new sN(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){sS[0]=e,sS[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(sS)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&iS.push(t.getCacheKey(!0)),i&&iS.push(i.getCacheKey()),n&&iS.push(n.getCacheKey()),iS.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),iS.push(this.renderer.shadowMap.enabled?1:0),iS.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Is(iS),this.callHashCache.set(sS,s),iS.length=0}return sS.length=0,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===le||r.mapping===de||r.mapping===Ee){if(e.backgroundBlurriness>0||r.mapping===Ee)return mf(r);{let e;return e=!0===r.isCubeTexture?pc(r):Fl(r),hg(e)}}if(!0===r.isTexture)return Fl(r,Hl.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("WebGPUNodes: Unsupported background configuration.",r)},s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,()=>{if(r.isFogExp2){const e=fc("color","color",r).setGroup(ba),t=fc("density","float",r).setGroup(ba);return lT(e,oT(t))}if(r.isFog){const e=fc("color","color",r).setGroup(ba),t=fc("near","float",r).setGroup(ba),s=fc("far","float",r).setGroup(ba);return lT(e,aT(t,s))}o("Renderer: Unsupported fog configuration.",r)});t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,()=>!0===r.isCubeTexture?pc(r):!0===r.isTexture?Fl(r):void o("Nodes: Unsupported environment configuration.",r));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace+","+e.xr.isPresenting}hasOutputChange(e){return rS.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?mx(e,vn(Hl,kl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Fl(e,Hl).renderOutput(t.toneMapping,t.currentColorSpace);return rS.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new DN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const aS=new je;class oS{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new mS(i.framebufferWidth,i.framebufferHeight,{format:Re,type:Ge,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),i.layers.mask=6|e.layers.mask,n.layers.mask=-5&i.layers.mask,a.layers.mask=-3&i.layers.mask;const o=e.parent,u=i.cameras;xS(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function NS(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function SS(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(this._renderTarget,this._mrt),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){return null!==this._initPromise||(this._initPromise=new Promise(async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new nS(this,r),this._animation=new Kf(this,this._nodes,this.info),this._attributes=new oy(r),this._background=new eN(this,this._nodes),this._geometries=new dy(this._attributes,this.info),this._textures=new My(this,r,this.info),this._pipelines=new yy(r,this._nodes),this._bindings=new by(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new ey(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Sy(this.lighting),this._bundles=new dS,this._renderContexts=new wy,this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._handleObjectFunction,u=this._compilationPromises,l=!0===e.isScene?e:ES;null===r&&(r=e);const d=this._renderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new oS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(e,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u,await Promise.all(p)}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=wd,t.modelNormalViewMatrix=Cd):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===wd&&e.modelNormalViewMatrix===Cd}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=_,g.viewportValue.maxDepth=v,g.viewport=!1===g.viewportValue.equals(wS),g.scissorValue.copy(x).multiplyScalar(T).floor(),g.scissor=y._scissorTest&&!1===g.scissorValue.equals(wS),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new oS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const N=t.isArrayCamera?MS:CS;t.isArrayCamera||(BS.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),N.setFromProjectionMatrix(BS,t.coordinateSystem,t.reversedDepth));const S=this._renderLists.get(e,t);if(S.begin(),this._projectObject(e,t,0,S,g.clippingContext),S.finish(),!0===this.sortObjects&&S.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=AS.width,g.height=AS.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=S.occlusionQueryCount,g.scissorValue.max(LS.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,S,g),g.camera=t,this.backend.beginRender(g);const{bundles:R,lightsNode:E,transparentDoublePass:A,transparent:w,opaque:C}=S;return R.length>0&&this._renderBundles(R,l,E),!0===this.opaque&&C.length>0&&this._renderObjects(C,t,l,E),!0===this.transparent&&w.length>0&&this._renderTransparents(w,A,t,l,E),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._height=t,this.setViewport(0,0,e,t)}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,n)}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.get(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){!0===this._initialized&&(this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach(e=>{null!==e&&e.dispose()})),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.deleteForCompute(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=LS.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=LS.copy(t).floor()}else t=LS.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t),this._inspector.copyFramebufferToTexture(e)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n),this._inspector.copyTextureToTexture(e,t)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?MS:CS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&LS.setFromMatrixPosition(e.matrixWorld).applyMatrix4(BS);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,LS.z,null,i)}}else if(e.isLineLoop)o("Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if(e.isMesh||e.isLine||e.isPoints){const n=t.isArrayCamera?MS:CS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),LS.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(BS)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=M;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=ct;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=B}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n(t.not().discard(),e))(u)}}e.depthNode&&e.depthNode.isNode&&(l=e.depthNode),e.castShadowPositionNode&&e.castShadowPositionNode.isNode?o=e.castShadowPositionNode:e.positionNode&&e.positionNode.isNode&&(o=e.positionNode),r={version:t,colorNode:u,depthNode:l,positionNode:o},this._cacheShadowNodes.set(e,r)}return r}renderObject(e,t,r,s,i,n,a,o=null,u=null){let l,d,c,h,p=!1;if(e.onBeforeRender(this,t,r,s,i,n),!0===i.allowOverride&&null!==t.overrideMaterial){const e=t.overrideMaterial;if(p=!0,l=t.overrideMaterial.colorNode,d=t.overrideMaterial.depthNode,c=t.overrideMaterial.positionNode,h=t.overrideMaterial.side,i.positionNode&&i.positionNode.isNode&&(e.positionNode=i.positionNode),e.alphaTest=i.alphaTest,e.alphaMap=i.alphaMap,e.transparent=i.transparent||i.transmission>0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);this.shadowMap.type===Ze?e.side=null!==i.shadowSide?i.shadowSide:i.side:e.side=null!==i.shadowSide?i.shadowSide:FS[i.side],null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===B&&!1===i.forceSinglePass?(i.side=M,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=ct,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=B):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){return this.backend.hasCompatibility(e)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class DS{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class US extends DS{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(ay-e%ay)%ay;var e}get buffer(){return this._buffer}update(){return!0}}class IS extends US{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let OS=0;class VS extends IS{constructor(e,t){super("UniformBuffer_"+OS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class kS extends IS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.generation=null,this.version=0},this.texture=t,this.version=t?t.version:0,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=0},e.texture=this.texture,e}}let WS=0;class HS extends $S{constructor(e,t){super(e,t),this.id=WS++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class qS extends HS{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class jS extends qS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class XS extends qS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const KS={bitcast_int_uint:new Xx("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new Xx("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},YS={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},QS={low:"lowp",medium:"mediump",high:"highp"},ZS={swizzleAssign:!0,storageBuffer:!1},JS={perspective:"smooth",linear:"noperspective"},eR={centroid:"centroid"},tR="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision highp sampler2DShadow;\nprecision highp sampler2DArrayShadow;\nprecision highp samplerCubeShadow;\n";class rR extends PN{constructor(e,t){super(e,t,new tS),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=KS[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==KS[e]&&this._include(e),YS[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`${e} ? ${t} : ${r}`}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?Tt:_t;2===s?n=i?Rt:G:3===s?n=i?Et:At:4===s&&(n=i?wt:Re);const a={Float32Array:j,Uint8Array:Ge,Uint16Array:St,Uint32Array:S,Int8Array:Nt,Int16Array:vt,Int32Array:R,Uint8ClampedArray:Ge},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=QS[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=QS[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${JS[s.interpolationType]||s.interpolationType} ${eR[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${JS[e.interpolationType]||e.interpolationType} ${eR[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce((e,t)=>e*t,1)}u`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=ZS[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}ZS[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new qS(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new jS(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new XS(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new VS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new zS(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let sR=null,iR=null;class nR{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[Ct.RENDER]:null,[Ct.COMPUTE]:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?Ct.COMPUTE:Ct.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return sR=sR||new t,this.renderer.getDrawingBufferSize(sR)}setScissorTest(){}getClearColor(){const e=this.renderer;return iR=iR||new By,e.getClearColor(iR),iR.getRGB(iR),iR}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Mt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${ut} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}deleteBindGroupData(){}dispose(){}}let aR,oR,uR=0;class lR{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class dR{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===R,id:uR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new lR(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e0?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()})}}let pR,gR,mR,fR=!1;class yR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===fR&&(this._init(),fR=!0)}_init(){const e=this.gl;pR={[Vr]:e.REPEAT,[xe]:e.CLAMP_TO_EDGE,[Or]:e.MIRRORED_REPEAT},gR={[w]:e.NEAREST,[kr]:e.NEAREST_MIPMAP_NEAREST,[at]:e.NEAREST_MIPMAP_LINEAR,[oe]:e.LINEAR,[nt]:e.LINEAR_MIPMAP_NEAREST,[K]:e.LINEAR_MIPMAP_LINEAR},mR={[qr]:e.NEVER,[Hr]:e.ALWAYS,[A]:e.LESS,[Je]:e.LEQUAL,[Wr]:e.EQUAL,[$r]:e.GEQUAL,[zr]:e.GREATER,[Gr]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];d("WebGLBackend: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}if(t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)}return t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this,n=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,o),r.texParameteri(e,r.TEXTURE_WRAP_S,pR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,pR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,pR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,gR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===oe&&u?K:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,gR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,mR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===w)return;if(t.minFilter!==at&&t.minFilter!==K)return;if(t.type===j&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(!e.isRenderTargetTexture&&void 0!==n)if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0){const t=Xr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e));i.bindRenderbuffer(i.RENDERBUFFER,null)}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();a.state.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function bR(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class xR{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class TR{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const _R={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class vR{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){o("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){o("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise(t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){o("Error checking query:",e),t(this.lastValue)}};n()})}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class RR extends nR{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.currentSamples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new xR(this),this.capabilities=new TR(this),this.attributeUtils=new dR(this),this.textureUtils=new yR(this),this.bufferRenderer=new vR(this),this.state=new cR(this),this.utils=new hR(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed")}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e._autoAllocateDepthBuffer&&!1===e.multiview&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new SR(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e)),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(v("WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):v("WebGLBackend: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()});return void t.push(i)}this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=(e.getShaderInfoLog(t)||"").trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=(s.getProgramInfoLog(e)||"").trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");o("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&d("WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;e_R[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=Ay(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const ER="point-list",AR="line-list",wR="line-strip",CR="triangle-list",MR="triangle-strip",BR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},LR="never",FR="less",PR="equal",DR="less-equal",UR="greater",IR="not-equal",OR="greater-equal",VR="always",kR="store",GR="load",zR="clear",$R="ccw",WR="cw",HR="none",qR="back",jR="uint16",XR="uint32",KR="r8unorm",YR="r8snorm",QR="r8uint",ZR="r8sint",JR="r16uint",eE="r16sint",tE="r16float",rE="rg8unorm",sE="rg8snorm",iE="rg8uint",nE="rg8sint",aE="r32uint",oE="r32sint",uE="r32float",lE="rg16uint",dE="rg16sint",cE="rg16float",hE="rgba8unorm",pE="rgba8unorm-srgb",gE="rgba8snorm",mE="rgba8uint",fE="rgba8sint",yE="bgra8unorm",bE="bgra8unorm-srgb",xE="rgb9e5ufloat",TE="rgb10a2unorm",_E="rg11b10ufloat",vE="rg32uint",NE="rg32sint",SE="rg32float",RE="rgba16uint",EE="rgba16sint",AE="rgba16float",wE="rgba32uint",CE="rgba32sint",ME="rgba32float",BE="depth16unorm",LE="depth24plus",FE="depth24plus-stencil8",PE="depth32float",DE="depth32float-stencil8",UE="bc1-rgba-unorm",IE="bc1-rgba-unorm-srgb",OE="bc2-rgba-unorm",VE="bc2-rgba-unorm-srgb",kE="bc3-rgba-unorm",GE="bc3-rgba-unorm-srgb",zE="bc4-r-unorm",$E="bc4-r-snorm",WE="bc5-rg-unorm",HE="bc5-rg-snorm",qE="bc6h-rgb-ufloat",jE="bc6h-rgb-float",XE="bc7-rgba-unorm",KE="bc7-rgba-unorm-srgb",YE="etc2-rgb8unorm",QE="etc2-rgb8unorm-srgb",ZE="etc2-rgb8a1unorm",JE="etc2-rgb8a1unorm-srgb",eA="etc2-rgba8unorm",tA="etc2-rgba8unorm-srgb",rA="eac-r11unorm",sA="eac-r11snorm",iA="eac-rg11unorm",nA="eac-rg11snorm",aA="astc-4x4-unorm",oA="astc-4x4-unorm-srgb",uA="astc-5x4-unorm",lA="astc-5x4-unorm-srgb",dA="astc-5x5-unorm",cA="astc-5x5-unorm-srgb",hA="astc-6x5-unorm",pA="astc-6x5-unorm-srgb",gA="astc-6x6-unorm",mA="astc-6x6-unorm-srgb",fA="astc-8x5-unorm",yA="astc-8x5-unorm-srgb",bA="astc-8x6-unorm",xA="astc-8x6-unorm-srgb",TA="astc-8x8-unorm",_A="astc-8x8-unorm-srgb",vA="astc-10x5-unorm",NA="astc-10x5-unorm-srgb",SA="astc-10x6-unorm",RA="astc-10x6-unorm-srgb",EA="astc-10x8-unorm",AA="astc-10x8-unorm-srgb",wA="astc-10x10-unorm",CA="astc-10x10-unorm-srgb",MA="astc-12x10-unorm",BA="astc-12x10-unorm-srgb",LA="astc-12x12-unorm",FA="astc-12x12-unorm-srgb",PA="clamp-to-edge",DA="repeat",UA="mirror-repeat",IA="linear",OA="nearest",VA="zero",kA="one",GA="src",zA="one-minus-src",$A="src-alpha",WA="one-minus-src-alpha",HA="dst",qA="one-minus-dst",jA="dst-alpha",XA="one-minus-dst-alpha",KA="src-alpha-saturated",YA="constant",QA="one-minus-constant",ZA="add",JA="subtract",ew="reverse-subtract",tw="min",rw="max",sw=0,iw=15,nw="keep",aw="zero",ow="replace",uw="invert",lw="increment-clamp",dw="decrement-clamp",cw="increment-wrap",hw="decrement-wrap",pw="storage",gw="read-only-storage",mw="write-only",fw="read-only",yw="read-write",bw="non-filtering",xw="comparison",Tw="float",_w="unfilterable-float",vw="depth",Nw="sint",Sw="uint",Rw="2d",Ew="3d",Aw="2d",ww="2d-array",Cw="cube",Mw="3d",Bw="all",Lw="vertex",Fw="instance",Pw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"},Dw={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class Uw extends $S{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class Iw extends US{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let Ow=0;class Vw extends Iw{constructor(e,t){super("StorageBuffer_"+Ow++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ti.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class kw extends ty{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:IA}),this.flipYSampler=e.createSampler({minFilter:OA}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:MR,stripIndexFormat:XR},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:MR,stripIndexFormat:XR},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Aw,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:Aw,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:zR,storeOp:kR,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0,s=null){const i=this.get(e);void 0===i.layers&&(i.layers=[]);const n=i.layers[r]||this._mipmapCreateBundles(e,t,r),a=s||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(a,n),null===s&&this.device.queue.submit([a.finish()]),i.layers[r]=n}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Aw,baseArrayLayer:r});const a=[];for(let o=1;o0)for(let t=0,n=s.length;t0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new kw(this.backend.device)),e}_generateMipmaps(e,t,r=0,s=null){this._getPassUtils().generateMipmaps(e,t,r,s)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,qw=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,jw={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class Xw extends YN{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(Hw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=qw.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class Kw extends KN{parseFunction(e){return new Xw(e)}}const Yw={[ti.READ_ONLY]:"read",[ti.WRITE_ONLY]:"write",[ti.READ_WRITE]:"read_write"},Qw={[Vr]:"repeat",[xe]:"clamp",[Or]:"mirror"},Zw={vertex:BR.VERTEX,fragment:BR.FRAGMENT,compute:BR.COMPUTE},Jw={instance:!0,swizzleAssign:!1,storageBuffer:!0},eC={"^^":"tsl_xor"},tC={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},rC={},sC={tsl_xor:new Xx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new Xx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new Xx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new Xx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new Xx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new Xx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new Xx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new Xx("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new Xx("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new Xx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new Xx("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new Xx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new Xx("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},iC={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let nC="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(nC+="diagnostic( off, derivative_uniformity );\n");class aC extends PN{constructor(e,t){super(e,t,new Kw),this.uniformGroups={},this.uniformGroupsBindings={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${Qw[e.wrapS]}S_${Qw[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=rC[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Vr?(s.push(sC.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===xe?(s.push(sC.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Or?(s.push(sC.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",rC[t]=r=new Xx(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Eu(new pl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Eu(new pl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Eu(new pl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u"){this._include("biquadraticTexture");const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${a}`),`tsl_biquadraticTexture( ${t}, ${n}( ${r} ), ${a}, u32( ${i} ) )`}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";return i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`),r=`${u}( ${a}( ${r} ) * ${u}( ${o} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction&&this.renderer.hasCompatibility(E.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===j||!1===this.isSampleCompare(e)&&e.minFilter===w&&e.magFilter===w||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"cubeDepthTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=eC[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),ti.READ_WRITE):ti.READ_ONLY:e.access}getStorageAccess(e,t){return Yw[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new XS(i.name,i.node,o,n):new qS(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new jS(i.name,i.node,o,n):"texture3D"===t&&(s=new XS(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(Zw[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new Uw(`${i.name}_sampler`,i.node,o);e.setVisibility(Zw[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?VS:Vw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|Zw[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e?(e=new zS(u,o),e.setVisibility(Zw[r]),this.uniformGroups[u]=e,l.push(e)):(e.setVisibility(e.getVisibility()|Zw[r]),-1===l.indexOf(e)&&l.push(e)),a=this.getNodeUniform(i,t);const s=a.name;e.uniforms.some(e=>e.name===s)||e.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","builtinClipSpace","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!1===this.isUnfilterable(t)&&!0!==i.node.isStorageTextureNode)&&(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=Ww(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}let s=this.uniformGroupsBindings[e];void 0===s&&(s={index:a.binding++,id:a.group},this.uniformGroupsBindings[e]=s),n[e]={index:s.index,id:s.id,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.builtinClipSpace = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return tC[e]||e}isAvailable(e){let t=Jw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),Jw[e]=t),t}_getWGSLMethod(e){return void 0!==sC[e]&&this._include(e),iC[e]}_include(e){const t=sC[e];return t.build(this),this.addInclude(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${nC}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){const[r,s,i]=t;return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class oC{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return e.depth&&(t=null!==e.depthTexture?this.getTextureFormatGPU(e.depthTexture):e.stencil?FE:LE),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.currentSamples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?ER:e.isLineSegments||e.isMesh&&!0===t.wireframe?AR:e.isLine?wR:e.isMesh?CR:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ge)return yE;if(e===be)return AE;throw new Error("Unsupported output buffer type.")}}const uC=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&uC.set(Float16Array,["float16"]);const lC=new Map([[ot,["float16"]]]),dC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class cC{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=Kr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=Bw;let o;o=t.isSampledCubeTexture?Cw:t.isSampledTexture3D?Mw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?ww:Aw,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&BR.COMPUTE&&(s.access===ti.READ_WRITE||s.access===ti.WRITE_ONLY)?e.type=pw:e.type=gw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===ti.READ_WRITE?yw:t===ti.WRITE_ONLY?mw:fw,s.texture.isArrayTexture?e.viewDimension=ww:s.texture.is3DTexture&&(e.viewDimension=Mw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=_w)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=_w:t.sampleType=vw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=Nw:e===S?t.sampleType=Sw:e===j&&(this.backend.hasFeature("float32-filterable")?t.sampleType=Tw:t.sampleType=_w)}s.isSampledCubeTexture?t.viewDimension=Cw:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=ww:s.isSampledTexture3D&&(t.viewDimension=Mw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(E.TEXTURE_COMPARE)?t.type=xw:t.type=bw),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class gC{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===ee||s.blending===ze&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures,r=e.context.mrt;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},E={},A=e.context.depth,w=e.context.stencil;if(!0!==A&&!0!==w||(!0===A&&(E.format=N,E.depthWriteEnabled=s.depthWrite,E.depthCompare=v),!0===w&&(E.stencilFront=f,E.stencilBack={},E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),R.depthStencil=E),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(R),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(R)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),e()});t.push(e)}}createBundleEncoder(e,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:s.getCurrentColorFormats(e),depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e),{layoutGPU:s}=t.layout;a.push(s)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===ht){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:ZA},r={srcFactor:i,dstFactor:n,operation:ZA}};if(e.premultipliedAlpha)switch(s){case ze:i(kA,WA,kA,WA);break;case qt:i(kA,kA,kA,kA);break;case Ht:i(VA,zA,VA,kA);break;case Wt:i(HA,WA,VA,kA)}else switch(s){case ze:i($A,WA,kA,WA);break;case qt:i($A,kA,kA,kA);break;case Ht:o(`WebGPURenderer: "SubtractiveBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`);break;case Wt:o(`WebGPURenderer: "MultiplyBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case pt:t=VA;break;case kt:t=kA;break;case Vt:t=GA;break;case Dt:t=zA;break;case $e:t=$A;break;case We:t=WA;break;case It:t=HA;break;case Pt:t=qA;break;case Ut:t=jA;break;case Ft:t=XA;break;case Ot:t=KA;break;case 211:t=YA;break;case 212:t=QA;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ss:t=LR;break;case rs:t=VR;break;case ts:t=FR;break;case es:t=DR;break;case Jr:t=PR;break;case Zr:t=OR;break;case Qr:t=UR;break;case Yr:t=IR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case cs:t=nw;break;case ds:t=aw;break;case ls:t=ow;break;case us:t=uw;break;case os:t=lw;break;case as:t=dw;break;case ns:t=cw;break;case is:t=hw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case He:t=ZA;break;case Lt:t=JA;break;case Bt:t=ew;break;case ps:t=tw;break;case hs:t=rw;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?jR:XR);let n=r.side===M;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?WR:$R,s.cullMode=r.side===B?HR:qR,s}_getColorWriteMask(e){return!0===e.colorWrite?iw:sw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=VR;else{const r=e.depthFunc;switch(r){case er:t=LR;break;case Jt:t=VR;break;case Zt:t=FR;break;case Qt:t=DR;break;case Yt:t=PR;break;case Kt:t=OR;break;case Xt:t=UR;break;case jt:t=IR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class mC extends NR{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class fC extends nR{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.defaultRenderPassdescriptor=null,this.utils=new oC(this),this.attributeUtils=new cC(this),this.bindingUtils=new pC(this),this.pipelineUtils=new gC(this),this.textureUtils=new $w(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[E.TEXTURE_COMPARE]:t}}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:t.compatibilityMode?"compatibility":void 0},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(Pw),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}else r=t.device;r.lost.then(t=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Pw.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${ut} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===be?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:GR}),this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e),n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n),l=u.pipeline;if(!0===u.error)return;const d=e.getIndex(),c=null!==d,h=e.getDrawParameters();if(null===h)return;const p=(t,r)=>{this.pipelineUtils.setPipeline(t,l),r.pipeline=l;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(p(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&v("WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===c?s.drawIndexed(i[o],n,e[o]/d.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===c){const{vertexCount:i,instanceCount:n,firstVertex:a}=h,o=e.getIndirect();if(null!==o){const t=this.get(o).buffer,r=e.getIndirectOffset(),i=Array.isArray(r)?r:[r];for(let e=0;e0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new RR(e)));super(new t(e),e),this.library=new xC,this.isWebGPURenderer=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}}class _C extends As{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class vC{constructor(e,t=En(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Qp;r.name="PostProcessing",this._quadMesh=new $b(r),this._quadMesh.name="Post-Processing",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=yl(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){v('PostProcessing: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class NC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class SC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!1,this.image={width:e,height:t,depth:r},this.magFilter=oe,this.minFilter=oe,this.wrapR=xe,this.isStorageTexture=!0,this.is3DTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class RC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!0,this.image={width:e,height:t,depth:r},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class EC extends rx{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class AC extends ws{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Cs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):o(t),this.manager.itemError(e)}},r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(o("NodeLoader: Node type not found:",e),gn()):new this.nodes[e]}}class wC extends Ms{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class CC extends Bs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new AC;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new wC;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}t.lights=this.getLightsData(e.lightsNode.getLights()),this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const Us=e=>Ds(e),Is=e=>Ds(e),Os=(...e)=>Ds(e),Vs=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),ks=new WeakMap;function Gs(e){return Vs.get(e)}function zs(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function $s(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Ws(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Hs(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function qs(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function js(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Ys(u[0]):null}function Xs(e){let t=ks.get(e);return void 0===t&&(t={},ks.set(e,t)),t}function Ks(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Qs=Object.freeze({__proto__:null,arrayBufferToBase64:Ks,base64ToArrayBuffer:Ys,getAlignmentFromType:Hs,getDataFromObject:Xs,getLengthFromType:$s,getMemoryLengthFromType:Ws,getTypeFromLength:Gs,getTypedArrayFromType:zs,getValueFromType:js,getValueType:qs,hash:Os,hashArray:Is,hashString:Us});const Zs={VERTEX:"vertex",FRAGMENT:"fragment"},Js={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},ei={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ti={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ri=["fragment","vertex"],si=["setup","analyze","generate"],ii=[...ri,"compute"],ni=["x","y","z","w"],ai={analyze:"setup",generate:"analyze"};let oi=0;class ui extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Js.NONE,this.updateBeforeType=Js.NONE,this.updateAfterType=Js.NONE,this.uuid=l.generateUUID(),this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:oi++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this),this}onFrameUpdate(e){return this.onUpdate(e,Js.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Js.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Js.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.7,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class li extends ui{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}getMemberType(e,t){return this.node.getMemberType(e,t)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class di extends ui{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class ci extends ui{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class hi extends ci{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce((t,r)=>t+e.getTypeLength(r.getNodeType(e)),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const pi=ni.join("");class gi extends ui{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(ni.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}getScope(){return this.node.getScope()}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===pi.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class mi extends ci{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");ui.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==_i?_i.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn()."),this;{const t=vi.get("assign");return this.addToStack(t(...e))}},ui.prototype.toVarIntent=function(){return this},ui.prototype.get=function(e){return new Ti(this,e)};const Ri={};function Ei(e,t,r){Ri[e]=Ri[t]=Ri[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new gi(this,e),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();ui.prototype["set"+s]=ui.prototype["set"+i]=ui.prototype["set"+n]=function(t){const r=Si(e);return new mi(this,r,Zi(t))},ui.prototype["flip"+s]=ui.prototype["flip"+i]=ui.prototype["flip"+n]=function(){const t=Si(e);return new fi(this,t)}}const Ai=["x","y","z","w"],wi=["r","g","b","a"],Ci=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ai[e],r=wi[e],s=Ci[e];Ei(t,r,s);for(let i=0;i<4;i++){t=Ai[e]+Ai[i],r=wi[e]+wi[i],s=Ci[e]+Ci[i],Ei(t,r,s);for(let n=0;n<4;n++){t=Ai[e]+Ai[i]+Ai[n],r=wi[e]+wi[i]+wi[n],s=Ci[e]+Ci[i]+Ci[n],Ei(t,r,s);for(let a=0;a<4;a++)t=Ai[e]+Ai[i]+Ai[n]+Ai[a],r=wi[e]+wi[i]+wi[n]+wi[a],s=Ci[e]+Ci[i]+Ci[n]+Ci[a],Ei(t,r,s)}}}for(let e=0;e<32;e++)Ri[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new li(this,new xi(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};Object.defineProperties(ui.prototype,Ri);const Mi=new WeakMap,Bi=function(e,t=null){for(const r in e)e[r]=Zi(e[r],t);return e},Li=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...tn(d(t)))):null!==r?(r=Zi(r),n=(...s)=>i(new e(t,...tn(d(s)),r))):n=(...r)=>i(new e(t,...tn(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Pi=function(e,...t){return new e(...tn(t))};class Di extends ui{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=Mi.get(e.constructor);void 0===s&&(s=new WeakMap,Mi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Zi(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;en(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=Zi(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return en(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield Zi(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof ui&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=Zi(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=Zi(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e),o=e.fnCall;if(e.fnCall=this,"setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return e.fnCall=o,r}}class Ui extends ui{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Di(this,e)}setup(){return this.call()}}const Ii=[!1,!0],Oi=[0,1,2,3],Vi=[-1,-2],ki=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Gi=new Map;for(const e of Ii)Gi.set(e,new xi(e));const zi=new Map;for(const e of Oi)zi.set(e,new xi(e,"uint"));const $i=new Map([...zi].map(e=>new xi(e.value,"int")));for(const e of Vi)$i.set(e,new xi(e,"int"));const Wi=new Map([...$i].map(e=>new xi(e.value)));for(const e of ki)Wi.set(e,new xi(e));for(const e of ki)Wi.set(-e,new xi(-e));const Hi={bool:Gi,uint:zi,ints:$i,float:Wi},qi=new Map([...Gi,...Wi]),ji=(e,t)=>qi.has(e)?qi.get(e):!0===e.isNode?e:new xi(e,t),Xi=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`),new xi(0,e);if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[js(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Ji(t.get(r[0]));if(1===r.length){const t=ji(r[0],e);return t.nodeType===e?Ji(t):Ji(new di(t,e))}const s=r.map(e=>ji(e));return Ji(new hi(s,e))}},Ki=e=>"object"==typeof e&&null!==e?e.value:e,Yi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Qi(e,t){return new Ui(e,t)}const Zi=(e,t=null)=>function(e,t=null){const r=qs(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Zi(ji(e,t)):"shader"===r?e.isFn?e:un(e):e}(e,t),Ji=(e,t=null)=>Zi(e,t).toVarIntent(),en=(e,t=null)=>new Bi(e,t),tn=(e,t=null)=>new Li(e,t),rn=(e,t=null,r=null,s=null)=>new Fi(e,t,r,s),sn=(e,...t)=>new Pi(e,...t),nn=(e,t=null,r=null,s={})=>new Fi(e,t,r,{...s,intent:!0});let an=0;class on extends ui{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type."),t=null)),this.shaderNode=new Qi(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+an++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function un(e,t=null){const r=new on(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const ln=e=>{_i=e},dn=()=>_i,cn=(...e)=>_i.If(...e);function hn(e){return _i&&_i.addToStack(e),e}Ni("toStack",hn);const pn=new Xi("color"),gn=new Xi("float",Hi.float),mn=new Xi("int",Hi.ints),fn=new Xi("uint",Hi.uint),yn=new Xi("bool",Hi.bool),bn=new Xi("vec2"),xn=new Xi("ivec2"),Tn=new Xi("uvec2"),_n=new Xi("bvec2"),vn=new Xi("vec3"),Nn=new Xi("ivec3"),Sn=new Xi("uvec3"),Rn=new Xi("bvec3"),En=new Xi("vec4"),An=new Xi("ivec4"),wn=new Xi("uvec4"),Cn=new Xi("bvec4"),Mn=new Xi("mat2"),Bn=new Xi("mat3"),Ln=new Xi("mat4");Ni("toColor",pn),Ni("toFloat",gn),Ni("toInt",mn),Ni("toUint",fn),Ni("toBool",yn),Ni("toVec2",bn),Ni("toIVec2",xn),Ni("toUVec2",Tn),Ni("toBVec2",_n),Ni("toVec3",vn),Ni("toIVec3",Nn),Ni("toUVec3",Sn),Ni("toBVec3",Rn),Ni("toVec4",En),Ni("toIVec4",An),Ni("toUVec4",wn),Ni("toBVec4",Cn),Ni("toMat2",Mn),Ni("toMat3",Bn),Ni("toMat4",Ln);const Fn=rn(li).setParameterLength(2),Pn=(e,t)=>Zi(new di(Zi(e),t));Ni("element",Fn),Ni("convert",Pn);Ni("append",e=>(d("TSL: .append() has been renamed to .toStack()."),hn(e)));class Dn extends ui{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}customCacheKey(){return Us(this.type+":"+(this.name||"")+":"+(this.varying?"1":"0"))}getHash(e){return this.name||super.getHash(e)}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const Un=(e,t)=>new Dn(e,t),In=(e,t)=>new Dn(e,t,!0),On=sn(Dn,"vec4","DiffuseColor"),Vn=sn(Dn,"vec3","DiffuseContribution"),kn=sn(Dn,"vec3","EmissiveColor"),Gn=sn(Dn,"float","Roughness"),zn=sn(Dn,"float","Metalness"),$n=sn(Dn,"float","Clearcoat"),Wn=sn(Dn,"float","ClearcoatRoughness"),Hn=sn(Dn,"vec3","Sheen"),qn=sn(Dn,"float","SheenRoughness"),jn=sn(Dn,"float","Iridescence"),Xn=sn(Dn,"float","IridescenceIOR"),Kn=sn(Dn,"float","IridescenceThickness"),Yn=sn(Dn,"float","AlphaT"),Qn=sn(Dn,"float","Anisotropy"),Zn=sn(Dn,"vec3","AnisotropyT"),Jn=sn(Dn,"vec3","AnisotropyB"),ea=sn(Dn,"color","SpecularColor"),ta=sn(Dn,"color","SpecularColorBlended"),ra=sn(Dn,"float","SpecularF90"),sa=sn(Dn,"float","Shininess"),ia=sn(Dn,"vec4","Output"),na=sn(Dn,"float","dashSize"),aa=sn(Dn,"float","gapSize"),oa=sn(Dn,"float","pointWidth"),ua=sn(Dn,"float","IOR"),la=sn(Dn,"float","Transmission"),da=sn(Dn,"float","Thickness"),ca=sn(Dn,"float","AttenuationDistance"),ha=sn(Dn,"color","AttenuationColor"),pa=sn(Dn,"float","Dispersion");class ga extends ui{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const ma=e=>new ga(e),fa=(e,t=0)=>new ga(e,!0,t),ya=fa("frame"),ba=fa("render"),xa=ma("object");class Ta extends yi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=xa}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),t}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const _a=(e,t)=>{const r=Yi(t||e);if(r===e&&(e=js(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new Ta(e,r)};class va extends ci{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const Na=(...e)=>{let t;if(1===e.length){const r=e[0];t=new va(null,r.length,r)}else{const r=e[0],s=e[1];t=new va(r,s)}return Zi(t)};Ni("toArray",(e,t)=>Na(Array(t).fill(e)));class Sa extends ci{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return ni.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.build(e),a=r.getNodeType(e),o=s.build(e,a),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=n);else if(i){const s=e.getVarFromNode(this,null,a),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)o("TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?tn(t):en(t[0]),new Ea(Zi(e),t));Ni("call",Aa);const wa={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ca extends ci{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ca(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const Ma=nn(Ca,"+").setParameterLength(2,1/0).setName("add"),Ba=nn(Ca,"-").setParameterLength(2,1/0).setName("sub"),La=nn(Ca,"*").setParameterLength(2,1/0).setName("mul"),Fa=nn(Ca,"/").setParameterLength(2,1/0).setName("div"),Pa=nn(Ca,"%").setParameterLength(2).setName("mod"),Da=nn(Ca,"==").setParameterLength(2).setName("equal"),Ua=nn(Ca,"!=").setParameterLength(2).setName("notEqual"),Ia=nn(Ca,"<").setParameterLength(2).setName("lessThan"),Oa=nn(Ca,">").setParameterLength(2).setName("greaterThan"),Va=nn(Ca,"<=").setParameterLength(2).setName("lessThanEqual"),ka=nn(Ca,">=").setParameterLength(2).setName("greaterThanEqual"),Ga=nn(Ca,"&&").setParameterLength(2,1/0).setName("and"),za=nn(Ca,"||").setParameterLength(2,1/0).setName("or"),$a=nn(Ca,"!").setParameterLength(1).setName("not"),Wa=nn(Ca,"^^").setParameterLength(2).setName("xor"),Ha=nn(Ca,"&").setParameterLength(2).setName("bitAnd"),qa=nn(Ca,"~").setParameterLength(1).setName("bitNot"),ja=nn(Ca,"|").setParameterLength(2).setName("bitOr"),Xa=nn(Ca,"^").setParameterLength(2).setName("bitXor"),Ka=nn(Ca,"<<").setParameterLength(2).setName("shiftLeft"),Ya=nn(Ca,">>").setParameterLength(2).setName("shiftRight"),Qa=un(([e])=>(e.addAssign(1),e)),Za=un(([e])=>(e.subAssign(1),e)),Ja=un(([e])=>{const t=mn(e).toConst();return e.addAssign(1),t}),eo=un(([e])=>{const t=mn(e).toConst();return e.subAssign(1),t});Ni("add",Ma),Ni("sub",Ba),Ni("mul",La),Ni("div",Fa),Ni("mod",Pa),Ni("equal",Da),Ni("notEqual",Ua),Ni("lessThan",Ia),Ni("greaterThan",Oa),Ni("lessThanEqual",Va),Ni("greaterThanEqual",ka),Ni("and",Ga),Ni("or",za),Ni("not",$a),Ni("xor",Wa),Ni("bitAnd",Ha),Ni("bitNot",qa),Ni("bitOr",ja),Ni("bitXor",Xa),Ni("shiftLeft",Ka),Ni("shiftRight",Ya),Ni("incrementBefore",Qa),Ni("decrementBefore",Za),Ni("increment",Ja),Ni("decrement",eo);const to=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),Pa(mn(e),mn(t)));Ni("modInt",to);class ro extends ci{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===ro.MAX||e===ro.MIN)&&arguments.length>3){let i=new ro(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===ro.LENGTH||t===ro.DISTANCE||t===ro.DOT?"float":t===ro.CROSS?"vec3":t===ro.ALL||t===ro.ANY?"bool":t===ro.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===ro.ONE_MINUS)i=Ba(1,t);else if(s===ro.RECIPROCAL)i=Fa(1,t);else if(s===ro.DIFFERENCE)i=Mo(Ba(t,r));else if(s===ro.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=En(vn(n),0):s=En(vn(s),0);const a=La(s,n).xyz;i=vo(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.generate(e,t);let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===ro.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===ro.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===ro.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==ro.MIN&&r!==ro.MAX?r===ro.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===ro.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===ro.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==ro.DFDX&&r!==ro.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}ro.ALL="all",ro.ANY="any",ro.RADIANS="radians",ro.DEGREES="degrees",ro.EXP="exp",ro.EXP2="exp2",ro.LOG="log",ro.LOG2="log2",ro.SQRT="sqrt",ro.INVERSE_SQRT="inversesqrt",ro.FLOOR="floor",ro.CEIL="ceil",ro.NORMALIZE="normalize",ro.FRACT="fract",ro.SIN="sin",ro.COS="cos",ro.TAN="tan",ro.ASIN="asin",ro.ACOS="acos",ro.ATAN="atan",ro.ABS="abs",ro.SIGN="sign",ro.LENGTH="length",ro.NEGATE="negate",ro.ONE_MINUS="oneMinus",ro.DFDX="dFdx",ro.DFDY="dFdy",ro.ROUND="round",ro.RECIPROCAL="reciprocal",ro.TRUNC="trunc",ro.FWIDTH="fwidth",ro.TRANSPOSE="transpose",ro.DETERMINANT="determinant",ro.INVERSE="inverse",ro.EQUALS="equals",ro.MIN="min",ro.MAX="max",ro.STEP="step",ro.REFLECT="reflect",ro.DISTANCE="distance",ro.DIFFERENCE="difference",ro.DOT="dot",ro.CROSS="cross",ro.POW="pow",ro.TRANSFORM_DIRECTION="transformDirection",ro.MIX="mix",ro.CLAMP="clamp",ro.REFRACT="refract",ro.SMOOTHSTEP="smoothstep",ro.FACEFORWARD="faceforward";const so=gn(1e-6),io=gn(1e6),no=gn(Math.PI),ao=gn(2*Math.PI),oo=gn(2*Math.PI),uo=gn(.5*Math.PI),lo=nn(ro,ro.ALL).setParameterLength(1),co=nn(ro,ro.ANY).setParameterLength(1),ho=nn(ro,ro.RADIANS).setParameterLength(1),po=nn(ro,ro.DEGREES).setParameterLength(1),go=nn(ro,ro.EXP).setParameterLength(1),mo=nn(ro,ro.EXP2).setParameterLength(1),fo=nn(ro,ro.LOG).setParameterLength(1),yo=nn(ro,ro.LOG2).setParameterLength(1),bo=nn(ro,ro.SQRT).setParameterLength(1),xo=nn(ro,ro.INVERSE_SQRT).setParameterLength(1),To=nn(ro,ro.FLOOR).setParameterLength(1),_o=nn(ro,ro.CEIL).setParameterLength(1),vo=nn(ro,ro.NORMALIZE).setParameterLength(1),No=nn(ro,ro.FRACT).setParameterLength(1),So=nn(ro,ro.SIN).setParameterLength(1),Ro=nn(ro,ro.COS).setParameterLength(1),Eo=nn(ro,ro.TAN).setParameterLength(1),Ao=nn(ro,ro.ASIN).setParameterLength(1),wo=nn(ro,ro.ACOS).setParameterLength(1),Co=nn(ro,ro.ATAN).setParameterLength(1,2),Mo=nn(ro,ro.ABS).setParameterLength(1),Bo=nn(ro,ro.SIGN).setParameterLength(1),Lo=nn(ro,ro.LENGTH).setParameterLength(1),Fo=nn(ro,ro.NEGATE).setParameterLength(1),Po=nn(ro,ro.ONE_MINUS).setParameterLength(1),Do=nn(ro,ro.DFDX).setParameterLength(1),Uo=nn(ro,ro.DFDY).setParameterLength(1),Io=nn(ro,ro.ROUND).setParameterLength(1),Oo=nn(ro,ro.RECIPROCAL).setParameterLength(1),Vo=nn(ro,ro.TRUNC).setParameterLength(1),ko=nn(ro,ro.FWIDTH).setParameterLength(1),Go=nn(ro,ro.TRANSPOSE).setParameterLength(1),zo=nn(ro,ro.DETERMINANT).setParameterLength(1),$o=nn(ro,ro.INVERSE).setParameterLength(1),Wo=nn(ro,ro.MIN).setParameterLength(2,1/0),Ho=nn(ro,ro.MAX).setParameterLength(2,1/0),qo=nn(ro,ro.STEP).setParameterLength(2),jo=nn(ro,ro.REFLECT).setParameterLength(2),Xo=nn(ro,ro.DISTANCE).setParameterLength(2),Ko=nn(ro,ro.DIFFERENCE).setParameterLength(2),Yo=nn(ro,ro.DOT).setParameterLength(2),Qo=nn(ro,ro.CROSS).setParameterLength(2),Zo=nn(ro,ro.POW).setParameterLength(2),Jo=e=>La(e,e),eu=e=>La(e,e,e),tu=e=>La(e,e,e,e),ru=nn(ro,ro.TRANSFORM_DIRECTION).setParameterLength(2),su=e=>La(Bo(e),Zo(Mo(e),1/3)),iu=e=>Yo(e,e),nu=nn(ro,ro.MIX).setParameterLength(3),au=(e,t=0,r=1)=>Zi(new ro(ro.CLAMP,Zi(e),Zi(t),Zi(r))),ou=e=>au(e),uu=nn(ro,ro.REFRACT).setParameterLength(3),lu=nn(ro,ro.SMOOTHSTEP).setParameterLength(3),du=nn(ro,ro.FACEFORWARD).setParameterLength(3),cu=un(([e])=>{const t=Yo(e.xy,bn(12.9898,78.233)),r=Pa(t,no);return No(So(r).mul(43758.5453))}),hu=(e,t,r)=>nu(t,r,e),pu=(e,t,r)=>lu(t,r,e),gu=(e,t)=>qo(t,e),mu=du,fu=xo;Ni("all",lo),Ni("any",co),Ni("radians",ho),Ni("degrees",po),Ni("exp",go),Ni("exp2",mo),Ni("log",fo),Ni("log2",yo),Ni("sqrt",bo),Ni("inverseSqrt",xo),Ni("floor",To),Ni("ceil",_o),Ni("normalize",vo),Ni("fract",No),Ni("sin",So),Ni("cos",Ro),Ni("tan",Eo),Ni("asin",Ao),Ni("acos",wo),Ni("atan",Co),Ni("abs",Mo),Ni("sign",Bo),Ni("length",Lo),Ni("lengthSq",iu),Ni("negate",Fo),Ni("oneMinus",Po),Ni("dFdx",Do),Ni("dFdy",Uo),Ni("round",Io),Ni("reciprocal",Oo),Ni("trunc",Vo),Ni("fwidth",ko),Ni("min",Wo),Ni("max",Ho),Ni("step",gu),Ni("reflect",jo),Ni("distance",Xo),Ni("dot",Yo),Ni("cross",Qo),Ni("pow",Zo),Ni("pow2",Jo),Ni("pow3",eu),Ni("pow4",tu),Ni("transformDirection",ru),Ni("mix",hu),Ni("clamp",au),Ni("refract",uu),Ni("smoothstep",pu),Ni("faceForward",du),Ni("difference",Ko),Ni("saturate",ou),Ni("cbrt",su),Ni("transpose",Go),Ni("determinant",zo),Ni("inverse",$o),Ni("rand",cu);class yu extends ui{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return e.flowBuildStage(this,"setup"),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.context.uniformFlow,a=e.getNodeProperties(this);a.condNode=t,a.ifNode=n?r:r.context({nodeBlock:r}),a.elseNode=s?n?s:s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?Un(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const bu=rn(yu).setParameterLength(2,3);Ni("select",bu);class xu extends ui{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const Tu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new xu(r,t)},_u=e=>Tu(e,{uniformFlow:!0}),vu=(e,t)=>Tu(e,{nodeName:t});function Nu(e,t,r=null){return Tu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function Su(e,t=null){return Tu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Ru(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),vu(e,t)}Ni("context",Tu),Ni("label",Ru),Ni("uniformFlow",_u),Ni("setName",vu),Ni("builtinShadowContext",(e,t,r)=>Nu(t,r,e)),Ni("builtinAOContext",(e,t)=>Su(t,e));class Eu extends ui{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.');return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Au=rn(Eu),wu=(e,t=null)=>Au(e,t).toStack(),Cu=(e,t=null)=>Au(e,t,!0).toStack(),Mu=e=>Au(e).setIntent(!0).toStack();Ni("toVar",wu),Ni("toConst",Cu),Ni("toVarIntent",Mu);class Bu extends ui{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const Lu=(e,t,r=null)=>Zi(new Bu(Zi(e),t,r));class Fu extends ui{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=Lu(e,"VERTEX"),this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null,this.global=!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),t.node=Lu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Zs.VERTEX);e.flowNodeFromShaderStage(Zs.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Pu=rn(Fu).setParameterLength(1,2),Du=e=>Pu(e);Ni("toVarying",Pu),Ni("toVertexStage",Du);const Uu=un(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return nu(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Iu=un(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return nu(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ou="WorkingColorSpace";class Vu extends ci{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===Ou?p.workingColorSpace:"OutputColorSpace"===t?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=En(Uu(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=En(Bn(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=En(Iu(i.rgb),i.a)),i):i}}const ku=(e,t)=>Zi(new Vu(Zi(e),Ou,t)),Gu=(e,t)=>Zi(new Vu(Zi(e),t,Ou));Ni("workingToColorSpace",ku),Ni("colorSpaceToWorking",Gu);let zu=class extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class $u extends ui{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Js.OBJECT}setGroup(e){return this.group=e,this}element(e){return new zu(this,Zi(e))}setNodeType(e){const t=_a(null,e);null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew Wu(e,t,r);class qu extends ci{static get type(){return"ToneMappingNode"}constructor(e,t=Xu,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Os(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=En(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const ju=(e,t,r)=>Zi(new qu(e,Zi(t),Zi(r))),Xu=Hu("toneMappingExposure","float");Ni("toneMapping",(e,t,r)=>ju(t,r,e));const Ku=new WeakMap;function Yu(e,t){let r=Ku.get(e);return void 0===r&&(r=new b(e,t),Ku.set(e,r)),r}class Qu extends yi{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Yu(s.array,i):Yu(s,i);const o=new y(a,r,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=Pu(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}function Zu(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Bn(new Qu(e,"vec3",9,0).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,3).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Ln(new Qu(e,"vec4",16,0).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,4).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,8).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Qu(e,t,r,s).setUsage(i)}const Ju=(e,t=null,r=0,s=0)=>Zu(e,t,r,s),el=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,f,!0),tl=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x,!0);Ni("toAttribute",e=>Ju(e.value));class rl extends ui{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Js.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const sl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;esl(e,r).setCount(t);Ni("compute",il),Ni("computeKernel",sl);class nl extends ui{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const al=e=>new nl(Zi(e));function ol(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),al(e).setParent(t)}Ni("cache",ol),Ni("isolate",al);class ul extends ui{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const ll=rn(ul).setParameterLength(2);Ni("bypass",ll);class dl extends ui{static get type(){return"RemapNode"}constructor(e,t,r,s=gn(0),i=gn(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const cl=rn(dl,null,null,{doClamp:!1}).setParameterLength(3,5),hl=rn(dl).setParameterLength(3,5);Ni("remap",cl),Ni("remapClamp",hl);class pl extends ui{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const gl=rn(pl).setParameterLength(1,2),ml=e=>(e?bu(e,gl("discard")):gl("discard")).toStack();Ni("discard",ml);class fl extends ci{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const yl=(e,t=null,r=null)=>Zi(new fl(Zi(e),t,r));Ni("renderOutput",yl);class bl extends ci{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e);if(null!==t)t(e,r);else{const t="--- TSL debug - "+e.shaderStage+" shader ---",s="-".repeat(t.length);let i="";i+="// #"+t+"#\n",i+=e.flow.code.replace(/^\t/gm,"")+"\n",i+="/* ... */ "+r+" /* ... */\n",i+="// #"+s+"#\n",_(i)}return r}}const xl=(e,t=null)=>Zi(new bl(Zi(e),t)).toStack();Ni("debug",xl);class Tl{constructor(){this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class _l extends ui{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=Js.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}getNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==Tl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function vl(e,t="",r=null){return(e=Zi(e)).before(new _l(e,t,r))}Ni("toInspector",vl);class Nl extends ui{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return Pu(this).build(e,r)}return d(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Sl=(e,t=null)=>new Nl(e,t),Rl=(e=0)=>Sl("uv"+(e>0?e:""),"vec2");class El extends ui{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const Al=rn(El).setParameterLength(1,2);class wl extends Ta{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Js.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const Cl=rn(wl).setParameterLength(1),Ml=new N;class Bl extends Ta{static get type(){return"TextureNode"}constructor(e=Ml,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Js.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Rl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=_a(this.value.matrix)),this._matrixUniform.mul(vn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=_a(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(mn(Al(this,this.levelNode).y).sub(t.y).sub(1)),t)),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");const s=un(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?Js.OBJECT:Js.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;null!==this.compareNode&&(e.renderer.hasCompatibility(E.TEXTURE_COMPARE)?n=this.compareNode:(null!==this.value.compareFunction&&this.value.compareFunction!==A&&v('TSL: Only "LessCompare" is supported for depth texture comparison fallback.'),a=this.compareNode)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:u,compareNode:l,compareStepNode:d,depthNode:c,gradNode:h,offsetNode:p}=s,g=this.generateUV(e,t),m=r?r.build(e,"float"):null,f=u?u.build(e,"float"):null,y=c?c.build(e,"int"):null,b=l?l.build(e,"float"):null,x=d?d.build(e,"float"):null,T=h?[h[0].build(e,"vec2"),h[1].build(e,"vec2")]:null,_=p?this.generateOffset(e,p):null,v=e.getVarFromNode(this);o=e.getPropertyName(v);let N=this.generateSnippet(e,i,g,m,f,y,b,T,_);null!==x&&(N=qo(gl(x,"float"),gl(N,a)).build(e,a)),e.addLineFlowCode(`${o} = ${N}`,this),n.snippet=N,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=Gu(gl(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Zi(e).mul(Cl(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===w||r.magFilter===w)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Zi(t)}level(e){const t=this.clone();return t.levelNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}size(e){return Al(this,e)}bias(e){const t=this.clone();return t.biasNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Zi(e),Zi(t)],r.referenceNode=this.getBase(),Zi(r)}depth(e){const t=this.clone();return t.depthNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}offset(e){const t=this.clone();return t.offsetNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}const Ll=rn(Bl).setParameterLength(1,4).setName("texture"),Fl=(e=Ml,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Zi(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=Ll(e,t,r,s),i},Pl=(...e)=>Fl(...e).setSampler(!1);class Dl extends Ta{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Ul=(e,t,r)=>new Dl(e,t,r);class Il extends li{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class Ol extends Dl{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?qs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Js.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rnew Ol(e,t);class kl extends ui{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}const Gl=rn(kl).setParameterLength(1);let zl,$l;class Wl extends ui{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}getNodeType(){return this.scope===Wl.DPR?"float":this.scope===Wl.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Js.NONE;return this.scope!==Wl.SIZE&&this.scope!==Wl.VIEWPORT&&this.scope!==Wl.DPR||(e=Js.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Wl.VIEWPORT?null!==t?$l.copy(t.viewport):(e.getViewport($l),$l.multiplyScalar(e.getPixelRatio())):this.scope===Wl.DPR?this._output.value=e.getPixelRatio():null!==t?(zl.width=t.width,zl.height=t.height):e.getDrawingBufferSize(zl)}setup(){const e=this.scope;let r=null;return r=e===Wl.SIZE?_a(zl||(zl=new t)):e===Wl.VIEWPORT?_a($l||($l=new s)):e===Wl.DPR?_a(1):bn(Xl.div(jl)),this._output=r,r}generate(e){if(this.scope===Wl.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(jl).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Wl.COORDINATE="coordinate",Wl.VIEWPORT="viewport",Wl.SIZE="size",Wl.UV="uv",Wl.DPR="dpr";const Hl=sn(Wl,Wl.DPR),ql=sn(Wl,Wl.UV),jl=sn(Wl,Wl.SIZE),Xl=sn(Wl,Wl.COORDINATE),Kl=sn(Wl,Wl.VIEWPORT),Yl=Kl.zw,Ql=Xl.sub(Kl.xy),Zl=Ql.div(Yl),Jl=un(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),jl),"vec2").once()(),ed=_a(0,"uint").setName("u_cameraIndex").setGroup(fa("cameraIndex")).toVarying("v_cameraIndex"),td=_a("float").setName("cameraNear").setGroup(ba).onRenderUpdate(({camera:e})=>e.near),rd=_a("float").setName("cameraFar").setGroup(ba).onRenderUpdate(({camera:e})=>e.far),sd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Vl(r).setGroup(ba).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?Gl("gl_ViewID_OVR"):ed).toConst("cameraProjectionMatrix")}else t=_a("mat4").setName("cameraProjectionMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),id=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=Vl(r).setGroup(ba).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?Gl("gl_ViewID_OVR"):ed).toConst("cameraProjectionMatrixInverse")}else t=_a("mat4").setName("cameraProjectionMatrixInverse").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),nd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Vl(r).setGroup(ba).setName("cameraViewMatrices").element(e.isMultiViewCamera?Gl("gl_ViewID_OVR"):ed).toConst("cameraViewMatrix")}else t=_a("mat4").setName("cameraViewMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),ad=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);t=Vl(r).setGroup(ba).setName("cameraWorldMatrices").element(e.isMultiViewCamera?Gl("gl_ViewID_OVR"):ed).toConst("cameraWorldMatrix")}else t=_a("mat4").setName("cameraWorldMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorld);return t}).once()(),od=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);t=Vl(r).setGroup(ba).setName("cameraNormalMatrices").element(e.isMultiViewCamera?Gl("gl_ViewID_OVR"):ed).toConst("cameraNormalMatrix")}else t=_a("mat3").setName("cameraNormalMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.normalMatrix);return t}).once()(),ud=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld));return t}).once()(),ld=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);t=Vl(r,"vec4").setGroup(ba).setName("cameraViewports").element(ed).toConst("cameraViewport")}else t=En(0,0,jl.x,jl.y).toConst("cameraViewport");return t}).once()(),dd=new C;class cd extends ui{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Js.OBJECT,this.uniformNode=new Ta(null)}getNodeType(){const e=this.scope;return e===cd.WORLD_MATRIX?"mat4":e===cd.POSITION||e===cd.VIEW_POSITION||e===cd.DIRECTION||e===cd.SCALE?"vec3":e===cd.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===cd.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===cd.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===cd.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===cd.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===cd.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===cd.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),dd.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=dd.radius}}generate(e){const t=this.scope;return t===cd.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===cd.POSITION||t===cd.VIEW_POSITION||t===cd.DIRECTION||t===cd.SCALE?this.uniformNode.nodeType="vec3":t===cd.RADIUS&&(this.uniformNode.nodeType="float"),this.uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}cd.WORLD_MATRIX="worldMatrix",cd.POSITION="position",cd.SCALE="scale",cd.VIEW_POSITION="viewPosition",cd.DIRECTION="direction",cd.RADIUS="radius";const hd=rn(cd,cd.DIRECTION).setParameterLength(1),pd=rn(cd,cd.WORLD_MATRIX).setParameterLength(1),gd=rn(cd,cd.POSITION).setParameterLength(1),md=rn(cd,cd.SCALE).setParameterLength(1),fd=rn(cd,cd.VIEW_POSITION).setParameterLength(1),yd=rn(cd,cd.RADIUS).setParameterLength(1);class bd extends cd{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const xd=sn(bd,bd.DIRECTION),Td=sn(bd,bd.WORLD_MATRIX),_d=sn(bd,bd.POSITION),vd=sn(bd,bd.SCALE),Nd=sn(bd,bd.VIEW_POSITION),Sd=sn(bd,bd.RADIUS),Rd=_a(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Ed=_a(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Ad=un(e=>e.context.modelViewMatrix||wd).once()().toVar("modelViewMatrix"),wd=nd.mul(Td),Cd=un(e=>(e.context.isHighPrecisionModelViewMatrix=!0,_a("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Md=un(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return _a("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),Bd=un(e=>"fragment"!==e.shaderStage?(v("TSL: `clipSpace` is only available in fragment stage."),En()):e.context.clipSpace.toVarying("v_clipSpace")).once()(),Ld=Sl("position","vec3"),Fd=Ld.toVarying("positionLocal"),Pd=Ld.toVarying("positionPrevious"),Dd=un(e=>Td.mul(Fd).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Ud=un(()=>Fd.transformDirection(Td).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Id=un(e=>{if("fragment"===e.shaderStage&&e.material.vertexNode){const e=id.mul(Bd);return e.xyz.div(e.w).toVar("positionView")}return e.context.setupPositionView().toVarying("v_positionView")},"vec3").once(["POSITION","VERTEX"])(),Od=un(e=>{let t;return t=e.camera.isOrthographicCamera?vn(0,0,1):Id.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class Vd extends ui{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===M?"false":e.getFrontFacing()}}const kd=sn(Vd),Gd=gn(kd).mul(2).sub(1),zd=un(([e],{material:t})=>{const r=t.side;return r===M?e=e.mul(-1):r===B&&(e=e.mul(Gd)),e}),$d=Sl("normal","vec3"),Wd=un(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),vn(0,1,0)):$d,"vec3").once()().toVar("normalLocal"),Hd=Id.dFdx().cross(Id.dFdy()).normalize().toVar("normalFlat"),qd=un(e=>{let t;return t=!0===e.material.flatShading?Hd:Zd(Wd).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),jd=un(e=>{let t=qd.transformDirection(nd);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),Xd=un(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=qd,!0!==t.flatShading&&(s=zd(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),Kd=Xd.transformDirection(nd).toVar("normalWorld"),Yd=un(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?Xd:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),Qd=un(([e,t=Td])=>{const r=Bn(t),s=e.div(vn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),Zd=un(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=Rd.mul(e);return nd.transformDirection(s)}),Jd=un(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),Xd)).once(["NORMAL","VERTEX"])(),ec=un(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),Kd)).once(["NORMAL","VERTEX"])(),tc=un(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),Yd)).once(["NORMAL","VERTEX"])(),rc=new L,sc=new a,ic=_a(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),nc=_a(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),ac=_a(new a).onReference(function(e){return e.material}).onObjectUpdate(function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(rc.copy(r),sc.makeRotationFromEuler(rc)):sc.identity(),sc}),oc=Od.negate().reflect(Xd),uc=Od.negate().refract(Xd,ic),lc=oc.transformDirection(nd).toVar("reflectVector"),dc=uc.transformDirection(nd).toVar("reflectVector"),cc=new F;class hc extends Bl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===P?lc:e.mapping===D?dc:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),vn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?vn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=vn(t.x.negate(),t.yz)),ac.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const pc=rn(hc).setParameterLength(1,4).setName("cubeTexture"),gc=(e=cc,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Zi(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=pc(e,t,r,s),i};class mc extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class fc extends ui{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Js.OBJECT}element(e){return new mc(this,Zi(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Ul(null,e,this.count):Array.isArray(this.getValueFromReference())?Vl(null,e):"texture"===e?Fl(null):"cubeTexture"===e?gc(null):_a(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew fc(e,t,r),bc=(e,t,r,s)=>new fc(e,t,s,r);class xc extends fc{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const Tc=(e,t,r=null)=>new xc(e,t,r),_c=Rl(),vc=Id.dFdx(),Nc=Id.dFdy(),Sc=_c.dFdx(),Rc=_c.dFdy(),Ec=Xd,Ac=Nc.cross(Ec),wc=Ec.cross(vc),Cc=Ac.mul(Sc.x).add(wc.mul(Rc.x)),Mc=Ac.mul(Sc.y).add(wc.mul(Rc.y)),Bc=Cc.dot(Cc).max(Mc.dot(Mc)),Lc=Bc.equal(0).select(0,Bc.inverseSqrt()),Fc=Cc.mul(Lc).toVar("tangentViewFrame"),Pc=Mc.mul(Lc).toVar("bitangentViewFrame"),Dc=Sl("tangent","vec4"),Uc=Dc.xyz.toVar("tangentLocal"),Ic=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Ad.mul(En(Uc,0)).xyz.toVarying("v_tangentView").normalize():Fc,!0!==r.flatShading&&(s=zd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Oc=Ic.transformDirection(nd).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Vc=un(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(Dc.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),kc=Vc($d.cross(Dc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Gc=Vc(Wd.cross(Uc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),zc=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Vc(Xd.cross(Ic),"v_bitangentView").normalize():Pc,!0!==r.flatShading&&(s=zd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),$c=Vc(Kd.cross(Oc),"v_bitangentWorld").normalize().toVar("bitangentWorld"),Wc=Bn(Ic,zc,Xd).toVar("TBNViewMatrix"),Hc=Od.mul(Wc),qc=un(()=>{let e=Jn.cross(Od);return e=e.cross(Jn).normalize(),e=nu(e,Xd,Qn.mul(Gn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),jc=e=>Zi(e).mul(.5).add(.5),Xc=e=>vn(e,bo(ou(gn(1).sub(Yo(e,e)))));class Kc extends ci{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=U,this.unpackNormalMode=I}setup({material:e}){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===U?s===O?i=Xc(i.xy):s===V?i=Xc(i.yw):s!==I&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==I&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.flatShading&&(t=zd(t)),i=vn(i.xy.mul(t),i.z)}let n=null;return t===k?n=Zd(i):t===U?n=Wc.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=Xd),n}}const Yc=rn(Kc).setParameterLength(1,2),Qc=un(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Rl()),forceUVContext:!0}),s=gn(r(e=>e));return bn(gn(r(e=>e.add(e.dFdx()))).sub(s),gn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),Zc=un(e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(Gd),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class Jc extends ci{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Qc({textureNode:this.textureNode,bumpScale:e});return Zc({surf_pos:Id,surf_norm:Xd,dHdxy:t})}}const eh=rn(Jc).setParameterLength(1,2),th=new Map;class rh extends ui{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=th.get(e);return void 0===r&&(r=Tc(e,t),th.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===rh.COLOR){const e=void 0!==t.color?this.getColor(r):vn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===rh.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===rh.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:gn(1);else if(r===rh.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===rh.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===rh.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===rh.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===rh.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===rh.NORMAL)t.normalMap?(s=Yc(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=G&&t.normalMap.format!=z&&t.normalMap.format!=$||(s.unpackNormalMode=O)):s=t.bumpMap?eh(this.getTexture("bump").r,this.getFloat("bumpScale")):Xd;else if(r===rh.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===rh.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===rh.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Yc(this.getTexture(r),this.getCache(r+"Scale","vec2")):Xd;else if(r===rh.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===rh.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===rh.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Mn(kh.x,kh.y,kh.y.negate(),kh.x).mul(e.rg.mul(2).sub(bn(1)).normalize().mul(e.b))}else s=kh;else if(r===rh.IRIDESCENCE_THICKNESS){const e=yc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=yc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===rh.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===rh.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===rh.IOR)s=this.getFloat(r);else if(r===rh.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===rh.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===rh.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):gn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}rh.ALPHA_TEST="alphaTest",rh.COLOR="color",rh.OPACITY="opacity",rh.SHININESS="shininess",rh.SPECULAR="specular",rh.SPECULAR_STRENGTH="specularStrength",rh.SPECULAR_INTENSITY="specularIntensity",rh.SPECULAR_COLOR="specularColor",rh.REFLECTIVITY="reflectivity",rh.ROUGHNESS="roughness",rh.METALNESS="metalness",rh.NORMAL="normal",rh.CLEARCOAT="clearcoat",rh.CLEARCOAT_ROUGHNESS="clearcoatRoughness",rh.CLEARCOAT_NORMAL="clearcoatNormal",rh.EMISSIVE="emissive",rh.ROTATION="rotation",rh.SHEEN="sheen",rh.SHEEN_ROUGHNESS="sheenRoughness",rh.ANISOTROPY="anisotropy",rh.IRIDESCENCE="iridescence",rh.IRIDESCENCE_IOR="iridescenceIOR",rh.IRIDESCENCE_THICKNESS="iridescenceThickness",rh.IOR="ior",rh.TRANSMISSION="transmission",rh.THICKNESS="thickness",rh.ATTENUATION_DISTANCE="attenuationDistance",rh.ATTENUATION_COLOR="attenuationColor",rh.LINE_SCALE="scale",rh.LINE_DASH_SIZE="dashSize",rh.LINE_GAP_SIZE="gapSize",rh.LINE_WIDTH="linewidth",rh.LINE_DASH_OFFSET="dashOffset",rh.POINT_SIZE="size",rh.DISPERSION="dispersion",rh.LIGHT_MAP="light",rh.AO="ao";const sh=sn(rh,rh.ALPHA_TEST),ih=sn(rh,rh.COLOR),nh=sn(rh,rh.SHININESS),ah=sn(rh,rh.EMISSIVE),oh=sn(rh,rh.OPACITY),uh=sn(rh,rh.SPECULAR),lh=sn(rh,rh.SPECULAR_INTENSITY),dh=sn(rh,rh.SPECULAR_COLOR),ch=sn(rh,rh.SPECULAR_STRENGTH),hh=sn(rh,rh.REFLECTIVITY),ph=sn(rh,rh.ROUGHNESS),gh=sn(rh,rh.METALNESS),mh=sn(rh,rh.NORMAL),fh=sn(rh,rh.CLEARCOAT),yh=sn(rh,rh.CLEARCOAT_ROUGHNESS),bh=sn(rh,rh.CLEARCOAT_NORMAL),xh=sn(rh,rh.ROTATION),Th=sn(rh,rh.SHEEN),_h=sn(rh,rh.SHEEN_ROUGHNESS),vh=sn(rh,rh.ANISOTROPY),Nh=sn(rh,rh.IRIDESCENCE),Sh=sn(rh,rh.IRIDESCENCE_IOR),Rh=sn(rh,rh.IRIDESCENCE_THICKNESS),Eh=sn(rh,rh.TRANSMISSION),Ah=sn(rh,rh.THICKNESS),wh=sn(rh,rh.IOR),Ch=sn(rh,rh.ATTENUATION_DISTANCE),Mh=sn(rh,rh.ATTENUATION_COLOR),Bh=sn(rh,rh.LINE_SCALE),Lh=sn(rh,rh.LINE_DASH_SIZE),Fh=sn(rh,rh.LINE_GAP_SIZE),Ph=sn(rh,rh.LINE_WIDTH),Dh=sn(rh,rh.LINE_DASH_OFFSET),Uh=sn(rh,rh.POINT_SIZE),Ih=sn(rh,rh.DISPERSION),Oh=sn(rh,rh.LIGHT_MAP),Vh=sn(rh,rh.AO),kh=_a(new t).onReference(function(e){return e.material}).onRenderUpdate(function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}),Gh=un(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class zh extends li{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const $h=rn(zh).setParameterLength(2);class Wh extends Dl{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Gs(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ti.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return $h(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ti.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Ju(this.value),this._varying=Pu(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const Hh=(e,t=null,r=0)=>new Wh(e,t,r);class qh extends ui{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===qh.VERTEX)s=e.getVertexIndex();else if(r===qh.INSTANCE)s=e.getInstanceIndex();else if(r===qh.DRAW)s=e.getDrawIndex();else if(r===qh.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===qh.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==qh.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Pu(this).build(e,t)}return i}}qh.VERTEX="vertex",qh.INSTANCE="instance",qh.SUBGROUP="subgroup",qh.INVOCATION_LOCAL="invocationLocal",qh.INVOCATION_SUBGROUP="invocationSubgroup",qh.DRAW="draw";const jh=sn(qh,qh.VERTEX),Xh=sn(qh,qh.INSTANCE),Kh=sn(qh,qh.SUBGROUP),Yh=sn(qh,qh.INVOCATION_SUBGROUP),Qh=sn(qh,qh.INVOCATION_LOCAL),Zh=sn(qh,qh.DRAW);class Jh extends ui{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Js.FRAME,this.buffer=null,this.bufferColor=null,this.previousInstanceMatrixNode=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){let{instanceMatrixNode:t,instanceColorNode:r}=this;null===t&&(t=this._createInstanceMatrixNode(!0,e),this.instanceMatrixNode=t);const{instanceColor:s,isStorageColor:i}=this;if(s&&null===r){if(i)r=Hh(s,"vec3",Math.max(s.count,1)).element(Xh);else{const e=new W(s.array,3),t=s.usage===x?tl:el;this.bufferColor=e,r=vn(t(e,"vec3",3,0))}this.instanceColorNode=r}const n=t.mul(Fd).xyz;if(Fd.assign(n),e.needsPreviousData()&&Pd.assign(this.getPreviousInstancedPosition(e)),e.hasGeometryAttribute("normal")){const e=Qd(Wd,t);Wd.assign(e)}null!==this.instanceColorNode&&In("vec3","vInstanceColor").assign(this.instanceColorNode)}update(e){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)),null!==this.previousInstanceMatrixNode&&e.object.previousInstanceMatrix.array.set(this.instanceMatrix.array)}getPreviousInstancedPosition(e){const t=e.object;return null===this.previousInstanceMatrixNode&&(t.previousInstanceMatrix=this.instanceMatrix.clone(),this.previousInstanceMatrixNode=this._createInstanceMatrixNode(!1,e)),this.previousInstanceMatrixNode.mul(Pd).xyz}_createInstanceMatrixNode(e,t){let r;const{instanceMatrix:s}=this,{count:i}=s;if(this.isStorageMatrix)r=Hh(s,"mat4",Math.max(i,1)).element(Xh);else{if(i<=(!0===t.renderer.backend.isWebGPUBackend?1e3:250))r=Ul(s.array,"mat4",Math.max(i,1)).element(Xh);else{const t=new H(s.array,16,1);!0===e&&(this.buffer=t);const i=s.usage===x?tl:el,n=[i(t,"vec4",16,0),i(t,"vec4",16,4),i(t,"vec4",16,8),i(t,"vec4",16,12)];r=Ln(...n)}}return r}}const ep=rn(Jh).setParameterLength(2,3);class tp extends Jh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const rp=rn(tp).setParameterLength(1);class sp extends ui{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=Xh:this.batchingIdNode=Zh);const t=un(([e])=>{const t=mn(Al(Pl(this.batchMesh._indirectTexture),0).x).toConst(),r=mn(e).mod(t).toConst(),s=mn(e).div(t).toConst();return Pl(this.batchMesh._indirectTexture,xn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(mn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=mn(Al(Pl(s),0).x).toConst(),n=gn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Ln(Pl(s,xn(a,o)),Pl(s,xn(a.add(1),o)),Pl(s,xn(a.add(2),o)),Pl(s,xn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=un(([e])=>{const t=mn(Al(Pl(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Pl(l,xn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);In("vec3","vBatchColor").assign(t)}const d=Bn(u);Fd.assign(u.mul(Fd));const c=Wd.div(vn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;Wd.assign(h),e.hasGeometryAttribute("tangent")&&Uc.mulAssign(d)}}const ip=rn(sp).setParameterLength(1),np=new WeakMap;class ap extends ui{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Js.OBJECT,this.skinIndexNode=Sl("skinIndex","uvec4"),this.skinWeightNode=Sl("skinWeight","vec4"),this.bindMatrixNode=yc("bindMatrix","mat4"),this.bindMatrixInverseNode=yc("bindMatrixInverse","mat4"),this.boneMatricesNode=bc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Fd,this.toPositionNode=Fd,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=Ma(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormalAndTangent(e=this.boneMatricesNode,t=Wd,r=Uc){const{skinIndexNode:s,skinWeightNode:i,bindMatrixNode:n,bindMatrixInverseNode:a}=this,o=e.element(s.x),u=e.element(s.y),l=e.element(s.z),d=e.element(s.w);let c=Ma(i.x.mul(o),i.y.mul(u),i.z.mul(l),i.w.mul(d));c=a.mul(c).mul(n);return{skinNormal:c.transformDirection(t).xyz,skinTangent:c.transformDirection(r).xyz}}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=bc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Pd)}setup(e){e.needsPreviousData()&&Pd.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const{skinNormal:t,skinTangent:r}=this.getSkinnedNormalAndTangent();Wd.assign(t),e.hasGeometryAttribute("tangent")&&Uc.assign(r)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;np.get(t)!==e.frameId&&(np.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const op=e=>new ap(e);class up extends ui{static get type(){return"LoopNode"}constructor(e=[]){super("void"),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew up(tn(e,"int")).toStack(),dp=()=>gl("break").toStack(),cp=new WeakMap,hp=new s,pp=un(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=mn(jh).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Pl(e,xn(u,o)).depth(i).xyz.mul(t)});class gp extends ui{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=_a(1),this.updateType=Js.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=cp.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new q(m,h,p,a);f.type=j,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=gn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Pl(this.mesh.morphTexture,xn(mn(e).add(1),mn(Xh))).r):t.assign(yc("morphTargetInfluences","float").element(e).toVar()),cn(t.notEqual(0),()=>{!0===s&&Fd.addAssign(pp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(0)})),!0===i&&Wd.addAssign(pp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(1)}))})})}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce((e,t)=>e+t,0)}}const mp=rn(gp).setParameterLength(1);class fp extends ui{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class yp extends fp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class bp extends xu{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:vn().toVar("directDiffuse"),directSpecular:vn().toVar("directSpecular"),indirectDiffuse:vn().toVar("indirectDiffuse"),indirectSpecular:vn().toVar("indirectSpecular")};return{radiance:vn().toVar("radiance"),irradiance:vn().toVar("irradiance"),iblIrradiance:vn().toVar("iblIrradiance"),ambientOcclusion:gn(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const xp=rn(bp);class Tp extends fp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const _p=new t;class vp extends Bl{static get type(){return"ViewportTextureNode"}constructor(e=ql,t=null,r=null){let s=null;null===r?(s=new X,s.minFilter=K,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Js.RENDER,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer.getRenderTarget();return this.value=this.getTextureForReference(t),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(_p):_p.set(r.width,r.height);const s=this.getTextureForReference(r);s.image.width===_p.width&&s.image.height===_p.height||(s.image.width=_p.width,s.image.height=_p.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const Np=rn(vp).setParameterLength(0,3),Sp=rn(vp,null,null,{generateMipmaps:!0}).setParameterLength(0,3),Rp=Sp(),Ep=(e=ql,t=null)=>Rp.sample(e,t);let Ap=null;class wp extends vp{static get type(){return"ViewportDepthTextureNode"}constructor(e=ql,t=null){null===Ap&&(Ap=new Y),super(e,t,Ap)}getTextureForReference(){return Ap}}const Cp=rn(wp).setParameterLength(0,2);class Mp extends ui{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Mp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Mp.DEPTH_BASE)null!==r&&(s=Dp().assign(r));else if(t===Mp.DEPTH)s=e.isPerspectiveCamera?Lp(Id.z,td,rd):Bp(Id.z,td,rd);else if(t===Mp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Fp(r,td,rd);s=Bp(e,td,rd)}else s=r;else s=Bp(Id.z,td,rd);return s}}Mp.DEPTH_BASE="depthBase",Mp.DEPTH="depth",Mp.LINEAR_DEPTH="linearDepth";const Bp=(e,t,r)=>e.add(t).div(t.sub(r)),Lp=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Fp=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Pp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=yo(e.negate().div(t)),i=yo(r.div(t));return s.div(i)},Dp=rn(Mp,Mp.DEPTH_BASE),Up=sn(Mp,Mp.DEPTH),Ip=rn(Mp,Mp.LINEAR_DEPTH).setParameterLength(0,1),Op=Ip(Cp());Up.assign=e=>Dp(e);class Vp extends ui{static get type(){return"ClippingNode"}constructor(e=Vp.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===Vp.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Vp.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return un(()=>{const r=gn().toVar("distanceToPlane"),s=gn().toVar("distanceToGradient"),i=gn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Vl(t).setGroup(ba);lp(n,({i:t})=>{const n=e.element(t);r.assign(Id.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(lu(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Vl(e).setGroup(ba),n=gn(1).toVar("intersectionClipOpacity");lp(a,({i:e})=>{const i=t.element(e);r.assign(Id.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(lu(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}On.a.mulAssign(i),On.a.equal(0).discard()})()}setupDefault(e,t){return un(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Vl(t).setGroup(ba);lp(r,({i:t})=>{const r=e.element(t);Id.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Vl(e).setGroup(ba),r=yn(!0).toVar("clipped");lp(s,({i:e})=>{const s=t.element(e);r.assign(Id.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),un(()=>{const s=Vl(e).setGroup(ba),i=Gl(t.getClipDistance());lp(r,({i:e})=>{const t=s.element(e),r=Id.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}Vp.ALPHA_TO_COVERAGE="alphaToCoverage",Vp.DEFAULT="default",Vp.HARDWARE="hardware";const kp=un(([e])=>No(La(1e4,So(La(17,e.x).add(La(.1,e.y)))).mul(Ma(.1,Mo(So(La(13,e.y).add(e.x))))))),Gp=un(([e])=>kp(bn(kp(e.xy),e.z))),zp=un(([e])=>{const t=Ho(Lo(Do(e.xyz)),Lo(Uo(e.xyz))),r=gn(1).div(gn(.05).mul(t)).toVar("pixScale"),s=bn(mo(To(yo(r))),mo(_o(yo(r)))),i=bn(Gp(To(s.x.mul(e.xyz))),Gp(To(s.y.mul(e.xyz)))),n=No(yo(r)),a=Ma(La(n.oneMinus(),i.x),La(n,i.y)),o=Wo(n,n.oneMinus()),u=vn(a.mul(a).div(La(2,o).mul(Ba(1,o))),a.sub(La(.5,o)).div(Ba(1,o)),Ba(1,Ba(1,a).mul(Ba(1,a)).div(La(2,o).mul(Ba(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return au(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class $p extends Nl{static get type(){return"VertexColorNode"}constructor(e){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}const Wp=(e=0)=>new $p(e),Hp=un(([e,t])=>Wo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),qp=un(([e,t])=>Wo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),jp=un(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Xp=un(([e,t])=>nu(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),qo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Kp=un(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return En(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)}).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),Yp=un(([e])=>En(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),Qp=un(([e])=>(cn(e.a.equal(0),()=>En(0)),En(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class Zp extends Q{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.maskNode=null,this.maskShadowNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,this.contextNode=null}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Us(t.slice(0,-4)),r.getCacheKey());return this.type+Is(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Lu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=this.setupVertex(e),i=Lu(this.vertexNode||s,"VERTEX");let n;e.context.clipSpace=i,e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==a&&e.stack.addToStack(a);const i=En(s,On.a).max(0);n=this.setupOutput(e,i),ia.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&ia.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=En(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.currentSamples;this.alphaToCoverage&&t>1?s=new Vp(Vp.ALPHA_TO_COVERAGE):e.stack.addToStack(new Vp)}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.addToStack(new Vp(Vp.HARDWARE)),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Pp(Id.z,td,rd):Bp(Id.z,td,rd))}null!==s&&Up.assign(s).toStack()}setupPositionView(){return Ad.mul(Fd).xyz}setupModelViewProjection(){return sd.mul(Id)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.position=e.removeStack(),Gh}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&mp(t).toStack(),!0===t.isSkinnedMesh&&op(t).toStack(),this.displacementMap){const e=Tc("displacementMap","texture"),t=Tc("displacementScale","float"),r=Tc("displacementBias","float");Fd.addAssign(Wd.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&ip(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&rp(t).toStack(),null!==this.positionNode&&Fd.assign(Lu(this.positionNode,"POSITION","vec3")),Fd}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&yn(this.maskNode).not().discard();let s=this.colorNode?En(this.colorNode):ih;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul(Wp())),t.instanceColor){s=In("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=In("vec3","vBatchColor").mul(s)}On.assign(s);const i=this.opacityNode?gn(this.opacityNode):oh;On.a.assign(On.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?gn(this.alphaTestNode):sh,!0===this.alphaToCoverage?(On.a=lu(n,n.add(ko(On.a)),On.a),On.a.lessThanEqual(0).discard()):On.a.lessThanEqual(n).discard()),!0===this.alphaHash&&On.a.lessThan(zp(Fd)).discard(),e.isOpaque()&&On.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?vn(0):On.rgb}setupNormal(){return this.normalNode?vn(this.normalNode):mh}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?Tc("envMap","cubeTexture"):Tc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Tp(Oh)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=Vh),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new yp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=xp(n,t,r,s)}else null!==r&&(a=vn(null!==s?nu(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(kn.assign(vn(i||ah)),a=a.add(kn)),a}setupFog(e,t){const r=e.fogNode;return r&&(ia.assign(t),t=En(r.toVar())),t}setupPremultipliedAlpha(e,t){return Yp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=Q.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.maskNode=e.maskNode,this.maskShadowNode=e.maskShadowNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,this.contextNode=e.contextNode,super.copy(e)}}const Jp=new Z;class eg extends Zp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(Jp),this.setValues(e)}}const tg=new J;class rg extends Zp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(tg),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?gn(this.offsetNode):Dh,t=this.dashScaleNode?gn(this.dashScaleNode):Bh,r=this.dashSizeNode?gn(this.dashSizeNode):Lh,s=this.gapSizeNode?gn(this.gapSizeNode):Fh;na.assign(r),aa.assign(s);const i=Pu(Sl("lineDistance").mul(t));(e?i.add(e):i).mod(na.add(aa)).greaterThan(na).discard()}}const sg=new J;class ig extends Zp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(sg),this.vertexColors=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=ee,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.vertexColors,i=this._useDash,n=this._useWorldUnits,a=un(({start:e,end:t})=>{const r=sd.element(2).element(2),s=sd.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return En(nu(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=un(()=>{const e=Sl("instanceStart"),t=Sl("instanceEnd"),r=En(Ad.mul(En(e,1))).toVar("start"),s=En(Ad.mul(En(t,1))).toVar("end");if(i){const e=this.dashScaleNode?gn(this.dashScaleNode):Bh,t=this.offsetNode?gn(this.offsetNode):Dh,r=Sl("instanceDistanceStart"),s=Sl("instanceDistanceEnd");let i=Ld.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),In("float","lineDistance").assign(i)}n&&(In("vec3","worldStart").assign(r.xyz),In("vec3","worldEnd").assign(s.xyz));const o=Kl.z.div(Kl.w),u=sd.element(2).element(3).equal(-1);cn(u,()=>{cn(r.z.lessThan(0).and(s.z.greaterThan(0)),()=>{s.assign(a({start:r,end:s}))}).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),()=>{r.assign(a({start:s,end:r}))})});const l=sd.mul(r),d=sd.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=En().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=nu(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=In("vec4","worldPos");o.assign(Ld.y.lessThan(.5).select(r,s));const u=Ph.mul(.5);o.addAssign(En(Ld.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(En(Ld.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(En(a.mul(u),0)),cn(Ld.y.greaterThan(1).or(Ld.y.lessThan(0)),()=>{o.subAssign(En(a.mul(2).mul(u),0))})),g.assign(sd.mul(o));const l=vn().toVar();l.assign(Ld.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=bn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Ld.x.lessThan(0).select(e.negate(),e)),cn(Ld.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(Ld.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Ph)),e.assign(e.div(Kl.w.div(Hl))),g.assign(Ld.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(En(e,0,0)))}return g})();const o=un(({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return bn(h,p)});if(this.colorNode=un(()=>{const e=Rl();if(i){const t=this.dashSizeNode?gn(this.dashSizeNode):Lh,r=this.gapSizeNode?gn(this.gapSizeNode):Fh;na.assign(t),aa.assign(r);const s=In("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(na.add(aa)).greaterThan(na).discard()}const a=gn(1).toVar("alpha");if(n){const e=In("vec3","worldStart"),s=In("vec3","worldEnd"),n=In("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:vn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Ph);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(lu(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=gn(s.fwidth()).toVar("dlen");cn(e.y.abs().greaterThan(1),()=>{a.assign(lu(i.oneMinus(),i.add(1),s).oneMinus())})}else cn(e.y.abs().greaterThan(1),()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()});let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Sl("instanceColorStart"),t=Sl("instanceColorEnd");u=Ld.y.lessThan(.5).select(e,t).mul(ih)}else u=ih;return En(u,a)})(),this.transparent){const e=this.opacityNode?gn(this.opacityNode):oh;this.outputNode=En(this.colorNode.rgb.mul(e).add(Ep().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const ng=new te;class ag extends Zp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(ng),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?gn(this.opacityNode):oh;On.assign(Gu(En(jc(Xd),e),re))}}const og=un(([e=Ud])=>{const t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return bn(t,r)});class ug extends se{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new ie(5,5,5),n=og(Ud),a=new Zp;a.colorNode=Fl(t,n,0),a.side=M,a.blending=ee;const o=new ne(i,a),u=new ae;u.add(o),t.minFilter===K&&(t.minFilter=oe);const l=new ue(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const lg=new WeakMap;class dg extends ci{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=gc(null);const t=new F;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Js.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===le||r===de){if(lg.has(e)){const t=lg.get(e);hg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new ug(r.height);s.fromEquirectangularTexture(t,e),hg(s.texture,e.mapping),this._cubeTexture=s.texture,lg.set(e,s.texture),e.addEventListener("dispose",cg)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function cg(e){const t=e.target;t.removeEventListener("dispose",cg);const r=lg.get(t);void 0!==r&&(lg.delete(t),r.dispose())}function hg(e,t){t===le?e.mapping=P:t===de&&(e.mapping=D)}const pg=rn(dg).setParameterLength(1);class gg extends fp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=pg(this.envNode)}}class mg extends fp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=gn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class fg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class yg extends fg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(En(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(En(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(On.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case pe:s.rgb.assign(nu(s.rgb,s.rgb.mul(i.rgb),ch.mul(hh)));break;case he:s.rgb.assign(nu(s.rgb,i.rgb,ch.mul(hh)));break;case ce:s.rgb.addAssign(i.rgb.mul(ch.mul(hh)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const bg=new ge;class xg extends Zp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(bg),this.setValues(e)}setupNormal(){return zd(qd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new gg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new mg(Oh)),t}setupOutgoingLight(){return On.rgb}setupLightingModel(){return new yg}}const Tg=un(({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))}),_g=un(e=>e.diffuseColor.mul(1/Math.PI)),vg=un(({dotNH:e})=>sa.mul(gn(.5)).add(1).mul(gn(1/Math.PI)).mul(e.pow(sa))),Ng=un(({lightDirection:e})=>{const t=e.add(Od).normalize(),r=Xd.dot(t).clamp(),s=Od.dot(t).clamp(),i=Tg({f0:ea,f90:1,dotVH:s}),n=gn(.25),a=vg({dotNH:r});return i.mul(n).mul(a)});class Sg extends yg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Xd.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(_g({diffuseColor:On.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(Ng({lightDirection:e})).mul(ch))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(_g({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const Rg=new me;class Eg extends Zp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Rg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new gg(t):null}setupLightingModel(){return new Sg(!1)}}const Ag=new fe;class wg extends Zp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Ag),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new gg(t):null}setupLightingModel(){return new Sg}setupVariants(){const e=(this.shininessNode?gn(this.shininessNode):nh).max(1e-4);sa.assign(e);const t=this.specularNode||uh;ea.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Cg=un(e=>{if(!1===e.geometry.hasAttribute("normal"))return gn(0);const t=qd.dFdx().abs().max(qd.dFdy().abs());return t.x.max(t.y).max(t.z)}),Mg=un(e=>{const{roughness:t}=e,r=Cg();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),Bg=un(({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return Fa(.5,i.add(n).max(so))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Lg=un(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(vn(e.mul(r),t.mul(s),a).length()),l=a.mul(vn(e.mul(i),t.mul(n),o).length());return Fa(.5,u.add(l))}).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),Fg=un(({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)}).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Pg=gn(1/Math.PI),Dg=un(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=vn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Pg.mul(n.mul(u.pow2()))}).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),Ug=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=Xd,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Od).normalize(),d=n.dot(e).clamp(),c=n.dot(Od).clamp(),h=n.dot(l).clamp(),p=Od.dot(l).clamp();let g,m,f=Tg({f0:t,f90:r,dotVH:p});if(Ki(a)&&(f=jn.mix(f,i)),Ki(o)){const t=Zn.dot(e),r=Zn.dot(Od),s=Zn.dot(l),i=Jn.dot(e),n=Jn.dot(Od),a=Jn.dot(l);g=Lg({alphaT:Yn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Dg({alphaT:Yn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=Bg({alpha:u,dotNL:d,dotNV:c}),m=Fg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),Ig=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let Og=null;const Vg=un(({roughness:e,dotNV:t})=>{null===Og&&(Og=new ye(Ig,16,16,G,be),Og.name="DFG_LUT",Og.minFilter=oe,Og.magFilter=oe,Og.wrapS=xe,Og.wrapT=xe,Og.generateMipmaps=!1,Og.needsUpdate=!0);const r=bn(e,t);return Fl(Og,r).rg}),kg=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Ug({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=Xd.dot(e).clamp(),l=Xd.dot(Od).clamp(),d=Vg({roughness:s,dotNV:l}),c=Vg({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=gn(1).sub(g),y=gn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(gn(1).sub(f.mul(y).mul(b).mul(b)).add(so)),T=f.mul(y),_=x.mul(T);return o.add(_)}),Gg=un(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Vg({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),zg=un(({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(vn(t).mul(n)).div(n.oneMinus())}).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),$g=un(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=gn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return gn(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)}).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),Wg=un(({dotNV:e,dotNL:t})=>gn(1).div(gn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Hg=un(({lightDirection:e})=>{const t=e.add(Od).normalize(),r=Xd.dot(e).clamp(),s=Xd.dot(Od).clamp(),i=Xd.dot(t).clamp(),n=$g({roughness:qn,dotNH:i}),a=Wg({dotNV:s,dotNL:r});return Hn.mul(n).mul(a)}),qg=un(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=bn(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i}).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),jg=un(({f:e})=>{const t=e.length();return Ho(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),Xg=un(({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,Ho(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)}).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Kg=un(({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=vn().toVar();return cn(d.dot(r.sub(i)).greaterThanEqual(0),()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(Bn(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=vn(0).toVar();f.addAssign(Xg({v1:h,v2:p})),f.addAssign(Xg({v1:p,v2:g})),f.addAssign(Xg({v1:g,v2:m})),f.addAssign(Xg({v1:m,v2:h})),c.assign(vn(jg({f:f})))}),c}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Yg=un(({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=vn().toVar();return cn(o.dot(e.sub(t)).greaterThanEqual(0),()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=vn(0).toVar();d.addAssign(Xg({v1:n,v2:a})),d.addAssign(Xg({v1:a,v2:o})),d.addAssign(Xg({v1:o,v2:l})),d.addAssign(Xg({v1:l,v2:n})),u.assign(vn(jg({f:d.abs()})))}),u}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Qg=1/6,Zg=e=>La(Qg,La(e,La(e,e.negate().add(3)).sub(3)).add(1)),Jg=e=>La(Qg,La(e,La(e,La(3,e).sub(6))).add(4)),em=e=>La(Qg,La(e,La(e,La(-3,e).add(3)).add(3)).add(1)),tm=e=>La(Qg,Zo(e,3)),rm=e=>Zg(e).add(Jg(e)),sm=e=>em(e).add(tm(e)),im=e=>Ma(-1,Jg(e).div(Zg(e).add(Jg(e)))),nm=e=>Ma(1,tm(e).div(em(e).add(tm(e)))),am=(e,t,r)=>{const s=e.uvNode,i=La(s,t.zw).add(.5),n=To(i),a=No(i),o=rm(a.x),u=sm(a.x),l=im(a.x),d=nm(a.x),c=im(a.y),h=nm(a.y),p=bn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=bn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=bn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=bn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=rm(a.y).mul(Ma(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=sm(a.y).mul(Ma(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},om=un(([e,t])=>{const r=bn(e.size(mn(t))),s=bn(e.size(mn(t.add(1)))),i=Fa(1,r),n=Fa(1,s),a=am(e,En(i,r),To(t)),o=am(e,En(n,s),_o(t));return No(t).mix(a,o)}),um=un(([e,t])=>{const r=t.mul(Cl(e));return om(e,r)}),lm=un(([e,t,r,s,i])=>{const n=vn(uu(t.negate(),vo(e),Fa(1,s))),a=vn(Lo(i[0].xyz),Lo(i[1].xyz),Lo(i[2].xyz));return vo(n).mul(r.mul(a))}).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),dm=un(([e,t])=>e.mul(au(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),cm=Sp(),hm=Ep(),pm=un(([e,t,r],{material:s})=>{const i=(s.side===M?cm:hm).sample(e),n=yo(jl.x).mul(dm(t,r));return om(i,n)}),gm=un(([e,t,r])=>(cn(r.notEqual(0),()=>{const s=fo(t).negate().div(r);return go(s.negate().mul(e))}),vn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),mm=un(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=En().toVar(),f=vn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=vn(d.sub(i),d,d.add(i));lp({start:0,end:3},({i:i})=>{const d=n.element(i),g=lm(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(En(y,1))),x=bn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(bn(x.x,x.y.oneMinus()));const T=pm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(gm(Lo(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=lm(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(En(n,1))),y=bn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(bn(y.x,y.y.oneMinus())),m=pm(y,r,d),f=s.mul(gm(Lo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=vn(Gg({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return En(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),fm=Bn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),ym=(e,t)=>e.sub(t).div(e.add(t)).pow2(),bm=un(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=nu(e,t,lu(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();cn(a.lessThan(0),()=>vn(1));const o=a.sqrt(),u=ym(n,e),l=Tg({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=gn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return vn(1).add(t).div(vn(1).sub(t))})(i.clamp(0,.9999)),g=ym(p,n.toVec3()),m=Tg({f0:g,f90:1,dotVH:o}),f=vn(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),b=vn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(vn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return lp({start:1,end:2,condition:"<=",name:"m"},({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=vn(54856e-17,44201e-17,52481e-17),i=vn(1681e3,1795300,2208400),n=vn(43278e5,93046e5,66121e5),a=gn(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=vn(o.x.add(a),o.y,o.z).div(1.0685e-7),fm.mul(o)})(gn(e).mul(y),gn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(vn(0))}).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),xm=un(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=gn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=gn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),Tm=vn(.04),_m=gn(1);class vm extends fg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=vn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=vn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=vn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=vn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=vn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=Xd.dot(Od).clamp(),t=bm({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:ea}),r=bm({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:On.rgb});this.iridescenceFresnel=nu(t,r,zn),this.iridescenceF0Dielectric=zg({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=zg({f:r,f90:1,dotVH:e}),this.iridescenceF0=nu(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,zn)}if(!0===this.transmission){const t=Dd,r=ud.sub(Dd).normalize(),s=Kd,i=e.context;i.backdrop=mm(s,r,Gn,Vn,ta,ra,t,Td,nd,sd,ua,da,ha,ca,this.dispersion?pa:null),i.backdropAlpha=la,On.a.mulAssign(nu(1,i.backdrop.a,la))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=Xd.dot(Od).clamp(),a=Vg({roughness:Gn,dotNV:n}),o=i?jn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Xd.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(Hg({lightDirection:e})));const t=xm({normal:Xd,viewDir:Od,roughness:qn}),r=xm({normal:Xd,viewDir:e,roughness:qn}),i=Hn.r.max(Hn.g).max(Hn.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=Yd.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Ug({lightDirection:e,f0:Tm,f90:_m,roughness:Wn,normalView:Yd})))}r.directDiffuse.addAssign(s.mul(_g({diffuseColor:Vn}))),r.directSpecular.addAssign(s.mul(kg({lightDirection:e,f0:ta,f90:1,roughness:Gn,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=Xd,h=Od,p=Id.toVar(),g=qg({N:c,V:h,roughness:Gn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Bn(vn(m.x,0,m.y),vn(0,1,0),vn(m.z,0,m.w)).toVar(),b=ta.mul(f.x).add(ta.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(Kg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Vn).mul(Kg({N:c,V:h,P:p,mInv:Bn(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context,s=t.mul(_g({diffuseColor:Vn})).toVar();if(!0===this.sheen){const e=xm({normal:Xd,viewDir:Od,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(Hn,xm({normal:Xd,viewDir:Od,roughness:qn}))),!0===this.clearcoat){const e=Yd.dot(Od).clamp(),t=Gg({dotNV:e,specularColor:Tm,specularF90:_m,roughness:Wn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=vn().toVar("singleScatteringDielectric"),n=vn().toVar("multiScatteringDielectric"),a=vn().toVar("singleScatteringMetallic"),o=vn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ra,ea,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ra,On.rgb,this.iridescenceF0Metallic);const u=nu(i,a,zn),l=nu(n,o,zn),d=i.add(n),c=Vn.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=xm({normal:Xd,viewDir:Od,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=Xd.dot(Od).clamp().add(t),i=Gn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Yd.dot(Od).clamp(),r=Tg({dotVH:e,f0:Tm,f90:_m}),s=t.mul($n.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul($n));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const Nm=gn(1),Sm=gn(-2),Rm=gn(.8),Em=gn(-1),Am=gn(.4),wm=gn(2),Cm=gn(.305),Mm=gn(3),Bm=gn(.21),Lm=gn(4),Fm=gn(4),Pm=gn(16),Dm=un(([e])=>{const t=vn(Mo(e)).toVar(),r=gn(-1).toVar();return cn(t.x.greaterThan(t.z),()=>{cn(t.x.greaterThan(t.y),()=>{r.assign(bu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}).Else(()=>{cn(t.z.greaterThan(t.y),()=>{r.assign(bu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Um=un(([e,t])=>{const r=bn().toVar();return cn(t.equal(0),()=>{r.assign(bn(e.z,e.y).div(Mo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(bn(e.x.negate(),e.z.negate()).div(Mo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(bn(e.x.negate(),e.y).div(Mo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(bn(e.z.negate(),e.y).div(Mo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(bn(e.x.negate(),e.z).div(Mo(e.y)))}).Else(()=>{r.assign(bn(e.x,e.y).div(Mo(e.z)))}),La(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Im=un(([e])=>{const t=gn(0).toVar();return cn(e.greaterThanEqual(Rm),()=>{t.assign(Nm.sub(e).mul(Em.sub(Sm)).div(Nm.sub(Rm)).add(Sm))}).ElseIf(e.greaterThanEqual(Am),()=>{t.assign(Rm.sub(e).mul(wm.sub(Em)).div(Rm.sub(Am)).add(Em))}).ElseIf(e.greaterThanEqual(Cm),()=>{t.assign(Am.sub(e).mul(Mm.sub(wm)).div(Am.sub(Cm)).add(wm))}).ElseIf(e.greaterThanEqual(Bm),()=>{t.assign(Cm.sub(e).mul(Lm.sub(Mm)).div(Cm.sub(Bm)).add(Mm))}).Else(()=>{t.assign(gn(-2).mul(yo(La(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Om=un(([e,t])=>{const r=e.toVar();r.assign(La(2,r).sub(1));const s=vn(r,1).toVar();return cn(t.equal(0),()=>{s.assign(s.zyx)}).ElseIf(t.equal(1),()=>{s.assign(s.xzy),s.xz.mulAssign(-1)}).ElseIf(t.equal(2),()=>{s.x.mulAssign(-1)}).ElseIf(t.equal(3),()=>{s.assign(s.zyx),s.xz.mulAssign(-1)}).ElseIf(t.equal(4),()=>{s.assign(s.xzy),s.xy.mulAssign(-1)}).ElseIf(t.equal(5),()=>{s.z.mulAssign(-1)}),s}).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),Vm=un(([e,t,r,s,i,n])=>{const a=gn(r),o=vn(t),u=au(Im(a),Sm,n),l=No(u),d=To(u),c=vn(km(e,o,d,s,i,n)).toVar();return cn(l.notEqual(0),()=>{const t=vn(km(e,o,d.add(1),s,i,n)).toVar();c.assign(nu(c,t,l))}),c}),km=un(([e,t,r,s,i,n])=>{const a=gn(r).toVar(),o=vn(t),u=gn(Dm(o)).toVar(),l=gn(Ho(Fm.sub(a),0)).toVar();a.assign(Ho(a,Fm));const d=gn(mo(a)).toVar(),c=bn(Um(o,u).mul(d.sub(2)).add(1)).toVar();return cn(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(La(3,Pm))),c.y.addAssign(La(4,mo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(bn(),bn())}),Gm=un(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Ro(s),l=r.mul(u).add(i.cross(r).mul(So(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return km(e,l,t,n,a,o)}),zm=un(({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=vn(bu(t,r,Qo(r,s))).toVar();cn(h.equal(vn(0)),()=>{h.assign(vn(s.z,0,s.x.negate()))}),h.assign(vo(h));const p=vn().toVar();return p.addAssign(i.element(0).mul(Gm({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),lp({start:mn(1),end:e},({i:e})=>{cn(e.greaterThanEqual(n),()=>{dp()});const t=gn(a.mul(gn(e))).toVar();p.addAssign(i.element(e).mul(Gm({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(Gm({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),En(p,1)}),$m=un(([e])=>{const t=fn(e).toVar();return t.assign(t.shiftLeft(fn(16)).bitOr(t.shiftRight(fn(16)))),t.assign(t.bitAnd(fn(1431655765)).shiftLeft(fn(1)).bitOr(t.bitAnd(fn(2863311530)).shiftRight(fn(1)))),t.assign(t.bitAnd(fn(858993459)).shiftLeft(fn(2)).bitOr(t.bitAnd(fn(3435973836)).shiftRight(fn(2)))),t.assign(t.bitAnd(fn(252645135)).shiftLeft(fn(4)).bitOr(t.bitAnd(fn(4042322160)).shiftRight(fn(4)))),t.assign(t.bitAnd(fn(16711935)).shiftLeft(fn(8)).bitOr(t.bitAnd(fn(4278255360)).shiftRight(fn(8)))),gn(t).mul(2.3283064365386963e-10)}),Wm=un(([e,t])=>bn(gn(e).div(gn(t)),$m(e))),Hm=un(([e,t,r])=>{const s=r.mul(r).toConst(),i=vn(1,0,0).toConst(),n=Qo(t,i).toConst(),a=bo(e.x).toConst(),o=La(2,3.14159265359).mul(e.y).toConst(),u=a.mul(Ro(o)).toConst(),l=a.mul(So(o)).toVar(),d=La(.5,t.z.add(1)).toConst();l.assign(d.oneMinus().mul(bo(u.mul(u).oneMinus())).add(d.mul(l)));const c=i.mul(u).add(n.mul(l)).add(t.mul(bo(Ho(0,u.mul(u).add(l.mul(l)).oneMinus()))));return vo(vn(s.mul(c.x),s.mul(c.y),Ho(0,c.z)))}),qm=un(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=vn(s).toVar(),l=vn(0).toVar(),d=gn(0).toVar();return cn(e.lessThan(.001),()=>{l.assign(km(r,u,t,n,a,o))}).Else(()=>{const s=bu(Mo(u.z).lessThan(.999),vn(0,0,1),vn(1,0,0)),c=vo(Qo(s,u)).toVar(),h=Qo(u,c).toVar();lp({start:fn(0),end:i},({i:s})=>{const p=Wm(s,i),g=Hm(p,vn(0,0,1),e),m=vo(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=vo(m.mul(Yo(u,m).mul(2)).sub(u)),y=Ho(Yo(u,f),0);cn(y.greaterThan(0),()=>{const e=km(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),cn(d.greaterThan(0),()=>{l.assign(l.div(d))})}),En(l,1)}),jm=[.125,.215,.35,.446,.526,.582],Xm=20,Km=new _e(-1,1,1,-1,0,1),Ym=new ve(90,1),Qm=new e;let Zm=null,Jm=0,ef=0;const tf=new r,rf=new WeakMap,sf=[3,1,5,0,4,2],nf=Om(Rl(),Sl("faceIndex")).normalize(),af=vn(nf.x,nf.y,nf.z);class of{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=tf,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Zm=this._renderer.getRenderTarget(),Jm=this._renderer.getActiveCubeFace(),ef=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" instead.'),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=cf(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=hf(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===P||e.mapping===D?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=jm[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=sf[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Te;T.setAttribute("position",new Ae(y,g)),T.setAttribute("uv",new Ae(b,m)),T.setAttribute("faceIndex",new Ae(x,f)),s.push(new ne(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=Vl(new Array(Xm).fill(0)),n=_a(new r(0,1,0)),a=_a(0),o=gn(Xm),u=_a(0),l=_a(1),d=Fl(),c=_a(0),h=gn(1/t),p=gn(1/s),g=gn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:af,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=df("blur");return f.fragmentNode=zm({...m,latitudinal:u.equal(1)}),rf.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Fl(),i=_a(0),n=_a(0),a=gn(1/t),o=gn(1/r),u=gn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=df("ggx");return d.fragmentNode=qm({...l,N_immutable:af,GGX_SAMPLES:fn(512)}),rf.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ne(new Te,e);await this._renderer.compile(t,Km)}_sceneToCubeUV(e,t,r,s,i){const n=Ym;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Qm),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ne(new ie,new ge({name:"PMREM.Background",side:M,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(Qm),h=!0),u.setRenderTarget(s),u.clear(),h&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;lf(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===P||e.mapping===D;s?null===this._cubemapMaterial&&(this._cubemapMaterial=cf(e)):null===this._equirectMaterial&&(this._equirectMaterial=hf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;lf(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Km)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,lf(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,Km),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,lf(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,Km)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=rf.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):Xm;f>Xm&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),4*(this._cubeSize-T),3*T,2*T),u.setRenderTarget(t),u.render(c,Km)}}function uf(e,t){const r=new Ne(e,t,{magFilter:oe,minFilter:oe,generateMipmaps:!1,type:be,format:Re,colorSpace:Se});return r.texture.mapping=Ee,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function lf(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function df(e){const t=new Zp;return t.depthTest=!1,t.depthWrite=!1,t.blending=ee,t.name=`PMREM_${e}`,t}function cf(e){const t=df("cubemap");return t.fragmentNode=gc(e,af),t}function hf(e){const t=df("equirect");return t.fragmentNode=Fl(e,og(af),0),t}const pf=new WeakMap;function gf(e,t,r){const s=function(e){let t=pf.get(e);void 0===t&&(t=new WeakMap,pf.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class mf extends ci{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new N;s.isRenderTargetTexture=!0,this._texture=Fl(s),this._width=_a(0),this._height=_a(0),this._maxMip=_a(0),this.updateBeforeType=Js.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:gf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new of(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=ac.mul(vn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Vm(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const ff=rn(mf).setParameterLength(1,3),yf=new WeakMap;class bf extends fp{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=yf.get(e);void 0===s&&(s=ff(e),yf.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?qc:Xd,i=r.context(xf(Gn,s)).mul(nc),n=r.context(Tf(Kd)).mul(Math.PI).mul(nc),a=al(i),o=al(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(xf(Wn,Yd)).mul(nc),t=al(e);u.addAssign(t)}}}const xf=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Od.negate().reflect(t),r=tu(e).mix(r,t).normalize(),r=r.transformDirection(nd)),r),getTextureLevel:()=>e}},Tf=e=>({getUV:()=>e,getTextureLevel:()=>gn(1)}),_f=new we;class vf extends Zp{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(_f),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new bf(t):null}setupLightingModel(){return new vm}setupSpecular(){const e=nu(vn(.04),On.rgb,zn);ea.assign(vn(.04)),ta.assign(e),ra.assign(1)}setupVariants(){const e=this.metalnessNode?gn(this.metalnessNode):gh;zn.assign(e);let t=this.roughnessNode?gn(this.roughnessNode):ph;t=Mg({roughness:t}),Gn.assign(t),this.setupSpecular(),Vn.assign(On.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const Nf=new Ce;class Sf extends vf{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(Nf),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?gn(this.iorNode):wh;ua.assign(e),ea.assign(Wo(Jo(ua.sub(1).div(ua.add(1))).mul(dh),vn(1)).mul(lh)),ta.assign(nu(ea,On.rgb,zn)),ra.assign(nu(lh,1,zn))}setupLightingModel(){return new vm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?gn(this.clearcoatNode):fh,t=this.clearcoatRoughnessNode?gn(this.clearcoatRoughnessNode):yh;$n.assign(e),Wn.assign(Mg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?vn(this.sheenNode):Th,t=this.sheenRoughnessNode?gn(this.sheenRoughnessNode):_h;Hn.assign(e),qn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?gn(this.iridescenceNode):Nh,t=this.iridescenceIORNode?gn(this.iridescenceIORNode):Sh,r=this.iridescenceThicknessNode?gn(this.iridescenceThicknessNode):Rh;jn.assign(e),Xn.assign(t),Kn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?bn(this.anisotropyNode):vh).toVar();Qn.assign(e.length()),cn(Qn.equal(0),()=>{e.assign(bn(1,0))}).Else(()=>{e.divAssign(bn(Qn)),Qn.assign(Qn.saturate())}),Yn.assign(Qn.pow2().mix(Gn.pow2(),1)),Zn.assign(Wc[0].mul(e.x).add(Wc[1].mul(e.y))),Jn.assign(Wc[1].mul(e.x).sub(Wc[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?gn(this.transmissionNode):Eh,t=this.thicknessNode?gn(this.thicknessNode):Ah,r=this.attenuationDistanceNode?gn(this.attenuationDistanceNode):Ch,s=this.attenuationColorNode?vn(this.attenuationColorNode):Mh;if(la.assign(e),da.assign(t),ca.assign(r),ha.assign(s),this.useDispersion){const e=this.dispersionNode?gn(this.dispersionNode):Ih;pa.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?vn(this.clearcoatNormalNode):bh}setup(e){e.context.setupClearcoatNormal=()=>Lu(this.setupClearcoatNormal(e),"NORMAL","vec3"),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class Rf extends vm{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(Xd.mul(a)).normalize(),h=gn(Od.dot(c.negate()).saturate().pow(l).mul(d)),p=vn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Ef extends Sf{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=gn(.1),this.thicknessAmbientNode=gn(0),this.thicknessAttenuationNode=gn(.1),this.thicknessPowerNode=gn(2),this.thicknessScaleNode=gn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new Rf(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const Af=un(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=bn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=Tc("gradientMap","texture").context({getUV:()=>i});return vn(e.r)}{const e=i.fwidth().mul(.5);return nu(vn(.7),vn(1),lu(gn(.7).sub(e.x),gn(.7).add(e.x),i.x))}});class wf extends fg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Af({normal:$d,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(_g({diffuseColor:On.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(_g({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const Cf=new Me;class Mf extends Zp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Cf),this.setValues(e)}setupLightingModel(){return new wf}}const Bf=un(()=>{const e=vn(Od.z,0,Od.x.negate()).normalize(),t=Od.cross(e);return bn(e.dot(Xd),t.dot(Xd)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Lf=new Be;class Ff extends Zp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Lf),this.setValues(e)}setupVariants(e){const t=Bf;let r;r=e.material.matcap?Tc("matcap","texture").context({getUV:()=>t}):vn(nu(.2,.8,t.y)),On.rgb.mulAssign(r.rgb)}}class Pf extends ci{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return Mn(e,s,s.negate(),e).mul(r)}{const e=t,s=Ln(En(1,0,0,0),En(0,Ro(e.x),So(e.x).negate(),0),En(0,So(e.x),Ro(e.x),0),En(0,0,0,1)),i=Ln(En(Ro(e.y),0,So(e.y),0),En(0,1,0,0),En(So(e.y).negate(),0,Ro(e.y),0),En(0,0,0,1)),n=Ln(En(Ro(e.z),So(e.z).negate(),0,0),En(So(e.z),Ro(e.z),0,0),En(0,0,1,0),En(0,0,0,1));return s.mul(i).mul(n).mul(En(r,1)).xyz}}}const Df=rn(Pf).setParameterLength(2),Uf=new Le;class If extends Zp{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(Uf),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=Ad.mul(vn(s||0));let u=bn(Td[0].xyz.length(),Td[1].xyz.length());null!==n&&(u=u.mul(bn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=Ld.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new $u(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=gn(i||xh),c=Df(l,d);return En(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const Of=new Fe,Vf=new t;class kf extends If{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Of),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Ad.mul(vn(e||Fd)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?bn(n):Uh;u=u.mul(Hl),r.isPerspectiveCamera&&!0===a&&(u=u.mul(Gf.div(Id.z.negate()))),i&&i.isNode&&(u=u.mul(bn(i)));let l=Ld.xy;if(s&&s.isNode){const e=gn(s);l=Df(l,e)}return l=l.mul(u),l=l.div(Yl.div(2)),l=l.mul(o.w),o=o.add(En(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const Gf=_a(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(Vf);this.value=.5*t.y});class zf extends fg{constructor(){super(),this.shadowNode=gn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){On.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(On.rgb)}}const $f=new Pe;class Wf extends Zp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues($f),this.setValues(e)}setupLightingModel(){return new zf}}const Hf=Un("vec3"),qf=Un("vec3"),jf=Un("vec3");class Xf extends fg{constructor(){super()}start(e){const{material:t}=e,r=Un("vec3"),s=Un("vec3");cn(ud.sub(Dd).length().greaterThan(Sd.mul(2)),()=>{r.assign(ud),s.assign(Dd)}).Else(()=>{r.assign(Dd),s.assign(ud)});const i=s.sub(r),n=_a("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=gn(0).toVar(),l=vn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),lp(n,()=>{const s=r.add(o.mul(u)),i=nd.mul(En(s,1)).xyz;let n;null!==t.depthNode&&(qf.assign(Ip(Lp(i.z,td,rd))),e.context.sceneDepthNode=Ip(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,Hf.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&Hf.mulAssign(n);const d=Hf.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),jf.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?cn(r.greaterThanEqual(qf),()=>{Hf.addAssign(e)}):Hf.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(Yg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(jf)}}class Kf extends Zp{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=M,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new Xf}}class Yf{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,this._context="undefined"!=typeof self?self:null,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class Qf{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getIndirectOffset(){return this._geometries.getIndirectOffset(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.id),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Us(s)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=Os(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Os(e,1)),e=Os(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const ey=[];class ty{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);ey[0]=e,ey[1]=t,ey[2]=n,ey[3]=i;let l=u.get(ey);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(ey,l)):(l.camera=s,l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),ey[0]=null,ey[1]=null,ey[2]=null,ey[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Qf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Jf(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class ry{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const sy=1,iy=2,ny=3,ay=4,oy=16;class uy extends ry{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===sy?this.backend.createAttribute(e):t===iy?this.backend.createIndexAttribute(e):t===ny?this.backend.createStorageAttribute(e):t===ay&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,ny):this.updateAttribute(e,sy);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,iy);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,ay)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndirectOffset(e){return e.geometry.indirectOffset}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=dy(t),e.set(t,r)):r.version!==ly(t)&&(this.attributes.delete(r),r=dy(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class hy{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):o("WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class py{constructor(e){this.cacheKey=e,this.usedTimes=0}}class gy extends py{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class my extends py{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let fy=0;class yy{constructor(e,t,r,s=null,i=null){this.id=fy++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class by extends ry{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new yy(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new yy(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new yy(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new my(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new gy(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class xy extends ry{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ay:ny;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ay:ny;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0,i=!1));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture&&!0===o.mipmapsAutoUpdate){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0,i=!1)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function Ty(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function _y(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function vy(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===B&&!1===e.forceSinglePass}class Ny{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(vy(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(vy(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||Ty),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||_y),this.transparent.length>1&&this.transparent.sort(t||_y)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new Y,l.format=e.stencilBuffer?Oe:Ve,l.type=e.stencilBuffer?ke:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,l.isArrayTexture=!0===e.multiview&&a.depth>1,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:Ge}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,this.info.memory.textures++,e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=My){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1)):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput(e)?this.outputNode.build(e,...t):super.build(e,...t),ln(r),e.removeActiveStack(this),o}}const Dy=rn(Py).setParameterLength(0,1);class Uy extends ui{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1})),this.name=t,this.isStructLayoutNode=!0}getLength(){const e=Float32Array.BYTES_PER_ELEMENT;let t=1,r=0;for(const s of this.membersLayout){const i=s.type,n=Ws(i),a=Hs(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}getMemberType(e,t){const r=this.membersLayout.find(e=>e.name===t);return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Iy extends ui{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.getMemberType(e,t)}_getChildren(){const e=super._getChildren(),t=e.find(e=>e.childNode===this.structTypeNode);return e.splice(e.indexOf(t),1),e.push(t),e}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structTypeNode.membersLayout,this.values)}`,this),t.name}}class Oy extends ui{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(){return"OutputType"}generate(e){const t=e.getDataFromNode(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;tnew qy(e,"uint","float"),Ky={};class Yy extends ro{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(jy(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return fn;case"int":return mn;case"uvec2":return Tn;case"uvec3":return Sn;case"uvec4":return wn;case"ivec2":return xn;case"ivec3":return Nn;case"ivec4":return An}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t);const i=gn(s.bitAnd(Fo(s))),n=Xy(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{cn(e.equal(fn(0)),()=>fn(32));const s=fn(0),i=fn(0);return this._resolveElementType(e,s,t),cn(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),cn(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),cn(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),cn(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),cn(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(fn(1)).bitAnd(fn(1431655765)))),s.assign(s.bitAnd(fn(858993459)).add(s.shiftRight(fn(2)).bitAnd(fn(858993459))));const i=s.add(s.shiftRight(fn(4))).bitAnd(fn(252645135)).mul(fn(16843009)).shiftRight(fn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return un(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}Yy.COUNT_TRAILING_ZEROS="countTrailingZeros",Yy.COUNT_LEADING_ZEROS="countLeadingZeros",Yy.COUNT_ONE_BITS="countOneBits";const Qy=nn(Yy,Yy.COUNT_TRAILING_ZEROS).setParameterLength(1),Zy=nn(Yy,Yy.COUNT_LEADING_ZEROS).setParameterLength(1),Jy=nn(Yy,Yy.COUNT_ONE_BITS).setParameterLength(1),eb=un(([e])=>{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)}),tb=(e,t)=>Zo(La(4,e.mul(Ba(1,e))),t);class rb extends ci{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}getNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const sb=nn(rb,"snorm").setParameterLength(1),ib=nn(rb,"unorm").setParameterLength(1),nb=nn(rb,"float16").setParameterLength(1);class ab extends ci{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}getNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const ob=nn(ab,"snorm").setParameterLength(1),ub=nn(ab,"unorm").setParameterLength(1),lb=nn(ab,"float16").setParameterLength(1),db=un(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),cb=un(([e])=>vn(db(e.z.add(db(e.y.mul(1)))),db(e.z.add(db(e.x.mul(1)))),db(e.y.add(db(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),hb=un(([e,t,r])=>{const s=vn(e).toVar(),i=gn(1.4).toVar(),n=gn(0).toVar(),a=vn(s).toVar();return lp({start:gn(0),end:gn(3),type:"float",condition:"<="},()=>{const e=vn(cb(a.mul(2))).toVar();s.addAssign(e.add(r.mul(gn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=gn(db(s.z.add(db(s.x.add(db(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)}),n}).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class pb extends ui{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}getNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const gb=rn(pb),mb=e=>(...t)=>gb(e,...t),fb=_a(0).setGroup(ba).onRenderUpdate(e=>e.time),yb=_a(0).setGroup(ba).onRenderUpdate(e=>e.deltaTime),bb=_a(0,"uint").setGroup(ba).onRenderUpdate(e=>e.frameId);const xb=un(([e,t,r=bn(.5)])=>Df(e.sub(r),t).add(r)),Tb=un(([e,t,r=bn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),_b=un(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Td.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Td;const i=nd.mul(s);return Ki(t)&&(i[0][0]=Td[0].length(),i[0][1]=0,i[0][2]=0),Ki(r)&&(i[1][0]=0,i[1][1]=Td[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,sd.mul(i).mul(Fd)}),vb=un(([e=null])=>{const t=Ip();return Ip(Cp(e)).sub(t).lessThan(0).select(ql,e)}),Nb=un(([e,t=Rl(),r=gn(0)])=>{const s=e.x,i=e.y,n=r.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=e.reciprocal(),l=bn(a,o);return t.add(l).mul(u)}),Sb=un(([e,t=null,r=null,s=gn(1),i=Fd,n=Wd])=>{let a=n.abs().normalize();a=a.div(a.dot(vn(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=Fl(d,o).mul(a.x),g=Fl(c,u).mul(a.y),m=Fl(h,l).mul(a.z);return Ma(p,g,m)}),Rb=new je,Eb=new r,Ab=new r,wb=new r,Cb=new a,Mb=new r(0,0,-1),Bb=new s,Lb=new r,Fb=new r,Pb=new s,Db=new t,Ub=new Ne,Ib=ql.flipX();Ub.depthTexture=new Y(1,1);let Ob=!1;class Vb extends Bl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Ub.texture,Ib),this._reflectorBaseNode=e.reflector||new kb(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Zi(new Vb({defaultTexture:Ub.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class kb extends ui{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Xe,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Js.RENDER:Js.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Db),e.setSize(Math.round(Db.width*r),Math.round(Db.height*r))}setup(e){return this._updateResolution(Ub,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new Ne(0,0,{type:be,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=Ke,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new Y),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&Ob)return!1;Ob=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Db),this._updateResolution(o,s),Ab.setFromMatrixPosition(n.matrixWorld),wb.setFromMatrixPosition(r.matrixWorld),Cb.extractRotation(n.matrixWorld),Eb.set(0,0,1),Eb.applyMatrix4(Cb),Lb.subVectors(Ab,wb);let u=!1;if(!0===Lb.dot(Eb)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Ob=!1);u=!0}Lb.reflect(Eb).negate(),Lb.add(Ab),Cb.extractRotation(r.matrixWorld),Mb.set(0,0,-1),Mb.applyMatrix4(Cb),Mb.add(wb),Fb.subVectors(Ab,Mb),Fb.reflect(Eb).negate(),Fb.add(Ab),a.coordinateSystem=r.coordinateSystem,a.position.copy(Lb),a.up.set(0,1,0),a.up.applyMatrix4(Cb),a.up.reflect(Eb),a.lookAt(Fb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Rb.setFromNormalAndCoplanarPoint(Eb,Ab),Rb.applyMatrix4(a.matrixWorldInverse),Bb.set(Rb.normal.x,Rb.normal.y,Rb.normal.z,Rb.constant);const l=a.projectionMatrix;Pb.x=(Math.sign(Bb.x)+l.elements[8])/l.elements[0],Pb.y=(Math.sign(Bb.y)+l.elements[9])/l.elements[5],Pb.z=-1,Pb.w=(1+l.elements[10])/l.elements[14],Bb.multiplyScalar(1/Bb.dot(Pb));l.elements[2]=Bb.x,l.elements[6]=Bb.y,l.elements[10]=s.coordinateSystem===h?Bb.z-0:Bb.z+1-0,l.elements[14]=Bb.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,Ob=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const Gb=new _e(-1,1,1,-1,0,1);class zb extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Ye([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Ye(t,2))}}const $b=new zb;class Wb extends ne{constructor(e=null){super($b,e),this.camera=Gb,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,Gb)}render(e){e.render(this,Gb)}}const Hb=new t;class qb extends Bl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new Ne(t,r,s);super(i.texture,Rl()),this.isRTTNode=!0,this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new Wb(new Zp),this.updateBeforeType=Js.RENDER}get autoResize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoResize){const t=e.getPixelRatio(),r=e.getSize(Hb),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Bl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const jb=(e,...t)=>Zi(new qb(Zi(e),...t)),Xb=un(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=bn(e.x,e.y.oneMinus()).mul(2).sub(1),i=En(vn(e,t),1)):i=En(vn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=En(r.mul(i));return n.xyz.div(n.w)}),Kb=un(([e,t])=>{const r=t.mul(En(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return bn(s.x,s.y.oneMinus())}),Yb=un(([e,t,r])=>{const s=Al(Pl(t)),i=xn(e.mul(s)).toVar(),n=Pl(t,i).toVar(),a=Pl(t,i.sub(xn(2,0))).toVar(),o=Pl(t,i.sub(xn(1,0))).toVar(),u=Pl(t,i.add(xn(1,0))).toVar(),l=Pl(t,i.add(xn(2,0))).toVar(),d=Pl(t,i.add(xn(0,2))).toVar(),c=Pl(t,i.add(xn(0,1))).toVar(),h=Pl(t,i.sub(xn(0,1))).toVar(),p=Pl(t,i.sub(xn(0,2))).toVar(),g=Mo(Ba(gn(2).mul(o).sub(a),n)).toVar(),m=Mo(Ba(gn(2).mul(u).sub(l),n)).toVar(),f=Mo(Ba(gn(2).mul(c).sub(d),n)).toVar(),y=Mo(Ba(gn(2).mul(h).sub(p),n)).toVar(),b=Xb(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(Xb(e.sub(bn(gn(1).div(s.x),0)),o,r)),b.negate().add(Xb(e.add(bn(gn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(Xb(e.add(bn(0,gn(1).div(s.y))),c,r)),b.negate().add(Xb(e.sub(bn(0,gn(1).div(s.y))),h,r)));return vo(Qo(x,T))}),Qb=un(([e])=>No(gn(52.9829189).mul(No(Yo(e,bn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),Zb=un(([e,t,r])=>{const s=gn(2.399963229728653),i=bo(gn(e).add(.5).div(gn(t))),n=gn(e).mul(s).add(r);return bn(Ro(n),So(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class Jb extends ui{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Rl())}sample(e){return this.callback(e)}}class ex extends ui{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===ex.OBJECT?this.updateType=Js.OBJECT:e===ex.MATERIAL?this.updateType=Js.RENDER:e===ex.BEFORE_OBJECT?this.updateBeforeType=Js.OBJECT:e===ex.BEFORE_MATERIAL&&(this.updateBeforeType=Js.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}ex.OBJECT="object",ex.MATERIAL="material",ex.BEFORE_OBJECT="beforeObject",ex.BEFORE_MATERIAL="beforeMaterial";const tx=(e,t)=>new ex(e,t).toStack();class rx extends W{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class sx extends Ae{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class ix extends ui{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const nx=sn(ix),ax=new L,ox=new a;class ux extends ui{static get type(){return"SceneNode"}constructor(e=ux.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===ux.BACKGROUND_BLURRINESS?s=yc("backgroundBlurriness","float",r):t===ux.BACKGROUND_INTENSITY?s=yc("backgroundIntensity","float",r):t===ux.BACKGROUND_ROTATION?s=_a("mat4").setName("backgroundRotation").setGroup(ba).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Qe?(ax.copy(r.backgroundRotation),ax.x*=-1,ax.y*=-1,ax.z*=-1,ox.makeRotationFromEuler(ax)):ox.identity(),ox}):o("SceneNode: Unknown scope:",t),s}}ux.BACKGROUND_BLURRINESS="backgroundBlurriness",ux.BACKGROUND_INTENSITY="backgroundIntensity",ux.BACKGROUND_ROTATION="backgroundRotation";const lx=sn(ux,ux.BACKGROUND_BLURRINESS),dx=sn(ux,ux.BACKGROUND_INTENSITY),cx=sn(ux,ux.BACKGROUND_ROTATION);class hx extends Bl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=ti.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(ti.READ_WRITE)}toReadOnly(){return this.setAccess(ti.READ_ONLY)}toWriteOnly(){return this.setAccess(ti.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e.mipLevel=this.mipLevel,e}}const px=rn(hx).setParameterLength(1,3),gx=un(({texture:e,uv:t})=>{const r=1e-4,s=vn().toVar();return cn(t.x.lessThan(r),()=>{s.assign(vn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(vn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(vn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(vn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(vn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(vn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(vn(-.01,0,0))).r.sub(e.sample(t.add(vn(r,0,0))).r),n=e.sample(t.add(vn(0,-.01,0))).r.sub(e.sample(t.add(vn(0,r,0))).r),a=e.sample(t.add(vn(0,0,-.01))).r.sub(e.sample(t.add(vn(0,0,r))).r);s.assign(vn(i,n,a))}),s.normalize()});class mx extends Bl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return vn(.5,.5,.5)}setUpdateMatrix(){}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return gx({texture:this,uv:e})}}const fx=rn(mx).setParameterLength(1,3);class yx extends fc{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const bx=new WeakMap;class xx extends ci{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Js.OBJECT,this.updateAfterType=Js.OBJECT,this.previousModelWorldMatrix=_a(new a),this.previousProjectionMatrix=_a(new a).setGroup(ba),this.previousCameraViewMatrix=_a(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=_x(r);this.previousModelWorldMatrix.value.copy(s);const i=Tx(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){_x(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?sd:_a(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Ad).mul(Fd),s=this.previousProjectionMatrix.mul(t).mul(Pd),i=r.xy.div(r.w),n=s.xy.div(s.w);return Ba(i,n)}}function Tx(e){let t=bx.get(e);return void 0===t&&(t={},bx.set(e,t)),t}function _x(e,t=0){const r=Tx(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const vx=sn(xx),Nx=un(([e])=>Ax(e.rgb)),Sx=un(([e,t=gn(1)])=>t.mix(Ax(e.rgb),e.rgb)),Rx=un(([e,t=gn(1)])=>{const r=Ma(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return nu(e.rgb,s,i)}),Ex=un(([e,t=gn(1)])=>{const r=vn(.57735,.57735,.57735),s=t.cos();return vn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Yo(r,e.rgb).mul(s.oneMinus())))))}),Ax=(e,t=vn(p.getLuminanceCoefficients(new r)))=>Yo(e,t),wx=un(([e,t=vn(1),s=vn(0),i=vn(1),n=gn(1),a=vn(p.getLuminanceCoefficients(new r,Se))])=>{const o=e.rgb.dot(vn(a)),u=Ho(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return cn(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),cn(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),cn(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),En(u.rgb,e.a)});class Cx extends ci{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Mx=rn(Cx).setParameterLength(2);let Bx=null;class Lx extends vp{static get type(){return"ViewportSharedTextureNode"}constructor(e=ql,t=null){null===Bx&&(Bx=new X),super(e,t,Bx)}getTextureForReference(){return Bx}updateReference(){return this}}const Fx=rn(Lx).setParameterLength(0,2),Px=new t;class Dx extends Bl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Ux extends Dx{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}class Ix extends ci{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new Y;i.isRenderTargetTexture=!0,i.name="depth";const n=new Ne(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:be,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=_a(0),this._cameraFar=_a(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Js.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=new Ux(this,e),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=new Ux(this,e,!0),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Fp(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Bp(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getOutputBufferType(),this.scope===Ix.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Px.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Px)),this._pixelRatio=i,this.setSize(Px.width,Px.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:Tu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Ix.COLOR="color",Ix.DEPTH="depth";class Ox extends Ix{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Ix.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)}),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Zp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=M;const t=Wd.negate(),r=sd.mul(Ad),s=gn(1),i=r.mul(En(Fd,1)),n=r.mul(En(Fd.add(t),1)),a=vo(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=En(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Vx=un(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),kx=un(([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp()).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Gx=un(([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)}).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),zx=un(([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)}),$x=un(([e,t])=>{const r=Bn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Bn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=zx(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Wx=Bn(vn(1.6605,-.1246,-.0182),vn(-.5876,1.1329,-.1006),vn(-.0728,-.0083,1.1187)),Hx=Bn(vn(.6274,.0691,.0164),vn(.3293,.9195,.088),vn(.0433,.0113,.8956)),qx=un(([e])=>{const t=vn(e).toVar(),r=vn(t.mul(t)).toVar(),s=vn(r.mul(r)).toVar();return gn(15.5).mul(s.mul(r)).sub(La(40.14,s.mul(t))).add(La(31.96,s).sub(La(6.868,r.mul(t))).add(La(.4298,r).add(La(.1191,t).sub(.00232))))}),jx=un(([e,t])=>{const r=vn(e).toVar(),s=Bn(vn(.856627153315983,.137318972929847,.11189821299995),vn(.0951212405381588,.761241990602591,.0767994186031903),vn(.0482516061458583,.101439036467562,.811302368396859)),i=Bn(vn(1.1271005818144368,-.1413297634984383,-.14132976349843826),vn(-.11060664309660323,1.157823702216272,-.11060664309660294),vn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=gn(-12.47393),a=gn(4.026069);return r.mulAssign(t),r.assign(Hx.mul(r)),r.assign(s.mul(r)),r.assign(Ho(r,1e-10)),r.assign(yo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(au(r,0,1)),r.assign(qx(r)),r.assign(i.mul(r)),r.assign(Zo(Ho(vn(0),r),vn(2.2))),r.assign(Wx.mul(r)),r.assign(au(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Xx=un(([e,t])=>{const r=gn(.76),s=gn(.15);e=e.mul(t);const i=Wo(e.r,Wo(e.g,e.b)),n=bu(i.lessThan(.08),i.sub(La(6.25,i.mul(i))),.04);e.subAssign(n);const a=Ho(e.r,Ho(e.g,e.b));cn(a.lessThan(r),()=>e);const o=Ba(1,r),u=Ba(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=Ba(1,Fa(1,s.mul(a.sub(u)).add(1)));return nu(e,vn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class Kx extends ui{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const Yx=rn(Kx).setParameterLength(1,3);class Qx extends Kx{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const Zx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Jx extends ui{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new u,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:gn()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Ks(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Ys(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const eT=rn(Jx).setParameterLength(1);class tT extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class rT{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const sT=new tT;class iT extends ui{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new tT,this._output=eT(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=eT(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=eT(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new rT(this),t=sT.get("THREE"),r=sT.get("TSL"),s=this.getMethod(),i=[e,this._local,sT,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:gn()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[Us(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Is(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const nT=rn(iT).setParameterLength(1,2);function aT(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Id.z).negate()}const oT=un(([e,t],r)=>{const s=aT(r);return lu(e,t,s)}),uT=un(([e],t)=>{const r=aT(t);return e.mul(e,r,r).negate().exp().oneMinus()}),lT=un(([e,t],r)=>{const s=aT(r),i=t.sub(Dd.y).max(0).toConst().mul(s).toConst();return e.mul(e,i,i).negate().exp().oneMinus()}),dT=un(([e,t])=>En(t.toFloat().mix(ia.rgb,e.toVec3()),ia.a));let cT=null,hT=null;class pT extends ui{static get type(){return"RangeNode"}constructor(e=gn(),t=gn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(qs(t.value)),i=e.getTypeLength(qs(r.value));return s>i?s:i}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Error('THREE.TSL: No "ConstNode" found in node graph.');return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(qs(a)),d=e.getTypeLength(qs(o));cT=cT||new s,hT=hT||new s,cT.setScalar(0),hT.setScalar(0),1===u?cT.setScalar(a):a.isColor?cT.set(a.r,a.g,a.b,1):cT.set(a.x,a.y,a.z||0,a.w||0),1===d?hT.setScalar(o):o.isColor?hT.set(o.r,o.g,o.b,1):hT.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew mT(e,t),yT=fT("numWorkgroups","uvec3"),bT=fT("workgroupId","uvec3"),xT=fT("globalId","uvec3"),TT=fT("localId","uvec3"),_T=fT("subgroupSize","uint");class vT extends ui{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}}const NT=rn(vT);class ST extends li{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class RT extends ui{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new ST(this,e)}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class ET extends ui{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=gl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}ET.ATOMIC_LOAD="atomicLoad",ET.ATOMIC_STORE="atomicStore",ET.ATOMIC_ADD="atomicAdd",ET.ATOMIC_SUB="atomicSub",ET.ATOMIC_MAX="atomicMax",ET.ATOMIC_MIN="atomicMin",ET.ATOMIC_AND="atomicAnd",ET.ATOMIC_OR="atomicOr",ET.ATOMIC_XOR="atomicXor";const AT=rn(ET),wT=(e,t,r)=>AT(e,t,r).toStack();class CT extends ci{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}getNodeType(e){const t=this.method;return t===CT.SUBGROUP_ELECT?"bool":t===CT.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===CT.SUBGROUP_BROADCAST||r===CT.SUBGROUP_SHUFFLE||r===CT.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===CT.SUBGROUP_SHUFFLE_XOR||r===CT.SUBGROUP_SHUFFLE_DOWN||r===CT.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}CT.SUBGROUP_ELECT="subgroupElect",CT.SUBGROUP_BALLOT="subgroupBallot",CT.SUBGROUP_ADD="subgroupAdd",CT.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",CT.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",CT.SUBGROUP_MUL="subgroupMul",CT.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",CT.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",CT.SUBGROUP_AND="subgroupAnd",CT.SUBGROUP_OR="subgroupOr",CT.SUBGROUP_XOR="subgroupXor",CT.SUBGROUP_MIN="subgroupMin",CT.SUBGROUP_MAX="subgroupMax",CT.SUBGROUP_ALL="subgroupAll",CT.SUBGROUP_ANY="subgroupAny",CT.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",CT.QUAD_SWAP_X="quadSwapX",CT.QUAD_SWAP_Y="quadSwapY",CT.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",CT.SUBGROUP_BROADCAST="subgroupBroadcast",CT.SUBGROUP_SHUFFLE="subgroupShuffle",CT.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",CT.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",CT.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",CT.QUAD_BROADCAST="quadBroadcast";const MT=nn(CT,CT.SUBGROUP_ELECT).setParameterLength(0),BT=nn(CT,CT.SUBGROUP_BALLOT).setParameterLength(1),LT=nn(CT,CT.SUBGROUP_ADD).setParameterLength(1),FT=nn(CT,CT.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),PT=nn(CT,CT.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),DT=nn(CT,CT.SUBGROUP_MUL).setParameterLength(1),UT=nn(CT,CT.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),IT=nn(CT,CT.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),OT=nn(CT,CT.SUBGROUP_AND).setParameterLength(1),VT=nn(CT,CT.SUBGROUP_OR).setParameterLength(1),kT=nn(CT,CT.SUBGROUP_XOR).setParameterLength(1),GT=nn(CT,CT.SUBGROUP_MIN).setParameterLength(1),zT=nn(CT,CT.SUBGROUP_MAX).setParameterLength(1),$T=nn(CT,CT.SUBGROUP_ALL).setParameterLength(0),WT=nn(CT,CT.SUBGROUP_ANY).setParameterLength(0),HT=nn(CT,CT.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),qT=nn(CT,CT.QUAD_SWAP_X).setParameterLength(1),jT=nn(CT,CT.QUAD_SWAP_Y).setParameterLength(1),XT=nn(CT,CT.QUAD_SWAP_DIAGONAL).setParameterLength(1),KT=nn(CT,CT.SUBGROUP_BROADCAST).setParameterLength(2),YT=nn(CT,CT.SUBGROUP_SHUFFLE).setParameterLength(2),QT=nn(CT,CT.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),ZT=nn(CT,CT.SUBGROUP_SHUFFLE_UP).setParameterLength(2),JT=nn(CT,CT.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),e_=nn(CT,CT.QUAD_BROADCAST).setParameterLength(1);let t_;function r_(e){t_=t_||new WeakMap;let t=t_.get(e);return void 0===t&&t_.set(e,t={}),t}function s_(e){const t=r_(e);return t.shadowMatrix||(t.shadowMatrix=_a("mat4").setGroup(ba).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function i_(e,t=Dd){const r=s_(e).mul(t);return r.xyz.div(r.w)}function n_(e){const t=r_(e);return t.position||(t.position=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function a_(e){const t=r_(e);return t.targetPosition||(t.targetPosition=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function o_(e){const t=r_(e);return t.viewPosition||(t.viewPosition=_a(new r).setGroup(ba).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const u_=e=>nd.transformDirection(n_(e).sub(a_(e))),l_=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},d_=new WeakMap,c_=[];class h_ extends ui{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Un("vec3","totalDiffuse"),this.totalSpecularNode=Un("vec3","totalSpecular"),this.outgoingLightNode=Un("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Zi(e));else{let s=null;if(null!==r&&(s=l_(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;d_.has(e)?s=d_.get(e):(s=new r(e),d_.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getNodeProperties(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=vn(null!==l?l.mix(g,u):u)),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class p_ extends ui{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Js.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){g_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Dd)}}const g_=Un("vec3","shadowPositionWorld");function m_(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function f_(e,t){return t=m_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function y_(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function b_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function x_(e,t){return t=b_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function T_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function __(e,t,r){return r=x_(t,r=f_(e,r))}function v_(e,t,r){y_(e,r),T_(t,r)}var N_=Object.freeze({__proto__:null,resetRendererAndSceneState:__,resetRendererState:f_,resetSceneState:x_,restoreRendererAndSceneState:v_,restoreRendererState:y_,restoreSceneState:T_,saveRendererAndSceneState:function(e,t,r={}){return r=b_(t,r=m_(e,r))},saveRendererState:m_,saveSceneState:b_});const S_=new WeakMap,R_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),E_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=yc("mapSize","vec2",r).setGroup(ba),a=yc("radius","float",r).setGroup(ba),o=bn(1).div(n),u=a.mul(o.x),l=Qb(Xl.xy).mul(6.28318530718);return Ma(i(t.xy.add(Zb(0,5,l).mul(u)),t.z),i(t.xy.add(Zb(1,5,l).mul(u)),t.z),i(t.xy.add(Zb(2,5,l).mul(u)),t.z),i(t.xy.add(Zb(3,5,l).mul(u)),t.z),i(t.xy.add(Zb(4,5,l).mul(u)),t.z)).mul(.2)}),A_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=yc("mapSize","vec2",r).setGroup(ba),a=bn(1).div(n),o=a.x,u=a.y,l=t.xy,d=No(l.mul(n).add(.5));return l.subAssign(d.mul(a)),Ma(i(l,t.z),i(l.add(bn(o,0)),t.z),i(l.add(bn(0,u)),t.z),i(l.add(a),t.z),nu(i(l.add(bn(o.negate(),0)),t.z),i(l.add(bn(o.mul(2),0)),t.z),d.x),nu(i(l.add(bn(o.negate(),u)),t.z),i(l.add(bn(o.mul(2),u)),t.z),d.x),nu(i(l.add(bn(0,u.negate())),t.z),i(l.add(bn(0,u.mul(2))),t.z),d.y),nu(i(l.add(bn(o,u.negate())),t.z),i(l.add(bn(o,u.mul(2))),t.z),d.y),nu(nu(i(l.add(bn(o.negate(),u.negate())),t.z),i(l.add(bn(o.mul(2),u.negate())),t.z),d.x),nu(i(l.add(bn(o.negate(),u.mul(2))),t.z),i(l.add(bn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),w_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e).sample(t.xy);e.isArrayTexture&&(s=s.depth(r)),s=s.rg;const i=s.x,n=Ho(1e-7,s.y.mul(s.y)),a=qo(t.z,i);cn(a.equal(1),()=>gn(1));const o=t.z.sub(i);let u=n.div(n.add(o.mul(o)));return u=au(Ba(u,.3).div(.65)),Ho(a,u)}),C_=e=>{let t=S_.get(e);return void 0===t&&(t=new Zp,t.colorNode=En(0,0,0,1),t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.blending=ee,t.fog=!1,S_.set(e,t)),t},M_=e=>{const t=S_.get(e);void 0!==t&&(t.dispose(),S_.delete(e))},B_=new Qf,L_=[],F_=(e,t,r,s)=>{L_[0]=e,L_[1]=t;let i=B_.get(L_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ze)&&(s&&(Xs(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,B_.set(L_,i)),L_[0]=null,L_[1]=null,i},P_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanVertical"),a=gn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));lp({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(Xl.xy,bn(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),D_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanHorizontal"),a=gn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));lp({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(Xl.xy,bn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(Ma(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),U_=[R_,E_,A_,w_];let I_;const O_=new Wb;class V_ extends p_{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._currentShadowType=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n});return a.select(o,gn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=yc("bias","float",r).setGroup(ba);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===h&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=yc("near","float",r.camera).setGroup(ba),s=yc("far","float",r.camera).setGroup(ba);n=Pp(e.negate(),t,s)}return a=vn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return U_[e]}setupRenderTarget(e,t){const r=new Y(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=Je;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t,camera:r}=e,{light:s,shadow:i}=this,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(i,e),o=t.shadowMap.type;if(o===et||o===tt?(n.minFilter=oe,n.magFilter=oe):(n.minFilter=w,n.magFilter=w),i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),o===Ze&&!0!==i.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}));let t=Fl(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Fl(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const s=yc("blurSamples","float",i).setGroup(ba),o=yc("radius","float",i).setGroup(ba),u=yc("mapSize","vec2",i).setGroup(ba);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Zp);l.fragmentNode=P_({samples:s,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Zp),l.fragmentNode=D_({samples:s,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const u=yc("intensity","float",i).setGroup(ba),l=yc("normalBias","float",i).setGroup(ba),d=s_(s).mul(g_.add(Kd.mul(l))),c=this.setupShadowCoord(e,d),h=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===h)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const p=o===Ze&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,g=this.setupShadowFilter(e,{filterFn:h,shadowTexture:a.texture,depthTexture:p,shadowCoord:c,shadow:i,depthLayer:this.depthLayer});let m,f;!0===t.shadowMap.transmitted&&(a.texture.isCubeTexture?m=gc(a.texture,c.xyz):(m=Fl(a.texture,c),n.isArrayTexture&&(m=m.depth(this.depthLayer)))),f=m?nu(1,g.rgb.mix(m,1),u.mul(m.a)).toVar():nu(1,g,u).toVar(),this.shadowMap=a,this.shadow.map=a;const y=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return m&&f.toInspector(`${y} / Color`,()=>this.shadowMap.texture.isCubeTexture?gc(this.shadowMap.texture):Fl(this.shadowMap.texture)),f.toInspector(`${y} / Depth`,()=>this.shadowMap.texture.isCubeTexture?gc(this.shadowMap.texture).r.oneMinus():Pl(this.shadowMap.depthTexture,Rl().mul(Al(Fl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return un(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");I_=__(i,n,I_),n.overrideMaterial=C_(r),i.setRenderObjectFunction(F_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===Ze&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,v_(i,n,I_)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),O_.material=this.vsmMaterialVertical,O_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),O_.material=this.vsmMaterialHorizontal,O_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,M_(this.light),this.shadowMap&&(this.shadowMap.dispose(),this.shadowMap=null),null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null)}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const k_=(e,t)=>new V_(e,t),G_=new e,z_=new a,$_=new r,W_=new r,H_=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],q_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],j_=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],X_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],K_=un(({depthTexture:e,bd3D:t,dp:r})=>gc(e,t).compare(r)),Y_=un(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=yc("radius","float",s).setGroup(ba),n=yc("mapSize","vec2",s).setGroup(ba),a=i.div(n.x),o=Mo(t),u=vo(Qo(t,o.x.greaterThan(o.z).select(vn(0,1,0),vn(1,0,0)))),l=Qo(t,u),d=Qb(Xl.xy).mul(6.28318530718),c=Zb(0,5,d),h=Zb(1,5,d),p=Zb(2,5,d),g=Zb(3,5,d),m=Zb(4,5,d);return gc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(gc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(gc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(gc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(gc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),Q_=un(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toConst(),n=i.abs().toConst(),a=n.x.max(n.y).max(n.z),o=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.near),u=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.far),l=yc("bias","float",s).setGroup(ba),d=gn(1).toVar();return cn(a.sub(u).lessThanEqual(0).and(a.sub(o).greaterThanEqual(0)),()=>{const r=Lp(a.negate(),o,u);r.addAssign(l);const n=i.normalize();d.assign(e({depthTexture:t,bd3D:n,dp:r,shadow:s}))}),d});class Z_ extends V_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===rt?K_:Y_}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return Q_({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new st(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=Je;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?H_:j_,d=u?q_:X_;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(G_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),$_.setFromMatrixPosition(s.matrixWorld),a.position.copy($_),W_.copy(a.position),W_.add(l[e]),a.up.copy(d[e]),a.lookAt(W_),a.updateMatrixWorld(),o.makeTranslation(-$_.x,-$_.y,-$_.z),z_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(z_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const J_=(e,t)=>new Z_(e,t);class ev extends fp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||_a(this.color).setGroup(ba),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Js.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return o_(this.light).sub(e.context.positionView||Id)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return k_(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Zi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const tv=un(({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)}),rv=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=tv({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class sv extends ev{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(2).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return J_(this.light)}setupDirect(e){return rv({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const iv=un(([e=Rl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),nv=un(([e=Rl()],{renderer:t,material:r})=>{const s=iu(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=gn(s.fwidth()).toVar();i=lu(e.oneMinus(),e.add(1),s).oneMinus()}else i=bu(s.greaterThan(1),0,1);return i}),av=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=yn(e).toVar();return bu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),ov=un(([e,t])=>{const r=yn(t).toVar(),s=gn(e).toVar();return bu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),uv=un(([e])=>{const t=gn(e).toVar();return mn(To(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),lv=un(([e,t])=>{const r=gn(e).toVar();return t.assign(uv(r)),r.sub(gn(t))}),dv=mb([un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=gn(s).toVar(),l=gn(r).toVar(),d=gn(t).toVar(),c=gn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=vn(s).toVar(),l=vn(r).toVar(),d=vn(t).toVar(),c=vn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),cv=mb([un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=gn(o).toVar(),m=gn(a).toVar(),f=gn(n).toVar(),y=gn(i).toVar(),b=gn(s).toVar(),x=gn(r).toVar(),T=gn(t).toVar(),_=gn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=vn(o).toVar(),m=vn(a).toVar(),f=vn(n).toVar(),y=vn(i).toVar(),b=vn(s).toVar(),x=vn(r).toVar(),T=vn(t).toVar(),_=vn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),hv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=fn(e).toVar(),a=fn(n.bitAnd(fn(7))).toVar(),o=gn(av(a.lessThan(fn(4)),i,s)).toVar(),u=gn(La(2,av(a.lessThan(fn(4)),s,i))).toVar();return ov(o,yn(a.bitAnd(fn(1)))).add(ov(u,yn(a.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),pv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=fn(e).toVar(),u=fn(o.bitAnd(fn(15))).toVar(),l=gn(av(u.lessThan(fn(8)),a,n)).toVar(),d=gn(av(u.lessThan(fn(4)),n,av(u.equal(fn(12)).or(u.equal(fn(14))),a,i))).toVar();return ov(l,yn(u.bitAnd(fn(1)))).add(ov(d,yn(u.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),gv=mb([hv,pv]),mv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=Sn(e).toVar();return vn(gv(n.x,i,s),gv(n.y,i,s),gv(n.z,i,s))}).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),fv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=Sn(e).toVar();return vn(gv(o.x,a,n,i),gv(o.y,a,n,i),gv(o.z,a,n,i))}).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),yv=mb([mv,fv]),bv=un(([e])=>{const t=gn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),xv=un(([e])=>{const t=gn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),Tv=mb([bv,un(([e])=>{const t=vn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),_v=mb([xv,un(([e])=>{const t=vn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),vv=un(([e,t])=>{const r=mn(t).toVar(),s=fn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(mn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),Nv=un(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(vv(r,mn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(vv(e,mn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(vv(t,mn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(vv(r,mn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(vv(e,mn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(vv(t,mn(4))),t.addAssign(e)}),Sv=un(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=fn(e).toVar();return s.bitXorAssign(i),s.subAssign(vv(i,mn(14))),n.bitXorAssign(s),n.subAssign(vv(s,mn(11))),i.bitXorAssign(n),i.subAssign(vv(n,mn(25))),s.bitXorAssign(i),s.subAssign(vv(i,mn(16))),n.bitXorAssign(s),n.subAssign(vv(s,mn(4))),i.bitXorAssign(n),i.subAssign(vv(n,mn(14))),s.bitXorAssign(i),s.subAssign(vv(i,mn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),Rv=un(([e])=>{const t=fn(e).toVar();return gn(t).div(gn(fn(mn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Ev=un(([e])=>{const t=gn(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),Av=mb([un(([e])=>{const t=mn(e).toVar(),r=fn(fn(1)).toVar(),s=fn(fn(mn(3735928559)).add(r.shiftLeft(fn(2))).add(fn(13))).toVar();return Sv(s.add(fn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(fn(2)).toVar(),n=fn().toVar(),a=fn().toVar(),o=fn().toVar();return n.assign(a.assign(o.assign(fn(mn(3735928559)).add(i.shiftLeft(fn(2))).add(fn(13))))),n.addAssign(fn(s)),a.addAssign(fn(r)),Sv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(fn(3)).toVar(),o=fn().toVar(),u=fn().toVar(),l=fn().toVar();return o.assign(u.assign(l.assign(fn(mn(3735928559)).add(a.shiftLeft(fn(2))).add(fn(13))))),o.addAssign(fn(n)),u.addAssign(fn(i)),l.addAssign(fn(s)),Sv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),un(([e,t,r,s])=>{const i=mn(s).toVar(),n=mn(r).toVar(),a=mn(t).toVar(),o=mn(e).toVar(),u=fn(fn(4)).toVar(),l=fn().toVar(),d=fn().toVar(),c=fn().toVar();return l.assign(d.assign(c.assign(fn(mn(3735928559)).add(u.shiftLeft(fn(2))).add(fn(13))))),l.addAssign(fn(o)),d.addAssign(fn(a)),c.addAssign(fn(n)),Nv(l,d,c),l.addAssign(fn(i)),Sv(l,d,c)}).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),un(([e,t,r,s,i])=>{const n=mn(i).toVar(),a=mn(s).toVar(),o=mn(r).toVar(),u=mn(t).toVar(),l=mn(e).toVar(),d=fn(fn(5)).toVar(),c=fn().toVar(),h=fn().toVar(),p=fn().toVar();return c.assign(h.assign(p.assign(fn(mn(3735928559)).add(d.shiftLeft(fn(2))).add(fn(13))))),c.addAssign(fn(l)),h.addAssign(fn(u)),p.addAssign(fn(o)),Nv(c,h,p),c.addAssign(fn(a)),h.addAssign(fn(n)),Sv(c,h,p)}).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),wv=mb([un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(Av(s,r)).toVar(),n=Sn().toVar();return n.x.assign(i.bitAnd(mn(255))),n.y.assign(i.shiftRight(mn(8)).bitAnd(mn(255))),n.z.assign(i.shiftRight(mn(16)).bitAnd(mn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(Av(n,i,s)).toVar(),o=Sn().toVar();return o.x.assign(a.bitAnd(mn(255))),o.y.assign(a.shiftRight(mn(8)).bitAnd(mn(255))),o.z.assign(a.shiftRight(mn(16)).bitAnd(mn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Cv=mb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(lv(t.x,r)).toVar(),n=gn(lv(t.y,s)).toVar(),a=gn(Ev(i)).toVar(),o=gn(Ev(n)).toVar(),u=gn(dv(gv(Av(r,s),i,n),gv(Av(r.add(mn(1)),s),i.sub(1),n),gv(Av(r,s.add(mn(1))),i,n.sub(1)),gv(Av(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return Tv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(lv(t.x,r)).toVar(),a=gn(lv(t.y,s)).toVar(),o=gn(lv(t.z,i)).toVar(),u=gn(Ev(n)).toVar(),l=gn(Ev(a)).toVar(),d=gn(Ev(o)).toVar(),c=gn(cv(gv(Av(r,s,i),n,a,o),gv(Av(r.add(mn(1)),s,i),n.sub(1),a,o),gv(Av(r,s.add(mn(1)),i),n,a.sub(1),o),gv(Av(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),gv(Av(r,s,i.add(mn(1))),n,a,o.sub(1)),gv(Av(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),gv(Av(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),gv(Av(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return _v(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),Mv=mb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(lv(t.x,r)).toVar(),n=gn(lv(t.y,s)).toVar(),a=gn(Ev(i)).toVar(),o=gn(Ev(n)).toVar(),u=vn(dv(yv(wv(r,s),i,n),yv(wv(r.add(mn(1)),s),i.sub(1),n),yv(wv(r,s.add(mn(1))),i,n.sub(1)),yv(wv(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return Tv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(lv(t.x,r)).toVar(),a=gn(lv(t.y,s)).toVar(),o=gn(lv(t.z,i)).toVar(),u=gn(Ev(n)).toVar(),l=gn(Ev(a)).toVar(),d=gn(Ev(o)).toVar(),c=vn(cv(yv(wv(r,s,i),n,a,o),yv(wv(r.add(mn(1)),s,i),n.sub(1),a,o),yv(wv(r,s.add(mn(1)),i),n,a.sub(1),o),yv(wv(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),yv(wv(r,s,i.add(mn(1))),n,a,o.sub(1)),yv(wv(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),yv(wv(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),yv(wv(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return _v(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),Bv=mb([un(([e])=>{const t=gn(e).toVar(),r=mn(uv(t)).toVar();return Rv(Av(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(uv(t.x)).toVar(),s=mn(uv(t.y)).toVar();return Rv(Av(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(uv(t.x)).toVar(),s=mn(uv(t.y)).toVar(),i=mn(uv(t.z)).toVar();return Rv(Av(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=En(e).toVar(),r=mn(uv(t.x)).toVar(),s=mn(uv(t.y)).toVar(),i=mn(uv(t.z)).toVar(),n=mn(uv(t.w)).toVar();return Rv(Av(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Lv=mb([un(([e])=>{const t=gn(e).toVar(),r=mn(uv(t)).toVar();return vn(Rv(Av(r,mn(0))),Rv(Av(r,mn(1))),Rv(Av(r,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(uv(t.x)).toVar(),s=mn(uv(t.y)).toVar();return vn(Rv(Av(r,s,mn(0))),Rv(Av(r,s,mn(1))),Rv(Av(r,s,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(uv(t.x)).toVar(),s=mn(uv(t.y)).toVar(),i=mn(uv(t.z)).toVar();return vn(Rv(Av(r,s,i,mn(0))),Rv(Av(r,s,i,mn(1))),Rv(Av(r,s,i,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=En(e).toVar(),r=mn(uv(t.x)).toVar(),s=mn(uv(t.y)).toVar(),i=mn(uv(t.z)).toVar(),n=mn(uv(t.w)).toVar();return vn(Rv(Av(r,s,i,n,mn(0))),Rv(Av(r,s,i,n,mn(1))),Rv(Av(r,s,i,n,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Fv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=gn(0).toVar(),l=gn(1).toVar();return lp(a,()=>{u.addAssign(l.mul(Cv(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Pv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(0).toVar(),l=gn(1).toVar();return lp(a,()=>{u.addAssign(l.mul(Mv(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Dv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar();return bn(Fv(o,a,n,i),Fv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i))}).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Uv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(Pv(o,a,n,i)).toVar(),l=gn(Fv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i)).toVar();return En(u,l)}).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Iv=mb([un(([e,t,r,s,i,n,a])=>{const o=mn(a).toVar(),u=gn(n).toVar(),l=mn(i).toVar(),d=mn(s).toVar(),c=mn(r).toVar(),h=mn(t).toVar(),p=bn(e).toVar(),g=vn(Lv(bn(h.add(d),c.add(l)))).toVar(),m=bn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=bn(bn(gn(h),gn(c)).add(m)).toVar(),y=bn(f.sub(p)).toVar();return cn(o.equal(mn(2)),()=>Mo(y.x).add(Mo(y.y))),cn(o.equal(mn(3)),()=>Ho(Mo(y.x),Mo(y.y))),Yo(y,y)}).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),un(([e,t,r,s,i,n,a,o,u])=>{const l=mn(u).toVar(),d=gn(o).toVar(),c=mn(a).toVar(),h=mn(n).toVar(),p=mn(i).toVar(),g=mn(s).toVar(),m=mn(r).toVar(),f=mn(t).toVar(),y=vn(e).toVar(),b=vn(Lv(vn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=vn(vn(gn(f),gn(m),gn(g)).add(b)).toVar(),T=vn(x.sub(y)).toVar();return cn(l.equal(mn(2)),()=>Mo(T.x).add(Mo(T.y)).add(Mo(T.z))),cn(l.equal(mn(3)),()=>Ho(Mo(T.x),Mo(T.y),Mo(T.z))),Yo(T,T)}).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Ov=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(lv(n.x,a),lv(n.y,o)).toVar(),l=gn(1e6).toVar();return lp({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{lp({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Iv(u,e,t,a,o,i,s)).toVar();l.assign(Wo(l,r))})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Vv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(lv(n.x,a),lv(n.y,o)).toVar(),l=bn(1e6,1e6).toVar();return lp({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{lp({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Iv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),kv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(lv(n.x,a),lv(n.y,o)).toVar(),l=vn(1e6,1e6,1e6).toVar();return lp({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{lp({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Iv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.z.assign(l.y),l.y.assign(r)}).ElseIf(r.lessThan(l.z),()=>{l.z.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Gv=mb([Ov,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(lv(n.x,a),lv(n.y,o),lv(n.z,u)).toVar(),d=gn(1e6).toVar();return lp({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{lp({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{lp({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Iv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(Wo(d,n))})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),zv=mb([Vv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(lv(n.x,a),lv(n.y,o),lv(n.z,u)).toVar(),d=bn(1e6,1e6).toVar();return lp({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{lp({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{lp({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Iv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),$v=mb([kv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(lv(n.x,a),lv(n.y,o),lv(n.z,u)).toVar(),d=vn(1e6,1e6,1e6).toVar();return lp({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{lp({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{lp({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Iv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.z.assign(d.y),d.y.assign(n)}).ElseIf(n.lessThan(d.z),()=>{d.z.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Wv=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=bn(t).toVar(),p=bn(r).toVar(),g=bn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Lv(v))}),cn(c.equal(mn(2)),()=>{N.assign($v(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Pv(vn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Hv=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=vn(t).toVar(),p=vn(r).toVar(),g=vn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Lv(v))}),cn(c.equal(mn(2)),()=>{N.assign($v(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Pv(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),qv=un(([e])=>{const t=e.y,r=e.z,s=vn().toVar();return cn(t.lessThan(1e-4),()=>{s.assign(vn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(To(i)).mul(6).toVar();const n=mn(Vo(i)),a=i.sub(gn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());cn(n.equal(mn(0)),()=>{s.assign(vn(r,l,o))}).ElseIf(n.equal(mn(1)),()=>{s.assign(vn(u,r,o))}).ElseIf(n.equal(mn(2)),()=>{s.assign(vn(o,r,l))}).ElseIf(n.equal(mn(3)),()=>{s.assign(vn(o,u,r))}).ElseIf(n.equal(mn(4)),()=>{s.assign(vn(l,o,r))}).Else(()=>{s.assign(vn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),jv=un(([e])=>{const t=vn(e).toVar(),r=gn(t.x).toVar(),s=gn(t.y).toVar(),i=gn(t.z).toVar(),n=gn(Wo(r,Wo(s,i))).toVar(),a=gn(Ho(r,Ho(s,i))).toVar(),o=gn(a.sub(n)).toVar(),u=gn().toVar(),l=gn().toVar(),d=gn().toVar();return d.assign(a),cn(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),cn(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{cn(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(Ma(2,i.sub(r).div(o)))}).Else(()=>{u.assign(Ma(4,r.sub(s).div(o)))}),u.mulAssign(1/6),cn(u.lessThan(0),()=>{u.addAssign(1)})}),vn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),Xv=un(([e])=>{const t=vn(e).toVar(),r=Rn(Oa(t,vn(.04045))).toVar(),s=vn(t.div(12.92)).toVar(),i=vn(Zo(Ho(t.add(vn(.055)),vn(0)).div(1.055),vn(2.4))).toVar();return nu(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Kv=(e,t)=>{e=gn(e),t=gn(t);const r=bn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return lu(e.sub(r),e.add(r),t)},Yv=(e,t,r,s)=>nu(e,t,r[s].clamp()),Qv=(e,t,r,s,i)=>nu(e,t,Kv(r,s[i])),Zv=un(([e,t,r])=>{const s=vo(e).toVar(),i=Ba(gn(.5).mul(t.sub(r)),Dd).div(s).toVar(),n=Ba(gn(-.5).mul(t.sub(r)),Dd).div(s).toVar(),a=vn().toVar();a.x=s.x.greaterThan(gn(0)).select(i.x,n.x),a.y=s.y.greaterThan(gn(0)).select(i.y,n.y),a.z=s.z.greaterThan(gn(0)).select(i.z,n.z);const o=Wo(a.x,a.y,a.z).toVar();return Dd.add(s.mul(o)).toVar().sub(r)}),Jv=un(([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(La(r,r).sub(La(s,s)))),n});var eN=Object.freeze({__proto__:null,BRDF_GGX:Ug,BRDF_Lambert:_g,BasicPointShadowFilter:K_,BasicShadowFilter:R_,Break:dp,Const:Cu,Continue:()=>gl("continue").toStack(),DFGLUT:Vg,D_GGX:Fg,Discard:ml,EPSILON:so,F_Schlick:Tg,Fn:un,HALF_PI:uo,INFINITY:io,If:cn,Loop:lp,NodeAccess:ti,NodeShaderStage:Zs,NodeType:ei,NodeUpdateType:Js,OnBeforeMaterialUpdate:e=>tx(ex.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>tx(ex.BEFORE_OBJECT,e),OnMaterialUpdate:e=>tx(ex.MATERIAL,e),OnObjectUpdate:e=>tx(ex.OBJECT,e),PCFShadowFilter:E_,PCFSoftShadowFilter:A_,PI:no,PI2:ao,PointShadowFilter:Y_,Return:()=>gl("return").toStack(),Schlick_to_F0:zg,ScriptableNodeResources:sT,ShaderNode:Qi,Stack:hn,Switch:(...e)=>_i.Switch(...e),TBNViewMatrix:Wc,TWO_PI:oo,VSMShadowFilter:w_,V_GGX_SmithCorrelated:Bg,Var:wu,VarIntent:Mu,abs:Mo,acesFilmicToneMapping:$x,acos:wo,add:Ma,addMethodChaining:Ni,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:jx,all:lo,alphaT:Yn,and:Ga,anisotropy:Qn,anisotropyB:Jn,anisotropyT:Zn,any:co,append:e=>(d("TSL: append() has been renamed to Stack()."),hn(e)),array:Na,arrayBuffer:e=>new xi(e,"ArrayBuffer"),asin:Ao,assign:Ra,atan:Co,atomicAdd:(e,t)=>wT(ET.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>wT(ET.ATOMIC_AND,e,t),atomicFunc:wT,atomicLoad:e=>wT(ET.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>wT(ET.ATOMIC_MAX,e,t),atomicMin:(e,t)=>wT(ET.ATOMIC_MIN,e,t),atomicOr:(e,t)=>wT(ET.ATOMIC_OR,e,t),atomicStore:(e,t)=>wT(ET.ATOMIC_STORE,e,t),atomicSub:(e,t)=>wT(ET.ATOMIC_SUB,e,t),atomicXor:(e,t)=>wT(ET.ATOMIC_XOR,e,t),attenuationColor:ha,attenuationDistance:ca,attribute:Sl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new sx(e,r,s);return Hh(i,t,e)},backgroundBlurriness:lx,backgroundIntensity:dx,backgroundRotation:cx,batch:ip,bentNormalView:qc,billboarding:_b,bitAnd:Ha,bitNot:qa,bitOr:ja,bitXor:Xa,bitangentGeometry:kc,bitangentLocal:Gc,bitangentView:zc,bitangentWorld:$c,bitcast:jy,blendBurn:Hp,blendColor:Kp,blendDodge:qp,blendOverlay:Xp,blendScreen:jp,blur:zm,bool:yn,buffer:Ul,bufferAttribute:Ju,builtin:Gl,builtinAOContext:Su,builtinShadowContext:Nu,bumpMap:eh,bvec2:_n,bvec3:Rn,bvec4:Cn,bypass:ll,cache:ol,call:Aa,cameraFar:rd,cameraIndex:ed,cameraNear:td,cameraNormalMatrix:od,cameraPosition:ud,cameraProjectionMatrix:sd,cameraProjectionMatrixInverse:id,cameraViewMatrix:nd,cameraViewport:ld,cameraWorldMatrix:ad,cbrt:su,cdl:wx,ceil:_o,checker:iv,cineonToneMapping:Gx,clamp:au,clearcoat:$n,clearcoatNormalView:Yd,clearcoatRoughness:Wn,clipSpace:Bd,code:Yx,color:pn,colorSpaceToWorking:Gu,colorToDirection:e=>Zi(e).mul(2).sub(1),compute:il,computeKernel:sl,computeSkinning:(e,t=null)=>{const r=new ap(e);return r.positionNode=Hh(new W(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(Xh).toVar(),r.skinIndexNode=Hh(new W(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(Xh).toVar(),r.skinWeightNode=Hh(new W(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(Xh).toVar(),r.bindMatrixNode=_a(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=_a(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Ul(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Zi(r)},context:Tu,convert:Pn,convertColorSpace:(e,t,r)=>Zi(new Vu(Zi(e),t,r)),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():jb(e,...t),cos:Ro,countLeadingZeros:Zy,countOneBits:Jy,countTrailingZeros:Qy,cross:Qo,cubeTexture:gc,cubeTextureBase:pc,dFdx:Do,dFdy:Uo,dashSize:na,debug:xl,decrement:eo,decrementBefore:Za,defaultBuildStages:si,defaultShaderStages:ri,defined:Ki,degrees:po,deltaTime:yb,densityFogFactor:uT,depth:Up,depthPass:(e,t,r)=>new Ix(Ix.DEPTH,e,t,r),determinant:zo,difference:Ko,diffuseColor:On,diffuseContribution:Vn,directPointLight:rv,directionToColor:jc,directionToFaceDirection:zd,dispersion:pa,disposeShadowMaterial:M_,distance:Xo,div:Fa,dot:Yo,drawIndex:Zh,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x),element:Fn,emissive:kn,equal:Da,equirectUV:og,exp:go,exp2:mo,exponentialHeightFogFactor:lT,expression:gl,faceDirection:Gd,faceForward:du,faceforward:mu,float:gn,floatBitsToInt:e=>new qy(e,"int","float"),floatBitsToUint:Xy,floor:To,fog:dT,fract:No,frameGroup:ya,frameId:bb,frontFacing:kd,fwidth:ko,gain:(e,t)=>e.lessThan(.5)?tb(e.mul(2),t).div(2):Ba(1,tb(La(Ba(1,e),2),t).div(2)),gapSize:aa,getConstNodeType:Yi,getCurrentStack:dn,getDirection:Om,getDistanceAttenuation:tv,getGeometryRoughness:Cg,getNormalFromDepth:Yb,getParallaxCorrectNormal:Zv,getRoughness:Mg,getScreenPosition:Kb,getShIrradianceAt:Jv,getShadowMaterial:C_,getShadowRenderObjectFunction:F_,getTextureIndex:$y,getViewPosition:Xb,ggxConvolution:qm,globalId:xT,glsl:(e,t)=>Yx(e,t,"glsl"),glslFn:(e,t)=>Zx(e,t,"glsl"),grayscale:Nx,greaterThan:Oa,greaterThanEqual:ka,hash:eb,highpModelNormalViewMatrix:Md,highpModelViewMatrix:Cd,hue:Ex,increment:Ja,incrementBefore:Qa,inspector:vl,instance:ep,instanceIndex:Xh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new rx(e,r,s);return Hh(i,t,e)},instancedBufferAttribute:el,instancedDynamicBufferAttribute:tl,instancedMesh:rp,int:mn,intBitsToFloat:e=>new qy(e,"float","int"),interleavedGradientNoise:Qb,inverse:$o,inverseSqrt:xo,inversesqrt:fu,invocationLocalIndex:Qh,invocationSubgroupIndex:Yh,ior:ua,iridescence:jn,iridescenceIOR:Xn,iridescenceThickness:Kn,isolate:al,ivec2:xn,ivec3:Nn,ivec4:An,js:(e,t)=>Yx(e,t,"js"),label:Ru,length:Lo,lengthSq:iu,lessThan:Ia,lessThanEqual:Va,lightPosition:n_,lightProjectionUV:i_,lightShadowMatrix:s_,lightTargetDirection:u_,lightTargetPosition:a_,lightViewPosition:o_,lightingContext:xp,lights:(e=[])=>(new h_).setLights(e),linearDepth:Ip,linearToneMapping:Vx,localId:TT,log:fo,log2:yo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(fo(r.div(t)));return gn(Math.E).pow(s).mul(t).negate()},luminance:Ax,mat2:Mn,mat3:Bn,mat4:Ln,matcapUV:Bf,materialAO:Vh,materialAlphaTest:sh,materialAnisotropy:vh,materialAnisotropyVector:kh,materialAttenuationColor:Mh,materialAttenuationDistance:Ch,materialClearcoat:fh,materialClearcoatNormal:bh,materialClearcoatRoughness:yh,materialColor:ih,materialDispersion:Ih,materialEmissive:ah,materialEnvIntensity:nc,materialEnvRotation:ac,materialIOR:wh,materialIridescence:Nh,materialIridescenceIOR:Sh,materialIridescenceThickness:Rh,materialLightMap:Oh,materialLineDashOffset:Dh,materialLineDashSize:Lh,materialLineGapSize:Fh,materialLineScale:Bh,materialLineWidth:Ph,materialMetalness:gh,materialNormal:mh,materialOpacity:oh,materialPointSize:Uh,materialReference:Tc,materialReflectivity:hh,materialRefractionRatio:ic,materialRotation:xh,materialRoughness:ph,materialSheen:Th,materialSheenRoughness:_h,materialShininess:nh,materialSpecular:uh,materialSpecularColor:dh,materialSpecularIntensity:lh,materialSpecularStrength:ch,materialThickness:Ah,materialTransmission:Eh,max:Ho,maxMipLevel:Cl,mediumpModelViewMatrix:wd,metalness:zn,min:Wo,mix:nu,mixElement:hu,mod:Pa,modInt:to,modelDirection:xd,modelNormalMatrix:Rd,modelPosition:_d,modelRadius:Sd,modelScale:vd,modelViewMatrix:Ad,modelViewPosition:Nd,modelViewProjection:Gh,modelWorldMatrix:Td,modelWorldMatrixInverse:Ed,morphReference:mp,mrt:Hy,mul:La,mx_aastep:Kv,mx_add:(e,t=gn(0))=>Ma(e,t),mx_atan2:(e=gn(0),t=gn(1))=>Co(e,t),mx_cell_noise_float:(e=Rl())=>Bv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>gn(e).sub(r).mul(t).add(r),mx_divide:(e,t=gn(1))=>Fa(e,t),mx_fractal_noise_float:(e=Rl(),t=3,r=2,s=.5,i=1)=>Fv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Rl(),t=3,r=2,s=.5,i=1)=>Dv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Rl(),t=3,r=2,s=.5,i=1)=>Pv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Rl(),t=3,r=2,s=.5,i=1)=>Uv(e,mn(t),r,s).mul(i),mx_frame:()=>bb,mx_heighttonormal:(e,t)=>(e=vn(e),t=gn(t),eh(e,t)),mx_hsvtorgb:qv,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=gn(1))=>Ba(t,e),mx_modulo:(e,t=gn(1))=>Pa(e,t),mx_multiply:(e,t=gn(1))=>La(e,t),mx_noise_float:(e=Rl(),t=1,r=0)=>Cv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Rl(),t=1,r=0)=>Mv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Rl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return En(Mv(e),Cv(e.add(bn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=bn(.5,.5),r=bn(1,1),s=gn(0),i=bn(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=bn(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=gn(1))=>Zo(e,t),mx_ramp4:(e,t,r,s,i=Rl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=nu(e,t,n),u=nu(r,s,n);return nu(o,u,a)},mx_ramplr:(e,t,r=Rl())=>Yv(e,t,r,"x"),mx_ramptb:(e,t,r=Rl())=>Yv(e,t,r,"y"),mx_rgbtohsv:jv,mx_rotate2d:(e,t)=>{e=bn(e);const r=(t=gn(t)).mul(Math.PI/180);return Df(e,r)},mx_rotate3d:(e,t,r)=>{e=vn(e),t=gn(t),r=vn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=gn(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=gn(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Rl())=>Qv(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Rl())=>Qv(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:Xv,mx_subtract:(e,t=gn(0))=>Ba(e,t),mx_timer:()=>fb,mx_transform_uv:(e=1,t=0,r=Rl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Wv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Hv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Rl(),t=1)=>Gv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec2:(e=Rl(),t=1)=>zv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec3:(e=Rl(),t=1)=>$v(e.convert("vec2|vec3"),t,mn(1)),negate:Fo,neutralToneMapping:Xx,nodeArray:tn,nodeImmutable:sn,nodeObject:Zi,nodeObjectIntent:Ji,nodeObjects:en,nodeProxy:rn,nodeProxyIntent:nn,normalFlat:Hd,normalGeometry:$d,normalLocal:Wd,normalMap:Yc,normalView:Xd,normalViewGeometry:qd,normalWorld:Kd,normalWorldGeometry:jd,normalize:vo,not:$a,notEqual:Ua,numWorkgroups:yT,objectDirection:hd,objectGroup:xa,objectPosition:gd,objectRadius:yd,objectScale:md,objectViewPosition:fd,objectWorldMatrix:pd,oneMinus:Po,or:za,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=fb)=>e.fract(),oscSine:(e=fb)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=fb)=>e.fract().round(),oscTriangle:(e=fb)=>e.add(.5).fract().mul(2).sub(1).abs(),output:ia,outputStruct:Vy,overloadingFn:mb,packHalf2x16:nb,packSnorm2x16:sb,packUnorm2x16:ib,parabola:tb,parallaxDirection:Hc,parallaxUV:(e,t)=>e.sub(Hc.mul(t)),parameter:(e,t)=>new Fy(e,t),pass:(e,t,r)=>new Ix(Ix.COLOR,e,t,r),passTexture:(e,t)=>new Dx(e,t),pcurve:(e,t,r)=>Zo(Fa(Zo(e,t),Ma(Zo(e,t),Zo(Ba(1,e),r))),1/t),perspectiveDepthToViewZ:Fp,pmremTexture:ff,pointShadow:J_,pointUV:nx,pointWidth:oa,positionGeometry:Ld,positionLocal:Fd,positionPrevious:Pd,positionView:Id,positionViewDirection:Od,positionWorld:Dd,positionWorldDirection:Ud,posterize:Mx,pow:Zo,pow2:Jo,pow3:eu,pow4:tu,premultiplyAlpha:Yp,property:Un,quadBroadcast:e_,quadSwapDiagonal:XT,quadSwapX:qT,quadSwapY:jT,radians:ho,rand:cu,range:gT,rangeFogFactor:oT,reciprocal:Oo,reference:yc,referenceBuffer:bc,reflect:jo,reflectVector:lc,reflectView:oc,reflector:e=>new Vb(e),refract:uu,refractVector:dc,refractView:uc,reinhardToneMapping:kx,remap:cl,remapClamp:hl,renderGroup:ba,renderOutput:yl,rendererReference:Hu,replaceDefaultUV:function(e,t=null){return Tu(t,{getUV:e})},rotate:Df,rotateUV:xb,roughness:Gn,round:Io,rtt:jb,sRGBTransferEOTF:Uu,sRGBTransferOETF:Iu,sample:(e,t=null)=>new Jb(e,Zi(t)),sampler:e=>(!0===e.isNode?e:Fl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Fl(e)).convert("samplerComparison"),saturate:ou,saturation:Sx,screenCoordinate:Xl,screenDPR:Hl,screenSize:jl,screenUV:ql,scriptable:nT,scriptableValue:eT,select:bu,setCurrentStack:ln,setName:vu,shaderStages:ii,shadow:k_,shadowPositionWorld:g_,shapeCircle:nv,sharedUniformGroup:fa,sheen:Hn,sheenRoughness:qn,shiftLeft:Ka,shiftRight:Ya,shininess:sa,sign:Bo,sin:So,sinc:(e,t)=>So(no.mul(t.mul(e).sub(1))).div(no.mul(t.mul(e).sub(1))),skinning:op,smoothstep:lu,smoothstepElement:pu,specularColor:ea,specularColorBlended:ta,specularF90:ra,spherizeUV:Tb,split:(e,t)=>Zi(new gi(Zi(e),t)),spritesheetUV:Nb,sqrt:bo,stack:Dy,step:qo,stepElement:gu,storage:Hh,storageBarrier:()=>NT("storage").toStack(),storageTexture:px,string:(e="")=>new xi(e,"string"),struct:(e,t=null)=>{const r=new Uy(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;efx(e,t).level(r),texture3DLoad:(...e)=>fx(...e).setSampler(!1),textureBarrier:()=>NT("texture").toStack(),textureBicubic:um,textureBicubicLevel:om,textureCubeUV:Vm,textureLevel:(e,t,r)=>Fl(e,t).level(r),textureLoad:Pl,textureSize:Al,textureStore:(e,t,r)=>{const s=px(e,t,r);return null!==r&&s.toStack(),s},thickness:da,time:fb,toneMapping:ju,toneMappingExposure:Xu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Zi(new Ox(t,r,Zi(s),Zi(i),Zi(n))),transformDirection:ru,transformNormal:Qd,transformNormalToView:Zd,transformedClearcoatNormalView:tc,transformedNormalView:Jd,transformedNormalWorld:ec,transmission:la,transpose:Go,triNoise3D:hb,triplanarTexture:(...e)=>Sb(...e),triplanarTextures:Sb,trunc:Vo,uint:fn,uintBitsToFloat:e=>new qy(e,"float","uint"),uniform:_a,uniformArray:Vl,uniformCubeTexture:(e=cc)=>pc(e),uniformFlow:_u,uniformGroup:ma,uniformTexture:(e=Ml)=>Fl(e),unpackHalf2x16:lb,unpackNormal:Xc,unpackSnorm2x16:ob,unpackUnorm2x16:ub,unpremultiplyAlpha:Qp,userData:(e,t,r)=>new yx(e,t,r),uv:Rl,uvec2:Tn,uvec3:Sn,uvec4:wn,varying:Pu,varyingProperty:In,vec2:bn,vec3:vn,vec4:En,vectorComponents:ni,velocity:vx,vertexColor:Wp,vertexIndex:jh,vertexStage:Du,vibrance:Rx,viewZToLogarithmicDepth:Pp,viewZToOrthographicDepth:Bp,viewZToPerspectiveDepth:Lp,viewport:Kl,viewportCoordinate:Ql,viewportDepthTexture:Cp,viewportLinearDepth:Op,viewportMipTexture:Sp,viewportOpaqueMipTexture:Ep,viewportResolution:Jl,viewportSafeUV:vb,viewportSharedTexture:Fx,viewportSize:Yl,viewportTexture:Np,viewportUV:Zl,vogelDiskSample:Zb,wgsl:(e,t)=>Yx(e,t,"wgsl"),wgslFn:(e,t)=>Zx(e,t,"wgsl"),workgroupArray:(e,t)=>new RT("Workgroup",e,t),workgroupBarrier:()=>NT("workgroup").toStack(),workgroupId:bT,workingToColorSpace:ku,xor:Wa});const tN=new Ly;class rN extends ry{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(tN),tN.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(tN),tN.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;tN.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=En(l).mul(dx).context({getUV:()=>cx.mul(jd),getTextureLevel:()=>lx}),p=sd.element(3).element(3).equal(1),g=Fa(1,sd.element(1).element(1)).mul(3),m=p.select(Fd.mul(g),Fd),f=Ad.mul(En(m,0));let y=sd.mul(En(f.xyz,1));y=y.setZ(y.w);const b=new Zp;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=M,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ne(new it(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=En(l).mul(dx),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?tN.set(0,0,0,1):"alpha-blend"===a&&tN.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=tN.r,T.g=tN.g,T.b=tN.b,T.a=tN.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let sN=0;class iN{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=sN++}}class nN{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new iN(t.name,[],t.index,t.bindingsReference);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class aN{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class oN{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class uN{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class lN extends uN{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class dN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let cN=0;class hN{constructor(e=null){this.id=cN++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class pN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class gN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class mN extends gN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class fN extends gN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class yN extends gN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class bN extends gN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class xN extends gN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class TN extends gN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class _N extends gN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class vN extends gN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class NN extends mN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class SN extends fN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class RN extends yN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class EN extends bN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class AN extends xN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class wN extends TN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class CN extends _N{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class MN extends vN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let BN=0;const LN=new WeakMap,FN=new WeakMap,PN=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),DN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class UN{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.types={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=Dy(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new hN,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:BN++})}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===ze&&!1===e.alphaToCoverage}getBindGroupsCache(){let e=FN.get(this.renderer);return void 0===e&&(e=new Qf,FN.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new Ne(e,t,r)}createCubeRenderTarget(e,t){return new ug(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new iN(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new iN(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of ii)for(const s in r[e]){const i=r[e][s],n=t[s]||(t[s]=[]);for(const e of i)!1===n.includes(e)&&n.push(e)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order);for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${DN(n.r)}, ${DN(n.g)}, ${DN(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new aN(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===R)return"int";if(t===S)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=Gs(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return PN.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ot||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Dy(this.stack);const e=dn();return this.stacks.push(e),ln(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,ln(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new aN("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const a=this.structs.index++;null===r&&(r="StructType"+a),n=new pN(r,t),this.structs[s].push(n),this.types[s][r]=e,i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new oN(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new uN(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new lN(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,d(`TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new dN("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new Qx,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new Fy(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new hN,this.stack=Dy();for(const r of si)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){d("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){d("Abstract function.")}getVaryings(){d("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){d("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){d("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Zp),e.build(this)}else this.addFlow("compute",e);for(const e of si){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ii){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getSharedDataFromNode(e){let t=LN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new NN(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new SN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new RN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new EN(e);else if("color"===t)s=new AN(e);else if("mat2"===t)s=new wN(e);else if("mat3"===t)s=new CN(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new MN(e)}r.cache=s}return s}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,this.getTypeFromLength(i,this.getComponentType(t)),r)):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${ut} - Node System\n`}needsPreviousData(){const e=this.renderer.getMRT();return e&&e.has("velocity")||!0===Xs(this.object).useVelocity}}class IN{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===Js.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===Js.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class ON{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}ON.isNodeFunctionInput=!0;class VN extends ev{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class kN extends ev{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:u_(this.light),lightColor:e}}}class GN extends ev{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=n_(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=_a(new e).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=Kd.dot(s).mul(.5).add(.5),n=nu(r,t,i);e.context.irradiance.addAssign(n)}}class zN extends ev{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=_a(0).setGroup(ba),this.penumbraCosNode=_a(0).setGroup(ba),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(0).setGroup(ba),this.colorNode=_a(this.color).setGroup(ba)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e,t){const{coneCosNode:r,penumbraCosNode:s}=this;return lu(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=i_(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(u_(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=tv({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=Fl(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class $N extends zN{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=Fl(r,bn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}class WN extends ev{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Vl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=Jv(Kd,this.lightProbe);e.context.irradiance.addAssign(t)}}const HN=un(([e,t])=>{const r=e.abs().sub(t);return Lo(Ho(r,0)).add(Wo(Ho(r.x,r.y),0))});class qN extends zN{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=gn(0),r=this.penumbraCosNode,s=s_(this.light).mul(e.context.positionWorld||Dd);return cn(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=HN(e.xy.sub(bn(.5)),bn(.5)),n=Fa(-1,Ba(1,wo(r)).sub(1));t.assign(ou(i.mul(-2).mul(n)))}),t}}const jN=new a,XN=new a;let KN=null;class YN extends ev{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=_a(new r).setGroup(ba),this.halfWidth=_a(new r).setGroup(ba),this.updateType=Js.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;XN.identity(),jN.copy(t.matrixWorld),jN.premultiply(r),XN.extractRotation(jN),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(XN),this.halfHeight.value.applyMatrix4(XN)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Fl(KN.LTC_FLOAT_1),r=Fl(KN.LTC_FLOAT_2)):(t=Fl(KN.LTC_HALF_1),r=Fl(KN.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:o_(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){KN=e}}class QN{parseFunction(){d("Abstract function.")}}class ZN{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}ZN.isNodeFunction=!0;const JN=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,eS=/[a-z_0-9]+/gi,tS="#pragma main";class rS extends ZN{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(tS),r=-1!==t?e.slice(t+12):e,s=r.match(JN);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=eS.exec(i));)n.push(a);const o=[];let u=0;for(;u{const r=this.backend.createNodeBuilder(e.object,this.renderer);return r.scene=e.scene,r.material=t,r.camera=e.camera,r.context.material=t,r.lightsNode=e.lightsNode,r.environmentNode=this.getEnvironmentNode(e.scene),r.fogNode=this.getFogNode(e.scene),r.clippingContext=e.clippingContext,this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview&&r.enableMultiview(),r};let n=t(e.material);try{n.build()}catch(e){n=t(new Zp),n.build(),o("TSL: "+e)}r=this._createNodeBuilderState(n),s.set(i,r)}r.usedTimes++,t.nodeBuilderState=r}return r}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new nN(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){nS[0]=e,nS[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(nS)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&aS.push(t.getCacheKey(!0)),i&&aS.push(i.getCacheKey()),n&&aS.push(n.getCacheKey()),aS.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),aS.push(this.renderer.shadowMap.enabled?1:0),aS.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Is(aS),this.callHashCache.set(nS,s),aS.length=0}return nS.length=0,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===le||r.mapping===de||r.mapping===Ee){if(e.backgroundBlurriness>0||r.mapping===Ee)return ff(r);{let e;return e=!0===r.isCubeTexture?gc(r):Fl(r),pg(e)}}if(!0===r.isTexture)return Fl(r,ql.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("WebGPUNodes: Unsupported background configuration.",r)},s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,()=>{if(r.isFogExp2){const e=yc("color","color",r).setGroup(ba),t=yc("density","float",r).setGroup(ba);return dT(e,uT(t))}if(r.isFog){const e=yc("color","color",r).setGroup(ba),t=yc("near","float",r).setGroup(ba),s=yc("far","float",r).setGroup(ba);return dT(e,oT(t,s))}o("Renderer: Unsupported fog configuration.",r)});t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,()=>!0===r.isCubeTexture?gc(r):!0===r.isTexture?Fl(r):void o("Nodes: Unsupported environment configuration.",r));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace+","+e.xr.isPresenting}hasOutputChange(e){return iS.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?fx(e,vn(ql,Gl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Fl(e,ql).renderOutput(t.toneMapping,t.currentColorSpace);return iS.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new IN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const uS=new je;class lS{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new yS(i.framebufferWidth,i.framebufferHeight,{format:Re,type:Ge,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),i.layers.mask=6|e.layers.mask,n.layers.mask=-5&i.layers.mask,a.layers.mask=-3&i.layers.mask;const o=e.parent,u=i.cameras;_S(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function RS(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function ES(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(this._renderTarget,this._mrt),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){return null!==this._initPromise||(this._initPromise=new Promise(async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new oS(this,r),this._animation=new Yf(this,this._nodes,this.info),this._attributes=new uy(r),this._background=new rN(this,this._nodes),this._geometries=new cy(this._attributes,this.info),this._textures=new By(this,r,this.info),this._pipelines=new by(r,this._nodes),this._bindings=new xy(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new ty(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Ry(this.lighting),this._bundles=new hS,this._renderContexts=new Cy,this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._handleObjectFunction,u=this._compilationPromises,l=!0===e.isScene?e:wS;null===r&&(r=e);const d=this._renderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new lS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(e,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u,await Promise.all(p)}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=Cd,t.modelNormalViewMatrix=Md):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===Cd&&e.modelNormalViewMatrix===Md}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=_,g.viewportValue.maxDepth=v,g.viewport=!1===g.viewportValue.equals(MS),g.scissorValue.copy(x).multiplyScalar(T).floor(),g.scissor=y._scissorTest&&!1===g.scissorValue.equals(MS),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new lS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const N=t.isArrayCamera?LS:BS;t.isArrayCamera||(FS.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),N.setFromProjectionMatrix(FS,t.coordinateSystem,t.reversedDepth));const S=this._renderLists.get(e,t);if(S.begin(),this._projectObject(e,t,0,S,g.clippingContext),S.finish(),!0===this.sortObjects&&S.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=CS.width,g.height=CS.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=S.occlusionQueryCount,g.scissorValue.max(PS.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,S,g),g.camera=t,this.backend.beginRender(g);const{bundles:R,lightsNode:E,transparentDoublePass:A,transparent:w,opaque:C}=S;return R.length>0&&this._renderBundles(R,l,E),!0===this.opaque&&C.length>0&&this._renderObjects(C,t,l,E),!0===this.transparent&&w.length>0&&this._renderTransparents(w,A,t,l,E),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._height=t,this.setViewport(0,0,e,t)}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,n)}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.get(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){!0===this._initialized&&(this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach(e=>{null!==e&&e.dispose()})),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.deleteForCompute(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=PS.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=PS.copy(t).floor()}else t=PS.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t),this._inspector.copyFramebufferToTexture(e)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n),this._inspector.copyTextureToTexture(e,t)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?LS:BS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&PS.setFromMatrixPosition(e.matrixWorld).applyMatrix4(FS);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,PS.z,null,i)}}else if(e.isLineLoop)o("Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if(e.isMesh||e.isLine||e.isPoints){const n=t.isArrayCamera?LS:BS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),PS.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(FS)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=M;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=ct;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=B}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n(t.not().discard(),e))(u)}}e.depthNode&&e.depthNode.isNode&&(l=e.depthNode),e.castShadowPositionNode&&e.castShadowPositionNode.isNode?o=e.castShadowPositionNode:e.positionNode&&e.positionNode.isNode&&(o=e.positionNode),r={version:t,colorNode:u,depthNode:l,positionNode:o},this._cacheShadowNodes.set(e,r)}return r}renderObject(e,t,r,s,i,n,a,o=null,u=null){let l,d,c,h,p=!1;if(e.onBeforeRender(this,t,r,s,i,n),!0===i.allowOverride&&null!==t.overrideMaterial){const e=t.overrideMaterial;if(p=!0,l=t.overrideMaterial.colorNode,d=t.overrideMaterial.depthNode,c=t.overrideMaterial.positionNode,h=t.overrideMaterial.side,i.positionNode&&i.positionNode.isNode&&(e.positionNode=i.positionNode),e.alphaTest=i.alphaTest,e.alphaMap=i.alphaMap,e.transparent=i.transparent||i.transmission>0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);this.shadowMap.type===Ze?e.side=null!==i.shadowSide?i.shadowSide:i.side:e.side=null!==i.shadowSide?i.shadowSide:DS[i.side],null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===B&&!1===i.forceSinglePass?(i.side=M,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=ct,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=B):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){return this.backend.hasCompatibility(e)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class IS{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class OS extends IS{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(oy-e%oy)%oy;var e}get buffer(){return this._buffer}update(){return!0}}class VS extends OS{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let kS=0;class GS extends VS{constructor(e,t){super("UniformBuffer_"+kS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class zS extends VS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.generation=null,this.version=0},this.texture=t,this.version=t?t.version:0,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=0},e.texture=this.texture,e}}let qS=0;class jS extends HS{constructor(e,t){super(e,t),this.id=qS++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class XS extends jS{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class KS extends XS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class YS extends XS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const QS={bitcast_int_uint:new Kx("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new Kx("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},ZS={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},JS={low:"lowp",medium:"mediump",high:"highp"},eR={swizzleAssign:!0,storageBuffer:!1},tR={perspective:"smooth",linear:"noperspective"},rR={centroid:"centroid"},sR="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision highp sampler2DShadow;\nprecision highp sampler2DArrayShadow;\nprecision highp samplerCubeShadow;\n";class iR extends UN{constructor(e,t){super(e,t,new sS),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=QS[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==QS[e]&&this._include(e),ZS[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`${e} ? ${t} : ${r}`}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?Tt:_t;2===s?n=i?Rt:G:3===s?n=i?Et:At:4===s&&(n=i?wt:Re);const a={Float32Array:j,Uint8Array:Ge,Uint16Array:St,Uint32Array:S,Int8Array:Nt,Int16Array:vt,Int32Array:R,Uint8ClampedArray:Ge},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=JS[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=JS[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${tR[s.interpolationType]||s.interpolationType} ${rR[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${tR[e.interpolationType]||e.interpolationType} ${rR[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce((e,t)=>e*t,1)}u`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=eR[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}eR[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new XS(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new KS(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new YS(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new GS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new WS(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let nR=null,aR=null;class oR{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[Ct.RENDER]:null,[Ct.COMPUTE]:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?Ct.COMPUTE:Ct.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return nR=nR||new t,this.renderer.getDrawingBufferSize(nR)}setScissorTest(){}getClearColor(){const e=this.renderer;return aR=aR||new Ly,e.getClearColor(aR),aR.getRGB(aR),aR}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Mt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${ut} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}deleteBindGroupData(){}dispose(){}}let uR,lR,dR=0;class cR{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class hR{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===R,id:dR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new cR(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e0?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()})}}let mR,fR,yR,bR=!1;class xR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===bR&&(this._init(),bR=!0)}_init(){const e=this.gl;mR={[Vr]:e.REPEAT,[xe]:e.CLAMP_TO_EDGE,[Or]:e.MIRRORED_REPEAT},fR={[w]:e.NEAREST,[kr]:e.NEAREST_MIPMAP_NEAREST,[at]:e.NEAREST_MIPMAP_LINEAR,[oe]:e.LINEAR,[nt]:e.LINEAR_MIPMAP_NEAREST,[K]:e.LINEAR_MIPMAP_LINEAR},yR={[qr]:e.NEVER,[Hr]:e.ALWAYS,[A]:e.LESS,[Je]:e.LEQUAL,[Wr]:e.EQUAL,[$r]:e.GEQUAL,[zr]:e.GREATER,[Gr]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];d("WebGLBackend: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}if(t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)}return t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this,n=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,o),r.texParameteri(e,r.TEXTURE_WRAP_S,mR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,mR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,mR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,fR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===oe&&u?K:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,fR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,yR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===w)return;if(t.minFilter!==at&&t.minFilter!==K)return;if(t.type===j&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(!e.isRenderTargetTexture&&void 0!==n)if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0){const t=Xr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e));i.bindRenderbuffer(i.RENDERBUFFER,null)}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();a.state.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function TR(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class _R{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class vR{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const NR={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class SR{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){o("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){o("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise(t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){o("Error checking query:",e),t(this.lastValue)}};n()})}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class AR extends oR{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.currentSamples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new _R(this),this.capabilities=new vR(this),this.attributeUtils=new hR(this),this.textureUtils=new xR(this),this.bufferRenderer=new SR(this),this.state=new pR(this),this.utils=new gR(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed")}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e._autoAllocateDepthBuffer&&!1===e.multiview&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new ER(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e)),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(v("WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):v("WebGLBackend: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()});return void t.push(i)}this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=(e.getShaderInfoLog(t)||"").trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=(s.getProgramInfoLog(e)||"").trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");o("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&d("WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;eNR[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=wy(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const wR="point-list",CR="line-list",MR="line-strip",BR="triangle-list",LR="triangle-strip",FR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},PR="never",DR="less",UR="equal",IR="less-equal",OR="greater",VR="not-equal",kR="greater-equal",GR="always",zR="store",$R="load",WR="clear",HR="ccw",qR="cw",jR="none",XR="back",KR="uint16",YR="uint32",QR="r8unorm",ZR="r8snorm",JR="r8uint",eE="r8sint",tE="r16uint",rE="r16sint",sE="r16float",iE="rg8unorm",nE="rg8snorm",aE="rg8uint",oE="rg8sint",uE="r32uint",lE="r32sint",dE="r32float",cE="rg16uint",hE="rg16sint",pE="rg16float",gE="rgba8unorm",mE="rgba8unorm-srgb",fE="rgba8snorm",yE="rgba8uint",bE="rgba8sint",xE="bgra8unorm",TE="bgra8unorm-srgb",_E="rgb9e5ufloat",vE="rgb10a2unorm",NE="rg11b10ufloat",SE="rg32uint",RE="rg32sint",EE="rg32float",AE="rgba16uint",wE="rgba16sint",CE="rgba16float",ME="rgba32uint",BE="rgba32sint",LE="rgba32float",FE="depth16unorm",PE="depth24plus",DE="depth24plus-stencil8",UE="depth32float",IE="depth32float-stencil8",OE="bc1-rgba-unorm",VE="bc1-rgba-unorm-srgb",kE="bc2-rgba-unorm",GE="bc2-rgba-unorm-srgb",zE="bc3-rgba-unorm",$E="bc3-rgba-unorm-srgb",WE="bc4-r-unorm",HE="bc4-r-snorm",qE="bc5-rg-unorm",jE="bc5-rg-snorm",XE="bc6h-rgb-ufloat",KE="bc6h-rgb-float",YE="bc7-rgba-unorm",QE="bc7-rgba-unorm-srgb",ZE="etc2-rgb8unorm",JE="etc2-rgb8unorm-srgb",eA="etc2-rgb8a1unorm",tA="etc2-rgb8a1unorm-srgb",rA="etc2-rgba8unorm",sA="etc2-rgba8unorm-srgb",iA="eac-r11unorm",nA="eac-r11snorm",aA="eac-rg11unorm",oA="eac-rg11snorm",uA="astc-4x4-unorm",lA="astc-4x4-unorm-srgb",dA="astc-5x4-unorm",cA="astc-5x4-unorm-srgb",hA="astc-5x5-unorm",pA="astc-5x5-unorm-srgb",gA="astc-6x5-unorm",mA="astc-6x5-unorm-srgb",fA="astc-6x6-unorm",yA="astc-6x6-unorm-srgb",bA="astc-8x5-unorm",xA="astc-8x5-unorm-srgb",TA="astc-8x6-unorm",_A="astc-8x6-unorm-srgb",vA="astc-8x8-unorm",NA="astc-8x8-unorm-srgb",SA="astc-10x5-unorm",RA="astc-10x5-unorm-srgb",EA="astc-10x6-unorm",AA="astc-10x6-unorm-srgb",wA="astc-10x8-unorm",CA="astc-10x8-unorm-srgb",MA="astc-10x10-unorm",BA="astc-10x10-unorm-srgb",LA="astc-12x10-unorm",FA="astc-12x10-unorm-srgb",PA="astc-12x12-unorm",DA="astc-12x12-unorm-srgb",UA="clamp-to-edge",IA="repeat",OA="mirror-repeat",VA="linear",kA="nearest",GA="zero",zA="one",$A="src",WA="one-minus-src",HA="src-alpha",qA="one-minus-src-alpha",jA="dst",XA="one-minus-dst",KA="dst-alpha",YA="one-minus-dst-alpha",QA="src-alpha-saturated",ZA="constant",JA="one-minus-constant",ew="add",tw="subtract",rw="reverse-subtract",sw="min",iw="max",nw=0,aw=15,ow="keep",uw="zero",lw="replace",dw="invert",cw="increment-clamp",hw="decrement-clamp",pw="increment-wrap",gw="decrement-wrap",mw="storage",fw="read-only-storage",yw="write-only",bw="read-only",xw="read-write",Tw="non-filtering",_w="comparison",vw="float",Nw="unfilterable-float",Sw="depth",Rw="sint",Ew="uint",Aw="2d",ww="3d",Cw="2d",Mw="2d-array",Bw="cube",Lw="3d",Fw="all",Pw="vertex",Dw="instance",Uw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"},Iw={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class Ow extends HS{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class Vw extends OS{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let kw=0;class Gw extends Vw{constructor(e,t){super("StorageBuffer_"+kw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ti.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class zw extends ry{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:VA}),this.flipYSampler=e.createSampler({minFilter:kA}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:LR,stripIndexFormat:YR},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:LR,stripIndexFormat:YR},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Cw,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:Cw,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:WR,storeOp:zR,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0,s=null){const i=this.get(e);void 0===i.layers&&(i.layers=[]);const n=i.layers[r]||this._mipmapCreateBundles(e,t,r),a=s||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(a,n),null===s&&this.device.queue.submit([a.finish()]),i.layers[r]=n}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Cw,baseArrayLayer:r});const a=[];for(let o=1;o0)for(let t=0,n=s.length;t0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new zw(this.backend.device)),e}_generateMipmaps(e,t,r=0,s=null){this._getPassUtils().generateMipmaps(e,t,r,s)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,Xw=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,Kw={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class Yw extends ZN{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(jw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=Xw.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class Qw extends QN{parseFunction(e){return new Yw(e)}}const Zw={[ti.READ_ONLY]:"read",[ti.WRITE_ONLY]:"write",[ti.READ_WRITE]:"read_write"},Jw={[Vr]:"repeat",[xe]:"clamp",[Or]:"mirror"},eC={vertex:FR.VERTEX,fragment:FR.FRAGMENT,compute:FR.COMPUTE},tC={instance:!0,swizzleAssign:!1,storageBuffer:!0},rC={"^^":"tsl_xor"},sC={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},iC={},nC={tsl_xor:new Kx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new Kx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new Kx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new Kx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new Kx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new Kx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new Kx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new Kx("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new Kx("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new Kx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new Kx("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new Kx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new Kx("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},aC={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let oC="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(oC+="diagnostic( off, derivative_uniformity );\n");class uC extends UN{constructor(e,t){super(e,t,new Qw),this.uniformGroups={},this.uniformGroupsBindings={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${Jw[e.wrapS]}S_${Jw[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=iC[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Vr?(s.push(nC.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===xe?(s.push(nC.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Or?(s.push(nC.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",iC[t]=r=new Kx(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Eu(new pl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Eu(new pl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Eu(new pl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u"){this._include("biquadraticTexture");const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${a}`),`tsl_biquadraticTexture( ${t}, ${n}( ${r} ), ${a}, u32( ${i} ) )`}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";return i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`),r=`${u}( ${a}( ${r} ) * ${u}( ${o} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction&&this.renderer.hasCompatibility(E.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===j||!1===this.isSampleCompare(e)&&e.minFilter===w&&e.magFilter===w||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"cubeDepthTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=rC[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),ti.READ_WRITE):ti.READ_ONLY:e.access}getStorageAccess(e,t){return Zw[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new YS(i.name,i.node,o,n):new XS(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new KS(i.name,i.node,o,n):"texture3D"===t&&(s=new YS(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(eC[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new Ow(`${i.name}_sampler`,i.node,o);e.setVisibility(eC[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?GS:Gw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|eC[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e?(e=new WS(u,o),e.setVisibility(eC[r]),this.uniformGroups[u]=e,l.push(e)):(e.setVisibility(e.getVisibility()|eC[r]),-1===l.indexOf(e)&&l.push(e)),a=this.getNodeUniform(i,t);const s=a.name;e.uniforms.some(e=>e.name===s)||e.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","builtinClipSpace","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!1===this.isUnfilterable(t)&&!0!==i.node.isStorageTextureNode)&&(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=qw(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}let s=this.uniformGroupsBindings[e];void 0===s&&(s={index:a.binding++,id:a.group},this.uniformGroupsBindings[e]=s),n[e]={index:s.index,id:s.id,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.builtinClipSpace = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return sC[e]||e}isAvailable(e){let t=tC[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),tC[e]=t),t}_getWGSLMethod(e){return void 0!==nC[e]&&this._include(e),aC[e]}_include(e){const t=nC[e];return t.build(this),this.addInclude(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${oC}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){const[r,s,i]=t;return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class lC{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return e.depth&&(t=null!==e.depthTexture?this.getTextureFormatGPU(e.depthTexture):e.stencil?DE:PE),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.currentSamples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?wR:e.isLineSegments||e.isMesh&&!0===t.wireframe?CR:e.isLine?MR:e.isMesh?BR:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ge)return xE;if(e===be)return CE;throw new Error("Unsupported output buffer type.")}}const dC=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&dC.set(Float16Array,["float16"]);const cC=new Map([[ot,["float16"]]]),hC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class pC{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=Kr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=Fw;let o;o=t.isSampledCubeTexture?Bw:t.isSampledTexture3D?Lw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Mw:Cw,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&FR.COMPUTE&&(s.access===ti.READ_WRITE||s.access===ti.WRITE_ONLY)?e.type=mw:e.type=fw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===ti.READ_WRITE?xw:t===ti.WRITE_ONLY?yw:bw,s.texture.isArrayTexture?e.viewDimension=Mw:s.texture.is3DTexture&&(e.viewDimension=Lw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=Nw)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=Nw:t.sampleType=Sw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=Rw:e===S?t.sampleType=Ew:e===j&&(this.backend.hasFeature("float32-filterable")?t.sampleType=vw:t.sampleType=Nw)}s.isSampledCubeTexture?t.viewDimension=Bw:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=Mw:s.isSampledTexture3D&&(t.viewDimension=Lw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(E.TEXTURE_COMPARE)?t.type=_w:t.type=Tw),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class fC{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===ee||s.blending===ze&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures,r=e.context.mrt;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},E={},A=e.context.depth,w=e.context.stencil;if(!0!==A&&!0!==w||(!0===A&&(E.format=N,E.depthWriteEnabled=s.depthWrite,E.depthCompare=v),!0===w&&(E.stencilFront=f,E.stencilBack={},E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),R.depthStencil=E),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(R),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(R)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),e()});t.push(e)}}createBundleEncoder(e,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:s.getCurrentColorFormats(e),depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e),{layoutGPU:s}=t.layout;a.push(s)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===ht){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:ew},r={srcFactor:i,dstFactor:n,operation:ew}};if(e.premultipliedAlpha)switch(s){case ze:i(zA,qA,zA,qA);break;case qt:i(zA,zA,zA,zA);break;case Ht:i(GA,WA,GA,zA);break;case Wt:i(jA,qA,GA,zA)}else switch(s){case ze:i(HA,qA,zA,qA);break;case qt:i(HA,zA,zA,zA);break;case Ht:o(`WebGPURenderer: "SubtractiveBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`);break;case Wt:o(`WebGPURenderer: "MultiplyBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case pt:t=GA;break;case kt:t=zA;break;case Vt:t=$A;break;case Dt:t=WA;break;case $e:t=HA;break;case We:t=qA;break;case It:t=jA;break;case Pt:t=XA;break;case Ut:t=KA;break;case Ft:t=YA;break;case Ot:t=QA;break;case 211:t=ZA;break;case 212:t=JA;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ss:t=PR;break;case rs:t=GR;break;case ts:t=DR;break;case es:t=IR;break;case Jr:t=UR;break;case Zr:t=kR;break;case Qr:t=OR;break;case Yr:t=VR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case cs:t=ow;break;case ds:t=uw;break;case ls:t=lw;break;case us:t=dw;break;case os:t=cw;break;case as:t=hw;break;case ns:t=pw;break;case is:t=gw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case He:t=ew;break;case Lt:t=tw;break;case Bt:t=rw;break;case ps:t=sw;break;case hs:t=iw;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?KR:YR);let n=r.side===M;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?qR:HR,s.cullMode=r.side===B?jR:XR,s}_getColorWriteMask(e){return!0===e.colorWrite?aw:nw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=GR;else{const r=e.depthFunc;switch(r){case er:t=PR;break;case Jt:t=GR;break;case Zt:t=DR;break;case Qt:t=IR;break;case Yt:t=UR;break;case Kt:t=kR;break;case Xt:t=OR;break;case jt:t=VR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class yC extends RR{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class bC extends oR{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.defaultRenderPassdescriptor=null,this.utils=new lC(this),this.attributeUtils=new pC(this),this.bindingUtils=new mC(this),this.pipelineUtils=new fC(this),this.textureUtils=new Hw(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[E.TEXTURE_COMPARE]:t}}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:t.compatibilityMode?"compatibility":void 0},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(Uw),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}else r=t.device;r.lost.then(t=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Uw.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${ut} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===be?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:$R}),this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e),n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n),l=u.pipeline;if(!0===u.error)return;const d=e.getIndex(),c=null!==d,h=e.getDrawParameters();if(null===h)return;const p=(t,r)=>{this.pipelineUtils.setPipeline(t,l),r.pipeline=l;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(p(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&v("WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===c?s.drawIndexed(i[o],n,e[o]/d.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===c){const{vertexCount:i,instanceCount:n,firstVertex:a}=h,o=e.getIndirect();if(null!==o){const t=this.get(o).buffer,r=e.getIndirectOffset(),i=Array.isArray(r)?r:[r];for(let e=0;e0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new AR(e)));super(new t(e),e),this.library=new _C,this.isWebGPURenderer=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}}class NC extends As{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class SC{constructor(e,t=En(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Zp;r.name="PostProcessing",this._quadMesh=new Wb(r),this._quadMesh.name="Post-Processing",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=yl(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){v('PostProcessing: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class RC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class EC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!1,this.image={width:e,height:t,depth:r},this.magFilter=oe,this.minFilter=oe,this.wrapR=xe,this.isStorageTexture=!0,this.is3DTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class AC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!0,this.image={width:e,height:t,depth:r},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class wC extends sx{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class CC extends ws{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Cs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):o(t),this.manager.itemError(e)}},r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(o("NodeLoader: Node type not found:",e),gn()):new this.nodes[e]}}class MC extends Ms{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class BC extends Bs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new CC;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new MC;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t} [promises=null] - An array of compilation promises which is only relevant in context of `Renderer.compileAsync()`. - * @return {RenderPipeline} The render pipeline. + * @return {RenderObjectPipeline} The render pipeline. */ getForRender( renderObject, promises = null ) { @@ -31057,7 +31057,7 @@ class Pipelines extends DataMap { * @param {ProgrammableStage} stageFragment - The programmable stage representing the fragment shader. * @param {string} cacheKey - The cache key. * @param {?Array} promises - An array of compilation promises which is only relevant in context of `Renderer.compileAsync()`. - * @return {RenderPipeline} The render pipeline. + * @return {RenderObjectPipeline} The render pipeline. */ _getRenderPipeline( renderObject, stageVertex, stageFragment, cacheKey, promises ) { @@ -31069,7 +31069,7 @@ class Pipelines extends DataMap { if ( pipeline === undefined ) { - pipeline = new RenderPipeline( cacheKey, stageVertex, stageFragment ); + pipeline = new RenderObjectPipeline( cacheKey, stageVertex, stageFragment ); this.caches.set( cacheKey, pipeline ); @@ -52857,6 +52857,38 @@ class NodeFunctionInput { NodeFunctionInput.isNodeFunctionInput = true; +/** + * Module for representing ambient lights as nodes. + * + * @augments AnalyticLightNode + */ +class AmbientLightNode extends AnalyticLightNode { + + static get type() { + + return 'AmbientLightNode'; + + } + + /** + * Constructs a new ambient light node. + * + * @param {?AmbientLight} [light=null] - The ambient light source. + */ + constructor( light = null ) { + + super( light ); + + } + + setup( { context } ) { + + context.irradiance.addAssign( this.colorNode ); + + } + +} + /** * Module for representing directional lights as nodes. * @@ -52892,123 +52924,78 @@ class DirectionalLightNode extends AnalyticLightNode { } -const _matrix41 = /*@__PURE__*/ new Matrix4(); -const _matrix42 = /*@__PURE__*/ new Matrix4(); - -let _ltcLib = null; - /** - * Module for representing rect area lights as nodes. + * Module for representing hemisphere lights as nodes. * * @augments AnalyticLightNode */ -class RectAreaLightNode extends AnalyticLightNode { +class HemisphereLightNode extends AnalyticLightNode { static get type() { - return 'RectAreaLightNode'; + return 'HemisphereLightNode'; } /** - * Constructs a new rect area light node. + * Constructs a new hemisphere light node. * - * @param {?RectAreaLight} [light=null] - The rect area light source. + * @param {?HemisphereLight} [light=null] - The hemisphere light source. */ constructor( light = null ) { super( light ); /** - * Uniform node representing the half height of the are light. + * Uniform node representing the light's position. * * @type {UniformNode} */ - this.halfHeight = uniform( new Vector3() ).setGroup( renderGroup ); + this.lightPositionNode = lightPosition( light ); /** - * Uniform node representing the half width of the are light. + * A node representing the light's direction. * - * @type {UniformNode} + * @type {Node} */ - this.halfWidth = uniform( new Vector3() ).setGroup( renderGroup ); + this.lightDirectionNode = this.lightPositionNode.normalize(); /** - * The `updateType` is set to `NodeUpdateType.RENDER` since the light - * relies on `viewMatrix` which might vary per render call. + * Uniform node representing the light's ground color. * - * @type {string} - * @default 'render' + * @type {UniformNode} */ - this.updateType = NodeUpdateType.RENDER; + this.groundColorNode = uniform( new Color() ).setGroup( renderGroup ); } /** - * Overwritten to updated rect area light specific uniforms. + * Overwritten to updated hemisphere light specific uniforms. * * @param {NodeFrame} frame - A reference to the current node frame. */ update( frame ) { - super.update( frame ); - const { light } = this; - const viewMatrix = frame.camera.matrixWorldInverse; - - _matrix42.identity(); - _matrix41.copy( light.matrixWorld ); - _matrix41.premultiply( viewMatrix ); - _matrix42.extractRotation( _matrix41 ); + super.update( frame ); - this.halfWidth.value.set( light.width * 0.5, 0.0, 0.0 ); - this.halfHeight.value.set( 0.0, light.height * 0.5, 0.0 ); + this.lightPositionNode.object3d = light; - this.halfWidth.value.applyMatrix4( _matrix42 ); - this.halfHeight.value.applyMatrix4( _matrix42 ); + this.groundColorNode.value.copy( light.groundColor ).multiplyScalar( light.intensity ); } - setupDirectRectArea( builder ) { - - let ltc_1, ltc_2; - - if ( builder.isAvailable( 'float32Filterable' ) ) { - - ltc_1 = texture( _ltcLib.LTC_FLOAT_1 ); - ltc_2 = texture( _ltcLib.LTC_FLOAT_2 ); - - } else { - - ltc_1 = texture( _ltcLib.LTC_HALF_1 ); - ltc_2 = texture( _ltcLib.LTC_HALF_2 ); - - } - - const { colorNode, light } = this; - - const lightPosition = lightViewPosition( light ); + setup( builder ) { - return { - lightColor: colorNode, - lightPosition, - halfWidth: this.halfWidth, - halfHeight: this.halfHeight, - ltc_1, - ltc_2 - }; + const { colorNode, groundColorNode, lightDirectionNode } = this; - } + const dotNL = normalWorld.dot( lightDirectionNode ); + const hemiDiffuseWeight = dotNL.mul( 0.5 ).add( 0.5 ); - /** - * Used to configure the internal BRDF approximation texture data. - * - * @param {RectAreaLightTexturesLib} ltc - The BRDF approximation texture data. - */ - static setLTC( ltc ) { + const irradiance = mix( groundColorNode, colorNode, hemiDiffuseWeight ); - _ltcLib = ltc; + builder.context.irradiance.addAssign( irradiance ); } @@ -53217,6 +53204,72 @@ class IESSpotLightNode extends SpotLightNode { } +/** + * Module for representing light probes as nodes. + * + * @augments AnalyticLightNode + */ +class LightProbeNode extends AnalyticLightNode { + + static get type() { + + return 'LightProbeNode'; + + } + + /** + * Constructs a new light probe node. + * + * @param {?LightProbe} [light=null] - The light probe. + */ + constructor( light = null ) { + + super( light ); + + const array = []; + + for ( let i = 0; i < 9; i ++ ) array.push( new Vector3() ); + + /** + * Light probe represented as a uniform of spherical harmonics. + * + * @type {UniformArrayNode} + */ + this.lightProbe = uniformArray( array ); + + } + + /** + * Overwritten to updated light probe specific uniforms. + * + * @param {NodeFrame} frame - A reference to the current node frame. + */ + update( frame ) { + + const { light } = this; + + super.update( frame ); + + // + + for ( let i = 0; i < 9; i ++ ) { + + this.lightProbe.array[ i ].copy( light.sh.coefficients[ i ] ).multiplyScalar( light.intensity ); + + } + + } + + setup( builder ) { + + const irradiance = getShIrradianceAt( normalWorld, this.lightProbe ); + + builder.context.irradiance.addAssign( irradiance ); + + } + +} + const sdBox = /*@__PURE__*/ Fn( ( [ p, b ] ) => { const d = p.abs().sub( b ); @@ -53299,176 +53352,123 @@ class ProjectorLightNode extends SpotLightNode { } -/** - * Module for representing ambient lights as nodes. - * - * @augments AnalyticLightNode - */ -class AmbientLightNode extends AnalyticLightNode { - - static get type() { - - return 'AmbientLightNode'; - - } - - /** - * Constructs a new ambient light node. - * - * @param {?AmbientLight} [light=null] - The ambient light source. - */ - constructor( light = null ) { - - super( light ); - - } - - setup( { context } ) { - - context.irradiance.addAssign( this.colorNode ); - - } +const _matrix41 = /*@__PURE__*/ new Matrix4(); +const _matrix42 = /*@__PURE__*/ new Matrix4(); -} +let _ltcLib = null; /** - * Module for representing hemisphere lights as nodes. + * Module for representing rect area lights as nodes. * * @augments AnalyticLightNode */ -class HemisphereLightNode extends AnalyticLightNode { +class RectAreaLightNode extends AnalyticLightNode { static get type() { - return 'HemisphereLightNode'; + return 'RectAreaLightNode'; } /** - * Constructs a new hemisphere light node. + * Constructs a new rect area light node. * - * @param {?HemisphereLight} [light=null] - The hemisphere light source. + * @param {?RectAreaLight} [light=null] - The rect area light source. */ constructor( light = null ) { super( light ); /** - * Uniform node representing the light's position. + * Uniform node representing the half height of the are light. * * @type {UniformNode} */ - this.lightPositionNode = lightPosition( light ); + this.halfHeight = uniform( new Vector3() ).setGroup( renderGroup ); /** - * A node representing the light's direction. + * Uniform node representing the half width of the are light. * - * @type {Node} + * @type {UniformNode} */ - this.lightDirectionNode = this.lightPositionNode.normalize(); + this.halfWidth = uniform( new Vector3() ).setGroup( renderGroup ); /** - * Uniform node representing the light's ground color. + * The `updateType` is set to `NodeUpdateType.RENDER` since the light + * relies on `viewMatrix` which might vary per render call. * - * @type {UniformNode} + * @type {string} + * @default 'render' */ - this.groundColorNode = uniform( new Color() ).setGroup( renderGroup ); + this.updateType = NodeUpdateType.RENDER; } /** - * Overwritten to updated hemisphere light specific uniforms. + * Overwritten to updated rect area light specific uniforms. * * @param {NodeFrame} frame - A reference to the current node frame. */ update( frame ) { - const { light } = this; - super.update( frame ); - this.lightPositionNode.object3d = light; - - this.groundColorNode.value.copy( light.groundColor ).multiplyScalar( light.intensity ); - - } - - setup( builder ) { + const { light } = this; - const { colorNode, groundColorNode, lightDirectionNode } = this; + const viewMatrix = frame.camera.matrixWorldInverse; - const dotNL = normalWorld.dot( lightDirectionNode ); - const hemiDiffuseWeight = dotNL.mul( 0.5 ).add( 0.5 ); + _matrix42.identity(); + _matrix41.copy( light.matrixWorld ); + _matrix41.premultiply( viewMatrix ); + _matrix42.extractRotation( _matrix41 ); - const irradiance = mix( groundColorNode, colorNode, hemiDiffuseWeight ); + this.halfWidth.value.set( light.width * 0.5, 0.0, 0.0 ); + this.halfHeight.value.set( 0.0, light.height * 0.5, 0.0 ); - builder.context.irradiance.addAssign( irradiance ); + this.halfWidth.value.applyMatrix4( _matrix42 ); + this.halfHeight.value.applyMatrix4( _matrix42 ); } -} + setupDirectRectArea( builder ) { -/** - * Module for representing light probes as nodes. - * - * @augments AnalyticLightNode - */ -class LightProbeNode extends AnalyticLightNode { + let ltc_1, ltc_2; - static get type() { + if ( builder.isAvailable( 'float32Filterable' ) ) { - return 'LightProbeNode'; + ltc_1 = texture( _ltcLib.LTC_FLOAT_1 ); + ltc_2 = texture( _ltcLib.LTC_FLOAT_2 ); - } + } else { - /** - * Constructs a new light probe node. - * - * @param {?LightProbe} [light=null] - The light probe. - */ - constructor( light = null ) { + ltc_1 = texture( _ltcLib.LTC_HALF_1 ); + ltc_2 = texture( _ltcLib.LTC_HALF_2 ); - super( light ); + } - const array = []; + const { colorNode, light } = this; - for ( let i = 0; i < 9; i ++ ) array.push( new Vector3() ); + const lightPosition = lightViewPosition( light ); - /** - * Light probe represented as a uniform of spherical harmonics. - * - * @type {UniformArrayNode} - */ - this.lightProbe = uniformArray( array ); + return { + lightColor: colorNode, + lightPosition, + halfWidth: this.halfWidth, + halfHeight: this.halfHeight, + ltc_1, + ltc_2 + }; } /** - * Overwritten to updated light probe specific uniforms. + * Used to configure the internal BRDF approximation texture data. * - * @param {NodeFrame} frame - A reference to the current node frame. + * @param {RectAreaLightTexturesLib} ltc - The BRDF approximation texture data. */ - update( frame ) { - - const { light } = this; - - super.update( frame ); - - // - - for ( let i = 0; i < 9; i ++ ) { - - this.lightProbe.array[ i ].copy( light.sh.coefficients[ i ] ).multiplyScalar( light.intensity ); - - } - - } - - setup( builder ) { - - const irradiance = getShIrradianceAt( normalWorld, this.lightProbe ); + static setLTC( ltc ) { - builder.context.irradiance.addAssign( irradiance ); + _ltcLib = ltc; } @@ -53758,7 +53758,7 @@ const _cacheKeyValues = []; * @private * @augments DataMap */ -class Nodes extends DataMap { +class NodeManager extends DataMap { /** * Constructs a new nodes management component. @@ -57523,7 +57523,7 @@ class Renderer { * A reference to a renderer module for managing node related logic. * * @private - * @type {?Nodes} + * @type {?NodeManager} * @default null */ this._nodes = null; @@ -57977,7 +57977,7 @@ class Renderer { } - this._nodes = new Nodes( this, backend ); + this._nodes = new NodeManager( this, backend ); this._animation = new Animation( this, this._nodes, this.info ); this._attributes = new Attributes( backend ); this._background = new Background( this, this._nodes ); @@ -82131,4 +82131,4 @@ class ClippingGroup extends Group { } -export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayCamera, ArrayElementNode, ArrayNode, AssignNode, AttributeNode, BackSide, BasicEnvironmentNode, BasicShadowMap, BatchNode, BitcastNode, BlendMode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CanvasTarget, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, CodeNode, Color, ColorManagement, ColorSpaceNode, Compatibility, ComputeNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeDepthTexture, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CylinderGeometry, DataArrayTexture, DataTexture, DebugNode, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, EventNode, ExpressionNode, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FrustumArray, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InspectorBase, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, IsolateNode, JoinNode, KeepStencilOp, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, LightProbe, LightProbeNode, Lighting, LightingContextNode, LightingModel, LightingNode, LightsNode, Line2NodeMaterial, LineBasicMaterial, LineBasicNodeMaterial, LineDashedMaterial, LineDashedNodeMaterial, LinearFilter, LinearMipMapLinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoopNode, MRTNode, Material, MaterialBlending, MaterialLoader, MaterialNode, MaterialReferenceNode, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, MemberNode, Mesh, MeshBasicMaterial, MeshBasicNodeMaterial, MeshLambertMaterial, MeshLambertNodeMaterial, MeshMatcapMaterial, MeshMatcapNodeMaterial, MeshNormalMaterial, MeshNormalNodeMaterial, MeshPhongMaterial, MeshPhongNodeMaterial, MeshPhysicalMaterial, MeshPhysicalNodeMaterial, MeshSSSNodeMaterial, MeshStandardMaterial, MeshStandardNodeMaterial, MeshToonMaterial, MeshToonNodeMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, ModelNode, MorphNode, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoNormalPacking, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalGAPacking, NormalMapNode, NormalRGPacking, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, OutputStructNode, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PMREMNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PlaneGeometry, PointLight, PointLightNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, PosterizeNode, ProjectorLight, ProjectorLightNode, PropertyNode, QuadMesh, Quaternion, R11_EAC_Format, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RG11_EAC_Format, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGBIntegerFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RTTNode, RangeNode, RectAreaLight, RectAreaLightNode, RedFormat, RedIntegerFormat, ReferenceNode, ReflectorNode, ReinhardToneMapping, RemapNode, RenderOutputNode, RenderTarget, RendererReferenceNode, RendererUtils, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RotateNode, SIGNED_R11_EAC_Format, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SIGNED_RG11_EAC_Format, SRGBColorSpace, SRGBTransfer, Scene, SceneNode, ScreenNode, ScriptableNode, ScriptableValueNode, SetNode, ShadowBaseNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, Sphere, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StaticDrawUsage, StorageArrayElementNode, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, StructNode, StructTypeNode, SubBuildNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, TimestampQuery, ToneMappingNode, ToonOutlinePassNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, UserDataNode, VSMShadowMap, VarNode, VaryingNode, Vector2, Vector3, Vector4, VertexColorNode, ViewportDepthNode, ViewportDepthTextureNode, ViewportSharedTextureNode, ViewportTextureNode, VolumeNodeMaterial, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGPUCoordinateSystem, WebGPURenderer, WebXRController, ZeroFactor, ZeroStencilOp, createCanvasElement, defaultBuildStages, defaultShaderStages, error, log$1 as log, shaderStages, vectorComponents, warn, warnOnce }; +export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayCamera, ArrayElementNode, ArrayNode, AssignNode, AtomicFunctionNode, AttributeNode, BackSide, BarrierNode, BasicEnvironmentNode, BasicLightMapNode, BasicShadowMap, BatchNode, BitcastNode, BitcountNode, BlendMode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BuiltinNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CanvasTarget, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, ClippingNode, CodeNode, Color, ColorManagement, ColorSpaceNode, Compatibility, ComputeBuiltinNode, ComputeNode, ConditionalNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeDepthTexture, CubeMapNode, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CylinderGeometry, DataArrayTexture, DataTexture, DebugNode, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, EventNode, ExpressionNode, FileLoader, FlipNode, Float16BufferAttribute, Float32BufferAttribute, FloatType, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FrustumArray, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InputNode, InspectorBase, InspectorNode, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, IsolateNode, JoinNode, KeepStencilOp, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, LightProbe, LightProbeNode, Lighting, LightingContextNode, LightingModel, LightingNode, LightsNode, Line2NodeMaterial, LineBasicMaterial, LineBasicNodeMaterial, LineDashedMaterial, LineDashedNodeMaterial, LinearFilter, LinearMipMapLinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoopNode, MRTNode, Material, MaterialBlending, MaterialLoader, MaterialNode, MaterialReferenceNode, MathNode, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, MemberNode, Mesh, MeshBasicMaterial, MeshBasicNodeMaterial, MeshLambertMaterial, MeshLambertNodeMaterial, MeshMatcapMaterial, MeshMatcapNodeMaterial, MeshNormalMaterial, MeshNormalNodeMaterial, MeshPhongMaterial, MeshPhongNodeMaterial, MeshPhysicalMaterial, MeshPhysicalNodeMaterial, MeshSSSNodeMaterial, MeshStandardMaterial, MeshStandardNodeMaterial, MeshToonMaterial, MeshToonNodeMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, ModelNode, MorphNode, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoNormalPacking, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalGAPacking, NormalMapNode, NormalRGPacking, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OperatorNode, OrthographicCamera, OutputStructNode, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PMREMNode, PackFloatNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PlaneGeometry, PointLight, PointLightNode, PointShadowNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, PosterizeNode, ProjectorLight, ProjectorLightNode, PropertyNode, QuadMesh, Quaternion, R11_EAC_Format, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RG11_EAC_Format, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGBIntegerFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RTTNode, RangeNode, RectAreaLight, RectAreaLightNode, RedFormat, RedIntegerFormat, ReferenceBaseNode, ReferenceNode, ReflectorNode, ReinhardToneMapping, RemapNode, RenderOutputNode, RenderTarget, RendererReferenceNode, RendererUtils, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RotateNode, SIGNED_R11_EAC_Format, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SIGNED_RG11_EAC_Format, SRGBColorSpace, SRGBTransfer, SampleNode, Scene, SceneNode, ScreenNode, ScriptableNode, ScriptableValueNode, SetNode, ShadowBaseNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, Sphere, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StaticDrawUsage, StorageArrayElementNode, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, StructNode, StructTypeNode, SubBuildNode, SubgroupFunctionNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, TimestampQuery, ToneMappingNode, ToonOutlinePassNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnpackFloatNode, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, UserDataNode, VSMShadowMap, VarNode, VaryingNode, Vector2, Vector3, Vector4, VelocityNode, VertexColorNode, ViewportDepthNode, ViewportDepthTextureNode, ViewportSharedTextureNode, ViewportTextureNode, VolumeNodeMaterial, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGPUCoordinateSystem, WebGPURenderer, WebXRController, WorkgroupInfoNode, ZeroFactor, ZeroStencilOp, createCanvasElement, defaultBuildStages, defaultShaderStages, error, log$1 as log, shaderStages, vectorComponents, warn, warnOnce }; diff --git a/build/three.webgpu.nodes.min.js b/build/three.webgpu.nodes.min.js index d5e4da850bdf61..965af8253ba5a1 100644 --- a/build/three.webgpu.nodes.min.js +++ b/build/three.webgpu.nodes.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2026 Three.js Authors * SPDX-License-Identifier: MIT */ -import{Color as e,Vector2 as t,Vector3 as r,Vector4 as s,Matrix2 as i,Matrix3 as n,Matrix4 as a,error as o,EventDispatcher as u,MathUtils as l,warn as d,WebGLCoordinateSystem as c,WebGPUCoordinateSystem as h,ColorManagement as p,SRGBTransfer as g,NoToneMapping as m,StaticDrawUsage as f,InterleavedBufferAttribute as y,InterleavedBuffer as b,DynamicDrawUsage as x,NoColorSpace as T,log as _,warnOnce as v,Texture as N,UnsignedIntType as S,IntType as R,Compatibility as A,LessCompare as E,NearestFilter as w,Sphere as C,BackSide as M,DoubleSide as B,Euler as L,CubeTexture as F,CubeReflectionMapping as P,CubeRefractionMapping as D,TangentSpaceNormalMap as U,NoNormalPacking as I,NormalRGPacking as O,NormalGAPacking as V,ObjectSpaceNormalMap as k,RGFormat as G,RED_GREEN_RGTC2_Format as z,RG11_EAC_Format as $,InstancedBufferAttribute as W,InstancedInterleavedBuffer as H,DataArrayTexture as q,FloatType as j,FramebufferTexture as X,LinearMipmapLinearFilter as K,DepthTexture as Y,Material as Q,LineBasicMaterial as Z,LineDashedMaterial as J,NoBlending as ee,MeshNormalMaterial as te,SRGBColorSpace as re,WebGLCubeRenderTarget as se,BoxGeometry as ie,Mesh as ne,Scene as ae,LinearFilter as oe,CubeCamera as ue,EquirectangularReflectionMapping as le,EquirectangularRefractionMapping as de,AddOperation as ce,MixOperation as he,MultiplyOperation as pe,MeshBasicMaterial as ge,MeshLambertMaterial as me,MeshPhongMaterial as fe,DataTexture as ye,HalfFloatType as be,ClampToEdgeWrapping as xe,BufferGeometry as Te,OrthographicCamera as _e,PerspectiveCamera as ve,RenderTarget as Ne,LinearSRGBColorSpace as Se,RGBAFormat as Re,CubeUVReflectionMapping as Ae,BufferAttribute as Ee,MeshStandardMaterial as we,MeshPhysicalMaterial as Ce,MeshToonMaterial as Me,MeshMatcapMaterial as Be,SpriteMaterial as Le,PointsMaterial as Fe,ShadowMaterial as Pe,Uint32BufferAttribute as De,Uint16BufferAttribute as Ue,arrayNeedsUint32 as Ie,DepthStencilFormat as Oe,DepthFormat as Ve,UnsignedInt248Type as ke,UnsignedByteType as Ge,NormalBlending as ze,SrcAlphaFactor as $e,OneMinusSrcAlphaFactor as We,AddEquation as He,MaterialBlending as qe,Plane as je,Object3D as Xe,LinearMipMapLinearFilter as Ke,Float32BufferAttribute as Ye,UVMapping as Qe,VSMShadowMap as Ze,LessEqualCompare as Je,PCFShadowMap as et,PCFSoftShadowMap as tt,BasicShadowMap as rt,CubeDepthTexture as st,SphereGeometry as it,LinearMipmapNearestFilter as nt,NearestMipmapLinearFilter as at,Float16BufferAttribute as ot,REVISION as ut,ArrayCamera as lt,PlaneGeometry as dt,FrontSide as ct,CustomBlending as ht,ZeroFactor as pt,CylinderGeometry as gt,Quaternion as mt,WebXRController as ft,RAD2DEG as yt,FrustumArray as bt,Frustum as xt,RedIntegerFormat as Tt,RedFormat as _t,ShortType as vt,ByteType as Nt,UnsignedShortType as St,RGIntegerFormat as Rt,RGBIntegerFormat as At,RGBFormat as Et,RGBAIntegerFormat as wt,TimestampQuery as Ct,createCanvasElement as Mt,ReverseSubtractEquation as Bt,SubtractEquation as Lt,OneMinusDstAlphaFactor as Ft,OneMinusDstColorFactor as Pt,OneMinusSrcColorFactor as Dt,DstAlphaFactor as Ut,DstColorFactor as It,SrcAlphaSaturateFactor as Ot,SrcColorFactor as Vt,OneFactor as kt,CullFaceNone as Gt,CullFaceBack as zt,CullFaceFront as $t,MultiplyBlending as Wt,SubtractiveBlending as Ht,AdditiveBlending as qt,NotEqualDepth as jt,GreaterDepth as Xt,GreaterEqualDepth as Kt,EqualDepth as Yt,LessEqualDepth as Qt,LessDepth as Zt,AlwaysDepth as Jt,NeverDepth as er,UnsignedShort4444Type as tr,UnsignedShort5551Type as rr,UnsignedInt5999Type as sr,UnsignedInt101111Type as ir,AlphaFormat as nr,RGB_S3TC_DXT1_Format as ar,RGBA_S3TC_DXT1_Format as or,RGBA_S3TC_DXT3_Format as ur,RGBA_S3TC_DXT5_Format as lr,RGB_PVRTC_4BPPV1_Format as dr,RGB_PVRTC_2BPPV1_Format as cr,RGBA_PVRTC_4BPPV1_Format as hr,RGBA_PVRTC_2BPPV1_Format as pr,RGB_ETC1_Format as gr,RGB_ETC2_Format as mr,RGBA_ETC2_EAC_Format as fr,R11_EAC_Format as yr,SIGNED_R11_EAC_Format as br,SIGNED_RG11_EAC_Format as xr,RGBA_ASTC_4x4_Format as Tr,RGBA_ASTC_5x4_Format as _r,RGBA_ASTC_5x5_Format as vr,RGBA_ASTC_6x5_Format as Nr,RGBA_ASTC_6x6_Format as Sr,RGBA_ASTC_8x5_Format as Rr,RGBA_ASTC_8x6_Format as Ar,RGBA_ASTC_8x8_Format as Er,RGBA_ASTC_10x5_Format as wr,RGBA_ASTC_10x6_Format as Cr,RGBA_ASTC_10x8_Format as Mr,RGBA_ASTC_10x10_Format as Br,RGBA_ASTC_12x10_Format as Lr,RGBA_ASTC_12x12_Format as Fr,RGBA_BPTC_Format as Pr,RED_RGTC1_Format as Dr,SIGNED_RED_RGTC1_Format as Ur,SIGNED_RED_GREEN_RGTC2_Format as Ir,MirroredRepeatWrapping as Or,RepeatWrapping as Vr,NearestMipmapNearestFilter as kr,NotEqualCompare as Gr,GreaterCompare as zr,GreaterEqualCompare as $r,EqualCompare as Wr,AlwaysCompare as Hr,NeverCompare as qr,LinearTransfer as jr,getByteLength as Xr,isTypedArray as Kr,NotEqualStencilFunc as Yr,GreaterStencilFunc as Qr,GreaterEqualStencilFunc as Zr,EqualStencilFunc as Jr,LessEqualStencilFunc as es,LessStencilFunc as ts,AlwaysStencilFunc as rs,NeverStencilFunc as ss,DecrementWrapStencilOp as is,IncrementWrapStencilOp as ns,DecrementStencilOp as as,IncrementStencilOp as os,InvertStencilOp as us,ReplaceStencilOp as ls,ZeroStencilOp as ds,KeepStencilOp as cs,MaxEquation as hs,MinEquation as ps,SpotLight as gs,PointLight as ms,DirectionalLight as fs,RectAreaLight as ys,AmbientLight as bs,HemisphereLight as xs,LightProbe as Ts,LinearToneMapping as _s,ReinhardToneMapping as vs,CineonToneMapping as Ns,ACESFilmicToneMapping as Ss,AgXToneMapping as Rs,NeutralToneMapping as As,Group as Es,Loader as ws,FileLoader as Cs,MaterialLoader as Ms,ObjectLoader as Bs}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,Camera,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,ConstantAlphaFactor,ConstantColorFactor,Controls,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CustomToneMapping,Cylindrical,Data3DTexture,DataTextureLoader,DataUtils,DefaultLoadingManager,DetachedBindMode,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,ExternalTexture,ExtrudeGeometry,Fog,FogExp2,GLBufferAttribute,GLSL1,GLSL3,GridHelper,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,InstancedBufferGeometry,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,InterpolationSamplingMode,InterpolationSamplingType,KeyframeTrack,LOD,LatheGeometry,Layers,Light,Line,Line3,LineCurve,LineCurve3,LineLoop,LineSegments,LinearInterpolant,LinearMipMapNearestFilter,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,MeshDepthMaterial,MeshDistanceMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NormalAnimationBlendMode,NumberKeyframeTrack,OctahedronGeometry,OneMinusConstantAlphaFactor,OneMinusConstantColorFactor,Path,PlaneHelper,PointLightHelper,Points,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGB_BPTC_SIGNED_Format,RGB_BPTC_UNSIGNED_Format,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RenderTarget3D,RingGeometry,ShaderMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Spherical,SphericalHarmonics3,SplineCurve,SpotLightHelper,Sprite,StaticCopyUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,Timer,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGLRenderTarget,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding,getConsoleFunction,setConsoleFunction}from"./three.core.min.js";const Ls=["alphaMap","alphaTest","anisotropy","anisotropyMap","anisotropyRotation","aoMap","aoMapIntensity","attenuationColor","attenuationDistance","bumpMap","clearcoat","clearcoatMap","clearcoatNormalMap","clearcoatNormalScale","clearcoatRoughness","color","dispersion","displacementMap","emissive","emissiveIntensity","emissiveMap","envMap","envMapIntensity","gradientMap","ior","iridescence","iridescenceIOR","iridescenceMap","iridescenceThicknessMap","lightMap","lightMapIntensity","map","matcap","metalness","metalnessMap","normalMap","normalScale","opacity","roughness","roughnessMap","sheen","sheenColor","sheenColorMap","sheenRoughnessMap","shininess","specular","specularColor","specularColorMap","specularIntensity","specularIntensityMap","specularMap","thickness","transmission","transmissionMap"],Fs=new WeakMap;class Ps{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=Ls,this.renderId=0}firstInitialization(e){return!1===this.renderObjects.has(e)&&(this.getRenderObjectData(e),!0)}needsVelocity(e){const t=e.getMRT();return null!==t&&t.has("velocity")}getRenderObjectData(e){let t=this.renderObjects.get(e);if(void 0===t){const{geometry:r,material:s,object:i}=e;if(t={material:this.getMaterialData(s),geometry:{id:r.id,attributes:this.getAttributesData(r.attributes),indexVersion:r.index?r.index.version:null,drawRange:{start:r.drawRange.start,count:r.drawRange.count}},worldMatrix:i.matrixWorld.clone()},i.center&&(t.center=i.center.clone()),i.morphTargetInfluences&&(t.morphTargetInfluences=i.morphTargetInfluences.slice()),null!==e.bundle&&(t.version=e.bundle.version),t.material.transmission>0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}t.lights=this.getLightsData(e.lightsNode.getLights()),this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const Us=e=>Ds(e),Is=e=>Ds(e),Os=(...e)=>Ds(e),Vs=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),ks=new WeakMap;function Gs(e){return Vs.get(e)}function zs(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function $s(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Ws(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Hs(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function qs(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function js(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Ys(u[0]):null}function Xs(e){let t=ks.get(e);return void 0===t&&(t={},ks.set(e,t)),t}function Ks(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Qs=Object.freeze({__proto__:null,arrayBufferToBase64:Ks,base64ToArrayBuffer:Ys,getAlignmentFromType:Hs,getDataFromObject:Xs,getLengthFromType:$s,getMemoryLengthFromType:Ws,getTypeFromLength:Gs,getTypedArrayFromType:zs,getValueFromType:js,getValueType:qs,hash:Os,hashArray:Is,hashString:Us});const Zs={VERTEX:"vertex",FRAGMENT:"fragment"},Js={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},ei={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ti={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ri=["fragment","vertex"],si=["setup","analyze","generate"],ii=[...ri,"compute"],ni=["x","y","z","w"],ai={analyze:"setup",generate:"analyze"};let oi=0;class ui extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Js.NONE,this.updateBeforeType=Js.NONE,this.updateAfterType=Js.NONE,this.uuid=l.generateUUID(),this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:oi++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this),this}onFrameUpdate(e){return this.onUpdate(e,Js.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Js.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Js.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.7,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class li extends ui{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}getMemberType(e,t){return this.node.getMemberType(e,t)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class di extends ui{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class ci extends ui{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class hi extends ci{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce((t,r)=>t+e.getTypeLength(r.getNodeType(e)),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const pi=ni.join("");class gi extends ui{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(ni.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}getScope(){return this.node.getScope()}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===pi.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class mi extends ci{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");ui.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==_i?_i.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn()."),this;{const t=vi.get("assign");return this.addToStack(t(...e))}},ui.prototype.toVarIntent=function(){return this},ui.prototype.get=function(e){return new Ti(this,e)};const Ri={};function Ai(e,t,r){Ri[e]=Ri[t]=Ri[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new gi(this,e),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();ui.prototype["set"+s]=ui.prototype["set"+i]=ui.prototype["set"+n]=function(t){const r=Si(e);return new mi(this,r,Zi(t))},ui.prototype["flip"+s]=ui.prototype["flip"+i]=ui.prototype["flip"+n]=function(){const t=Si(e);return new fi(this,t)}}const Ei=["x","y","z","w"],wi=["r","g","b","a"],Ci=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ei[e],r=wi[e],s=Ci[e];Ai(t,r,s);for(let i=0;i<4;i++){t=Ei[e]+Ei[i],r=wi[e]+wi[i],s=Ci[e]+Ci[i],Ai(t,r,s);for(let n=0;n<4;n++){t=Ei[e]+Ei[i]+Ei[n],r=wi[e]+wi[i]+wi[n],s=Ci[e]+Ci[i]+Ci[n],Ai(t,r,s);for(let a=0;a<4;a++)t=Ei[e]+Ei[i]+Ei[n]+Ei[a],r=wi[e]+wi[i]+wi[n]+wi[a],s=Ci[e]+Ci[i]+Ci[n]+Ci[a],Ai(t,r,s)}}}for(let e=0;e<32;e++)Ri[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new li(this,new xi(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};Object.defineProperties(ui.prototype,Ri);const Mi=new WeakMap,Bi=function(e,t=null){for(const r in e)e[r]=Zi(e[r],t);return e},Li=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...tn(d(t)))):null!==r?(r=Zi(r),n=(...s)=>i(new e(t,...tn(d(s)),r))):n=(...r)=>i(new e(t,...tn(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Pi=function(e,...t){return new e(...tn(t))};class Di extends ui{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=Mi.get(e.constructor);void 0===s&&(s=new WeakMap,Mi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Zi(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;en(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=Zi(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return en(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield Zi(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof ui&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=Zi(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=Zi(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e),o=e.fnCall;if(e.fnCall=this,"setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return e.fnCall=o,r}}class Ui extends ui{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Di(this,e)}setup(){return this.call()}}const Ii=[!1,!0],Oi=[0,1,2,3],Vi=[-1,-2],ki=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Gi=new Map;for(const e of Ii)Gi.set(e,new xi(e));const zi=new Map;for(const e of Oi)zi.set(e,new xi(e,"uint"));const $i=new Map([...zi].map(e=>new xi(e.value,"int")));for(const e of Vi)$i.set(e,new xi(e,"int"));const Wi=new Map([...$i].map(e=>new xi(e.value)));for(const e of ki)Wi.set(e,new xi(e));for(const e of ki)Wi.set(-e,new xi(-e));const Hi={bool:Gi,uint:zi,ints:$i,float:Wi},qi=new Map([...Gi,...Wi]),ji=(e,t)=>qi.has(e)?qi.get(e):!0===e.isNode?e:new xi(e,t),Xi=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`),new xi(0,e);if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[js(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Ji(t.get(r[0]));if(1===r.length){const t=ji(r[0],e);return t.nodeType===e?Ji(t):Ji(new di(t,e))}const s=r.map(e=>ji(e));return Ji(new hi(s,e))}},Ki=e=>"object"==typeof e&&null!==e?e.value:e,Yi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Qi(e,t){return new Ui(e,t)}const Zi=(e,t=null)=>function(e,t=null){const r=qs(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Zi(ji(e,t)):"shader"===r?e.isFn?e:un(e):e}(e,t),Ji=(e,t=null)=>Zi(e,t).toVarIntent(),en=(e,t=null)=>new Bi(e,t),tn=(e,t=null)=>new Li(e,t),rn=(e,t=null,r=null,s=null)=>new Fi(e,t,r,s),sn=(e,...t)=>new Pi(e,...t),nn=(e,t=null,r=null,s={})=>new Fi(e,t,r,{...s,intent:!0});let an=0;class on extends ui{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type."),t=null)),this.shaderNode=new Qi(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+an++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function un(e,t=null){const r=new on(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const ln=e=>{_i=e},dn=()=>_i,cn=(...e)=>_i.If(...e);function hn(e){return _i&&_i.addToStack(e),e}Ni("toStack",hn);const pn=new Xi("color"),gn=new Xi("float",Hi.float),mn=new Xi("int",Hi.ints),fn=new Xi("uint",Hi.uint),yn=new Xi("bool",Hi.bool),bn=new Xi("vec2"),xn=new Xi("ivec2"),Tn=new Xi("uvec2"),_n=new Xi("bvec2"),vn=new Xi("vec3"),Nn=new Xi("ivec3"),Sn=new Xi("uvec3"),Rn=new Xi("bvec3"),An=new Xi("vec4"),En=new Xi("ivec4"),wn=new Xi("uvec4"),Cn=new Xi("bvec4"),Mn=new Xi("mat2"),Bn=new Xi("mat3"),Ln=new Xi("mat4");Ni("toColor",pn),Ni("toFloat",gn),Ni("toInt",mn),Ni("toUint",fn),Ni("toBool",yn),Ni("toVec2",bn),Ni("toIVec2",xn),Ni("toUVec2",Tn),Ni("toBVec2",_n),Ni("toVec3",vn),Ni("toIVec3",Nn),Ni("toUVec3",Sn),Ni("toBVec3",Rn),Ni("toVec4",An),Ni("toIVec4",En),Ni("toUVec4",wn),Ni("toBVec4",Cn),Ni("toMat2",Mn),Ni("toMat3",Bn),Ni("toMat4",Ln);const Fn=rn(li).setParameterLength(2),Pn=(e,t)=>Zi(new di(Zi(e),t));Ni("element",Fn),Ni("convert",Pn);Ni("append",e=>(d("TSL: .append() has been renamed to .toStack()."),hn(e)));class Dn extends ui{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}customCacheKey(){return Us(this.type+":"+(this.name||"")+":"+(this.varying?"1":"0"))}getHash(e){return this.name||super.getHash(e)}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const Un=(e,t)=>new Dn(e,t),In=(e,t)=>new Dn(e,t,!0),On=sn(Dn,"vec4","DiffuseColor"),Vn=sn(Dn,"vec3","DiffuseContribution"),kn=sn(Dn,"vec3","EmissiveColor"),Gn=sn(Dn,"float","Roughness"),zn=sn(Dn,"float","Metalness"),$n=sn(Dn,"float","Clearcoat"),Wn=sn(Dn,"float","ClearcoatRoughness"),Hn=sn(Dn,"vec3","Sheen"),qn=sn(Dn,"float","SheenRoughness"),jn=sn(Dn,"float","Iridescence"),Xn=sn(Dn,"float","IridescenceIOR"),Kn=sn(Dn,"float","IridescenceThickness"),Yn=sn(Dn,"float","AlphaT"),Qn=sn(Dn,"float","Anisotropy"),Zn=sn(Dn,"vec3","AnisotropyT"),Jn=sn(Dn,"vec3","AnisotropyB"),ea=sn(Dn,"color","SpecularColor"),ta=sn(Dn,"color","SpecularColorBlended"),ra=sn(Dn,"float","SpecularF90"),sa=sn(Dn,"float","Shininess"),ia=sn(Dn,"vec4","Output"),na=sn(Dn,"float","dashSize"),aa=sn(Dn,"float","gapSize"),oa=sn(Dn,"float","pointWidth"),ua=sn(Dn,"float","IOR"),la=sn(Dn,"float","Transmission"),da=sn(Dn,"float","Thickness"),ca=sn(Dn,"float","AttenuationDistance"),ha=sn(Dn,"color","AttenuationColor"),pa=sn(Dn,"float","Dispersion");class ga extends ui{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const ma=e=>new ga(e),fa=(e,t=0)=>new ga(e,!0,t),ya=fa("frame"),ba=fa("render"),xa=ma("object");class Ta extends yi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=xa}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),t}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const _a=(e,t)=>{const r=Yi(t||e);if(r===e&&(e=js(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new Ta(e,r)};class va extends ci{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const Na=(...e)=>{let t;if(1===e.length){const r=e[0];t=new va(null,r.length,r)}else{const r=e[0],s=e[1];t=new va(r,s)}return Zi(t)};Ni("toArray",(e,t)=>Na(Array(t).fill(e)));class Sa extends ci{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return ni.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.build(e),a=r.getNodeType(e),o=s.build(e,a),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=n);else if(i){const s=e.getVarFromNode(this,null,a),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)o("TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?tn(t):en(t[0]),new Aa(Zi(e),t));Ni("call",Ea);const wa={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ca extends ci{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ca(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const Ma=nn(Ca,"+").setParameterLength(2,1/0).setName("add"),Ba=nn(Ca,"-").setParameterLength(2,1/0).setName("sub"),La=nn(Ca,"*").setParameterLength(2,1/0).setName("mul"),Fa=nn(Ca,"/").setParameterLength(2,1/0).setName("div"),Pa=nn(Ca,"%").setParameterLength(2).setName("mod"),Da=nn(Ca,"==").setParameterLength(2).setName("equal"),Ua=nn(Ca,"!=").setParameterLength(2).setName("notEqual"),Ia=nn(Ca,"<").setParameterLength(2).setName("lessThan"),Oa=nn(Ca,">").setParameterLength(2).setName("greaterThan"),Va=nn(Ca,"<=").setParameterLength(2).setName("lessThanEqual"),ka=nn(Ca,">=").setParameterLength(2).setName("greaterThanEqual"),Ga=nn(Ca,"&&").setParameterLength(2,1/0).setName("and"),za=nn(Ca,"||").setParameterLength(2,1/0).setName("or"),$a=nn(Ca,"!").setParameterLength(1).setName("not"),Wa=nn(Ca,"^^").setParameterLength(2).setName("xor"),Ha=nn(Ca,"&").setParameterLength(2).setName("bitAnd"),qa=nn(Ca,"~").setParameterLength(1).setName("bitNot"),ja=nn(Ca,"|").setParameterLength(2).setName("bitOr"),Xa=nn(Ca,"^").setParameterLength(2).setName("bitXor"),Ka=nn(Ca,"<<").setParameterLength(2).setName("shiftLeft"),Ya=nn(Ca,">>").setParameterLength(2).setName("shiftRight"),Qa=un(([e])=>(e.addAssign(1),e)),Za=un(([e])=>(e.subAssign(1),e)),Ja=un(([e])=>{const t=mn(e).toConst();return e.addAssign(1),t}),eo=un(([e])=>{const t=mn(e).toConst();return e.subAssign(1),t});Ni("add",Ma),Ni("sub",Ba),Ni("mul",La),Ni("div",Fa),Ni("mod",Pa),Ni("equal",Da),Ni("notEqual",Ua),Ni("lessThan",Ia),Ni("greaterThan",Oa),Ni("lessThanEqual",Va),Ni("greaterThanEqual",ka),Ni("and",Ga),Ni("or",za),Ni("not",$a),Ni("xor",Wa),Ni("bitAnd",Ha),Ni("bitNot",qa),Ni("bitOr",ja),Ni("bitXor",Xa),Ni("shiftLeft",Ka),Ni("shiftRight",Ya),Ni("incrementBefore",Qa),Ni("decrementBefore",Za),Ni("increment",Ja),Ni("decrement",eo);const to=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),Pa(mn(e),mn(t)));Ni("modInt",to);class ro extends ci{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===ro.MAX||e===ro.MIN)&&arguments.length>3){let i=new ro(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===ro.LENGTH||t===ro.DISTANCE||t===ro.DOT?"float":t===ro.CROSS?"vec3":t===ro.ALL||t===ro.ANY?"bool":t===ro.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===ro.ONE_MINUS)i=Ba(1,t);else if(s===ro.RECIPROCAL)i=Fa(1,t);else if(s===ro.DIFFERENCE)i=Mo(Ba(t,r));else if(s===ro.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=An(vn(n),0):s=An(vn(s),0);const a=La(s,n).xyz;i=vo(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.generate(e,t);let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===ro.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===ro.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===ro.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==ro.MIN&&r!==ro.MAX?r===ro.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===ro.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===ro.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==ro.DFDX&&r!==ro.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}ro.ALL="all",ro.ANY="any",ro.RADIANS="radians",ro.DEGREES="degrees",ro.EXP="exp",ro.EXP2="exp2",ro.LOG="log",ro.LOG2="log2",ro.SQRT="sqrt",ro.INVERSE_SQRT="inversesqrt",ro.FLOOR="floor",ro.CEIL="ceil",ro.NORMALIZE="normalize",ro.FRACT="fract",ro.SIN="sin",ro.COS="cos",ro.TAN="tan",ro.ASIN="asin",ro.ACOS="acos",ro.ATAN="atan",ro.ABS="abs",ro.SIGN="sign",ro.LENGTH="length",ro.NEGATE="negate",ro.ONE_MINUS="oneMinus",ro.DFDX="dFdx",ro.DFDY="dFdy",ro.ROUND="round",ro.RECIPROCAL="reciprocal",ro.TRUNC="trunc",ro.FWIDTH="fwidth",ro.TRANSPOSE="transpose",ro.DETERMINANT="determinant",ro.INVERSE="inverse",ro.EQUALS="equals",ro.MIN="min",ro.MAX="max",ro.STEP="step",ro.REFLECT="reflect",ro.DISTANCE="distance",ro.DIFFERENCE="difference",ro.DOT="dot",ro.CROSS="cross",ro.POW="pow",ro.TRANSFORM_DIRECTION="transformDirection",ro.MIX="mix",ro.CLAMP="clamp",ro.REFRACT="refract",ro.SMOOTHSTEP="smoothstep",ro.FACEFORWARD="faceforward";const so=gn(1e-6),io=gn(1e6),no=gn(Math.PI),ao=gn(2*Math.PI),oo=gn(2*Math.PI),uo=gn(.5*Math.PI),lo=nn(ro,ro.ALL).setParameterLength(1),co=nn(ro,ro.ANY).setParameterLength(1),ho=nn(ro,ro.RADIANS).setParameterLength(1),po=nn(ro,ro.DEGREES).setParameterLength(1),go=nn(ro,ro.EXP).setParameterLength(1),mo=nn(ro,ro.EXP2).setParameterLength(1),fo=nn(ro,ro.LOG).setParameterLength(1),yo=nn(ro,ro.LOG2).setParameterLength(1),bo=nn(ro,ro.SQRT).setParameterLength(1),xo=nn(ro,ro.INVERSE_SQRT).setParameterLength(1),To=nn(ro,ro.FLOOR).setParameterLength(1),_o=nn(ro,ro.CEIL).setParameterLength(1),vo=nn(ro,ro.NORMALIZE).setParameterLength(1),No=nn(ro,ro.FRACT).setParameterLength(1),So=nn(ro,ro.SIN).setParameterLength(1),Ro=nn(ro,ro.COS).setParameterLength(1),Ao=nn(ro,ro.TAN).setParameterLength(1),Eo=nn(ro,ro.ASIN).setParameterLength(1),wo=nn(ro,ro.ACOS).setParameterLength(1),Co=nn(ro,ro.ATAN).setParameterLength(1,2),Mo=nn(ro,ro.ABS).setParameterLength(1),Bo=nn(ro,ro.SIGN).setParameterLength(1),Lo=nn(ro,ro.LENGTH).setParameterLength(1),Fo=nn(ro,ro.NEGATE).setParameterLength(1),Po=nn(ro,ro.ONE_MINUS).setParameterLength(1),Do=nn(ro,ro.DFDX).setParameterLength(1),Uo=nn(ro,ro.DFDY).setParameterLength(1),Io=nn(ro,ro.ROUND).setParameterLength(1),Oo=nn(ro,ro.RECIPROCAL).setParameterLength(1),Vo=nn(ro,ro.TRUNC).setParameterLength(1),ko=nn(ro,ro.FWIDTH).setParameterLength(1),Go=nn(ro,ro.TRANSPOSE).setParameterLength(1),zo=nn(ro,ro.DETERMINANT).setParameterLength(1),$o=nn(ro,ro.INVERSE).setParameterLength(1),Wo=nn(ro,ro.MIN).setParameterLength(2,1/0),Ho=nn(ro,ro.MAX).setParameterLength(2,1/0),qo=nn(ro,ro.STEP).setParameterLength(2),jo=nn(ro,ro.REFLECT).setParameterLength(2),Xo=nn(ro,ro.DISTANCE).setParameterLength(2),Ko=nn(ro,ro.DIFFERENCE).setParameterLength(2),Yo=nn(ro,ro.DOT).setParameterLength(2),Qo=nn(ro,ro.CROSS).setParameterLength(2),Zo=nn(ro,ro.POW).setParameterLength(2),Jo=e=>La(e,e),eu=e=>La(e,e,e),tu=e=>La(e,e,e,e),ru=nn(ro,ro.TRANSFORM_DIRECTION).setParameterLength(2),su=e=>La(Bo(e),Zo(Mo(e),1/3)),iu=e=>Yo(e,e),nu=nn(ro,ro.MIX).setParameterLength(3),au=(e,t=0,r=1)=>Zi(new ro(ro.CLAMP,Zi(e),Zi(t),Zi(r))),ou=e=>au(e),uu=nn(ro,ro.REFRACT).setParameterLength(3),lu=nn(ro,ro.SMOOTHSTEP).setParameterLength(3),du=nn(ro,ro.FACEFORWARD).setParameterLength(3),cu=un(([e])=>{const t=Yo(e.xy,bn(12.9898,78.233)),r=Pa(t,no);return No(So(r).mul(43758.5453))}),hu=(e,t,r)=>nu(t,r,e),pu=(e,t,r)=>lu(t,r,e),gu=(e,t)=>qo(t,e),mu=du,fu=xo;Ni("all",lo),Ni("any",co),Ni("radians",ho),Ni("degrees",po),Ni("exp",go),Ni("exp2",mo),Ni("log",fo),Ni("log2",yo),Ni("sqrt",bo),Ni("inverseSqrt",xo),Ni("floor",To),Ni("ceil",_o),Ni("normalize",vo),Ni("fract",No),Ni("sin",So),Ni("cos",Ro),Ni("tan",Ao),Ni("asin",Eo),Ni("acos",wo),Ni("atan",Co),Ni("abs",Mo),Ni("sign",Bo),Ni("length",Lo),Ni("lengthSq",iu),Ni("negate",Fo),Ni("oneMinus",Po),Ni("dFdx",Do),Ni("dFdy",Uo),Ni("round",Io),Ni("reciprocal",Oo),Ni("trunc",Vo),Ni("fwidth",ko),Ni("min",Wo),Ni("max",Ho),Ni("step",gu),Ni("reflect",jo),Ni("distance",Xo),Ni("dot",Yo),Ni("cross",Qo),Ni("pow",Zo),Ni("pow2",Jo),Ni("pow3",eu),Ni("pow4",tu),Ni("transformDirection",ru),Ni("mix",hu),Ni("clamp",au),Ni("refract",uu),Ni("smoothstep",pu),Ni("faceForward",du),Ni("difference",Ko),Ni("saturate",ou),Ni("cbrt",su),Ni("transpose",Go),Ni("determinant",zo),Ni("inverse",$o),Ni("rand",cu);class yu extends ui{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return e.flowBuildStage(this,"setup"),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.context.uniformFlow,a=e.getNodeProperties(this);a.condNode=t,a.ifNode=n?r:r.context({nodeBlock:r}),a.elseNode=s?n?s:s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?Un(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const bu=rn(yu).setParameterLength(2,3);Ni("select",bu);class xu extends ui{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const Tu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new xu(r,t)},_u=e=>Tu(e,{uniformFlow:!0}),vu=(e,t)=>Tu(e,{nodeName:t});function Nu(e,t,r=null){return Tu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function Su(e,t=null){return Tu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Ru(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),vu(e,t)}Ni("context",Tu),Ni("label",Ru),Ni("uniformFlow",_u),Ni("setName",vu),Ni("builtinShadowContext",(e,t,r)=>Nu(t,r,e)),Ni("builtinAOContext",(e,t)=>Su(t,e));class Au extends ui{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.');return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Eu=rn(Au),wu=(e,t=null)=>Eu(e,t).toStack(),Cu=(e,t=null)=>Eu(e,t,!0).toStack(),Mu=e=>Eu(e).setIntent(!0).toStack();Ni("toVar",wu),Ni("toConst",Cu),Ni("toVarIntent",Mu);class Bu extends ui{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const Lu=(e,t,r=null)=>Zi(new Bu(Zi(e),t,r));class Fu extends ui{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=Lu(e,"VERTEX"),this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null,this.global=!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),t.node=Lu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Zs.VERTEX);e.flowNodeFromShaderStage(Zs.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Pu=rn(Fu).setParameterLength(1,2),Du=e=>Pu(e);Ni("toVarying",Pu),Ni("toVertexStage",Du);const Uu=un(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return nu(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Iu=un(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return nu(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ou="WorkingColorSpace";class Vu extends ci{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===Ou?p.workingColorSpace:"OutputColorSpace"===t?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=An(Uu(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=An(Bn(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=An(Iu(i.rgb),i.a)),i):i}}const ku=(e,t)=>Zi(new Vu(Zi(e),Ou,t)),Gu=(e,t)=>Zi(new Vu(Zi(e),t,Ou));Ni("workingToColorSpace",ku),Ni("colorSpaceToWorking",Gu);let zu=class extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class $u extends ui{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Js.OBJECT}setGroup(e){return this.group=e,this}element(e){return new zu(this,Zi(e))}setNodeType(e){const t=_a(null,e);null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew Wu(e,t,r);class qu extends ci{static get type(){return"ToneMappingNode"}constructor(e,t=Xu,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Os(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=An(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const ju=(e,t,r)=>Zi(new qu(e,Zi(t),Zi(r))),Xu=Hu("toneMappingExposure","float");Ni("toneMapping",(e,t,r)=>ju(t,r,e));const Ku=new WeakMap;function Yu(e,t){let r=Ku.get(e);return void 0===r&&(r=new b(e,t),Ku.set(e,r)),r}class Qu extends yi{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Yu(s.array,i):Yu(s,i);const o=new y(a,r,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=Pu(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}function Zu(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Bn(new Qu(e,"vec3",9,0).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,3).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Ln(new Qu(e,"vec4",16,0).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,4).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,8).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Qu(e,t,r,s).setUsage(i)}const Ju=(e,t=null,r=0,s=0)=>Zu(e,t,r,s),el=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,f,!0),tl=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x,!0);Ni("toAttribute",e=>Ju(e.value));class rl extends ui{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Js.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const sl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;esl(e,r).setCount(t);Ni("compute",il),Ni("computeKernel",sl);class nl extends ui{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const al=e=>new nl(Zi(e));function ol(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),al(e).setParent(t)}Ni("cache",ol),Ni("isolate",al);class ul extends ui{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const ll=rn(ul).setParameterLength(2);Ni("bypass",ll);class dl extends ui{static get type(){return"RemapNode"}constructor(e,t,r,s=gn(0),i=gn(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const cl=rn(dl,null,null,{doClamp:!1}).setParameterLength(3,5),hl=rn(dl).setParameterLength(3,5);Ni("remap",cl),Ni("remapClamp",hl);class pl extends ui{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const gl=rn(pl).setParameterLength(1,2),ml=e=>(e?bu(e,gl("discard")):gl("discard")).toStack();Ni("discard",ml);class fl extends ci{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const yl=(e,t=null,r=null)=>Zi(new fl(Zi(e),t,r));Ni("renderOutput",yl);class bl extends ci{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e);if(null!==t)t(e,r);else{const t="--- TSL debug - "+e.shaderStage+" shader ---",s="-".repeat(t.length);let i="";i+="// #"+t+"#\n",i+=e.flow.code.replace(/^\t/gm,"")+"\n",i+="/* ... */ "+r+" /* ... */\n",i+="// #"+s+"#\n",_(i)}return r}}const xl=(e,t=null)=>Zi(new bl(Zi(e),t)).toStack();Ni("debug",xl);class Tl{constructor(){this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class _l extends ui{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=Js.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}getNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==Tl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function vl(e,t="",r=null){return(e=Zi(e)).before(new _l(e,t,r))}Ni("toInspector",vl);class Nl extends ui{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return Pu(this).build(e,r)}return d(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Sl=(e,t=null)=>new Nl(e,t),Rl=(e=0)=>Sl("uv"+(e>0?e:""),"vec2");class Al extends ui{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const El=rn(Al).setParameterLength(1,2);class wl extends Ta{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Js.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const Cl=rn(wl).setParameterLength(1),Ml=new N;class Bl extends Ta{static get type(){return"TextureNode"}constructor(e=Ml,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Js.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Rl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=_a(this.value.matrix)),this._matrixUniform.mul(vn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=_a(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(mn(El(this,this.levelNode).y).sub(t.y).sub(1)),t)),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");const s=un(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?Js.OBJECT:Js.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;null!==this.compareNode&&(e.renderer.hasCompatibility(A.TEXTURE_COMPARE)?n=this.compareNode:(null!==this.value.compareFunction&&this.value.compareFunction!==E&&v('TSL: Only "LessCompare" is supported for depth texture comparison fallback.'),a=this.compareNode)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:u,compareNode:l,compareStepNode:d,depthNode:c,gradNode:h,offsetNode:p}=s,g=this.generateUV(e,t),m=r?r.build(e,"float"):null,f=u?u.build(e,"float"):null,y=c?c.build(e,"int"):null,b=l?l.build(e,"float"):null,x=d?d.build(e,"float"):null,T=h?[h[0].build(e,"vec2"),h[1].build(e,"vec2")]:null,_=p?this.generateOffset(e,p):null,v=e.getVarFromNode(this);o=e.getPropertyName(v);let N=this.generateSnippet(e,i,g,m,f,y,b,T,_);null!==x&&(N=qo(gl(x,"float"),gl(N,a)).build(e,a)),e.addLineFlowCode(`${o} = ${N}`,this),n.snippet=N,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=Gu(gl(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Zi(e).mul(Cl(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===w||r.magFilter===w)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Zi(t)}level(e){const t=this.clone();return t.levelNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}size(e){return El(this,e)}bias(e){const t=this.clone();return t.biasNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Zi(e),Zi(t)],r.referenceNode=this.getBase(),Zi(r)}depth(e){const t=this.clone();return t.depthNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}offset(e){const t=this.clone();return t.offsetNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}const Ll=rn(Bl).setParameterLength(1,4).setName("texture"),Fl=(e=Ml,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Zi(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=Ll(e,t,r,s),i},Pl=(...e)=>Fl(...e).setSampler(!1);class Dl extends Ta{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Ul=(e,t,r)=>new Dl(e,t,r);class Il extends li{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class Ol extends Dl{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?qs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Js.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rnew Ol(e,t);const kl=rn(class extends ui{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);let Gl,zl;class $l extends ui{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}getNodeType(){return this.scope===$l.DPR?"float":this.scope===$l.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Js.NONE;return this.scope!==$l.SIZE&&this.scope!==$l.VIEWPORT&&this.scope!==$l.DPR||(e=Js.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===$l.VIEWPORT?null!==t?zl.copy(t.viewport):(e.getViewport(zl),zl.multiplyScalar(e.getPixelRatio())):this.scope===$l.DPR?this._output.value=e.getPixelRatio():null!==t?(Gl.width=t.width,Gl.height=t.height):e.getDrawingBufferSize(Gl)}setup(){const e=this.scope;let r=null;return r=e===$l.SIZE?_a(Gl||(Gl=new t)):e===$l.VIEWPORT?_a(zl||(zl=new s)):e===$l.DPR?_a(1):bn(jl.div(ql)),this._output=r,r}generate(e){if(this.scope===$l.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(ql).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}$l.COORDINATE="coordinate",$l.VIEWPORT="viewport",$l.SIZE="size",$l.UV="uv",$l.DPR="dpr";const Wl=sn($l,$l.DPR),Hl=sn($l,$l.UV),ql=sn($l,$l.SIZE),jl=sn($l,$l.COORDINATE),Xl=sn($l,$l.VIEWPORT),Kl=Xl.zw,Yl=jl.sub(Xl.xy),Ql=Yl.div(Kl),Zl=un(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),ql),"vec2").once()(),Jl=_a(0,"uint").setName("u_cameraIndex").setGroup(fa("cameraIndex")).toVarying("v_cameraIndex"),ed=_a("float").setName("cameraNear").setGroup(ba).onRenderUpdate(({camera:e})=>e.near),td=_a("float").setName("cameraFar").setGroup(ba).onRenderUpdate(({camera:e})=>e.far),rd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Vl(r).setGroup(ba).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraProjectionMatrix")}else t=_a("mat4").setName("cameraProjectionMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),sd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=Vl(r).setGroup(ba).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraProjectionMatrixInverse")}else t=_a("mat4").setName("cameraProjectionMatrixInverse").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),id=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Vl(r).setGroup(ba).setName("cameraViewMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraViewMatrix")}else t=_a("mat4").setName("cameraViewMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),nd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);t=Vl(r).setGroup(ba).setName("cameraWorldMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraWorldMatrix")}else t=_a("mat4").setName("cameraWorldMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorld);return t}).once()(),ad=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);t=Vl(r).setGroup(ba).setName("cameraNormalMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraNormalMatrix")}else t=_a("mat3").setName("cameraNormalMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.normalMatrix);return t}).once()(),od=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld));return t}).once()(),ud=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);t=Vl(r,"vec4").setGroup(ba).setName("cameraViewports").element(Jl).toConst("cameraViewport")}else t=An(0,0,ql.x,ql.y).toConst("cameraViewport");return t}).once()(),ld=new C;class dd extends ui{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Js.OBJECT,this.uniformNode=new Ta(null)}getNodeType(){const e=this.scope;return e===dd.WORLD_MATRIX?"mat4":e===dd.POSITION||e===dd.VIEW_POSITION||e===dd.DIRECTION||e===dd.SCALE?"vec3":e===dd.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===dd.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===dd.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===dd.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===dd.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===dd.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===dd.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),ld.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=ld.radius}}generate(e){const t=this.scope;return t===dd.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===dd.POSITION||t===dd.VIEW_POSITION||t===dd.DIRECTION||t===dd.SCALE?this.uniformNode.nodeType="vec3":t===dd.RADIUS&&(this.uniformNode.nodeType="float"),this.uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}dd.WORLD_MATRIX="worldMatrix",dd.POSITION="position",dd.SCALE="scale",dd.VIEW_POSITION="viewPosition",dd.DIRECTION="direction",dd.RADIUS="radius";const cd=rn(dd,dd.DIRECTION).setParameterLength(1),hd=rn(dd,dd.WORLD_MATRIX).setParameterLength(1),pd=rn(dd,dd.POSITION).setParameterLength(1),gd=rn(dd,dd.SCALE).setParameterLength(1),md=rn(dd,dd.VIEW_POSITION).setParameterLength(1),fd=rn(dd,dd.RADIUS).setParameterLength(1);class yd extends dd{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const bd=sn(yd,yd.DIRECTION),xd=sn(yd,yd.WORLD_MATRIX),Td=sn(yd,yd.POSITION),_d=sn(yd,yd.SCALE),vd=sn(yd,yd.VIEW_POSITION),Nd=sn(yd,yd.RADIUS),Sd=_a(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Rd=_a(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Ad=un(e=>e.context.modelViewMatrix||Ed).once()().toVar("modelViewMatrix"),Ed=id.mul(xd),wd=un(e=>(e.context.isHighPrecisionModelViewMatrix=!0,_a("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Cd=un(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return _a("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),Md=un(e=>"fragment"!==e.shaderStage?(v("TSL: `clipSpace` is only available in fragment stage."),An()):e.context.clipSpace.toVarying("v_clipSpace")).once()(),Bd=Sl("position","vec3"),Ld=Bd.toVarying("positionLocal"),Fd=Bd.toVarying("positionPrevious"),Pd=un(e=>xd.mul(Ld).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Dd=un(()=>Ld.transformDirection(xd).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Ud=un(e=>{if("fragment"===e.shaderStage&&e.material.vertexNode){const e=sd.mul(Md);return e.xyz.div(e.w).toVar("positionView")}return e.context.setupPositionView().toVarying("v_positionView")},"vec3").once(["POSITION","VERTEX"])(),Id=un(e=>{let t;return t=e.camera.isOrthographicCamera?vn(0,0,1):Ud.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class Od extends ui{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===M?"false":e.getFrontFacing()}}const Vd=sn(Od),kd=gn(Vd).mul(2).sub(1),Gd=un(([e],{material:t})=>{const r=t.side;return r===M?e=e.mul(-1):r===B&&(e=e.mul(kd)),e}),zd=Sl("normal","vec3"),$d=un(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),vn(0,1,0)):zd,"vec3").once()().toVar("normalLocal"),Wd=Ud.dFdx().cross(Ud.dFdy()).normalize().toVar("normalFlat"),Hd=un(e=>{let t;return t=!0===e.material.flatShading?Wd:Qd($d).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),qd=un(e=>{let t=Hd.transformDirection(id);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),jd=un(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=Hd,!0!==t.flatShading&&(s=Gd(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),Xd=jd.transformDirection(id).toVar("normalWorld"),Kd=un(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?jd:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),Yd=un(([e,t=xd])=>{const r=Bn(t),s=e.div(vn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),Qd=un(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=Sd.mul(e);return id.transformDirection(s)}),Zd=un(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),jd)).once(["NORMAL","VERTEX"])(),Jd=un(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),Xd)).once(["NORMAL","VERTEX"])(),ec=un(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),Kd)).once(["NORMAL","VERTEX"])(),tc=new L,rc=new a,sc=_a(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),ic=_a(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),nc=_a(new a).onReference(function(e){return e.material}).onObjectUpdate(function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(tc.copy(r),rc.makeRotationFromEuler(tc)):rc.identity(),rc}),ac=Id.negate().reflect(jd),oc=Id.negate().refract(jd,sc),uc=ac.transformDirection(id).toVar("reflectVector"),lc=oc.transformDirection(id).toVar("reflectVector"),dc=new F;class cc extends Bl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===P?uc:e.mapping===D?lc:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),vn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?vn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=vn(t.x.negate(),t.yz)),nc.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const hc=rn(cc).setParameterLength(1,4).setName("cubeTexture"),pc=(e=dc,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Zi(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=hc(e,t,r,s),i};class gc extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class mc extends ui{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Js.OBJECT}element(e){return new gc(this,Zi(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Ul(null,e,this.count):Array.isArray(this.getValueFromReference())?Vl(null,e):"texture"===e?Fl(null):"cubeTexture"===e?pc(null):_a(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew mc(e,t,r),yc=(e,t,r,s)=>new mc(e,t,s,r);class bc extends mc{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const xc=(e,t,r=null)=>new bc(e,t,r),Tc=Rl(),_c=Ud.dFdx(),vc=Ud.dFdy(),Nc=Tc.dFdx(),Sc=Tc.dFdy(),Rc=jd,Ac=vc.cross(Rc),Ec=Rc.cross(_c),wc=Ac.mul(Nc.x).add(Ec.mul(Sc.x)),Cc=Ac.mul(Nc.y).add(Ec.mul(Sc.y)),Mc=wc.dot(wc).max(Cc.dot(Cc)),Bc=Mc.equal(0).select(0,Mc.inverseSqrt()),Lc=wc.mul(Bc).toVar("tangentViewFrame"),Fc=Cc.mul(Bc).toVar("bitangentViewFrame"),Pc=Sl("tangent","vec4"),Dc=Pc.xyz.toVar("tangentLocal"),Uc=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Ad.mul(An(Dc,0)).xyz.toVarying("v_tangentView").normalize():Lc,!0!==r.flatShading&&(s=Gd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Ic=Uc.transformDirection(id).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Oc=un(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(Pc.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),Vc=Oc(zd.cross(Pc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),kc=Oc($d.cross(Dc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Gc=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Oc(jd.cross(Uc),"v_bitangentView").normalize():Fc,!0!==r.flatShading&&(s=Gd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),zc=Oc(Xd.cross(Ic),"v_bitangentWorld").normalize().toVar("bitangentWorld"),$c=Bn(Uc,Gc,jd).toVar("TBNViewMatrix"),Wc=Id.mul($c),Hc=un(()=>{let e=Jn.cross(Id);return e=e.cross(Jn).normalize(),e=nu(e,jd,Qn.mul(Gn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),qc=e=>Zi(e).mul(.5).add(.5),jc=e=>vn(e,bo(ou(gn(1).sub(Yo(e,e)))));class Xc extends ci{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=U,this.unpackNormalMode=I}setup({material:e}){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===U?s===O?i=jc(i.xy):s===V?i=jc(i.yw):s!==I&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==I&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.flatShading&&(t=Gd(t)),i=vn(i.xy.mul(t),i.z)}let n=null;return t===k?n=Qd(i):t===U?n=$c.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=jd),n}}const Kc=rn(Xc).setParameterLength(1,2),Yc=un(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Rl()),forceUVContext:!0}),s=gn(r(e=>e));return bn(gn(r(e=>e.add(e.dFdx()))).sub(s),gn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),Qc=un(e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(kd),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class Zc extends ci{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Yc({textureNode:this.textureNode,bumpScale:e});return Qc({surf_pos:Ud,surf_norm:jd,dHdxy:t})}}const Jc=rn(Zc).setParameterLength(1,2),eh=new Map;class th extends ui{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=eh.get(e);return void 0===r&&(r=xc(e,t),eh.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===th.COLOR){const e=void 0!==t.color?this.getColor(r):vn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===th.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===th.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:gn(1);else if(r===th.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===th.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===th.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===th.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===th.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===th.NORMAL)t.normalMap?(s=Kc(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=G&&t.normalMap.format!=z&&t.normalMap.format!=$||(s.unpackNormalMode=O)):s=t.bumpMap?Jc(this.getTexture("bump").r,this.getFloat("bumpScale")):jd;else if(r===th.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===th.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===th.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Kc(this.getTexture(r),this.getCache(r+"Scale","vec2")):jd;else if(r===th.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===th.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===th.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Mn(Vh.x,Vh.y,Vh.y.negate(),Vh.x).mul(e.rg.mul(2).sub(bn(1)).normalize().mul(e.b))}else s=Vh;else if(r===th.IRIDESCENCE_THICKNESS){const e=fc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=fc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===th.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===th.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===th.IOR)s=this.getFloat(r);else if(r===th.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===th.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===th.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):gn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}th.ALPHA_TEST="alphaTest",th.COLOR="color",th.OPACITY="opacity",th.SHININESS="shininess",th.SPECULAR="specular",th.SPECULAR_STRENGTH="specularStrength",th.SPECULAR_INTENSITY="specularIntensity",th.SPECULAR_COLOR="specularColor",th.REFLECTIVITY="reflectivity",th.ROUGHNESS="roughness",th.METALNESS="metalness",th.NORMAL="normal",th.CLEARCOAT="clearcoat",th.CLEARCOAT_ROUGHNESS="clearcoatRoughness",th.CLEARCOAT_NORMAL="clearcoatNormal",th.EMISSIVE="emissive",th.ROTATION="rotation",th.SHEEN="sheen",th.SHEEN_ROUGHNESS="sheenRoughness",th.ANISOTROPY="anisotropy",th.IRIDESCENCE="iridescence",th.IRIDESCENCE_IOR="iridescenceIOR",th.IRIDESCENCE_THICKNESS="iridescenceThickness",th.IOR="ior",th.TRANSMISSION="transmission",th.THICKNESS="thickness",th.ATTENUATION_DISTANCE="attenuationDistance",th.ATTENUATION_COLOR="attenuationColor",th.LINE_SCALE="scale",th.LINE_DASH_SIZE="dashSize",th.LINE_GAP_SIZE="gapSize",th.LINE_WIDTH="linewidth",th.LINE_DASH_OFFSET="dashOffset",th.POINT_SIZE="size",th.DISPERSION="dispersion",th.LIGHT_MAP="light",th.AO="ao";const rh=sn(th,th.ALPHA_TEST),sh=sn(th,th.COLOR),ih=sn(th,th.SHININESS),nh=sn(th,th.EMISSIVE),ah=sn(th,th.OPACITY),oh=sn(th,th.SPECULAR),uh=sn(th,th.SPECULAR_INTENSITY),lh=sn(th,th.SPECULAR_COLOR),dh=sn(th,th.SPECULAR_STRENGTH),ch=sn(th,th.REFLECTIVITY),hh=sn(th,th.ROUGHNESS),ph=sn(th,th.METALNESS),gh=sn(th,th.NORMAL),mh=sn(th,th.CLEARCOAT),fh=sn(th,th.CLEARCOAT_ROUGHNESS),yh=sn(th,th.CLEARCOAT_NORMAL),bh=sn(th,th.ROTATION),xh=sn(th,th.SHEEN),Th=sn(th,th.SHEEN_ROUGHNESS),_h=sn(th,th.ANISOTROPY),vh=sn(th,th.IRIDESCENCE),Nh=sn(th,th.IRIDESCENCE_IOR),Sh=sn(th,th.IRIDESCENCE_THICKNESS),Rh=sn(th,th.TRANSMISSION),Ah=sn(th,th.THICKNESS),Eh=sn(th,th.IOR),wh=sn(th,th.ATTENUATION_DISTANCE),Ch=sn(th,th.ATTENUATION_COLOR),Mh=sn(th,th.LINE_SCALE),Bh=sn(th,th.LINE_DASH_SIZE),Lh=sn(th,th.LINE_GAP_SIZE),Fh=sn(th,th.LINE_WIDTH),Ph=sn(th,th.LINE_DASH_OFFSET),Dh=sn(th,th.POINT_SIZE),Uh=sn(th,th.DISPERSION),Ih=sn(th,th.LIGHT_MAP),Oh=sn(th,th.AO),Vh=_a(new t).onReference(function(e){return e.material}).onRenderUpdate(function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}),kh=un(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class Gh extends li{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const zh=rn(Gh).setParameterLength(2);class $h extends Dl{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Gs(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ti.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return zh(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ti.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Ju(this.value),this._varying=Pu(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const Wh=(e,t=null,r=0)=>new $h(e,t,r);class Hh extends ui{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===Hh.VERTEX)s=e.getVertexIndex();else if(r===Hh.INSTANCE)s=e.getInstanceIndex();else if(r===Hh.DRAW)s=e.getDrawIndex();else if(r===Hh.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Hh.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Hh.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Pu(this).build(e,t)}return i}}Hh.VERTEX="vertex",Hh.INSTANCE="instance",Hh.SUBGROUP="subgroup",Hh.INVOCATION_LOCAL="invocationLocal",Hh.INVOCATION_SUBGROUP="invocationSubgroup",Hh.DRAW="draw";const qh=sn(Hh,Hh.VERTEX),jh=sn(Hh,Hh.INSTANCE),Xh=sn(Hh,Hh.SUBGROUP),Kh=sn(Hh,Hh.INVOCATION_SUBGROUP),Yh=sn(Hh,Hh.INVOCATION_LOCAL),Qh=sn(Hh,Hh.DRAW);class Zh extends ui{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Js.FRAME,this.buffer=null,this.bufferColor=null,this.previousInstanceMatrixNode=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){let{instanceMatrixNode:t,instanceColorNode:r}=this;null===t&&(t=this._createInstanceMatrixNode(!0,e),this.instanceMatrixNode=t);const{instanceColor:s,isStorageColor:i}=this;if(s&&null===r){if(i)r=Wh(s,"vec3",Math.max(s.count,1)).element(jh);else{const e=new W(s.array,3),t=s.usage===x?tl:el;this.bufferColor=e,r=vn(t(e,"vec3",3,0))}this.instanceColorNode=r}const n=t.mul(Ld).xyz;if(Ld.assign(n),e.needsPreviousData()&&Fd.assign(this.getPreviousInstancedPosition(e)),e.hasGeometryAttribute("normal")){const e=Yd($d,t);$d.assign(e)}null!==this.instanceColorNode&&In("vec3","vInstanceColor").assign(this.instanceColorNode)}update(e){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)),null!==this.previousInstanceMatrixNode&&e.object.previousInstanceMatrix.array.set(this.instanceMatrix.array)}getPreviousInstancedPosition(e){const t=e.object;return null===this.previousInstanceMatrixNode&&(t.previousInstanceMatrix=this.instanceMatrix.clone(),this.previousInstanceMatrixNode=this._createInstanceMatrixNode(!1,e)),this.previousInstanceMatrixNode.mul(Fd).xyz}_createInstanceMatrixNode(e,t){let r;const{instanceMatrix:s}=this,{count:i}=s;if(this.isStorageMatrix)r=Wh(s,"mat4",Math.max(i,1)).element(jh);else{if(i<=(!0===t.renderer.backend.isWebGPUBackend?1e3:250))r=Ul(s.array,"mat4",Math.max(i,1)).element(jh);else{const t=new H(s.array,16,1);!0===e&&(this.buffer=t);const i=s.usage===x?tl:el,n=[i(t,"vec4",16,0),i(t,"vec4",16,4),i(t,"vec4",16,8),i(t,"vec4",16,12)];r=Ln(...n)}}return r}}const Jh=rn(Zh).setParameterLength(2,3);class ep extends Zh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const tp=rn(ep).setParameterLength(1);class rp extends ui{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=jh:this.batchingIdNode=Qh);const t=un(([e])=>{const t=mn(El(Pl(this.batchMesh._indirectTexture),0).x).toConst(),r=mn(e).mod(t).toConst(),s=mn(e).div(t).toConst();return Pl(this.batchMesh._indirectTexture,xn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(mn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=mn(El(Pl(s),0).x).toConst(),n=gn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Ln(Pl(s,xn(a,o)),Pl(s,xn(a.add(1),o)),Pl(s,xn(a.add(2),o)),Pl(s,xn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=un(([e])=>{const t=mn(El(Pl(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Pl(l,xn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);In("vec3","vBatchColor").assign(t)}const d=Bn(u);Ld.assign(u.mul(Ld));const c=$d.div(vn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;$d.assign(h),e.hasGeometryAttribute("tangent")&&Dc.mulAssign(d)}}const sp=rn(rp).setParameterLength(1),ip=new WeakMap;class np extends ui{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Js.OBJECT,this.skinIndexNode=Sl("skinIndex","uvec4"),this.skinWeightNode=Sl("skinWeight","vec4"),this.bindMatrixNode=fc("bindMatrix","mat4"),this.bindMatrixInverseNode=fc("bindMatrixInverse","mat4"),this.boneMatricesNode=yc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Ld,this.toPositionNode=Ld,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=Ma(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormalAndTangent(e=this.boneMatricesNode,t=$d,r=Dc){const{skinIndexNode:s,skinWeightNode:i,bindMatrixNode:n,bindMatrixInverseNode:a}=this,o=e.element(s.x),u=e.element(s.y),l=e.element(s.z),d=e.element(s.w);let c=Ma(i.x.mul(o),i.y.mul(u),i.z.mul(l),i.w.mul(d));c=a.mul(c).mul(n);return{skinNormal:c.transformDirection(t).xyz,skinTangent:c.transformDirection(r).xyz}}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=yc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Fd)}setup(e){e.needsPreviousData()&&Fd.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const{skinNormal:t,skinTangent:r}=this.getSkinnedNormalAndTangent();$d.assign(t),e.hasGeometryAttribute("tangent")&&Dc.assign(r)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;ip.get(t)!==e.frameId&&(ip.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const ap=e=>new np(e);class op extends ui{static get type(){return"LoopNode"}constructor(e=[]){super("void"),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew op(tn(e,"int")).toStack(),lp=()=>gl("break").toStack(),dp=new WeakMap,cp=new s,hp=un(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=mn(qh).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Pl(e,xn(u,o)).depth(i).xyz.mul(t)});class pp extends ui{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=_a(1),this.updateType=Js.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=dp.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new q(m,h,p,a);f.type=j,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=gn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Pl(this.mesh.morphTexture,xn(mn(e).add(1),mn(jh))).r):t.assign(fc("morphTargetInfluences","float").element(e).toVar()),cn(t.notEqual(0),()=>{!0===s&&Ld.addAssign(hp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(0)})),!0===i&&$d.addAssign(hp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(1)}))})})}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce((e,t)=>e+t,0)}}const gp=rn(pp).setParameterLength(1);class mp extends ui{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class fp extends mp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class yp extends xu{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:vn().toVar("directDiffuse"),directSpecular:vn().toVar("directSpecular"),indirectDiffuse:vn().toVar("indirectDiffuse"),indirectSpecular:vn().toVar("indirectSpecular")};return{radiance:vn().toVar("radiance"),irradiance:vn().toVar("irradiance"),iblIrradiance:vn().toVar("iblIrradiance"),ambientOcclusion:gn(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const bp=rn(yp);class xp extends mp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const Tp=new t;class _p extends Bl{static get type(){return"ViewportTextureNode"}constructor(e=Hl,t=null,r=null){let s=null;null===r?(s=new X,s.minFilter=K,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Js.RENDER,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer.getRenderTarget();return this.value=this.getTextureForReference(t),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(Tp):Tp.set(r.width,r.height);const s=this.getTextureForReference(r);s.image.width===Tp.width&&s.image.height===Tp.height||(s.image.width=Tp.width,s.image.height=Tp.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const vp=rn(_p).setParameterLength(0,3),Np=rn(_p,null,null,{generateMipmaps:!0}).setParameterLength(0,3),Sp=Np(),Rp=(e=Hl,t=null)=>Sp.sample(e,t);let Ap=null;class Ep extends _p{static get type(){return"ViewportDepthTextureNode"}constructor(e=Hl,t=null){null===Ap&&(Ap=new Y),super(e,t,Ap)}getTextureForReference(){return Ap}}const wp=rn(Ep).setParameterLength(0,2);class Cp extends ui{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Cp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Cp.DEPTH_BASE)null!==r&&(s=Pp().assign(r));else if(t===Cp.DEPTH)s=e.isPerspectiveCamera?Bp(Ud.z,ed,td):Mp(Ud.z,ed,td);else if(t===Cp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Lp(r,ed,td);s=Mp(e,ed,td)}else s=r;else s=Mp(Ud.z,ed,td);return s}}Cp.DEPTH_BASE="depthBase",Cp.DEPTH="depth",Cp.LINEAR_DEPTH="linearDepth";const Mp=(e,t,r)=>e.add(t).div(t.sub(r)),Bp=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Lp=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Fp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=yo(e.negate().div(t)),i=yo(r.div(t));return s.div(i)},Pp=rn(Cp,Cp.DEPTH_BASE),Dp=sn(Cp,Cp.DEPTH),Up=rn(Cp,Cp.LINEAR_DEPTH).setParameterLength(0,1),Ip=Up(wp());Dp.assign=e=>Pp(e);class Op extends ui{static get type(){return"ClippingNode"}constructor(e=Op.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===Op.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Op.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return un(()=>{const r=gn().toVar("distanceToPlane"),s=gn().toVar("distanceToGradient"),i=gn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Vl(t).setGroup(ba);up(n,({i:t})=>{const n=e.element(t);r.assign(Ud.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(lu(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Vl(e).setGroup(ba),n=gn(1).toVar("intersectionClipOpacity");up(a,({i:e})=>{const i=t.element(e);r.assign(Ud.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(lu(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}On.a.mulAssign(i),On.a.equal(0).discard()})()}setupDefault(e,t){return un(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Vl(t).setGroup(ba);up(r,({i:t})=>{const r=e.element(t);Ud.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Vl(e).setGroup(ba),r=yn(!0).toVar("clipped");up(s,({i:e})=>{const s=t.element(e);r.assign(Ud.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),un(()=>{const s=Vl(e).setGroup(ba),i=kl(t.getClipDistance());up(r,({i:e})=>{const t=s.element(e),r=Ud.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}Op.ALPHA_TO_COVERAGE="alphaToCoverage",Op.DEFAULT="default",Op.HARDWARE="hardware";const Vp=un(([e])=>No(La(1e4,So(La(17,e.x).add(La(.1,e.y)))).mul(Ma(.1,Mo(So(La(13,e.y).add(e.x))))))),kp=un(([e])=>Vp(bn(Vp(e.xy),e.z))),Gp=un(([e])=>{const t=Ho(Lo(Do(e.xyz)),Lo(Uo(e.xyz))),r=gn(1).div(gn(.05).mul(t)).toVar("pixScale"),s=bn(mo(To(yo(r))),mo(_o(yo(r)))),i=bn(kp(To(s.x.mul(e.xyz))),kp(To(s.y.mul(e.xyz)))),n=No(yo(r)),a=Ma(La(n.oneMinus(),i.x),La(n,i.y)),o=Wo(n,n.oneMinus()),u=vn(a.mul(a).div(La(2,o).mul(Ba(1,o))),a.sub(La(.5,o)).div(Ba(1,o)),Ba(1,Ba(1,a).mul(Ba(1,a)).div(La(2,o).mul(Ba(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return au(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class zp extends Nl{static get type(){return"VertexColorNode"}constructor(e){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}const $p=(e=0)=>new zp(e),Wp=un(([e,t])=>Wo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Hp=un(([e,t])=>Wo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),qp=un(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),jp=un(([e,t])=>nu(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),qo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Xp=un(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return An(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)}).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),Kp=un(([e])=>An(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),Yp=un(([e])=>(cn(e.a.equal(0),()=>An(0)),An(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class Qp extends Q{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.maskNode=null,this.maskShadowNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,this.contextNode=null}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Us(t.slice(0,-4)),r.getCacheKey());return this.type+Is(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Lu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=this.setupVertex(e),i=Lu(this.vertexNode||s,"VERTEX");let n;e.context.clipSpace=i,e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==a&&e.stack.addToStack(a);const i=An(s,On.a).max(0);n=this.setupOutput(e,i),ia.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&ia.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=An(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.currentSamples;this.alphaToCoverage&&t>1?s=new Op(Op.ALPHA_TO_COVERAGE):e.stack.addToStack(new Op)}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.addToStack(new Op(Op.HARDWARE)),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Fp(Ud.z,ed,td):Mp(Ud.z,ed,td))}null!==s&&Dp.assign(s).toStack()}setupPositionView(){return Ad.mul(Ld).xyz}setupModelViewProjection(){return rd.mul(Ud)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.position=e.removeStack(),kh}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&gp(t).toStack(),!0===t.isSkinnedMesh&&ap(t).toStack(),this.displacementMap){const e=xc("displacementMap","texture"),t=xc("displacementScale","float"),r=xc("displacementBias","float");Ld.addAssign($d.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&sp(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&tp(t).toStack(),null!==this.positionNode&&Ld.assign(Lu(this.positionNode,"POSITION","vec3")),Ld}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&yn(this.maskNode).not().discard();let s=this.colorNode?An(this.colorNode):sh;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul($p())),t.instanceColor){s=In("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=In("vec3","vBatchColor").mul(s)}On.assign(s);const i=this.opacityNode?gn(this.opacityNode):ah;On.a.assign(On.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?gn(this.alphaTestNode):rh,!0===this.alphaToCoverage?(On.a=lu(n,n.add(ko(On.a)),On.a),On.a.lessThanEqual(0).discard()):On.a.lessThanEqual(n).discard()),!0===this.alphaHash&&On.a.lessThan(Gp(Ld)).discard(),e.isOpaque()&&On.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?vn(0):On.rgb}setupNormal(){return this.normalNode?vn(this.normalNode):gh}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?xc("envMap","cubeTexture"):xc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new xp(Ih)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=Oh),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new fp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=bp(n,t,r,s)}else null!==r&&(a=vn(null!==s?nu(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(kn.assign(vn(i||nh)),a=a.add(kn)),a}setupFog(e,t){const r=e.fogNode;return r&&(ia.assign(t),t=An(r.toVar())),t}setupPremultipliedAlpha(e,t){return Kp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=Q.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.maskNode=e.maskNode,this.maskShadowNode=e.maskShadowNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,this.contextNode=e.contextNode,super.copy(e)}}const Zp=new Z;class Jp extends Qp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(Zp),this.setValues(e)}}const eg=new J;class tg extends Qp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(eg),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?gn(this.offsetNode):Ph,t=this.dashScaleNode?gn(this.dashScaleNode):Mh,r=this.dashSizeNode?gn(this.dashSizeNode):Bh,s=this.gapSizeNode?gn(this.gapSizeNode):Lh;na.assign(r),aa.assign(s);const i=Pu(Sl("lineDistance").mul(t));(e?i.add(e):i).mod(na.add(aa)).greaterThan(na).discard()}}const rg=new J;class sg extends Qp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(rg),this.vertexColors=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=ee,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.vertexColors,i=this._useDash,n=this._useWorldUnits,a=un(({start:e,end:t})=>{const r=rd.element(2).element(2),s=rd.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return An(nu(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=un(()=>{const e=Sl("instanceStart"),t=Sl("instanceEnd"),r=An(Ad.mul(An(e,1))).toVar("start"),s=An(Ad.mul(An(t,1))).toVar("end");if(i){const e=this.dashScaleNode?gn(this.dashScaleNode):Mh,t=this.offsetNode?gn(this.offsetNode):Ph,r=Sl("instanceDistanceStart"),s=Sl("instanceDistanceEnd");let i=Bd.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),In("float","lineDistance").assign(i)}n&&(In("vec3","worldStart").assign(r.xyz),In("vec3","worldEnd").assign(s.xyz));const o=Xl.z.div(Xl.w),u=rd.element(2).element(3).equal(-1);cn(u,()=>{cn(r.z.lessThan(0).and(s.z.greaterThan(0)),()=>{s.assign(a({start:r,end:s}))}).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),()=>{r.assign(a({start:s,end:r}))})});const l=rd.mul(r),d=rd.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=An().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=nu(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=In("vec4","worldPos");o.assign(Bd.y.lessThan(.5).select(r,s));const u=Fh.mul(.5);o.addAssign(An(Bd.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(An(Bd.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(An(a.mul(u),0)),cn(Bd.y.greaterThan(1).or(Bd.y.lessThan(0)),()=>{o.subAssign(An(a.mul(2).mul(u),0))})),g.assign(rd.mul(o));const l=vn().toVar();l.assign(Bd.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=bn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Bd.x.lessThan(0).select(e.negate(),e)),cn(Bd.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(Bd.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Fh)),e.assign(e.div(Xl.w.div(Wl))),g.assign(Bd.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(An(e,0,0)))}return g})();const o=un(({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return bn(h,p)});if(this.colorNode=un(()=>{const e=Rl();if(i){const t=this.dashSizeNode?gn(this.dashSizeNode):Bh,r=this.gapSizeNode?gn(this.gapSizeNode):Lh;na.assign(t),aa.assign(r);const s=In("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(na.add(aa)).greaterThan(na).discard()}const a=gn(1).toVar("alpha");if(n){const e=In("vec3","worldStart"),s=In("vec3","worldEnd"),n=In("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:vn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Fh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(lu(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=gn(s.fwidth()).toVar("dlen");cn(e.y.abs().greaterThan(1),()=>{a.assign(lu(i.oneMinus(),i.add(1),s).oneMinus())})}else cn(e.y.abs().greaterThan(1),()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()});let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Sl("instanceColorStart"),t=Sl("instanceColorEnd");u=Bd.y.lessThan(.5).select(e,t).mul(sh)}else u=sh;return An(u,a)})(),this.transparent){const e=this.opacityNode?gn(this.opacityNode):ah;this.outputNode=An(this.colorNode.rgb.mul(e).add(Rp().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const ig=new te;class ng extends Qp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(ig),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?gn(this.opacityNode):ah;On.assign(Gu(An(qc(jd),e),re))}}const ag=un(([e=Dd])=>{const t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return bn(t,r)});class og extends se{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new ie(5,5,5),n=ag(Dd),a=new Qp;a.colorNode=Fl(t,n,0),a.side=M,a.blending=ee;const o=new ne(i,a),u=new ae;u.add(o),t.minFilter===K&&(t.minFilter=oe);const l=new ue(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const ug=new WeakMap;class lg extends ci{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=pc(null);const t=new F;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Js.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===le||r===de){if(ug.has(e)){const t=ug.get(e);cg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new og(r.height);s.fromEquirectangularTexture(t,e),cg(s.texture,e.mapping),this._cubeTexture=s.texture,ug.set(e,s.texture),e.addEventListener("dispose",dg)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function dg(e){const t=e.target;t.removeEventListener("dispose",dg);const r=ug.get(t);void 0!==r&&(ug.delete(t),r.dispose())}function cg(e,t){t===le?e.mapping=P:t===de&&(e.mapping=D)}const hg=rn(lg).setParameterLength(1);class pg extends mp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=hg(this.envNode)}}class gg extends mp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=gn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class mg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class fg extends mg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(An(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(An(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(On.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case pe:s.rgb.assign(nu(s.rgb,s.rgb.mul(i.rgb),dh.mul(ch)));break;case he:s.rgb.assign(nu(s.rgb,i.rgb,dh.mul(ch)));break;case ce:s.rgb.addAssign(i.rgb.mul(dh.mul(ch)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const yg=new ge;class bg extends Qp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(yg),this.setValues(e)}setupNormal(){return Gd(Hd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new gg(Ih)),t}setupOutgoingLight(){return On.rgb}setupLightingModel(){return new fg}}const xg=un(({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))}),Tg=un(e=>e.diffuseColor.mul(1/Math.PI)),_g=un(({dotNH:e})=>sa.mul(gn(.5)).add(1).mul(gn(1/Math.PI)).mul(e.pow(sa))),vg=un(({lightDirection:e})=>{const t=e.add(Id).normalize(),r=jd.dot(t).clamp(),s=Id.dot(t).clamp(),i=xg({f0:ea,f90:1,dotVH:s}),n=gn(.25),a=_g({dotNH:r});return i.mul(n).mul(a)});class Ng extends fg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=jd.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Tg({diffuseColor:On.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(vg({lightDirection:e})).mul(dh))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Tg({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const Sg=new me;class Rg extends Qp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Sg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightingModel(){return new Ng(!1)}}const Ag=new fe;class Eg extends Qp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Ag),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightingModel(){return new Ng}setupVariants(){const e=(this.shininessNode?gn(this.shininessNode):ih).max(1e-4);sa.assign(e);const t=this.specularNode||oh;ea.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const wg=un(e=>{if(!1===e.geometry.hasAttribute("normal"))return gn(0);const t=Hd.dFdx().abs().max(Hd.dFdy().abs());return t.x.max(t.y).max(t.z)}),Cg=un(e=>{const{roughness:t}=e,r=wg();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),Mg=un(({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return Fa(.5,i.add(n).max(so))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Bg=un(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(vn(e.mul(r),t.mul(s),a).length()),l=a.mul(vn(e.mul(i),t.mul(n),o).length());return Fa(.5,u.add(l))}).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),Lg=un(({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)}).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Fg=gn(1/Math.PI),Pg=un(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=vn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Fg.mul(n.mul(u.pow2()))}).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),Dg=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=jd,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Id).normalize(),d=n.dot(e).clamp(),c=n.dot(Id).clamp(),h=n.dot(l).clamp(),p=Id.dot(l).clamp();let g,m,f=xg({f0:t,f90:r,dotVH:p});if(Ki(a)&&(f=jn.mix(f,i)),Ki(o)){const t=Zn.dot(e),r=Zn.dot(Id),s=Zn.dot(l),i=Jn.dot(e),n=Jn.dot(Id),a=Jn.dot(l);g=Bg({alphaT:Yn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Pg({alphaT:Yn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=Mg({alpha:u,dotNL:d,dotNV:c}),m=Lg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),Ug=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let Ig=null;const Og=un(({roughness:e,dotNV:t})=>{null===Ig&&(Ig=new ye(Ug,16,16,G,be),Ig.name="DFG_LUT",Ig.minFilter=oe,Ig.magFilter=oe,Ig.wrapS=xe,Ig.wrapT=xe,Ig.generateMipmaps=!1,Ig.needsUpdate=!0);const r=bn(e,t);return Fl(Ig,r).rg}),Vg=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Dg({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=jd.dot(e).clamp(),l=jd.dot(Id).clamp(),d=Og({roughness:s,dotNV:l}),c=Og({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=gn(1).sub(g),y=gn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(gn(1).sub(f.mul(y).mul(b).mul(b)).add(so)),T=f.mul(y),_=x.mul(T);return o.add(_)}),kg=un(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Og({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),Gg=un(({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(vn(t).mul(n)).div(n.oneMinus())}).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),zg=un(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=gn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return gn(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)}).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),$g=un(({dotNV:e,dotNL:t})=>gn(1).div(gn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Wg=un(({lightDirection:e})=>{const t=e.add(Id).normalize(),r=jd.dot(e).clamp(),s=jd.dot(Id).clamp(),i=jd.dot(t).clamp(),n=zg({roughness:qn,dotNH:i}),a=$g({dotNV:s,dotNL:r});return Hn.mul(n).mul(a)}),Hg=un(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=bn(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i}).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),qg=un(({f:e})=>{const t=e.length();return Ho(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),jg=un(({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,Ho(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)}).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Xg=un(({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=vn().toVar();return cn(d.dot(r.sub(i)).greaterThanEqual(0),()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(Bn(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=vn(0).toVar();f.addAssign(jg({v1:h,v2:p})),f.addAssign(jg({v1:p,v2:g})),f.addAssign(jg({v1:g,v2:m})),f.addAssign(jg({v1:m,v2:h})),c.assign(vn(qg({f:f})))}),c}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Kg=un(({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=vn().toVar();return cn(o.dot(e.sub(t)).greaterThanEqual(0),()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=vn(0).toVar();d.addAssign(jg({v1:n,v2:a})),d.addAssign(jg({v1:a,v2:o})),d.addAssign(jg({v1:o,v2:l})),d.addAssign(jg({v1:l,v2:n})),u.assign(vn(qg({f:d.abs()})))}),u}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Yg=1/6,Qg=e=>La(Yg,La(e,La(e,e.negate().add(3)).sub(3)).add(1)),Zg=e=>La(Yg,La(e,La(e,La(3,e).sub(6))).add(4)),Jg=e=>La(Yg,La(e,La(e,La(-3,e).add(3)).add(3)).add(1)),em=e=>La(Yg,Zo(e,3)),tm=e=>Qg(e).add(Zg(e)),rm=e=>Jg(e).add(em(e)),sm=e=>Ma(-1,Zg(e).div(Qg(e).add(Zg(e)))),im=e=>Ma(1,em(e).div(Jg(e).add(em(e)))),nm=(e,t,r)=>{const s=e.uvNode,i=La(s,t.zw).add(.5),n=To(i),a=No(i),o=tm(a.x),u=rm(a.x),l=sm(a.x),d=im(a.x),c=sm(a.y),h=im(a.y),p=bn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=bn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=bn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=bn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=tm(a.y).mul(Ma(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=rm(a.y).mul(Ma(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},am=un(([e,t])=>{const r=bn(e.size(mn(t))),s=bn(e.size(mn(t.add(1)))),i=Fa(1,r),n=Fa(1,s),a=nm(e,An(i,r),To(t)),o=nm(e,An(n,s),_o(t));return No(t).mix(a,o)}),om=un(([e,t])=>{const r=t.mul(Cl(e));return am(e,r)}),um=un(([e,t,r,s,i])=>{const n=vn(uu(t.negate(),vo(e),Fa(1,s))),a=vn(Lo(i[0].xyz),Lo(i[1].xyz),Lo(i[2].xyz));return vo(n).mul(r.mul(a))}).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),lm=un(([e,t])=>e.mul(au(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),dm=Np(),cm=Rp(),hm=un(([e,t,r],{material:s})=>{const i=(s.side===M?dm:cm).sample(e),n=yo(ql.x).mul(lm(t,r));return am(i,n)}),pm=un(([e,t,r])=>(cn(r.notEqual(0),()=>{const s=fo(t).negate().div(r);return go(s.negate().mul(e))}),vn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),gm=un(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=An().toVar(),f=vn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=vn(d.sub(i),d,d.add(i));up({start:0,end:3},({i:i})=>{const d=n.element(i),g=um(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(An(y,1))),x=bn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(bn(x.x,x.y.oneMinus()));const T=hm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(pm(Lo(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=um(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(An(n,1))),y=bn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(bn(y.x,y.y.oneMinus())),m=hm(y,r,d),f=s.mul(pm(Lo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=vn(kg({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return An(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),mm=Bn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),fm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),ym=un(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=nu(e,t,lu(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();cn(a.lessThan(0),()=>vn(1));const o=a.sqrt(),u=fm(n,e),l=xg({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=gn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return vn(1).add(t).div(vn(1).sub(t))})(i.clamp(0,.9999)),g=fm(p,n.toVec3()),m=xg({f0:g,f90:1,dotVH:o}),f=vn(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),b=vn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(vn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return up({start:1,end:2,condition:"<=",name:"m"},({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=vn(54856e-17,44201e-17,52481e-17),i=vn(1681e3,1795300,2208400),n=vn(43278e5,93046e5,66121e5),a=gn(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=vn(o.x.add(a),o.y,o.z).div(1.0685e-7),mm.mul(o)})(gn(e).mul(y),gn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(vn(0))}).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),bm=un(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=gn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=gn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),xm=vn(.04),Tm=gn(1);class _m extends mg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=vn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=vn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=vn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=vn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=vn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=jd.dot(Id).clamp(),t=ym({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:ea}),r=ym({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:On.rgb});this.iridescenceFresnel=nu(t,r,zn),this.iridescenceF0Dielectric=Gg({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=Gg({f:r,f90:1,dotVH:e}),this.iridescenceF0=nu(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,zn)}if(!0===this.transmission){const t=Pd,r=od.sub(Pd).normalize(),s=Xd,i=e.context;i.backdrop=gm(s,r,Gn,Vn,ta,ra,t,xd,id,rd,ua,da,ha,ca,this.dispersion?pa:null),i.backdropAlpha=la,On.a.mulAssign(nu(1,i.backdrop.a,la))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=jd.dot(Id).clamp(),a=Og({roughness:Gn,dotNV:n}),o=i?jn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=jd.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(Wg({lightDirection:e})));const t=bm({normal:jd,viewDir:Id,roughness:qn}),r=bm({normal:jd,viewDir:e,roughness:qn}),i=Hn.r.max(Hn.g).max(Hn.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=Kd.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Dg({lightDirection:e,f0:xm,f90:Tm,roughness:Wn,normalView:Kd})))}r.directDiffuse.addAssign(s.mul(Tg({diffuseColor:Vn}))),r.directSpecular.addAssign(s.mul(Vg({lightDirection:e,f0:ta,f90:1,roughness:Gn,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=jd,h=Id,p=Ud.toVar(),g=Hg({N:c,V:h,roughness:Gn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Bn(vn(m.x,0,m.y),vn(0,1,0),vn(m.z,0,m.w)).toVar(),b=ta.mul(f.x).add(ta.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(Xg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Vn).mul(Xg({N:c,V:h,P:p,mInv:Bn(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context,s=t.mul(Tg({diffuseColor:Vn})).toVar();if(!0===this.sheen){const e=bm({normal:jd,viewDir:Id,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(Hn,bm({normal:jd,viewDir:Id,roughness:qn}))),!0===this.clearcoat){const e=Kd.dot(Id).clamp(),t=kg({dotNV:e,specularColor:xm,specularF90:Tm,roughness:Wn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=vn().toVar("singleScatteringDielectric"),n=vn().toVar("multiScatteringDielectric"),a=vn().toVar("singleScatteringMetallic"),o=vn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ra,ea,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ra,On.rgb,this.iridescenceF0Metallic);const u=nu(i,a,zn),l=nu(n,o,zn),d=i.add(n),c=Vn.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=bm({normal:jd,viewDir:Id,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=jd.dot(Id).clamp().add(t),i=Gn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Kd.dot(Id).clamp(),r=xg({dotVH:e,f0:xm,f90:Tm}),s=t.mul($n.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul($n));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const vm=gn(1),Nm=gn(-2),Sm=gn(.8),Rm=gn(-1),Am=gn(.4),Em=gn(2),wm=gn(.305),Cm=gn(3),Mm=gn(.21),Bm=gn(4),Lm=gn(4),Fm=gn(16),Pm=un(([e])=>{const t=vn(Mo(e)).toVar(),r=gn(-1).toVar();return cn(t.x.greaterThan(t.z),()=>{cn(t.x.greaterThan(t.y),()=>{r.assign(bu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}).Else(()=>{cn(t.z.greaterThan(t.y),()=>{r.assign(bu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Dm=un(([e,t])=>{const r=bn().toVar();return cn(t.equal(0),()=>{r.assign(bn(e.z,e.y).div(Mo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(bn(e.x.negate(),e.z.negate()).div(Mo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(bn(e.x.negate(),e.y).div(Mo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(bn(e.z.negate(),e.y).div(Mo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(bn(e.x.negate(),e.z).div(Mo(e.y)))}).Else(()=>{r.assign(bn(e.x,e.y).div(Mo(e.z)))}),La(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Um=un(([e])=>{const t=gn(0).toVar();return cn(e.greaterThanEqual(Sm),()=>{t.assign(vm.sub(e).mul(Rm.sub(Nm)).div(vm.sub(Sm)).add(Nm))}).ElseIf(e.greaterThanEqual(Am),()=>{t.assign(Sm.sub(e).mul(Em.sub(Rm)).div(Sm.sub(Am)).add(Rm))}).ElseIf(e.greaterThanEqual(wm),()=>{t.assign(Am.sub(e).mul(Cm.sub(Em)).div(Am.sub(wm)).add(Em))}).ElseIf(e.greaterThanEqual(Mm),()=>{t.assign(wm.sub(e).mul(Bm.sub(Cm)).div(wm.sub(Mm)).add(Cm))}).Else(()=>{t.assign(gn(-2).mul(yo(La(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Im=un(([e,t])=>{const r=e.toVar();r.assign(La(2,r).sub(1));const s=vn(r,1).toVar();return cn(t.equal(0),()=>{s.assign(s.zyx)}).ElseIf(t.equal(1),()=>{s.assign(s.xzy),s.xz.mulAssign(-1)}).ElseIf(t.equal(2),()=>{s.x.mulAssign(-1)}).ElseIf(t.equal(3),()=>{s.assign(s.zyx),s.xz.mulAssign(-1)}).ElseIf(t.equal(4),()=>{s.assign(s.xzy),s.xy.mulAssign(-1)}).ElseIf(t.equal(5),()=>{s.z.mulAssign(-1)}),s}).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),Om=un(([e,t,r,s,i,n])=>{const a=gn(r),o=vn(t),u=au(Um(a),Nm,n),l=No(u),d=To(u),c=vn(Vm(e,o,d,s,i,n)).toVar();return cn(l.notEqual(0),()=>{const t=vn(Vm(e,o,d.add(1),s,i,n)).toVar();c.assign(nu(c,t,l))}),c}),Vm=un(([e,t,r,s,i,n])=>{const a=gn(r).toVar(),o=vn(t),u=gn(Pm(o)).toVar(),l=gn(Ho(Lm.sub(a),0)).toVar();a.assign(Ho(a,Lm));const d=gn(mo(a)).toVar(),c=bn(Dm(o,u).mul(d.sub(2)).add(1)).toVar();return cn(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(La(3,Fm))),c.y.addAssign(La(4,mo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(bn(),bn())}),km=un(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Ro(s),l=r.mul(u).add(i.cross(r).mul(So(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Vm(e,l,t,n,a,o)}),Gm=un(({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=vn(bu(t,r,Qo(r,s))).toVar();cn(h.equal(vn(0)),()=>{h.assign(vn(s.z,0,s.x.negate()))}),h.assign(vo(h));const p=vn().toVar();return p.addAssign(i.element(0).mul(km({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),up({start:mn(1),end:e},({i:e})=>{cn(e.greaterThanEqual(n),()=>{lp()});const t=gn(a.mul(gn(e))).toVar();p.addAssign(i.element(e).mul(km({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(km({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),An(p,1)}),zm=un(([e])=>{const t=fn(e).toVar();return t.assign(t.shiftLeft(fn(16)).bitOr(t.shiftRight(fn(16)))),t.assign(t.bitAnd(fn(1431655765)).shiftLeft(fn(1)).bitOr(t.bitAnd(fn(2863311530)).shiftRight(fn(1)))),t.assign(t.bitAnd(fn(858993459)).shiftLeft(fn(2)).bitOr(t.bitAnd(fn(3435973836)).shiftRight(fn(2)))),t.assign(t.bitAnd(fn(252645135)).shiftLeft(fn(4)).bitOr(t.bitAnd(fn(4042322160)).shiftRight(fn(4)))),t.assign(t.bitAnd(fn(16711935)).shiftLeft(fn(8)).bitOr(t.bitAnd(fn(4278255360)).shiftRight(fn(8)))),gn(t).mul(2.3283064365386963e-10)}),$m=un(([e,t])=>bn(gn(e).div(gn(t)),zm(e))),Wm=un(([e,t,r])=>{const s=r.mul(r).toConst(),i=vn(1,0,0).toConst(),n=Qo(t,i).toConst(),a=bo(e.x).toConst(),o=La(2,3.14159265359).mul(e.y).toConst(),u=a.mul(Ro(o)).toConst(),l=a.mul(So(o)).toVar(),d=La(.5,t.z.add(1)).toConst();l.assign(d.oneMinus().mul(bo(u.mul(u).oneMinus())).add(d.mul(l)));const c=i.mul(u).add(n.mul(l)).add(t.mul(bo(Ho(0,u.mul(u).add(l.mul(l)).oneMinus()))));return vo(vn(s.mul(c.x),s.mul(c.y),Ho(0,c.z)))}),Hm=un(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=vn(s).toVar(),l=vn(0).toVar(),d=gn(0).toVar();return cn(e.lessThan(.001),()=>{l.assign(Vm(r,u,t,n,a,o))}).Else(()=>{const s=bu(Mo(u.z).lessThan(.999),vn(0,0,1),vn(1,0,0)),c=vo(Qo(s,u)).toVar(),h=Qo(u,c).toVar();up({start:fn(0),end:i},({i:s})=>{const p=$m(s,i),g=Wm(p,vn(0,0,1),e),m=vo(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=vo(m.mul(Yo(u,m).mul(2)).sub(u)),y=Ho(Yo(u,f),0);cn(y.greaterThan(0),()=>{const e=Vm(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),cn(d.greaterThan(0),()=>{l.assign(l.div(d))})}),An(l,1)}),qm=[.125,.215,.35,.446,.526,.582],jm=20,Xm=new _e(-1,1,1,-1,0,1),Km=new ve(90,1),Ym=new e;let Qm=null,Zm=0,Jm=0;const ef=new r,tf=new WeakMap,rf=[3,1,5,0,4,2],sf=Im(Rl(),Sl("faceIndex")).normalize(),nf=vn(sf.x,sf.y,sf.z);class af{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=ef,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Qm=this._renderer.getRenderTarget(),Zm=this._renderer.getActiveCubeFace(),Jm=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" instead.'),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=df(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=cf(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===P||e.mapping===D?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=qm[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=rf[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Te;T.setAttribute("position",new Ee(y,g)),T.setAttribute("uv",new Ee(b,m)),T.setAttribute("faceIndex",new Ee(x,f)),s.push(new ne(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=Vl(new Array(jm).fill(0)),n=_a(new r(0,1,0)),a=_a(0),o=gn(jm),u=_a(0),l=_a(1),d=Fl(),c=_a(0),h=gn(1/t),p=gn(1/s),g=gn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:nf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=lf("blur");return f.fragmentNode=Gm({...m,latitudinal:u.equal(1)}),tf.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Fl(),i=_a(0),n=_a(0),a=gn(1/t),o=gn(1/r),u=gn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=lf("ggx");return d.fragmentNode=Hm({...l,N_immutable:nf,GGX_SAMPLES:fn(512)}),tf.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ne(new Te,e);await this._renderer.compile(t,Xm)}_sceneToCubeUV(e,t,r,s,i){const n=Km;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Ym),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ne(new ie,new ge({name:"PMREM.Background",side:M,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(Ym),h=!0),u.setRenderTarget(s),u.clear(),h&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;uf(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===P||e.mapping===D;s?null===this._cubemapMaterial&&(this._cubemapMaterial=df(e)):null===this._equirectMaterial&&(this._equirectMaterial=cf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;uf(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Xm)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,uf(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,Xm),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,uf(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,Xm)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=tf.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):jm;f>jm&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),4*(this._cubeSize-T),3*T,2*T),u.setRenderTarget(t),u.render(c,Xm)}}function of(e,t){const r=new Ne(e,t,{magFilter:oe,minFilter:oe,generateMipmaps:!1,type:be,format:Re,colorSpace:Se});return r.texture.mapping=Ae,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function uf(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function lf(e){const t=new Qp;return t.depthTest=!1,t.depthWrite=!1,t.blending=ee,t.name=`PMREM_${e}`,t}function df(e){const t=lf("cubemap");return t.fragmentNode=pc(e,nf),t}function cf(e){const t=lf("equirect");return t.fragmentNode=Fl(e,ag(nf),0),t}const hf=new WeakMap;function pf(e,t,r){const s=function(e){let t=hf.get(e);void 0===t&&(t=new WeakMap,hf.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class gf extends ci{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new N;s.isRenderTargetTexture=!0,this._texture=Fl(s),this._width=_a(0),this._height=_a(0),this._maxMip=_a(0),this.updateBeforeType=Js.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:pf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new af(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=nc.mul(vn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Om(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const mf=rn(gf).setParameterLength(1,3),ff=new WeakMap;class yf extends mp{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=ff.get(e);void 0===s&&(s=mf(e),ff.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Hc:jd,i=r.context(bf(Gn,s)).mul(ic),n=r.context(xf(Xd)).mul(Math.PI).mul(ic),a=al(i),o=al(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(bf(Wn,Kd)).mul(ic),t=al(e);u.addAssign(t)}}}const bf=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Id.negate().reflect(t),r=tu(e).mix(r,t).normalize(),r=r.transformDirection(id)),r),getTextureLevel:()=>e}},xf=e=>({getUV:()=>e,getTextureLevel:()=>gn(1)}),Tf=new we;class _f extends Qp{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(Tf),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new yf(t):null}setupLightingModel(){return new _m}setupSpecular(){const e=nu(vn(.04),On.rgb,zn);ea.assign(vn(.04)),ta.assign(e),ra.assign(1)}setupVariants(){const e=this.metalnessNode?gn(this.metalnessNode):ph;zn.assign(e);let t=this.roughnessNode?gn(this.roughnessNode):hh;t=Cg({roughness:t}),Gn.assign(t),this.setupSpecular(),Vn.assign(On.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const vf=new Ce;class Nf extends _f{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(vf),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?gn(this.iorNode):Eh;ua.assign(e),ea.assign(Wo(Jo(ua.sub(1).div(ua.add(1))).mul(lh),vn(1)).mul(uh)),ta.assign(nu(ea,On.rgb,zn)),ra.assign(nu(uh,1,zn))}setupLightingModel(){return new _m(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?gn(this.clearcoatNode):mh,t=this.clearcoatRoughnessNode?gn(this.clearcoatRoughnessNode):fh;$n.assign(e),Wn.assign(Cg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?vn(this.sheenNode):xh,t=this.sheenRoughnessNode?gn(this.sheenRoughnessNode):Th;Hn.assign(e),qn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?gn(this.iridescenceNode):vh,t=this.iridescenceIORNode?gn(this.iridescenceIORNode):Nh,r=this.iridescenceThicknessNode?gn(this.iridescenceThicknessNode):Sh;jn.assign(e),Xn.assign(t),Kn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?bn(this.anisotropyNode):_h).toVar();Qn.assign(e.length()),cn(Qn.equal(0),()=>{e.assign(bn(1,0))}).Else(()=>{e.divAssign(bn(Qn)),Qn.assign(Qn.saturate())}),Yn.assign(Qn.pow2().mix(Gn.pow2(),1)),Zn.assign($c[0].mul(e.x).add($c[1].mul(e.y))),Jn.assign($c[1].mul(e.x).sub($c[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?gn(this.transmissionNode):Rh,t=this.thicknessNode?gn(this.thicknessNode):Ah,r=this.attenuationDistanceNode?gn(this.attenuationDistanceNode):wh,s=this.attenuationColorNode?vn(this.attenuationColorNode):Ch;if(la.assign(e),da.assign(t),ca.assign(r),ha.assign(s),this.useDispersion){const e=this.dispersionNode?gn(this.dispersionNode):Uh;pa.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?vn(this.clearcoatNormalNode):yh}setup(e){e.context.setupClearcoatNormal=()=>Lu(this.setupClearcoatNormal(e),"NORMAL","vec3"),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class Sf extends _m{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(jd.mul(a)).normalize(),h=gn(Id.dot(c.negate()).saturate().pow(l).mul(d)),p=vn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Rf extends Nf{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=gn(.1),this.thicknessAmbientNode=gn(0),this.thicknessAttenuationNode=gn(.1),this.thicknessPowerNode=gn(2),this.thicknessScaleNode=gn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new Sf(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const Af=un(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=bn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=xc("gradientMap","texture").context({getUV:()=>i});return vn(e.r)}{const e=i.fwidth().mul(.5);return nu(vn(.7),vn(1),lu(gn(.7).sub(e.x),gn(.7).add(e.x),i.x))}});class Ef extends mg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Af({normal:zd,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(Tg({diffuseColor:On.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Tg({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const wf=new Me;class Cf extends Qp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(wf),this.setValues(e)}setupLightingModel(){return new Ef}}const Mf=un(()=>{const e=vn(Id.z,0,Id.x.negate()).normalize(),t=Id.cross(e);return bn(e.dot(jd),t.dot(jd)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Bf=new Be;class Lf extends Qp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Bf),this.setValues(e)}setupVariants(e){const t=Mf;let r;r=e.material.matcap?xc("matcap","texture").context({getUV:()=>t}):vn(nu(.2,.8,t.y)),On.rgb.mulAssign(r.rgb)}}class Ff extends ci{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return Mn(e,s,s.negate(),e).mul(r)}{const e=t,s=Ln(An(1,0,0,0),An(0,Ro(e.x),So(e.x).negate(),0),An(0,So(e.x),Ro(e.x),0),An(0,0,0,1)),i=Ln(An(Ro(e.y),0,So(e.y),0),An(0,1,0,0),An(So(e.y).negate(),0,Ro(e.y),0),An(0,0,0,1)),n=Ln(An(Ro(e.z),So(e.z).negate(),0,0),An(So(e.z),Ro(e.z),0,0),An(0,0,1,0),An(0,0,0,1));return s.mul(i).mul(n).mul(An(r,1)).xyz}}}const Pf=rn(Ff).setParameterLength(2),Df=new Le;class Uf extends Qp{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(Df),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=Ad.mul(vn(s||0));let u=bn(xd[0].xyz.length(),xd[1].xyz.length());null!==n&&(u=u.mul(bn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=Bd.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new $u(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=gn(i||bh),c=Pf(l,d);return An(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const If=new Fe,Of=new t;class Vf extends Uf{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(If),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Ad.mul(vn(e||Ld)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?bn(n):Dh;u=u.mul(Wl),r.isPerspectiveCamera&&!0===a&&(u=u.mul(kf.div(Ud.z.negate()))),i&&i.isNode&&(u=u.mul(bn(i)));let l=Bd.xy;if(s&&s.isNode){const e=gn(s);l=Pf(l,e)}return l=l.mul(u),l=l.div(Kl.div(2)),l=l.mul(o.w),o=o.add(An(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const kf=_a(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(Of);this.value=.5*t.y});class Gf extends mg{constructor(){super(),this.shadowNode=gn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){On.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(On.rgb)}}const zf=new Pe;class $f extends Qp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(zf),this.setValues(e)}setupLightingModel(){return new Gf}}const Wf=Un("vec3"),Hf=Un("vec3"),qf=Un("vec3");class jf extends mg{constructor(){super()}start(e){const{material:t}=e,r=Un("vec3"),s=Un("vec3");cn(od.sub(Pd).length().greaterThan(Nd.mul(2)),()=>{r.assign(od),s.assign(Pd)}).Else(()=>{r.assign(Pd),s.assign(od)});const i=s.sub(r),n=_a("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=gn(0).toVar(),l=vn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),up(n,()=>{const s=r.add(o.mul(u)),i=id.mul(An(s,1)).xyz;let n;null!==t.depthNode&&(Hf.assign(Up(Bp(i.z,ed,td))),e.context.sceneDepthNode=Up(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,Wf.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&Wf.mulAssign(n);const d=Wf.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),qf.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?cn(r.greaterThanEqual(Hf),()=>{Wf.addAssign(e)}):Wf.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(Kg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(qf)}}class Xf extends Qp{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=M,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new jf}}class Kf{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,this._context="undefined"!=typeof self?self:null,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class Yf{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getIndirectOffset(){return this._geometries.getIndirectOffset(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.id),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Us(s)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=Os(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Os(e,1)),e=Os(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const Jf=[];class ey{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);Jf[0]=e,Jf[1]=t,Jf[2]=n,Jf[3]=i;let l=u.get(Jf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Jf,l)):(l.camera=s,l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),Jf[0]=null,Jf[1]=null,Jf[2]=null,Jf[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Yf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Zf(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class ty{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const ry=1,sy=2,iy=3,ny=4,ay=16;class oy extends ty{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===ry?this.backend.createAttribute(e):t===sy?this.backend.createIndexAttribute(e):t===iy?this.backend.createStorageAttribute(e):t===ny&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,iy):this.updateAttribute(e,ry);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,sy);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,ny)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndirectOffset(e){return e.geometry.indirectOffset}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=ly(t),e.set(t,r)):r.version!==uy(t)&&(this.attributes.delete(r),r=ly(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class cy{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):o("WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class hy{constructor(e){this.cacheKey=e,this.usedTimes=0}}class py extends hy{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class gy extends hy{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let my=0;class fy{constructor(e,t,r,s=null,i=null){this.id=my++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class yy extends ty{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new fy(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new fy(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new fy(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new gy(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new py(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class by extends ty{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ny:iy;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ny:iy;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0,i=!1));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture&&!0===o.mipmapsAutoUpdate){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0,i=!1)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function xy(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function Ty(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function _y(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===B&&!1===e.forceSinglePass}class vy{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(_y(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(_y(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||xy),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Ty),this.transparent.length>1&&this.transparent.sort(t||Ty)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new Y,l.format=e.stencilBuffer?Oe:Ve,l.type=e.stencilBuffer?ke:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,l.isArrayTexture=!0===e.multiview&&a.depth>1,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:Ge}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,this.info.memory.textures++,e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=Cy){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1)):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput(e)?this.outputNode.build(e,...t):super.build(e,...t),ln(r),e.removeActiveStack(this),o}}const Py=rn(Fy).setParameterLength(0,1);class Dy extends ui{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1})),this.name=t,this.isStructLayoutNode=!0}getLength(){const e=Float32Array.BYTES_PER_ELEMENT;let t=1,r=0;for(const s of this.membersLayout){const i=s.type,n=Ws(i),a=Hs(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}getMemberType(e,t){const r=this.membersLayout.find(e=>e.name===t);return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Uy extends ui{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.getMemberType(e,t)}_getChildren(){const e=super._getChildren(),t=e.find(e=>e.childNode===this.structTypeNode);return e.splice(e.indexOf(t),1),e.push(t),e}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structTypeNode.membersLayout,this.values)}`,this),t.name}}class Iy extends ui{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(){return"OutputType"}generate(e){const t=e.getDataFromNode(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;tnew Hy(e,"uint","float"),Xy={};class Ky extends ro{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(qy(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return fn;case"int":return mn;case"uvec2":return Tn;case"uvec3":return Sn;case"uvec4":return wn;case"ivec2":return xn;case"ivec3":return Nn;case"ivec4":return En}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t);const i=gn(s.bitAnd(Fo(s))),n=jy(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{cn(e.equal(fn(0)),()=>fn(32));const s=fn(0),i=fn(0);return this._resolveElementType(e,s,t),cn(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),cn(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),cn(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),cn(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),cn(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(fn(1)).bitAnd(fn(1431655765)))),s.assign(s.bitAnd(fn(858993459)).add(s.shiftRight(fn(2)).bitAnd(fn(858993459))));const i=s.add(s.shiftRight(fn(4))).bitAnd(fn(252645135)).mul(fn(16843009)).shiftRight(fn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return un(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}Ky.COUNT_TRAILING_ZEROS="countTrailingZeros",Ky.COUNT_LEADING_ZEROS="countLeadingZeros",Ky.COUNT_ONE_BITS="countOneBits";const Yy=nn(Ky,Ky.COUNT_TRAILING_ZEROS).setParameterLength(1),Qy=nn(Ky,Ky.COUNT_LEADING_ZEROS).setParameterLength(1),Zy=nn(Ky,Ky.COUNT_ONE_BITS).setParameterLength(1),Jy=un(([e])=>{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)}),eb=(e,t)=>Zo(La(4,e.mul(Ba(1,e))),t);class tb extends ci{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}getNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const rb=nn(tb,"snorm").setParameterLength(1),sb=nn(tb,"unorm").setParameterLength(1),ib=nn(tb,"float16").setParameterLength(1);class nb extends ci{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}getNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const ab=nn(nb,"snorm").setParameterLength(1),ob=nn(nb,"unorm").setParameterLength(1),ub=nn(nb,"float16").setParameterLength(1),lb=un(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),db=un(([e])=>vn(lb(e.z.add(lb(e.y.mul(1)))),lb(e.z.add(lb(e.x.mul(1)))),lb(e.y.add(lb(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),cb=un(([e,t,r])=>{const s=vn(e).toVar(),i=gn(1.4).toVar(),n=gn(0).toVar(),a=vn(s).toVar();return up({start:gn(0),end:gn(3),type:"float",condition:"<="},()=>{const e=vn(db(a.mul(2))).toVar();s.addAssign(e.add(r.mul(gn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=gn(lb(s.z.add(lb(s.x.add(lb(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)}),n}).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class hb extends ui{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}getNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const pb=rn(hb),gb=e=>(...t)=>pb(e,...t),mb=_a(0).setGroup(ba).onRenderUpdate(e=>e.time),fb=_a(0).setGroup(ba).onRenderUpdate(e=>e.deltaTime),yb=_a(0,"uint").setGroup(ba).onRenderUpdate(e=>e.frameId);const bb=un(([e,t,r=bn(.5)])=>Pf(e.sub(r),t).add(r)),xb=un(([e,t,r=bn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),Tb=un(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=xd.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=xd;const i=id.mul(s);return Ki(t)&&(i[0][0]=xd[0].length(),i[0][1]=0,i[0][2]=0),Ki(r)&&(i[1][0]=0,i[1][1]=xd[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,rd.mul(i).mul(Ld)}),_b=un(([e=null])=>{const t=Up();return Up(wp(e)).sub(t).lessThan(0).select(Hl,e)}),vb=un(([e,t=Rl(),r=gn(0)])=>{const s=e.x,i=e.y,n=r.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=e.reciprocal(),l=bn(a,o);return t.add(l).mul(u)}),Nb=un(([e,t=null,r=null,s=gn(1),i=Ld,n=$d])=>{let a=n.abs().normalize();a=a.div(a.dot(vn(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=Fl(d,o).mul(a.x),g=Fl(c,u).mul(a.y),m=Fl(h,l).mul(a.z);return Ma(p,g,m)}),Sb=new je,Rb=new r,Ab=new r,Eb=new r,wb=new a,Cb=new r(0,0,-1),Mb=new s,Bb=new r,Lb=new r,Fb=new s,Pb=new t,Db=new Ne,Ub=Hl.flipX();Db.depthTexture=new Y(1,1);let Ib=!1;class Ob extends Bl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Db.texture,Ub),this._reflectorBaseNode=e.reflector||new Vb(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Zi(new Ob({defaultTexture:Db.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class Vb extends ui{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Xe,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Js.RENDER:Js.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Pb),e.setSize(Math.round(Pb.width*r),Math.round(Pb.height*r))}setup(e){return this._updateResolution(Db,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new Ne(0,0,{type:be,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=Ke,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new Y),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&Ib)return!1;Ib=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Pb),this._updateResolution(o,s),Ab.setFromMatrixPosition(n.matrixWorld),Eb.setFromMatrixPosition(r.matrixWorld),wb.extractRotation(n.matrixWorld),Rb.set(0,0,1),Rb.applyMatrix4(wb),Bb.subVectors(Ab,Eb);let u=!1;if(!0===Bb.dot(Rb)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Ib=!1);u=!0}Bb.reflect(Rb).negate(),Bb.add(Ab),wb.extractRotation(r.matrixWorld),Cb.set(0,0,-1),Cb.applyMatrix4(wb),Cb.add(Eb),Lb.subVectors(Ab,Cb),Lb.reflect(Rb).negate(),Lb.add(Ab),a.coordinateSystem=r.coordinateSystem,a.position.copy(Bb),a.up.set(0,1,0),a.up.applyMatrix4(wb),a.up.reflect(Rb),a.lookAt(Lb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Sb.setFromNormalAndCoplanarPoint(Rb,Ab),Sb.applyMatrix4(a.matrixWorldInverse),Mb.set(Sb.normal.x,Sb.normal.y,Sb.normal.z,Sb.constant);const l=a.projectionMatrix;Fb.x=(Math.sign(Mb.x)+l.elements[8])/l.elements[0],Fb.y=(Math.sign(Mb.y)+l.elements[9])/l.elements[5],Fb.z=-1,Fb.w=(1+l.elements[10])/l.elements[14],Mb.multiplyScalar(1/Mb.dot(Fb));l.elements[2]=Mb.x,l.elements[6]=Mb.y,l.elements[10]=s.coordinateSystem===h?Mb.z-0:Mb.z+1-0,l.elements[14]=Mb.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,Ib=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const kb=new _e(-1,1,1,-1,0,1);class Gb extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Ye([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Ye(t,2))}}const zb=new Gb;class $b extends ne{constructor(e=null){super(zb,e),this.camera=kb,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,kb)}render(e){e.render(this,kb)}}const Wb=new t;class Hb extends Bl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new Ne(t,r,s);super(i.texture,Rl()),this.isRTTNode=!0,this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new $b(new Qp),this.updateBeforeType=Js.RENDER}get autoResize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoResize){const t=e.getPixelRatio(),r=e.getSize(Wb),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Bl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const qb=(e,...t)=>Zi(new Hb(Zi(e),...t)),jb=un(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=bn(e.x,e.y.oneMinus()).mul(2).sub(1),i=An(vn(e,t),1)):i=An(vn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=An(r.mul(i));return n.xyz.div(n.w)}),Xb=un(([e,t])=>{const r=t.mul(An(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return bn(s.x,s.y.oneMinus())}),Kb=un(([e,t,r])=>{const s=El(Pl(t)),i=xn(e.mul(s)).toVar(),n=Pl(t,i).toVar(),a=Pl(t,i.sub(xn(2,0))).toVar(),o=Pl(t,i.sub(xn(1,0))).toVar(),u=Pl(t,i.add(xn(1,0))).toVar(),l=Pl(t,i.add(xn(2,0))).toVar(),d=Pl(t,i.add(xn(0,2))).toVar(),c=Pl(t,i.add(xn(0,1))).toVar(),h=Pl(t,i.sub(xn(0,1))).toVar(),p=Pl(t,i.sub(xn(0,2))).toVar(),g=Mo(Ba(gn(2).mul(o).sub(a),n)).toVar(),m=Mo(Ba(gn(2).mul(u).sub(l),n)).toVar(),f=Mo(Ba(gn(2).mul(c).sub(d),n)).toVar(),y=Mo(Ba(gn(2).mul(h).sub(p),n)).toVar(),b=jb(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(jb(e.sub(bn(gn(1).div(s.x),0)),o,r)),b.negate().add(jb(e.add(bn(gn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(jb(e.add(bn(0,gn(1).div(s.y))),c,r)),b.negate().add(jb(e.sub(bn(0,gn(1).div(s.y))),h,r)));return vo(Qo(x,T))}),Yb=un(([e])=>No(gn(52.9829189).mul(No(Yo(e,bn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),Qb=un(([e,t,r])=>{const s=gn(2.399963229728653),i=bo(gn(e).add(.5).div(gn(t))),n=gn(e).mul(s).add(r);return bn(Ro(n),So(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class Zb extends ui{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Rl())}sample(e){return this.callback(e)}}class Jb extends ui{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===Jb.OBJECT?this.updateType=Js.OBJECT:e===Jb.MATERIAL?this.updateType=Js.RENDER:e===Jb.BEFORE_OBJECT?this.updateBeforeType=Js.OBJECT:e===Jb.BEFORE_MATERIAL&&(this.updateBeforeType=Js.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}Jb.OBJECT="object",Jb.MATERIAL="material",Jb.BEFORE_OBJECT="beforeObject",Jb.BEFORE_MATERIAL="beforeMaterial";const ex=(e,t)=>new Jb(e,t).toStack();class tx extends W{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class rx extends Ee{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class sx extends ui{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const ix=sn(sx),nx=new L,ax=new a;class ox extends ui{static get type(){return"SceneNode"}constructor(e=ox.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===ox.BACKGROUND_BLURRINESS?s=fc("backgroundBlurriness","float",r):t===ox.BACKGROUND_INTENSITY?s=fc("backgroundIntensity","float",r):t===ox.BACKGROUND_ROTATION?s=_a("mat4").setName("backgroundRotation").setGroup(ba).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Qe?(nx.copy(r.backgroundRotation),nx.x*=-1,nx.y*=-1,nx.z*=-1,ax.makeRotationFromEuler(nx)):ax.identity(),ax}):o("SceneNode: Unknown scope:",t),s}}ox.BACKGROUND_BLURRINESS="backgroundBlurriness",ox.BACKGROUND_INTENSITY="backgroundIntensity",ox.BACKGROUND_ROTATION="backgroundRotation";const ux=sn(ox,ox.BACKGROUND_BLURRINESS),lx=sn(ox,ox.BACKGROUND_INTENSITY),dx=sn(ox,ox.BACKGROUND_ROTATION);class cx extends Bl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=ti.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(ti.READ_WRITE)}toReadOnly(){return this.setAccess(ti.READ_ONLY)}toWriteOnly(){return this.setAccess(ti.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e.mipLevel=this.mipLevel,e}}const hx=rn(cx).setParameterLength(1,3),px=un(({texture:e,uv:t})=>{const r=1e-4,s=vn().toVar();return cn(t.x.lessThan(r),()=>{s.assign(vn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(vn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(vn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(vn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(vn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(vn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(vn(-.01,0,0))).r.sub(e.sample(t.add(vn(r,0,0))).r),n=e.sample(t.add(vn(0,-.01,0))).r.sub(e.sample(t.add(vn(0,r,0))).r),a=e.sample(t.add(vn(0,0,-.01))).r.sub(e.sample(t.add(vn(0,0,r))).r);s.assign(vn(i,n,a))}),s.normalize()});class gx extends Bl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return vn(.5,.5,.5)}setUpdateMatrix(){}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return px({texture:this,uv:e})}}const mx=rn(gx).setParameterLength(1,3);class fx extends mc{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const yx=new WeakMap;class bx extends ci{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Js.OBJECT,this.updateAfterType=Js.OBJECT,this.previousModelWorldMatrix=_a(new a),this.previousProjectionMatrix=_a(new a).setGroup(ba),this.previousCameraViewMatrix=_a(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Tx(r);this.previousModelWorldMatrix.value.copy(s);const i=xx(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){Tx(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?rd:_a(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Ad).mul(Ld),s=this.previousProjectionMatrix.mul(t).mul(Fd),i=r.xy.div(r.w),n=s.xy.div(s.w);return Ba(i,n)}}function xx(e){let t=yx.get(e);return void 0===t&&(t={},yx.set(e,t)),t}function Tx(e,t=0){const r=xx(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const _x=sn(bx),vx=un(([e])=>Ax(e.rgb)),Nx=un(([e,t=gn(1)])=>t.mix(Ax(e.rgb),e.rgb)),Sx=un(([e,t=gn(1)])=>{const r=Ma(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return nu(e.rgb,s,i)}),Rx=un(([e,t=gn(1)])=>{const r=vn(.57735,.57735,.57735),s=t.cos();return vn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Yo(r,e.rgb).mul(s.oneMinus())))))}),Ax=(e,t=vn(p.getLuminanceCoefficients(new r)))=>Yo(e,t),Ex=un(([e,t=vn(1),s=vn(0),i=vn(1),n=gn(1),a=vn(p.getLuminanceCoefficients(new r,Se))])=>{const o=e.rgb.dot(vn(a)),u=Ho(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return cn(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),cn(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),cn(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),An(u.rgb,e.a)});class wx extends ci{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Cx=rn(wx).setParameterLength(2);let Mx=null;class Bx extends _p{static get type(){return"ViewportSharedTextureNode"}constructor(e=Hl,t=null){null===Mx&&(Mx=new X),super(e,t,Mx)}getTextureForReference(){return Mx}updateReference(){return this}}const Lx=rn(Bx).setParameterLength(0,2),Fx=new t;class Px extends Bl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Dx extends Px{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}class Ux extends ci{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new Y;i.isRenderTargetTexture=!0,i.name="depth";const n=new Ne(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:be,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=_a(0),this._cameraFar=_a(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Js.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=new Dx(this,e),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=new Dx(this,e,!0),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Lp(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Mp(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getOutputBufferType(),this.scope===Ux.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Fx.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Fx)),this._pixelRatio=i,this.setSize(Fx.width,Fx.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:Tu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Ux.COLOR="color",Ux.DEPTH="depth";class Ix extends Ux{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Ux.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)}),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Qp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=M;const t=$d.negate(),r=rd.mul(Ad),s=gn(1),i=r.mul(An(Ld,1)),n=r.mul(An(Ld.add(t),1)),a=vo(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=An(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Ox=un(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Vx=un(([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp()).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),kx=un(([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)}).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Gx=un(([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)}),zx=un(([e,t])=>{const r=Bn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Bn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Gx(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),$x=Bn(vn(1.6605,-.1246,-.0182),vn(-.5876,1.1329,-.1006),vn(-.0728,-.0083,1.1187)),Wx=Bn(vn(.6274,.0691,.0164),vn(.3293,.9195,.088),vn(.0433,.0113,.8956)),Hx=un(([e])=>{const t=vn(e).toVar(),r=vn(t.mul(t)).toVar(),s=vn(r.mul(r)).toVar();return gn(15.5).mul(s.mul(r)).sub(La(40.14,s.mul(t))).add(La(31.96,s).sub(La(6.868,r.mul(t))).add(La(.4298,r).add(La(.1191,t).sub(.00232))))}),qx=un(([e,t])=>{const r=vn(e).toVar(),s=Bn(vn(.856627153315983,.137318972929847,.11189821299995),vn(.0951212405381588,.761241990602591,.0767994186031903),vn(.0482516061458583,.101439036467562,.811302368396859)),i=Bn(vn(1.1271005818144368,-.1413297634984383,-.14132976349843826),vn(-.11060664309660323,1.157823702216272,-.11060664309660294),vn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=gn(-12.47393),a=gn(4.026069);return r.mulAssign(t),r.assign(Wx.mul(r)),r.assign(s.mul(r)),r.assign(Ho(r,1e-10)),r.assign(yo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(au(r,0,1)),r.assign(Hx(r)),r.assign(i.mul(r)),r.assign(Zo(Ho(vn(0),r),vn(2.2))),r.assign($x.mul(r)),r.assign(au(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),jx=un(([e,t])=>{const r=gn(.76),s=gn(.15);e=e.mul(t);const i=Wo(e.r,Wo(e.g,e.b)),n=bu(i.lessThan(.08),i.sub(La(6.25,i.mul(i))),.04);e.subAssign(n);const a=Ho(e.r,Ho(e.g,e.b));cn(a.lessThan(r),()=>e);const o=Ba(1,r),u=Ba(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=Ba(1,Fa(1,s.mul(a.sub(u)).add(1)));return nu(e,vn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class Xx extends ui{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const Kx=rn(Xx).setParameterLength(1,3);class Yx extends Xx{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const Qx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Zx extends ui{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new u,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:gn()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Ks(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Ys(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const Jx=rn(Zx).setParameterLength(1);class eT extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class tT{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const rT=new eT;class sT extends ui{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new eT,this._output=Jx(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=Jx(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=Jx(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new tT(this),t=rT.get("THREE"),r=rT.get("TSL"),s=this.getMethod(),i=[e,this._local,rT,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:gn()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[Us(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Is(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const iT=rn(sT).setParameterLength(1,2);function nT(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Ud.z).negate()}const aT=un(([e,t],r)=>{const s=nT(r);return lu(e,t,s)}),oT=un(([e],t)=>{const r=nT(t);return e.mul(e,r,r).negate().exp().oneMinus()}),uT=un(([e,t],r)=>{const s=nT(r),i=t.sub(Pd.y).max(0).toConst().mul(s).toConst();return e.mul(e,i,i).negate().exp().oneMinus()}),lT=un(([e,t])=>An(t.toFloat().mix(ia.rgb,e.toVec3()),ia.a));let dT=null,cT=null;class hT extends ui{static get type(){return"RangeNode"}constructor(e=gn(),t=gn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(qs(t.value)),i=e.getTypeLength(qs(r.value));return s>i?s:i}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Error('THREE.TSL: No "ConstNode" found in node graph.');return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(qs(a)),d=e.getTypeLength(qs(o));dT=dT||new s,cT=cT||new s,dT.setScalar(0),cT.setScalar(0),1===u?dT.setScalar(a):a.isColor?dT.set(a.r,a.g,a.b,1):dT.set(a.x,a.y,a.z||0,a.w||0),1===d?cT.setScalar(o):o.isColor?cT.set(o.r,o.g,o.b,1):cT.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew gT(e,t),fT=mT("numWorkgroups","uvec3"),yT=mT("workgroupId","uvec3"),bT=mT("globalId","uvec3"),xT=mT("localId","uvec3"),TT=mT("subgroupSize","uint");const _T=rn(class extends ui{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class vT extends li{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class NT extends ui{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new vT(this,e)}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class ST extends ui{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=gl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}ST.ATOMIC_LOAD="atomicLoad",ST.ATOMIC_STORE="atomicStore",ST.ATOMIC_ADD="atomicAdd",ST.ATOMIC_SUB="atomicSub",ST.ATOMIC_MAX="atomicMax",ST.ATOMIC_MIN="atomicMin",ST.ATOMIC_AND="atomicAnd",ST.ATOMIC_OR="atomicOr",ST.ATOMIC_XOR="atomicXor";const RT=rn(ST),AT=(e,t,r)=>RT(e,t,r).toStack();class ET extends ci{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}getNodeType(e){const t=this.method;return t===ET.SUBGROUP_ELECT?"bool":t===ET.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===ET.SUBGROUP_BROADCAST||r===ET.SUBGROUP_SHUFFLE||r===ET.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===ET.SUBGROUP_SHUFFLE_XOR||r===ET.SUBGROUP_SHUFFLE_DOWN||r===ET.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}ET.SUBGROUP_ELECT="subgroupElect",ET.SUBGROUP_BALLOT="subgroupBallot",ET.SUBGROUP_ADD="subgroupAdd",ET.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",ET.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",ET.SUBGROUP_MUL="subgroupMul",ET.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",ET.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",ET.SUBGROUP_AND="subgroupAnd",ET.SUBGROUP_OR="subgroupOr",ET.SUBGROUP_XOR="subgroupXor",ET.SUBGROUP_MIN="subgroupMin",ET.SUBGROUP_MAX="subgroupMax",ET.SUBGROUP_ALL="subgroupAll",ET.SUBGROUP_ANY="subgroupAny",ET.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",ET.QUAD_SWAP_X="quadSwapX",ET.QUAD_SWAP_Y="quadSwapY",ET.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",ET.SUBGROUP_BROADCAST="subgroupBroadcast",ET.SUBGROUP_SHUFFLE="subgroupShuffle",ET.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",ET.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",ET.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",ET.QUAD_BROADCAST="quadBroadcast";const wT=nn(ET,ET.SUBGROUP_ELECT).setParameterLength(0),CT=nn(ET,ET.SUBGROUP_BALLOT).setParameterLength(1),MT=nn(ET,ET.SUBGROUP_ADD).setParameterLength(1),BT=nn(ET,ET.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),LT=nn(ET,ET.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),FT=nn(ET,ET.SUBGROUP_MUL).setParameterLength(1),PT=nn(ET,ET.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),DT=nn(ET,ET.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),UT=nn(ET,ET.SUBGROUP_AND).setParameterLength(1),IT=nn(ET,ET.SUBGROUP_OR).setParameterLength(1),OT=nn(ET,ET.SUBGROUP_XOR).setParameterLength(1),VT=nn(ET,ET.SUBGROUP_MIN).setParameterLength(1),kT=nn(ET,ET.SUBGROUP_MAX).setParameterLength(1),GT=nn(ET,ET.SUBGROUP_ALL).setParameterLength(0),zT=nn(ET,ET.SUBGROUP_ANY).setParameterLength(0),$T=nn(ET,ET.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),WT=nn(ET,ET.QUAD_SWAP_X).setParameterLength(1),HT=nn(ET,ET.QUAD_SWAP_Y).setParameterLength(1),qT=nn(ET,ET.QUAD_SWAP_DIAGONAL).setParameterLength(1),jT=nn(ET,ET.SUBGROUP_BROADCAST).setParameterLength(2),XT=nn(ET,ET.SUBGROUP_SHUFFLE).setParameterLength(2),KT=nn(ET,ET.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),YT=nn(ET,ET.SUBGROUP_SHUFFLE_UP).setParameterLength(2),QT=nn(ET,ET.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),ZT=nn(ET,ET.QUAD_BROADCAST).setParameterLength(1);let JT;function e_(e){JT=JT||new WeakMap;let t=JT.get(e);return void 0===t&&JT.set(e,t={}),t}function t_(e){const t=e_(e);return t.shadowMatrix||(t.shadowMatrix=_a("mat4").setGroup(ba).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function r_(e,t=Pd){const r=t_(e).mul(t);return r.xyz.div(r.w)}function s_(e){const t=e_(e);return t.position||(t.position=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function i_(e){const t=e_(e);return t.targetPosition||(t.targetPosition=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function n_(e){const t=e_(e);return t.viewPosition||(t.viewPosition=_a(new r).setGroup(ba).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const a_=e=>id.transformDirection(s_(e).sub(i_(e))),o_=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},u_=new WeakMap,l_=[];class d_ extends ui{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Un("vec3","totalDiffuse"),this.totalSpecularNode=Un("vec3","totalSpecular"),this.outgoingLightNode=Un("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Zi(e));else{let s=null;if(null!==r&&(s=o_(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;u_.has(e)?s=u_.get(e):(s=new r(e),u_.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getNodeProperties(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=vn(null!==l?l.mix(g,u):u)),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class c_ extends ui{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Js.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){h_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Pd)}}const h_=Un("vec3","shadowPositionWorld");function p_(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function g_(e,t){return t=p_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function m_(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function f_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function y_(e,t){return t=f_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function b_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function x_(e,t,r){return r=y_(t,r=g_(e,r))}function T_(e,t,r){m_(e,r),b_(t,r)}var __=Object.freeze({__proto__:null,resetRendererAndSceneState:x_,resetRendererState:g_,resetSceneState:y_,restoreRendererAndSceneState:T_,restoreRendererState:m_,restoreSceneState:b_,saveRendererAndSceneState:function(e,t,r={}){return r=f_(t,r=p_(e,r))},saveRendererState:p_,saveSceneState:f_});const v_=new WeakMap,N_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),S_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=fc("mapSize","vec2",r).setGroup(ba),a=fc("radius","float",r).setGroup(ba),o=bn(1).div(n),u=a.mul(o.x),l=Yb(jl.xy).mul(6.28318530718);return Ma(i(t.xy.add(Qb(0,5,l).mul(u)),t.z),i(t.xy.add(Qb(1,5,l).mul(u)),t.z),i(t.xy.add(Qb(2,5,l).mul(u)),t.z),i(t.xy.add(Qb(3,5,l).mul(u)),t.z),i(t.xy.add(Qb(4,5,l).mul(u)),t.z)).mul(.2)}),R_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=fc("mapSize","vec2",r).setGroup(ba),a=bn(1).div(n),o=a.x,u=a.y,l=t.xy,d=No(l.mul(n).add(.5));return l.subAssign(d.mul(a)),Ma(i(l,t.z),i(l.add(bn(o,0)),t.z),i(l.add(bn(0,u)),t.z),i(l.add(a),t.z),nu(i(l.add(bn(o.negate(),0)),t.z),i(l.add(bn(o.mul(2),0)),t.z),d.x),nu(i(l.add(bn(o.negate(),u)),t.z),i(l.add(bn(o.mul(2),u)),t.z),d.x),nu(i(l.add(bn(0,u.negate())),t.z),i(l.add(bn(0,u.mul(2))),t.z),d.y),nu(i(l.add(bn(o,u.negate())),t.z),i(l.add(bn(o,u.mul(2))),t.z),d.y),nu(nu(i(l.add(bn(o.negate(),u.negate())),t.z),i(l.add(bn(o.mul(2),u.negate())),t.z),d.x),nu(i(l.add(bn(o.negate(),u.mul(2))),t.z),i(l.add(bn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),A_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e).sample(t.xy);e.isArrayTexture&&(s=s.depth(r)),s=s.rg;const i=s.x,n=Ho(1e-7,s.y.mul(s.y)),a=qo(t.z,i);cn(a.equal(1),()=>gn(1));const o=t.z.sub(i);let u=n.div(n.add(o.mul(o)));return u=au(Ba(u,.3).div(.65)),Ho(a,u)}),E_=e=>{let t=v_.get(e);return void 0===t&&(t=new Qp,t.colorNode=An(0,0,0,1),t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.blending=ee,t.fog=!1,v_.set(e,t)),t},w_=e=>{const t=v_.get(e);void 0!==t&&(t.dispose(),v_.delete(e))},C_=new Yf,M_=[],B_=(e,t,r,s)=>{M_[0]=e,M_[1]=t;let i=C_.get(M_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ze)&&(s&&(Xs(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,C_.set(M_,i)),M_[0]=null,M_[1]=null,i},L_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanVertical"),a=gn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));up({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(jl.xy,bn(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),F_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanHorizontal"),a=gn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));up({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(jl.xy,bn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(Ma(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),P_=[N_,S_,R_,A_];let D_;const U_=new $b;class I_ extends c_{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._currentShadowType=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n});return a.select(o,gn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=fc("bias","float",r).setGroup(ba);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===h&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=fc("near","float",r.camera).setGroup(ba),s=fc("far","float",r.camera).setGroup(ba);n=Fp(e.negate(),t,s)}return a=vn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return P_[e]}setupRenderTarget(e,t){const r=new Y(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=Je;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t,camera:r}=e,{light:s,shadow:i}=this,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(i,e),o=t.shadowMap.type;if(o===et||o===tt?(n.minFilter=oe,n.magFilter=oe):(n.minFilter=w,n.magFilter=w),i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),o===Ze&&!0!==i.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}));let t=Fl(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Fl(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const s=fc("blurSamples","float",i).setGroup(ba),o=fc("radius","float",i).setGroup(ba),u=fc("mapSize","vec2",i).setGroup(ba);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Qp);l.fragmentNode=L_({samples:s,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Qp),l.fragmentNode=F_({samples:s,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const u=fc("intensity","float",i).setGroup(ba),l=fc("normalBias","float",i).setGroup(ba),d=t_(s).mul(h_.add(Xd.mul(l))),c=this.setupShadowCoord(e,d),h=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===h)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const p=o===Ze&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,g=this.setupShadowFilter(e,{filterFn:h,shadowTexture:a.texture,depthTexture:p,shadowCoord:c,shadow:i,depthLayer:this.depthLayer});let m,f;!0===t.shadowMap.transmitted&&(a.texture.isCubeTexture?m=pc(a.texture,c.xyz):(m=Fl(a.texture,c),n.isArrayTexture&&(m=m.depth(this.depthLayer)))),f=m?nu(1,g.rgb.mix(m,1),u.mul(m.a)).toVar():nu(1,g,u).toVar(),this.shadowMap=a,this.shadow.map=a;const y=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return m&&f.toInspector(`${y} / Color`,()=>this.shadowMap.texture.isCubeTexture?pc(this.shadowMap.texture):Fl(this.shadowMap.texture)),f.toInspector(`${y} / Depth`,()=>this.shadowMap.texture.isCubeTexture?pc(this.shadowMap.texture).r.oneMinus():Pl(this.shadowMap.depthTexture,Rl().mul(El(Fl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return un(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");D_=x_(i,n,D_),n.overrideMaterial=E_(r),i.setRenderObjectFunction(B_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===Ze&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,T_(i,n,D_)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),U_.material=this.vsmMaterialVertical,U_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),U_.material=this.vsmMaterialHorizontal,U_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,w_(this.light),this.shadowMap&&(this.shadowMap.dispose(),this.shadowMap=null),null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null)}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const O_=(e,t)=>new I_(e,t),V_=new e,k_=new a,G_=new r,z_=new r,$_=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],W_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],H_=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],q_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],j_=un(({depthTexture:e,bd3D:t,dp:r})=>pc(e,t).compare(r)),X_=un(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=fc("radius","float",s).setGroup(ba),n=fc("mapSize","vec2",s).setGroup(ba),a=i.div(n.x),o=Mo(t),u=vo(Qo(t,o.x.greaterThan(o.z).select(vn(0,1,0),vn(1,0,0)))),l=Qo(t,u),d=Yb(jl.xy).mul(6.28318530718),c=Qb(0,5,d),h=Qb(1,5,d),p=Qb(2,5,d),g=Qb(3,5,d),m=Qb(4,5,d);return pc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(pc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),K_=un(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toConst(),n=i.abs().toConst(),a=n.x.max(n.y).max(n.z),o=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.near),u=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.far),l=fc("bias","float",s).setGroup(ba),d=gn(1).toVar();return cn(a.sub(u).lessThanEqual(0).and(a.sub(o).greaterThanEqual(0)),()=>{const r=Bp(a.negate(),o,u);r.addAssign(l);const n=i.normalize();d.assign(e({depthTexture:t,bd3D:n,dp:r,shadow:s}))}),d});class Y_ extends I_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===rt?j_:X_}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return K_({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new st(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=Je;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?$_:H_,d=u?W_:q_;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(V_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),G_.setFromMatrixPosition(s.matrixWorld),a.position.copy(G_),z_.copy(a.position),z_.add(l[e]),a.up.copy(d[e]),a.lookAt(z_),a.updateMatrixWorld(),o.makeTranslation(-G_.x,-G_.y,-G_.z),k_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(k_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const Q_=(e,t)=>new Y_(e,t);class Z_ extends mp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||_a(this.color).setGroup(ba),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Js.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return n_(this.light).sub(e.context.positionView||Ud)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return O_(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Zi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const J_=un(({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)}),ev=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=J_({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class tv extends Z_{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(2).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return Q_(this.light)}setupDirect(e){return ev({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const rv=un(([e=Rl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),sv=un(([e=Rl()],{renderer:t,material:r})=>{const s=iu(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=gn(s.fwidth()).toVar();i=lu(e.oneMinus(),e.add(1),s).oneMinus()}else i=bu(s.greaterThan(1),0,1);return i}),iv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=yn(e).toVar();return bu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),nv=un(([e,t])=>{const r=yn(t).toVar(),s=gn(e).toVar();return bu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),av=un(([e])=>{const t=gn(e).toVar();return mn(To(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),ov=un(([e,t])=>{const r=gn(e).toVar();return t.assign(av(r)),r.sub(gn(t))}),uv=gb([un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=gn(s).toVar(),l=gn(r).toVar(),d=gn(t).toVar(),c=gn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=vn(s).toVar(),l=vn(r).toVar(),d=vn(t).toVar(),c=vn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),lv=gb([un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=gn(o).toVar(),m=gn(a).toVar(),f=gn(n).toVar(),y=gn(i).toVar(),b=gn(s).toVar(),x=gn(r).toVar(),T=gn(t).toVar(),_=gn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=vn(o).toVar(),m=vn(a).toVar(),f=vn(n).toVar(),y=vn(i).toVar(),b=vn(s).toVar(),x=vn(r).toVar(),T=vn(t).toVar(),_=vn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),dv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=fn(e).toVar(),a=fn(n.bitAnd(fn(7))).toVar(),o=gn(iv(a.lessThan(fn(4)),i,s)).toVar(),u=gn(La(2,iv(a.lessThan(fn(4)),s,i))).toVar();return nv(o,yn(a.bitAnd(fn(1)))).add(nv(u,yn(a.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),cv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=fn(e).toVar(),u=fn(o.bitAnd(fn(15))).toVar(),l=gn(iv(u.lessThan(fn(8)),a,n)).toVar(),d=gn(iv(u.lessThan(fn(4)),n,iv(u.equal(fn(12)).or(u.equal(fn(14))),a,i))).toVar();return nv(l,yn(u.bitAnd(fn(1)))).add(nv(d,yn(u.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),hv=gb([dv,cv]),pv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=Sn(e).toVar();return vn(hv(n.x,i,s),hv(n.y,i,s),hv(n.z,i,s))}).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),gv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=Sn(e).toVar();return vn(hv(o.x,a,n,i),hv(o.y,a,n,i),hv(o.z,a,n,i))}).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),mv=gb([pv,gv]),fv=un(([e])=>{const t=gn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),yv=un(([e])=>{const t=gn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),bv=gb([fv,un(([e])=>{const t=vn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),xv=gb([yv,un(([e])=>{const t=vn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Tv=un(([e,t])=>{const r=mn(t).toVar(),s=fn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(mn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),_v=un(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Tv(r,mn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,mn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,mn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Tv(r,mn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,mn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,mn(4))),t.addAssign(e)}),vv=un(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=fn(e).toVar();return s.bitXorAssign(i),s.subAssign(Tv(i,mn(14))),n.bitXorAssign(s),n.subAssign(Tv(s,mn(11))),i.bitXorAssign(n),i.subAssign(Tv(n,mn(25))),s.bitXorAssign(i),s.subAssign(Tv(i,mn(16))),n.bitXorAssign(s),n.subAssign(Tv(s,mn(4))),i.bitXorAssign(n),i.subAssign(Tv(n,mn(14))),s.bitXorAssign(i),s.subAssign(Tv(i,mn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),Nv=un(([e])=>{const t=fn(e).toVar();return gn(t).div(gn(fn(mn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Sv=un(([e])=>{const t=gn(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),Rv=gb([un(([e])=>{const t=mn(e).toVar(),r=fn(fn(1)).toVar(),s=fn(fn(mn(3735928559)).add(r.shiftLeft(fn(2))).add(fn(13))).toVar();return vv(s.add(fn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(fn(2)).toVar(),n=fn().toVar(),a=fn().toVar(),o=fn().toVar();return n.assign(a.assign(o.assign(fn(mn(3735928559)).add(i.shiftLeft(fn(2))).add(fn(13))))),n.addAssign(fn(s)),a.addAssign(fn(r)),vv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(fn(3)).toVar(),o=fn().toVar(),u=fn().toVar(),l=fn().toVar();return o.assign(u.assign(l.assign(fn(mn(3735928559)).add(a.shiftLeft(fn(2))).add(fn(13))))),o.addAssign(fn(n)),u.addAssign(fn(i)),l.addAssign(fn(s)),vv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),un(([e,t,r,s])=>{const i=mn(s).toVar(),n=mn(r).toVar(),a=mn(t).toVar(),o=mn(e).toVar(),u=fn(fn(4)).toVar(),l=fn().toVar(),d=fn().toVar(),c=fn().toVar();return l.assign(d.assign(c.assign(fn(mn(3735928559)).add(u.shiftLeft(fn(2))).add(fn(13))))),l.addAssign(fn(o)),d.addAssign(fn(a)),c.addAssign(fn(n)),_v(l,d,c),l.addAssign(fn(i)),vv(l,d,c)}).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),un(([e,t,r,s,i])=>{const n=mn(i).toVar(),a=mn(s).toVar(),o=mn(r).toVar(),u=mn(t).toVar(),l=mn(e).toVar(),d=fn(fn(5)).toVar(),c=fn().toVar(),h=fn().toVar(),p=fn().toVar();return c.assign(h.assign(p.assign(fn(mn(3735928559)).add(d.shiftLeft(fn(2))).add(fn(13))))),c.addAssign(fn(l)),h.addAssign(fn(u)),p.addAssign(fn(o)),_v(c,h,p),c.addAssign(fn(a)),h.addAssign(fn(n)),vv(c,h,p)}).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),Av=gb([un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(Rv(s,r)).toVar(),n=Sn().toVar();return n.x.assign(i.bitAnd(mn(255))),n.y.assign(i.shiftRight(mn(8)).bitAnd(mn(255))),n.z.assign(i.shiftRight(mn(16)).bitAnd(mn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(Rv(n,i,s)).toVar(),o=Sn().toVar();return o.x.assign(a.bitAnd(mn(255))),o.y.assign(a.shiftRight(mn(8)).bitAnd(mn(255))),o.z.assign(a.shiftRight(mn(16)).bitAnd(mn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Ev=gb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(ov(t.x,r)).toVar(),n=gn(ov(t.y,s)).toVar(),a=gn(Sv(i)).toVar(),o=gn(Sv(n)).toVar(),u=gn(uv(hv(Rv(r,s),i,n),hv(Rv(r.add(mn(1)),s),i.sub(1),n),hv(Rv(r,s.add(mn(1))),i,n.sub(1)),hv(Rv(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return bv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(ov(t.x,r)).toVar(),a=gn(ov(t.y,s)).toVar(),o=gn(ov(t.z,i)).toVar(),u=gn(Sv(n)).toVar(),l=gn(Sv(a)).toVar(),d=gn(Sv(o)).toVar(),c=gn(lv(hv(Rv(r,s,i),n,a,o),hv(Rv(r.add(mn(1)),s,i),n.sub(1),a,o),hv(Rv(r,s.add(mn(1)),i),n,a.sub(1),o),hv(Rv(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),hv(Rv(r,s,i.add(mn(1))),n,a,o.sub(1)),hv(Rv(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),hv(Rv(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),hv(Rv(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return xv(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),wv=gb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(ov(t.x,r)).toVar(),n=gn(ov(t.y,s)).toVar(),a=gn(Sv(i)).toVar(),o=gn(Sv(n)).toVar(),u=vn(uv(mv(Av(r,s),i,n),mv(Av(r.add(mn(1)),s),i.sub(1),n),mv(Av(r,s.add(mn(1))),i,n.sub(1)),mv(Av(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return bv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(ov(t.x,r)).toVar(),a=gn(ov(t.y,s)).toVar(),o=gn(ov(t.z,i)).toVar(),u=gn(Sv(n)).toVar(),l=gn(Sv(a)).toVar(),d=gn(Sv(o)).toVar(),c=vn(lv(mv(Av(r,s,i),n,a,o),mv(Av(r.add(mn(1)),s,i),n.sub(1),a,o),mv(Av(r,s.add(mn(1)),i),n,a.sub(1),o),mv(Av(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),mv(Av(r,s,i.add(mn(1))),n,a,o.sub(1)),mv(Av(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),mv(Av(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),mv(Av(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return xv(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),Cv=gb([un(([e])=>{const t=gn(e).toVar(),r=mn(av(t)).toVar();return Nv(Rv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar();return Nv(Rv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar();return Nv(Rv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=An(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar(),n=mn(av(t.w)).toVar();return Nv(Rv(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Mv=gb([un(([e])=>{const t=gn(e).toVar(),r=mn(av(t)).toVar();return vn(Nv(Rv(r,mn(0))),Nv(Rv(r,mn(1))),Nv(Rv(r,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar();return vn(Nv(Rv(r,s,mn(0))),Nv(Rv(r,s,mn(1))),Nv(Rv(r,s,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar();return vn(Nv(Rv(r,s,i,mn(0))),Nv(Rv(r,s,i,mn(1))),Nv(Rv(r,s,i,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=An(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar(),n=mn(av(t.w)).toVar();return vn(Nv(Rv(r,s,i,n,mn(0))),Nv(Rv(r,s,i,n,mn(1))),Nv(Rv(r,s,i,n,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Bv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=gn(0).toVar(),l=gn(1).toVar();return up(a,()=>{u.addAssign(l.mul(Ev(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Lv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(0).toVar(),l=gn(1).toVar();return up(a,()=>{u.addAssign(l.mul(wv(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Fv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar();return bn(Bv(o,a,n,i),Bv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i))}).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Pv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(Lv(o,a,n,i)).toVar(),l=gn(Bv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i)).toVar();return An(u,l)}).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Dv=gb([un(([e,t,r,s,i,n,a])=>{const o=mn(a).toVar(),u=gn(n).toVar(),l=mn(i).toVar(),d=mn(s).toVar(),c=mn(r).toVar(),h=mn(t).toVar(),p=bn(e).toVar(),g=vn(Mv(bn(h.add(d),c.add(l)))).toVar(),m=bn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=bn(bn(gn(h),gn(c)).add(m)).toVar(),y=bn(f.sub(p)).toVar();return cn(o.equal(mn(2)),()=>Mo(y.x).add(Mo(y.y))),cn(o.equal(mn(3)),()=>Ho(Mo(y.x),Mo(y.y))),Yo(y,y)}).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),un(([e,t,r,s,i,n,a,o,u])=>{const l=mn(u).toVar(),d=gn(o).toVar(),c=mn(a).toVar(),h=mn(n).toVar(),p=mn(i).toVar(),g=mn(s).toVar(),m=mn(r).toVar(),f=mn(t).toVar(),y=vn(e).toVar(),b=vn(Mv(vn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=vn(vn(gn(f),gn(m),gn(g)).add(b)).toVar(),T=vn(x.sub(y)).toVar();return cn(l.equal(mn(2)),()=>Mo(T.x).add(Mo(T.y)).add(Mo(T.z))),cn(l.equal(mn(3)),()=>Ho(Mo(T.x),Mo(T.y),Mo(T.z))),Yo(T,T)}).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Uv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=gn(1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();l.assign(Wo(l,r))})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Iv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=bn(1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Ov=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=vn(1e6,1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.z.assign(l.y),l.y.assign(r)}).ElseIf(r.lessThan(l.z),()=>{l.z.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Vv=gb([Uv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=gn(1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(Wo(d,n))})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),kv=gb([Iv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=bn(1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Gv=gb([Ov,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=vn(1e6,1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.z.assign(d.y),d.y.assign(n)}).ElseIf(n.lessThan(d.z),()=>{d.z.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),zv=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=bn(t).toVar(),p=bn(r).toVar(),g=bn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(wv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(2)),()=>{N.assign(Gv(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Lv(vn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),$v=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=vn(t).toVar(),p=vn(r).toVar(),g=vn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(wv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(2)),()=>{N.assign(Gv(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Lv(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Wv=un(([e])=>{const t=e.y,r=e.z,s=vn().toVar();return cn(t.lessThan(1e-4),()=>{s.assign(vn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(To(i)).mul(6).toVar();const n=mn(Vo(i)),a=i.sub(gn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());cn(n.equal(mn(0)),()=>{s.assign(vn(r,l,o))}).ElseIf(n.equal(mn(1)),()=>{s.assign(vn(u,r,o))}).ElseIf(n.equal(mn(2)),()=>{s.assign(vn(o,r,l))}).ElseIf(n.equal(mn(3)),()=>{s.assign(vn(o,u,r))}).ElseIf(n.equal(mn(4)),()=>{s.assign(vn(l,o,r))}).Else(()=>{s.assign(vn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Hv=un(([e])=>{const t=vn(e).toVar(),r=gn(t.x).toVar(),s=gn(t.y).toVar(),i=gn(t.z).toVar(),n=gn(Wo(r,Wo(s,i))).toVar(),a=gn(Ho(r,Ho(s,i))).toVar(),o=gn(a.sub(n)).toVar(),u=gn().toVar(),l=gn().toVar(),d=gn().toVar();return d.assign(a),cn(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),cn(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{cn(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(Ma(2,i.sub(r).div(o)))}).Else(()=>{u.assign(Ma(4,r.sub(s).div(o)))}),u.mulAssign(1/6),cn(u.lessThan(0),()=>{u.addAssign(1)})}),vn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),qv=un(([e])=>{const t=vn(e).toVar(),r=Rn(Oa(t,vn(.04045))).toVar(),s=vn(t.div(12.92)).toVar(),i=vn(Zo(Ho(t.add(vn(.055)),vn(0)).div(1.055),vn(2.4))).toVar();return nu(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),jv=(e,t)=>{e=gn(e),t=gn(t);const r=bn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return lu(e.sub(r),e.add(r),t)},Xv=(e,t,r,s)=>nu(e,t,r[s].clamp()),Kv=(e,t,r,s,i)=>nu(e,t,jv(r,s[i])),Yv=un(([e,t,r])=>{const s=vo(e).toVar(),i=Ba(gn(.5).mul(t.sub(r)),Pd).div(s).toVar(),n=Ba(gn(-.5).mul(t.sub(r)),Pd).div(s).toVar(),a=vn().toVar();a.x=s.x.greaterThan(gn(0)).select(i.x,n.x),a.y=s.y.greaterThan(gn(0)).select(i.y,n.y),a.z=s.z.greaterThan(gn(0)).select(i.z,n.z);const o=Wo(a.x,a.y,a.z).toVar();return Pd.add(s.mul(o)).toVar().sub(r)}),Qv=un(([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(La(r,r).sub(La(s,s)))),n});var Zv=Object.freeze({__proto__:null,BRDF_GGX:Dg,BRDF_Lambert:Tg,BasicPointShadowFilter:j_,BasicShadowFilter:N_,Break:lp,Const:Cu,Continue:()=>gl("continue").toStack(),DFGLUT:Og,D_GGX:Lg,Discard:ml,EPSILON:so,F_Schlick:xg,Fn:un,HALF_PI:uo,INFINITY:io,If:cn,Loop:up,NodeAccess:ti,NodeShaderStage:Zs,NodeType:ei,NodeUpdateType:Js,OnBeforeMaterialUpdate:e=>ex(Jb.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>ex(Jb.BEFORE_OBJECT,e),OnMaterialUpdate:e=>ex(Jb.MATERIAL,e),OnObjectUpdate:e=>ex(Jb.OBJECT,e),PCFShadowFilter:S_,PCFSoftShadowFilter:R_,PI:no,PI2:ao,PointShadowFilter:X_,Return:()=>gl("return").toStack(),Schlick_to_F0:Gg,ScriptableNodeResources:rT,ShaderNode:Qi,Stack:hn,Switch:(...e)=>_i.Switch(...e),TBNViewMatrix:$c,TWO_PI:oo,VSMShadowFilter:A_,V_GGX_SmithCorrelated:Mg,Var:wu,VarIntent:Mu,abs:Mo,acesFilmicToneMapping:zx,acos:wo,add:Ma,addMethodChaining:Ni,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:qx,all:lo,alphaT:Yn,and:Ga,anisotropy:Qn,anisotropyB:Jn,anisotropyT:Zn,any:co,append:e=>(d("TSL: append() has been renamed to Stack()."),hn(e)),array:Na,arrayBuffer:e=>new xi(e,"ArrayBuffer"),asin:Eo,assign:Ra,atan:Co,atomicAdd:(e,t)=>AT(ST.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>AT(ST.ATOMIC_AND,e,t),atomicFunc:AT,atomicLoad:e=>AT(ST.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>AT(ST.ATOMIC_MAX,e,t),atomicMin:(e,t)=>AT(ST.ATOMIC_MIN,e,t),atomicOr:(e,t)=>AT(ST.ATOMIC_OR,e,t),atomicStore:(e,t)=>AT(ST.ATOMIC_STORE,e,t),atomicSub:(e,t)=>AT(ST.ATOMIC_SUB,e,t),atomicXor:(e,t)=>AT(ST.ATOMIC_XOR,e,t),attenuationColor:ha,attenuationDistance:ca,attribute:Sl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new rx(e,r,s);return Wh(i,t,e)},backgroundBlurriness:ux,backgroundIntensity:lx,backgroundRotation:dx,batch:sp,bentNormalView:Hc,billboarding:Tb,bitAnd:Ha,bitNot:qa,bitOr:ja,bitXor:Xa,bitangentGeometry:Vc,bitangentLocal:kc,bitangentView:Gc,bitangentWorld:zc,bitcast:qy,blendBurn:Wp,blendColor:Xp,blendDodge:Hp,blendOverlay:jp,blendScreen:qp,blur:Gm,bool:yn,buffer:Ul,bufferAttribute:Ju,builtin:kl,builtinAOContext:Su,builtinShadowContext:Nu,bumpMap:Jc,bvec2:_n,bvec3:Rn,bvec4:Cn,bypass:ll,cache:ol,call:Ea,cameraFar:td,cameraIndex:Jl,cameraNear:ed,cameraNormalMatrix:ad,cameraPosition:od,cameraProjectionMatrix:rd,cameraProjectionMatrixInverse:sd,cameraViewMatrix:id,cameraViewport:ud,cameraWorldMatrix:nd,cbrt:su,cdl:Ex,ceil:_o,checker:rv,cineonToneMapping:kx,clamp:au,clearcoat:$n,clearcoatNormalView:Kd,clearcoatRoughness:Wn,clipSpace:Md,code:Kx,color:pn,colorSpaceToWorking:Gu,colorToDirection:e=>Zi(e).mul(2).sub(1),compute:il,computeKernel:sl,computeSkinning:(e,t=null)=>{const r=new np(e);return r.positionNode=Wh(new W(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(jh).toVar(),r.skinIndexNode=Wh(new W(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(jh).toVar(),r.skinWeightNode=Wh(new W(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(jh).toVar(),r.bindMatrixNode=_a(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=_a(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Ul(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Zi(r)},context:Tu,convert:Pn,convertColorSpace:(e,t,r)=>Zi(new Vu(Zi(e),t,r)),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():qb(e,...t),cos:Ro,countLeadingZeros:Qy,countOneBits:Zy,countTrailingZeros:Yy,cross:Qo,cubeTexture:pc,cubeTextureBase:hc,dFdx:Do,dFdy:Uo,dashSize:na,debug:xl,decrement:eo,decrementBefore:Za,defaultBuildStages:si,defaultShaderStages:ri,defined:Ki,degrees:po,deltaTime:fb,densityFogFactor:oT,depth:Dp,depthPass:(e,t,r)=>new Ux(Ux.DEPTH,e,t,r),determinant:zo,difference:Ko,diffuseColor:On,diffuseContribution:Vn,directPointLight:ev,directionToColor:qc,directionToFaceDirection:Gd,dispersion:pa,disposeShadowMaterial:w_,distance:Xo,div:Fa,dot:Yo,drawIndex:Qh,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x),element:Fn,emissive:kn,equal:Da,equirectUV:ag,exp:go,exp2:mo,exponentialHeightFogFactor:uT,expression:gl,faceDirection:kd,faceForward:du,faceforward:mu,float:gn,floatBitsToInt:e=>new Hy(e,"int","float"),floatBitsToUint:jy,floor:To,fog:lT,fract:No,frameGroup:ya,frameId:yb,frontFacing:Vd,fwidth:ko,gain:(e,t)=>e.lessThan(.5)?eb(e.mul(2),t).div(2):Ba(1,eb(La(Ba(1,e),2),t).div(2)),gapSize:aa,getConstNodeType:Yi,getCurrentStack:dn,getDirection:Im,getDistanceAttenuation:J_,getGeometryRoughness:wg,getNormalFromDepth:Kb,getParallaxCorrectNormal:Yv,getRoughness:Cg,getScreenPosition:Xb,getShIrradianceAt:Qv,getShadowMaterial:E_,getShadowRenderObjectFunction:B_,getTextureIndex:zy,getViewPosition:jb,ggxConvolution:Hm,globalId:bT,glsl:(e,t)=>Kx(e,t,"glsl"),glslFn:(e,t)=>Qx(e,t,"glsl"),grayscale:vx,greaterThan:Oa,greaterThanEqual:ka,hash:Jy,highpModelNormalViewMatrix:Cd,highpModelViewMatrix:wd,hue:Rx,increment:Ja,incrementBefore:Qa,inspector:vl,instance:Jh,instanceIndex:jh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new tx(e,r,s);return Wh(i,t,e)},instancedBufferAttribute:el,instancedDynamicBufferAttribute:tl,instancedMesh:tp,int:mn,intBitsToFloat:e=>new Hy(e,"float","int"),interleavedGradientNoise:Yb,inverse:$o,inverseSqrt:xo,inversesqrt:fu,invocationLocalIndex:Yh,invocationSubgroupIndex:Kh,ior:ua,iridescence:jn,iridescenceIOR:Xn,iridescenceThickness:Kn,isolate:al,ivec2:xn,ivec3:Nn,ivec4:En,js:(e,t)=>Kx(e,t,"js"),label:Ru,length:Lo,lengthSq:iu,lessThan:Ia,lessThanEqual:Va,lightPosition:s_,lightProjectionUV:r_,lightShadowMatrix:t_,lightTargetDirection:a_,lightTargetPosition:i_,lightViewPosition:n_,lightingContext:bp,lights:(e=[])=>(new d_).setLights(e),linearDepth:Up,linearToneMapping:Ox,localId:xT,log:fo,log2:yo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(fo(r.div(t)));return gn(Math.E).pow(s).mul(t).negate()},luminance:Ax,mat2:Mn,mat3:Bn,mat4:Ln,matcapUV:Mf,materialAO:Oh,materialAlphaTest:rh,materialAnisotropy:_h,materialAnisotropyVector:Vh,materialAttenuationColor:Ch,materialAttenuationDistance:wh,materialClearcoat:mh,materialClearcoatNormal:yh,materialClearcoatRoughness:fh,materialColor:sh,materialDispersion:Uh,materialEmissive:nh,materialEnvIntensity:ic,materialEnvRotation:nc,materialIOR:Eh,materialIridescence:vh,materialIridescenceIOR:Nh,materialIridescenceThickness:Sh,materialLightMap:Ih,materialLineDashOffset:Ph,materialLineDashSize:Bh,materialLineGapSize:Lh,materialLineScale:Mh,materialLineWidth:Fh,materialMetalness:ph,materialNormal:gh,materialOpacity:ah,materialPointSize:Dh,materialReference:xc,materialReflectivity:ch,materialRefractionRatio:sc,materialRotation:bh,materialRoughness:hh,materialSheen:xh,materialSheenRoughness:Th,materialShininess:ih,materialSpecular:oh,materialSpecularColor:lh,materialSpecularIntensity:uh,materialSpecularStrength:dh,materialThickness:Ah,materialTransmission:Rh,max:Ho,maxMipLevel:Cl,mediumpModelViewMatrix:Ed,metalness:zn,min:Wo,mix:nu,mixElement:hu,mod:Pa,modInt:to,modelDirection:bd,modelNormalMatrix:Sd,modelPosition:Td,modelRadius:Nd,modelScale:_d,modelViewMatrix:Ad,modelViewPosition:vd,modelViewProjection:kh,modelWorldMatrix:xd,modelWorldMatrixInverse:Rd,morphReference:gp,mrt:Wy,mul:La,mx_aastep:jv,mx_add:(e,t=gn(0))=>Ma(e,t),mx_atan2:(e=gn(0),t=gn(1))=>Co(e,t),mx_cell_noise_float:(e=Rl())=>Cv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>gn(e).sub(r).mul(t).add(r),mx_divide:(e,t=gn(1))=>Fa(e,t),mx_fractal_noise_float:(e=Rl(),t=3,r=2,s=.5,i=1)=>Bv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Rl(),t=3,r=2,s=.5,i=1)=>Fv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Rl(),t=3,r=2,s=.5,i=1)=>Lv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Rl(),t=3,r=2,s=.5,i=1)=>Pv(e,mn(t),r,s).mul(i),mx_frame:()=>yb,mx_heighttonormal:(e,t)=>(e=vn(e),t=gn(t),Jc(e,t)),mx_hsvtorgb:Wv,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=gn(1))=>Ba(t,e),mx_modulo:(e,t=gn(1))=>Pa(e,t),mx_multiply:(e,t=gn(1))=>La(e,t),mx_noise_float:(e=Rl(),t=1,r=0)=>Ev(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Rl(),t=1,r=0)=>wv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Rl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return An(wv(e),Ev(e.add(bn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=bn(.5,.5),r=bn(1,1),s=gn(0),i=bn(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=bn(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=gn(1))=>Zo(e,t),mx_ramp4:(e,t,r,s,i=Rl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=nu(e,t,n),u=nu(r,s,n);return nu(o,u,a)},mx_ramplr:(e,t,r=Rl())=>Xv(e,t,r,"x"),mx_ramptb:(e,t,r=Rl())=>Xv(e,t,r,"y"),mx_rgbtohsv:Hv,mx_rotate2d:(e,t)=>{e=bn(e);const r=(t=gn(t)).mul(Math.PI/180);return Pf(e,r)},mx_rotate3d:(e,t,r)=>{e=vn(e),t=gn(t),r=vn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=gn(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=gn(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Rl())=>Kv(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Rl())=>Kv(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:qv,mx_subtract:(e,t=gn(0))=>Ba(e,t),mx_timer:()=>mb,mx_transform_uv:(e=1,t=0,r=Rl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>zv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>$v(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Rl(),t=1)=>Vv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec2:(e=Rl(),t=1)=>kv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec3:(e=Rl(),t=1)=>Gv(e.convert("vec2|vec3"),t,mn(1)),negate:Fo,neutralToneMapping:jx,nodeArray:tn,nodeImmutable:sn,nodeObject:Zi,nodeObjectIntent:Ji,nodeObjects:en,nodeProxy:rn,nodeProxyIntent:nn,normalFlat:Wd,normalGeometry:zd,normalLocal:$d,normalMap:Kc,normalView:jd,normalViewGeometry:Hd,normalWorld:Xd,normalWorldGeometry:qd,normalize:vo,not:$a,notEqual:Ua,numWorkgroups:fT,objectDirection:cd,objectGroup:xa,objectPosition:pd,objectRadius:fd,objectScale:gd,objectViewPosition:md,objectWorldMatrix:hd,oneMinus:Po,or:za,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=mb)=>e.fract(),oscSine:(e=mb)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=mb)=>e.fract().round(),oscTriangle:(e=mb)=>e.add(.5).fract().mul(2).sub(1).abs(),output:ia,outputStruct:Oy,overloadingFn:gb,packHalf2x16:ib,packSnorm2x16:rb,packUnorm2x16:sb,parabola:eb,parallaxDirection:Wc,parallaxUV:(e,t)=>e.sub(Wc.mul(t)),parameter:(e,t)=>new Ly(e,t),pass:(e,t,r)=>new Ux(Ux.COLOR,e,t,r),passTexture:(e,t)=>new Px(e,t),pcurve:(e,t,r)=>Zo(Fa(Zo(e,t),Ma(Zo(e,t),Zo(Ba(1,e),r))),1/t),perspectiveDepthToViewZ:Lp,pmremTexture:mf,pointShadow:Q_,pointUV:ix,pointWidth:oa,positionGeometry:Bd,positionLocal:Ld,positionPrevious:Fd,positionView:Ud,positionViewDirection:Id,positionWorld:Pd,positionWorldDirection:Dd,posterize:Cx,pow:Zo,pow2:Jo,pow3:eu,pow4:tu,premultiplyAlpha:Kp,property:Un,quadBroadcast:ZT,quadSwapDiagonal:qT,quadSwapX:WT,quadSwapY:HT,radians:ho,rand:cu,range:pT,rangeFogFactor:aT,reciprocal:Oo,reference:fc,referenceBuffer:yc,reflect:jo,reflectVector:uc,reflectView:ac,reflector:e=>new Ob(e),refract:uu,refractVector:lc,refractView:oc,reinhardToneMapping:Vx,remap:cl,remapClamp:hl,renderGroup:ba,renderOutput:yl,rendererReference:Hu,replaceDefaultUV:function(e,t=null){return Tu(t,{getUV:e})},rotate:Pf,rotateUV:bb,roughness:Gn,round:Io,rtt:qb,sRGBTransferEOTF:Uu,sRGBTransferOETF:Iu,sample:(e,t=null)=>new Zb(e,Zi(t)),sampler:e=>(!0===e.isNode?e:Fl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Fl(e)).convert("samplerComparison"),saturate:ou,saturation:Nx,screenCoordinate:jl,screenDPR:Wl,screenSize:ql,screenUV:Hl,scriptable:iT,scriptableValue:Jx,select:bu,setCurrentStack:ln,setName:vu,shaderStages:ii,shadow:O_,shadowPositionWorld:h_,shapeCircle:sv,sharedUniformGroup:fa,sheen:Hn,sheenRoughness:qn,shiftLeft:Ka,shiftRight:Ya,shininess:sa,sign:Bo,sin:So,sinc:(e,t)=>So(no.mul(t.mul(e).sub(1))).div(no.mul(t.mul(e).sub(1))),skinning:ap,smoothstep:lu,smoothstepElement:pu,specularColor:ea,specularColorBlended:ta,specularF90:ra,spherizeUV:xb,split:(e,t)=>Zi(new gi(Zi(e),t)),spritesheetUV:vb,sqrt:bo,stack:Py,step:qo,stepElement:gu,storage:Wh,storageBarrier:()=>_T("storage").toStack(),storageTexture:hx,string:(e="")=>new xi(e,"string"),struct:(e,t=null)=>{const r=new Dy(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;emx(e,t).level(r),texture3DLoad:(...e)=>mx(...e).setSampler(!1),textureBarrier:()=>_T("texture").toStack(),textureBicubic:om,textureBicubicLevel:am,textureCubeUV:Om,textureLevel:(e,t,r)=>Fl(e,t).level(r),textureLoad:Pl,textureSize:El,textureStore:(e,t,r)=>{const s=hx(e,t,r);return null!==r&&s.toStack(),s},thickness:da,time:mb,toneMapping:ju,toneMappingExposure:Xu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Zi(new Ix(t,r,Zi(s),Zi(i),Zi(n))),transformDirection:ru,transformNormal:Yd,transformNormalToView:Qd,transformedClearcoatNormalView:ec,transformedNormalView:Zd,transformedNormalWorld:Jd,transmission:la,transpose:Go,triNoise3D:cb,triplanarTexture:(...e)=>Nb(...e),triplanarTextures:Nb,trunc:Vo,uint:fn,uintBitsToFloat:e=>new Hy(e,"float","uint"),uniform:_a,uniformArray:Vl,uniformCubeTexture:(e=dc)=>hc(e),uniformFlow:_u,uniformGroup:ma,uniformTexture:(e=Ml)=>Fl(e),unpackHalf2x16:ub,unpackNormal:jc,unpackSnorm2x16:ab,unpackUnorm2x16:ob,unpremultiplyAlpha:Yp,userData:(e,t,r)=>new fx(e,t,r),uv:Rl,uvec2:Tn,uvec3:Sn,uvec4:wn,varying:Pu,varyingProperty:In,vec2:bn,vec3:vn,vec4:An,vectorComponents:ni,velocity:_x,vertexColor:$p,vertexIndex:qh,vertexStage:Du,vibrance:Sx,viewZToLogarithmicDepth:Fp,viewZToOrthographicDepth:Mp,viewZToPerspectiveDepth:Bp,viewport:Xl,viewportCoordinate:Yl,viewportDepthTexture:wp,viewportLinearDepth:Ip,viewportMipTexture:Np,viewportOpaqueMipTexture:Rp,viewportResolution:Zl,viewportSafeUV:_b,viewportSharedTexture:Lx,viewportSize:Kl,viewportTexture:vp,viewportUV:Ql,vogelDiskSample:Qb,wgsl:(e,t)=>Kx(e,t,"wgsl"),wgslFn:(e,t)=>Qx(e,t,"wgsl"),workgroupArray:(e,t)=>new NT("Workgroup",e,t),workgroupBarrier:()=>_T("workgroup").toStack(),workgroupId:yT,workingToColorSpace:ku,xor:Wa});const Jv=new By;class eN extends ty{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(Jv),Jv.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(Jv),Jv.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;Jv.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=An(l).mul(lx).context({getUV:()=>dx.mul(qd),getTextureLevel:()=>ux}),p=rd.element(3).element(3).equal(1),g=Fa(1,rd.element(1).element(1)).mul(3),m=p.select(Ld.mul(g),Ld),f=Ad.mul(An(m,0));let y=rd.mul(An(f.xyz,1));y=y.setZ(y.w);const b=new Qp;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=M,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ne(new it(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=An(l).mul(lx),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?Jv.set(0,0,0,1):"alpha-blend"===a&&Jv.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=Jv.r,T.g=Jv.g,T.b=Jv.b,T.a=Jv.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let tN=0;class rN{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=tN++}}class sN{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new rN(t.name,[],t.index,t.bindingsReference);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class iN{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class nN{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class aN{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class oN extends aN{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class uN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let lN=0;class dN{constructor(e=null){this.id=lN++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class cN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class hN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class pN extends hN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class gN extends hN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class mN extends hN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class fN extends hN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class yN extends hN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class bN extends hN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class xN extends hN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class TN extends hN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class _N extends pN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class vN extends gN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class NN extends mN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class SN extends fN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class RN extends yN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class AN extends bN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class EN extends xN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class wN extends TN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let CN=0;const MN=new WeakMap,BN=new WeakMap,LN=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),FN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class PN{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.types={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=Py(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new dN,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:CN++})}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===ze&&!1===e.alphaToCoverage}getBindGroupsCache(){let e=BN.get(this.renderer);return void 0===e&&(e=new Yf,BN.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new Ne(e,t,r)}createCubeRenderTarget(e,t){return new og(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new rN(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new rN(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of ii)for(const s in r[e]){const i=r[e][s],n=t[s]||(t[s]=[]);for(const e of i)!1===n.includes(e)&&n.push(e)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order);for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${FN(n.r)}, ${FN(n.g)}, ${FN(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new iN(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===R)return"int";if(t===S)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=Gs(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return LN.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ot||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Py(this.stack);const e=dn();return this.stacks.push(e),ln(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,ln(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new iN("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const a=this.structs.index++;null===r&&(r="StructType"+a),n=new cN(r,t),this.structs[s].push(n),this.types[s][r]=e,i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new nN(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new aN(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new oN(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,d(`TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new uN("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new Yx,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new Ly(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new dN,this.stack=Py();for(const r of si)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){d("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){d("Abstract function.")}getVaryings(){d("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){d("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){d("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Qp),e.build(this)}else this.addFlow("compute",e);for(const e of si){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ii){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getSharedDataFromNode(e){let t=MN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new _N(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new vN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new NN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new SN(e);else if("color"===t)s=new RN(e);else if("mat2"===t)s=new AN(e);else if("mat3"===t)s=new EN(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new wN(e)}r.cache=s}return s}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,this.getTypeFromLength(i,this.getComponentType(t)),r)):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${ut} - Node System\n`}needsPreviousData(){const e=this.renderer.getMRT();return e&&e.has("velocity")||!0===Xs(this.object).useVelocity}}class DN{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===Js.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===Js.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class UN{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}UN.isNodeFunctionInput=!0;class IN extends Z_{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:a_(this.light),lightColor:e}}}const ON=new a,VN=new a;let kN=null;class GN extends Z_{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=_a(new r).setGroup(ba),this.halfWidth=_a(new r).setGroup(ba),this.updateType=Js.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;VN.identity(),ON.copy(t.matrixWorld),ON.premultiply(r),VN.extractRotation(ON),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(VN),this.halfHeight.value.applyMatrix4(VN)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Fl(kN.LTC_FLOAT_1),r=Fl(kN.LTC_FLOAT_2)):(t=Fl(kN.LTC_HALF_1),r=Fl(kN.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:n_(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){kN=e}}class zN extends Z_{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=_a(0).setGroup(ba),this.penumbraCosNode=_a(0).setGroup(ba),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(0).setGroup(ba),this.colorNode=_a(this.color).setGroup(ba)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e,t){const{coneCosNode:r,penumbraCosNode:s}=this;return lu(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=r_(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(a_(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=J_({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=Fl(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class $N extends zN{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=Fl(r,bn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const WN=un(([e,t])=>{const r=e.abs().sub(t);return Lo(Ho(r,0)).add(Wo(Ho(r.x,r.y),0))});class HN extends zN{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=gn(0),r=this.penumbraCosNode,s=t_(this.light).mul(e.context.positionWorld||Pd);return cn(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=WN(e.xy.sub(bn(.5)),bn(.5)),n=Fa(-1,Ba(1,wo(r)).sub(1));t.assign(ou(i.mul(-2).mul(n)))}),t}}class qN extends Z_{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class jN extends Z_{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=s_(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=_a(new e).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=Xd.dot(s).mul(.5).add(.5),n=nu(r,t,i);e.context.irradiance.addAssign(n)}}class XN extends Z_{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Vl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=Qv(Xd,this.lightProbe);e.context.irradiance.addAssign(t)}}class KN{parseFunction(){d("Abstract function.")}}class YN{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}YN.isNodeFunction=!0;const QN=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,ZN=/[a-z_0-9]+/gi,JN="#pragma main";class eS extends YN{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(JN),r=-1!==t?e.slice(t+12):e,s=r.match(QN);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=ZN.exec(i));)n.push(a);const o=[];let u=0;for(;u{const r=this.backend.createNodeBuilder(e.object,this.renderer);return r.scene=e.scene,r.material=t,r.camera=e.camera,r.context.material=t,r.lightsNode=e.lightsNode,r.environmentNode=this.getEnvironmentNode(e.scene),r.fogNode=this.getFogNode(e.scene),r.clippingContext=e.clippingContext,this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview&&r.enableMultiview(),r};let n=t(e.material);try{n.build()}catch(e){n=t(new Qp),n.build(),o("TSL: "+e)}r=this._createNodeBuilderState(n),s.set(i,r)}r.usedTimes++,t.nodeBuilderState=r}return r}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new sN(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){sS[0]=e,sS[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(sS)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&iS.push(t.getCacheKey(!0)),i&&iS.push(i.getCacheKey()),n&&iS.push(n.getCacheKey()),iS.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),iS.push(this.renderer.shadowMap.enabled?1:0),iS.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Is(iS),this.callHashCache.set(sS,s),iS.length=0}return sS.length=0,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===le||r.mapping===de||r.mapping===Ae){if(e.backgroundBlurriness>0||r.mapping===Ae)return mf(r);{let e;return e=!0===r.isCubeTexture?pc(r):Fl(r),hg(e)}}if(!0===r.isTexture)return Fl(r,Hl.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("WebGPUNodes: Unsupported background configuration.",r)},s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,()=>{if(r.isFogExp2){const e=fc("color","color",r).setGroup(ba),t=fc("density","float",r).setGroup(ba);return lT(e,oT(t))}if(r.isFog){const e=fc("color","color",r).setGroup(ba),t=fc("near","float",r).setGroup(ba),s=fc("far","float",r).setGroup(ba);return lT(e,aT(t,s))}o("Renderer: Unsupported fog configuration.",r)});t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,()=>!0===r.isCubeTexture?pc(r):!0===r.isTexture?Fl(r):void o("Nodes: Unsupported environment configuration.",r));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace+","+e.xr.isPresenting}hasOutputChange(e){return rS.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?mx(e,vn(Hl,kl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Fl(e,Hl).renderOutput(t.toneMapping,t.currentColorSpace);return rS.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new DN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const aS=new je;class oS{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new mS(i.framebufferWidth,i.framebufferHeight,{format:Re,type:Ge,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),i.layers.mask=6|e.layers.mask,n.layers.mask=-5&i.layers.mask,a.layers.mask=-3&i.layers.mask;const o=e.parent,u=i.cameras;xS(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function NS(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function SS(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(this._renderTarget,this._mrt),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){return null!==this._initPromise||(this._initPromise=new Promise(async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new nS(this,r),this._animation=new Kf(this,this._nodes,this.info),this._attributes=new oy(r),this._background=new eN(this,this._nodes),this._geometries=new dy(this._attributes,this.info),this._textures=new My(this,r,this.info),this._pipelines=new yy(r,this._nodes),this._bindings=new by(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new ey(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Sy(this.lighting),this._bundles=new dS,this._renderContexts=new wy,this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._handleObjectFunction,u=this._compilationPromises,l=!0===e.isScene?e:AS;null===r&&(r=e);const d=this._renderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new oS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(e,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u,await Promise.all(p)}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=wd,t.modelNormalViewMatrix=Cd):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===wd&&e.modelNormalViewMatrix===Cd}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=_,g.viewportValue.maxDepth=v,g.viewport=!1===g.viewportValue.equals(wS),g.scissorValue.copy(x).multiplyScalar(T).floor(),g.scissor=y._scissorTest&&!1===g.scissorValue.equals(wS),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new oS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const N=t.isArrayCamera?MS:CS;t.isArrayCamera||(BS.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),N.setFromProjectionMatrix(BS,t.coordinateSystem,t.reversedDepth));const S=this._renderLists.get(e,t);if(S.begin(),this._projectObject(e,t,0,S,g.clippingContext),S.finish(),!0===this.sortObjects&&S.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=ES.width,g.height=ES.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=S.occlusionQueryCount,g.scissorValue.max(LS.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,S,g),g.camera=t,this.backend.beginRender(g);const{bundles:R,lightsNode:A,transparentDoublePass:E,transparent:w,opaque:C}=S;return R.length>0&&this._renderBundles(R,l,A),!0===this.opaque&&C.length>0&&this._renderObjects(C,t,l,A),!0===this.transparent&&w.length>0&&this._renderTransparents(w,E,t,l,A),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._height=t,this.setViewport(0,0,e,t)}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,n)}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.get(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){!0===this._initialized&&(this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach(e=>{null!==e&&e.dispose()})),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.deleteForCompute(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=LS.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=LS.copy(t).floor()}else t=LS.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t),this._inspector.copyFramebufferToTexture(e)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n),this._inspector.copyTextureToTexture(e,t)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?MS:CS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&LS.setFromMatrixPosition(e.matrixWorld).applyMatrix4(BS);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,LS.z,null,i)}}else if(e.isLineLoop)o("Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if(e.isMesh||e.isLine||e.isPoints){const n=t.isArrayCamera?MS:CS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),LS.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(BS)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=M;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=ct;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=B}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n(t.not().discard(),e))(u)}}e.depthNode&&e.depthNode.isNode&&(l=e.depthNode),e.castShadowPositionNode&&e.castShadowPositionNode.isNode?o=e.castShadowPositionNode:e.positionNode&&e.positionNode.isNode&&(o=e.positionNode),r={version:t,colorNode:u,depthNode:l,positionNode:o},this._cacheShadowNodes.set(e,r)}return r}renderObject(e,t,r,s,i,n,a,o=null,u=null){let l,d,c,h,p=!1;if(e.onBeforeRender(this,t,r,s,i,n),!0===i.allowOverride&&null!==t.overrideMaterial){const e=t.overrideMaterial;if(p=!0,l=t.overrideMaterial.colorNode,d=t.overrideMaterial.depthNode,c=t.overrideMaterial.positionNode,h=t.overrideMaterial.side,i.positionNode&&i.positionNode.isNode&&(e.positionNode=i.positionNode),e.alphaTest=i.alphaTest,e.alphaMap=i.alphaMap,e.transparent=i.transparent||i.transmission>0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);this.shadowMap.type===Ze?e.side=null!==i.shadowSide?i.shadowSide:i.side:e.side=null!==i.shadowSide?i.shadowSide:FS[i.side],null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===B&&!1===i.forceSinglePass?(i.side=M,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=ct,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=B):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){return this.backend.hasCompatibility(e)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class DS{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class US extends DS{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(ay-e%ay)%ay;var e}get buffer(){return this._buffer}update(){return!0}}class IS extends US{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let OS=0;class VS extends IS{constructor(e,t){super("UniformBuffer_"+OS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class kS extends IS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.generation=null,this.version=0},this.texture=t,this.version=t?t.version:0,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=0},e.texture=this.texture,e}}let WS=0;class HS extends $S{constructor(e,t){super(e,t),this.id=WS++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class qS extends HS{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class jS extends qS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class XS extends qS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const KS={bitcast_int_uint:new Xx("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new Xx("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},YS={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},QS={low:"lowp",medium:"mediump",high:"highp"},ZS={swizzleAssign:!0,storageBuffer:!1},JS={perspective:"smooth",linear:"noperspective"},eR={centroid:"centroid"},tR="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision highp sampler2DShadow;\nprecision highp sampler2DArrayShadow;\nprecision highp samplerCubeShadow;\n";class rR extends PN{constructor(e,t){super(e,t,new tS),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=KS[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==KS[e]&&this._include(e),YS[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`${e} ? ${t} : ${r}`}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?Tt:_t;2===s?n=i?Rt:G:3===s?n=i?At:Et:4===s&&(n=i?wt:Re);const a={Float32Array:j,Uint8Array:Ge,Uint16Array:St,Uint32Array:S,Int8Array:Nt,Int16Array:vt,Int32Array:R,Uint8ClampedArray:Ge},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=QS[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=QS[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${JS[s.interpolationType]||s.interpolationType} ${eR[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${JS[e.interpolationType]||e.interpolationType} ${eR[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce((e,t)=>e*t,1)}u`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=ZS[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}ZS[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new qS(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new jS(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new XS(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new VS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new zS(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let sR=null,iR=null;class nR{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[Ct.RENDER]:null,[Ct.COMPUTE]:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?Ct.COMPUTE:Ct.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return sR=sR||new t,this.renderer.getDrawingBufferSize(sR)}setScissorTest(){}getClearColor(){const e=this.renderer;return iR=iR||new By,e.getClearColor(iR),iR.getRGB(iR),iR}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Mt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${ut} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}deleteBindGroupData(){}dispose(){}}let aR,oR,uR=0;class lR{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class dR{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===R,id:uR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new lR(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e0?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()})}}let pR,gR,mR,fR=!1;class yR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===fR&&(this._init(),fR=!0)}_init(){const e=this.gl;pR={[Vr]:e.REPEAT,[xe]:e.CLAMP_TO_EDGE,[Or]:e.MIRRORED_REPEAT},gR={[w]:e.NEAREST,[kr]:e.NEAREST_MIPMAP_NEAREST,[at]:e.NEAREST_MIPMAP_LINEAR,[oe]:e.LINEAR,[nt]:e.LINEAR_MIPMAP_NEAREST,[K]:e.LINEAR_MIPMAP_LINEAR},mR={[qr]:e.NEVER,[Hr]:e.ALWAYS,[E]:e.LESS,[Je]:e.LEQUAL,[Wr]:e.EQUAL,[$r]:e.GEQUAL,[zr]:e.GREATER,[Gr]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];d("WebGLBackend: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}if(t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)}return t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this,n=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,o),r.texParameteri(e,r.TEXTURE_WRAP_S,pR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,pR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,pR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,gR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===oe&&u?K:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,gR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,mR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===w)return;if(t.minFilter!==at&&t.minFilter!==K)return;if(t.type===j&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(!e.isRenderTargetTexture&&void 0!==n)if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0){const t=Xr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e));i.bindRenderbuffer(i.RENDERBUFFER,null)}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();a.state.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function bR(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class xR{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class TR{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const _R={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class vR{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){o("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){o("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise(t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){o("Error checking query:",e),t(this.lastValue)}};n()})}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class RR extends nR{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.currentSamples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new xR(this),this.capabilities=new TR(this),this.attributeUtils=new dR(this),this.textureUtils=new yR(this),this.bufferRenderer=new vR(this),this.state=new cR(this),this.utils=new hR(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed")}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e._autoAllocateDepthBuffer&&!1===e.multiview&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new SR(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e)),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(v("WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):v("WebGLBackend: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()});return void t.push(i)}this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=(e.getShaderInfoLog(t)||"").trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=(s.getProgramInfoLog(e)||"").trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");o("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&d("WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;e_R[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=Ey(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const AR="point-list",ER="line-list",wR="line-strip",CR="triangle-list",MR="triangle-strip",BR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},LR="never",FR="less",PR="equal",DR="less-equal",UR="greater",IR="not-equal",OR="greater-equal",VR="always",kR="store",GR="load",zR="clear",$R="ccw",WR="cw",HR="none",qR="back",jR="uint16",XR="uint32",KR="r8unorm",YR="r8snorm",QR="r8uint",ZR="r8sint",JR="r16uint",eA="r16sint",tA="r16float",rA="rg8unorm",sA="rg8snorm",iA="rg8uint",nA="rg8sint",aA="r32uint",oA="r32sint",uA="r32float",lA="rg16uint",dA="rg16sint",cA="rg16float",hA="rgba8unorm",pA="rgba8unorm-srgb",gA="rgba8snorm",mA="rgba8uint",fA="rgba8sint",yA="bgra8unorm",bA="bgra8unorm-srgb",xA="rgb9e5ufloat",TA="rgb10a2unorm",_A="rg11b10ufloat",vA="rg32uint",NA="rg32sint",SA="rg32float",RA="rgba16uint",AA="rgba16sint",EA="rgba16float",wA="rgba32uint",CA="rgba32sint",MA="rgba32float",BA="depth16unorm",LA="depth24plus",FA="depth24plus-stencil8",PA="depth32float",DA="depth32float-stencil8",UA="bc1-rgba-unorm",IA="bc1-rgba-unorm-srgb",OA="bc2-rgba-unorm",VA="bc2-rgba-unorm-srgb",kA="bc3-rgba-unorm",GA="bc3-rgba-unorm-srgb",zA="bc4-r-unorm",$A="bc4-r-snorm",WA="bc5-rg-unorm",HA="bc5-rg-snorm",qA="bc6h-rgb-ufloat",jA="bc6h-rgb-float",XA="bc7-rgba-unorm",KA="bc7-rgba-unorm-srgb",YA="etc2-rgb8unorm",QA="etc2-rgb8unorm-srgb",ZA="etc2-rgb8a1unorm",JA="etc2-rgb8a1unorm-srgb",eE="etc2-rgba8unorm",tE="etc2-rgba8unorm-srgb",rE="eac-r11unorm",sE="eac-r11snorm",iE="eac-rg11unorm",nE="eac-rg11snorm",aE="astc-4x4-unorm",oE="astc-4x4-unorm-srgb",uE="astc-5x4-unorm",lE="astc-5x4-unorm-srgb",dE="astc-5x5-unorm",cE="astc-5x5-unorm-srgb",hE="astc-6x5-unorm",pE="astc-6x5-unorm-srgb",gE="astc-6x6-unorm",mE="astc-6x6-unorm-srgb",fE="astc-8x5-unorm",yE="astc-8x5-unorm-srgb",bE="astc-8x6-unorm",xE="astc-8x6-unorm-srgb",TE="astc-8x8-unorm",_E="astc-8x8-unorm-srgb",vE="astc-10x5-unorm",NE="astc-10x5-unorm-srgb",SE="astc-10x6-unorm",RE="astc-10x6-unorm-srgb",AE="astc-10x8-unorm",EE="astc-10x8-unorm-srgb",wE="astc-10x10-unorm",CE="astc-10x10-unorm-srgb",ME="astc-12x10-unorm",BE="astc-12x10-unorm-srgb",LE="astc-12x12-unorm",FE="astc-12x12-unorm-srgb",PE="clamp-to-edge",DE="repeat",UE="mirror-repeat",IE="linear",OE="nearest",VE="zero",kE="one",GE="src",zE="one-minus-src",$E="src-alpha",WE="one-minus-src-alpha",HE="dst",qE="one-minus-dst",jE="dst-alpha",XE="one-minus-dst-alpha",KE="src-alpha-saturated",YE="constant",QE="one-minus-constant",ZE="add",JE="subtract",ew="reverse-subtract",tw="min",rw="max",sw=0,iw=15,nw="keep",aw="zero",ow="replace",uw="invert",lw="increment-clamp",dw="decrement-clamp",cw="increment-wrap",hw="decrement-wrap",pw="storage",gw="read-only-storage",mw="write-only",fw="read-only",yw="read-write",bw="non-filtering",xw="comparison",Tw="float",_w="unfilterable-float",vw="depth",Nw="sint",Sw="uint",Rw="2d",Aw="3d",Ew="2d",ww="2d-array",Cw="cube",Mw="3d",Bw="all",Lw="vertex",Fw="instance",Pw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"},Dw={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class Uw extends $S{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class Iw extends US{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let Ow=0;class Vw extends Iw{constructor(e,t){super("StorageBuffer_"+Ow++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ti.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class kw extends ty{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:IE}),this.flipYSampler=e.createSampler({minFilter:OE}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:MR,stripIndexFormat:XR},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:MR,stripIndexFormat:XR},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Ew,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:Ew,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:zR,storeOp:kR,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0,s=null){const i=this.get(e);void 0===i.layers&&(i.layers=[]);const n=i.layers[r]||this._mipmapCreateBundles(e,t,r),a=s||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(a,n),null===s&&this.device.queue.submit([a.finish()]),i.layers[r]=n}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Ew,baseArrayLayer:r});const a=[];for(let o=1;o0)for(let t=0,n=s.length;t0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new kw(this.backend.device)),e}_generateMipmaps(e,t,r=0,s=null){this._getPassUtils().generateMipmaps(e,t,r,s)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,qw=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,jw={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class Xw extends YN{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(Hw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=qw.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class Kw extends KN{parseFunction(e){return new Xw(e)}}const Yw={[ti.READ_ONLY]:"read",[ti.WRITE_ONLY]:"write",[ti.READ_WRITE]:"read_write"},Qw={[Vr]:"repeat",[xe]:"clamp",[Or]:"mirror"},Zw={vertex:BR.VERTEX,fragment:BR.FRAGMENT,compute:BR.COMPUTE},Jw={instance:!0,swizzleAssign:!1,storageBuffer:!0},eC={"^^":"tsl_xor"},tC={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},rC={},sC={tsl_xor:new Xx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new Xx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new Xx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new Xx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new Xx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new Xx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new Xx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new Xx("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new Xx("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new Xx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new Xx("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new Xx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new Xx("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},iC={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let nC="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(nC+="diagnostic( off, derivative_uniformity );\n");class aC extends PN{constructor(e,t){super(e,t,new Kw),this.uniformGroups={},this.uniformGroupsBindings={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${Qw[e.wrapS]}S_${Qw[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=rC[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Vr?(s.push(sC.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===xe?(s.push(sC.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Or?(s.push(sC.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",rC[t]=r=new Xx(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Au(new pl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Au(new pl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Au(new pl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u"){this._include("biquadraticTexture");const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${a}`),`tsl_biquadraticTexture( ${t}, ${n}( ${r} ), ${a}, u32( ${i} ) )`}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";return i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`),r=`${u}( ${a}( ${r} ) * ${u}( ${o} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction&&this.renderer.hasCompatibility(A.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===j||!1===this.isSampleCompare(e)&&e.minFilter===w&&e.magFilter===w||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"cubeDepthTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=eC[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),ti.READ_WRITE):ti.READ_ONLY:e.access}getStorageAccess(e,t){return Yw[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new XS(i.name,i.node,o,n):new qS(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new jS(i.name,i.node,o,n):"texture3D"===t&&(s=new XS(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(Zw[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new Uw(`${i.name}_sampler`,i.node,o);e.setVisibility(Zw[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?VS:Vw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|Zw[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e?(e=new zS(u,o),e.setVisibility(Zw[r]),this.uniformGroups[u]=e,l.push(e)):(e.setVisibility(e.getVisibility()|Zw[r]),-1===l.indexOf(e)&&l.push(e)),a=this.getNodeUniform(i,t);const s=a.name;e.uniforms.some(e=>e.name===s)||e.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","builtinClipSpace","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!1===this.isUnfilterable(t)&&!0!==i.node.isStorageTextureNode)&&(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=Ww(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}let s=this.uniformGroupsBindings[e];void 0===s&&(s={index:a.binding++,id:a.group},this.uniformGroupsBindings[e]=s),n[e]={index:s.index,id:s.id,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.builtinClipSpace = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return tC[e]||e}isAvailable(e){let t=Jw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),Jw[e]=t),t}_getWGSLMethod(e){return void 0!==sC[e]&&this._include(e),iC[e]}_include(e){const t=sC[e];return t.build(this),this.addInclude(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${nC}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){const[r,s,i]=t;return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class oC{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return e.depth&&(t=null!==e.depthTexture?this.getTextureFormatGPU(e.depthTexture):e.stencil?FA:LA),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.currentSamples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?AR:e.isLineSegments||e.isMesh&&!0===t.wireframe?ER:e.isLine?wR:e.isMesh?CR:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ge)return yA;if(e===be)return EA;throw new Error("Unsupported output buffer type.")}}const uC=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&uC.set(Float16Array,["float16"]);const lC=new Map([[ot,["float16"]]]),dC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class cC{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=Kr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=Bw;let o;o=t.isSampledCubeTexture?Cw:t.isSampledTexture3D?Mw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?ww:Ew,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&BR.COMPUTE&&(s.access===ti.READ_WRITE||s.access===ti.WRITE_ONLY)?e.type=pw:e.type=gw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===ti.READ_WRITE?yw:t===ti.WRITE_ONLY?mw:fw,s.texture.isArrayTexture?e.viewDimension=ww:s.texture.is3DTexture&&(e.viewDimension=Mw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=_w)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=_w:t.sampleType=vw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=Nw:e===S?t.sampleType=Sw:e===j&&(this.backend.hasFeature("float32-filterable")?t.sampleType=Tw:t.sampleType=_w)}s.isSampledCubeTexture?t.viewDimension=Cw:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=ww:s.isSampledTexture3D&&(t.viewDimension=Mw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(A.TEXTURE_COMPARE)?t.type=xw:t.type=bw),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class gC{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===ee||s.blending===ze&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures,r=e.context.mrt;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},A={},E=e.context.depth,w=e.context.stencil;if(!0!==E&&!0!==w||(!0===E&&(A.format=N,A.depthWriteEnabled=s.depthWrite,A.depthCompare=v),!0===w&&(A.stencilFront=f,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(A.depthBias=s.polygonOffsetUnits,A.depthBiasSlopeScale=s.polygonOffsetFactor,A.depthBiasClamp=0),R.depthStencil=A),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(R),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(R)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),e()});t.push(e)}}createBundleEncoder(e,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:s.getCurrentColorFormats(e),depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e),{layoutGPU:s}=t.layout;a.push(s)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===ht){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:ZE},r={srcFactor:i,dstFactor:n,operation:ZE}};if(e.premultipliedAlpha)switch(s){case ze:i(kE,WE,kE,WE);break;case qt:i(kE,kE,kE,kE);break;case Ht:i(VE,zE,VE,kE);break;case Wt:i(HE,WE,VE,kE)}else switch(s){case ze:i($E,WE,kE,WE);break;case qt:i($E,kE,kE,kE);break;case Ht:o(`WebGPURenderer: "SubtractiveBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`);break;case Wt:o(`WebGPURenderer: "MultiplyBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case pt:t=VE;break;case kt:t=kE;break;case Vt:t=GE;break;case Dt:t=zE;break;case $e:t=$E;break;case We:t=WE;break;case It:t=HE;break;case Pt:t=qE;break;case Ut:t=jE;break;case Ft:t=XE;break;case Ot:t=KE;break;case 211:t=YE;break;case 212:t=QE;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ss:t=LR;break;case rs:t=VR;break;case ts:t=FR;break;case es:t=DR;break;case Jr:t=PR;break;case Zr:t=OR;break;case Qr:t=UR;break;case Yr:t=IR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case cs:t=nw;break;case ds:t=aw;break;case ls:t=ow;break;case us:t=uw;break;case os:t=lw;break;case as:t=dw;break;case ns:t=cw;break;case is:t=hw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case He:t=ZE;break;case Lt:t=JE;break;case Bt:t=ew;break;case ps:t=tw;break;case hs:t=rw;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?jR:XR);let n=r.side===M;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?WR:$R,s.cullMode=r.side===B?HR:qR,s}_getColorWriteMask(e){return!0===e.colorWrite?iw:sw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=VR;else{const r=e.depthFunc;switch(r){case er:t=LR;break;case Jt:t=VR;break;case Zt:t=FR;break;case Qt:t=DR;break;case Yt:t=PR;break;case Kt:t=OR;break;case Xt:t=UR;break;case jt:t=IR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class mC extends NR{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class fC extends nR{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.defaultRenderPassdescriptor=null,this.utils=new oC(this),this.attributeUtils=new cC(this),this.bindingUtils=new pC(this),this.pipelineUtils=new gC(this),this.textureUtils=new $w(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[A.TEXTURE_COMPARE]:t}}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:t.compatibilityMode?"compatibility":void 0},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(Pw),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}else r=t.device;r.lost.then(t=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Pw.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${ut} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===be?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:GR}),this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e),n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n),l=u.pipeline;if(!0===u.error)return;const d=e.getIndex(),c=null!==d,h=e.getDrawParameters();if(null===h)return;const p=(t,r)=>{this.pipelineUtils.setPipeline(t,l),r.pipeline=l;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(p(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&v("WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===c?s.drawIndexed(i[o],n,e[o]/d.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===c){const{vertexCount:i,instanceCount:n,firstVertex:a}=h,o=e.getIndirect();if(null!==o){const t=this.get(o).buffer,r=e.getIndirectOffset(),i=Array.isArray(r)?r:[r];for(let e=0;e0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new RR(e)));super(new t(e),e),this.library=new xC,this.isWebGPURenderer=!0}}class _C extends Es{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class vC{constructor(e,t=An(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Qp;r.name="PostProcessing",this._quadMesh=new $b(r),this._quadMesh.name="Post-Processing",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=yl(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){v('PostProcessing: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class NC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class SC extends rx{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class RC extends ws{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Cs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):o(t),this.manager.itemError(e)}},r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(o("NodeLoader: Node type not found:",e),gn()):new this.nodes[e]}}class AC extends Ms{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class EC extends Bs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new RC;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new AC;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}t.lights=this.getLightsData(e.lightsNode.getLights()),this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const Us=e=>Ds(e),Is=e=>Ds(e),Os=(...e)=>Ds(e),Vs=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),ks=new WeakMap;function Gs(e){return Vs.get(e)}function zs(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function $s(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Ws(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Hs(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function qs(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function js(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Ys(u[0]):null}function Xs(e){let t=ks.get(e);return void 0===t&&(t={},ks.set(e,t)),t}function Ks(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Qs=Object.freeze({__proto__:null,arrayBufferToBase64:Ks,base64ToArrayBuffer:Ys,getAlignmentFromType:Hs,getDataFromObject:Xs,getLengthFromType:$s,getMemoryLengthFromType:Ws,getTypeFromLength:Gs,getTypedArrayFromType:zs,getValueFromType:js,getValueType:qs,hash:Os,hashArray:Is,hashString:Us});const Zs={VERTEX:"vertex",FRAGMENT:"fragment"},Js={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},ei={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ti={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ri=["fragment","vertex"],si=["setup","analyze","generate"],ii=[...ri,"compute"],ni=["x","y","z","w"],ai={analyze:"setup",generate:"analyze"};let oi=0;class ui extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Js.NONE,this.updateBeforeType=Js.NONE,this.updateAfterType=Js.NONE,this.uuid=l.generateUUID(),this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:oi++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this),this}onFrameUpdate(e){return this.onUpdate(e,Js.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Js.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Js.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.7,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class li extends ui{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}getMemberType(e,t){return this.node.getMemberType(e,t)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class di extends ui{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class ci extends ui{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class hi extends ci{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce((t,r)=>t+e.getTypeLength(r.getNodeType(e)),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const pi=ni.join("");class gi extends ui{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(ni.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}getScope(){return this.node.getScope()}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===pi.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class mi extends ci{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");ui.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==_i?_i.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn()."),this;{const t=vi.get("assign");return this.addToStack(t(...e))}},ui.prototype.toVarIntent=function(){return this},ui.prototype.get=function(e){return new Ti(this,e)};const Ri={};function Ai(e,t,r){Ri[e]=Ri[t]=Ri[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new gi(this,e),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();ui.prototype["set"+s]=ui.prototype["set"+i]=ui.prototype["set"+n]=function(t){const r=Si(e);return new mi(this,r,Zi(t))},ui.prototype["flip"+s]=ui.prototype["flip"+i]=ui.prototype["flip"+n]=function(){const t=Si(e);return new fi(this,t)}}const Ei=["x","y","z","w"],wi=["r","g","b","a"],Ci=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ei[e],r=wi[e],s=Ci[e];Ai(t,r,s);for(let i=0;i<4;i++){t=Ei[e]+Ei[i],r=wi[e]+wi[i],s=Ci[e]+Ci[i],Ai(t,r,s);for(let n=0;n<4;n++){t=Ei[e]+Ei[i]+Ei[n],r=wi[e]+wi[i]+wi[n],s=Ci[e]+Ci[i]+Ci[n],Ai(t,r,s);for(let a=0;a<4;a++)t=Ei[e]+Ei[i]+Ei[n]+Ei[a],r=wi[e]+wi[i]+wi[n]+wi[a],s=Ci[e]+Ci[i]+Ci[n]+Ci[a],Ai(t,r,s)}}}for(let e=0;e<32;e++)Ri[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new li(this,new xi(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};Object.defineProperties(ui.prototype,Ri);const Mi=new WeakMap,Bi=function(e,t=null){for(const r in e)e[r]=Zi(e[r],t);return e},Li=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...tn(d(t)))):null!==r?(r=Zi(r),n=(...s)=>i(new e(t,...tn(d(s)),r))):n=(...r)=>i(new e(t,...tn(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Pi=function(e,...t){return new e(...tn(t))};class Di extends ui{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=Mi.get(e.constructor);void 0===s&&(s=new WeakMap,Mi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Zi(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;en(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=Zi(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return en(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield Zi(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof ui&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=Zi(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=Zi(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e),o=e.fnCall;if(e.fnCall=this,"setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return e.fnCall=o,r}}class Ui extends ui{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Di(this,e)}setup(){return this.call()}}const Ii=[!1,!0],Oi=[0,1,2,3],Vi=[-1,-2],ki=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Gi=new Map;for(const e of Ii)Gi.set(e,new xi(e));const zi=new Map;for(const e of Oi)zi.set(e,new xi(e,"uint"));const $i=new Map([...zi].map(e=>new xi(e.value,"int")));for(const e of Vi)$i.set(e,new xi(e,"int"));const Wi=new Map([...$i].map(e=>new xi(e.value)));for(const e of ki)Wi.set(e,new xi(e));for(const e of ki)Wi.set(-e,new xi(-e));const Hi={bool:Gi,uint:zi,ints:$i,float:Wi},qi=new Map([...Gi,...Wi]),ji=(e,t)=>qi.has(e)?qi.get(e):!0===e.isNode?e:new xi(e,t),Xi=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`),new xi(0,e);if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[js(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Ji(t.get(r[0]));if(1===r.length){const t=ji(r[0],e);return t.nodeType===e?Ji(t):Ji(new di(t,e))}const s=r.map(e=>ji(e));return Ji(new hi(s,e))}},Ki=e=>"object"==typeof e&&null!==e?e.value:e,Yi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Qi(e,t){return new Ui(e,t)}const Zi=(e,t=null)=>function(e,t=null){const r=qs(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Zi(ji(e,t)):"shader"===r?e.isFn?e:un(e):e}(e,t),Ji=(e,t=null)=>Zi(e,t).toVarIntent(),en=(e,t=null)=>new Bi(e,t),tn=(e,t=null)=>new Li(e,t),rn=(e,t=null,r=null,s=null)=>new Fi(e,t,r,s),sn=(e,...t)=>new Pi(e,...t),nn=(e,t=null,r=null,s={})=>new Fi(e,t,r,{...s,intent:!0});let an=0;class on extends ui{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type."),t=null)),this.shaderNode=new Qi(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+an++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function un(e,t=null){const r=new on(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const ln=e=>{_i=e},dn=()=>_i,cn=(...e)=>_i.If(...e);function hn(e){return _i&&_i.addToStack(e),e}Ni("toStack",hn);const pn=new Xi("color"),gn=new Xi("float",Hi.float),mn=new Xi("int",Hi.ints),fn=new Xi("uint",Hi.uint),yn=new Xi("bool",Hi.bool),bn=new Xi("vec2"),xn=new Xi("ivec2"),Tn=new Xi("uvec2"),_n=new Xi("bvec2"),vn=new Xi("vec3"),Nn=new Xi("ivec3"),Sn=new Xi("uvec3"),Rn=new Xi("bvec3"),An=new Xi("vec4"),En=new Xi("ivec4"),wn=new Xi("uvec4"),Cn=new Xi("bvec4"),Mn=new Xi("mat2"),Bn=new Xi("mat3"),Ln=new Xi("mat4");Ni("toColor",pn),Ni("toFloat",gn),Ni("toInt",mn),Ni("toUint",fn),Ni("toBool",yn),Ni("toVec2",bn),Ni("toIVec2",xn),Ni("toUVec2",Tn),Ni("toBVec2",_n),Ni("toVec3",vn),Ni("toIVec3",Nn),Ni("toUVec3",Sn),Ni("toBVec3",Rn),Ni("toVec4",An),Ni("toIVec4",En),Ni("toUVec4",wn),Ni("toBVec4",Cn),Ni("toMat2",Mn),Ni("toMat3",Bn),Ni("toMat4",Ln);const Fn=rn(li).setParameterLength(2),Pn=(e,t)=>Zi(new di(Zi(e),t));Ni("element",Fn),Ni("convert",Pn);Ni("append",e=>(d("TSL: .append() has been renamed to .toStack()."),hn(e)));class Dn extends ui{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}customCacheKey(){return Us(this.type+":"+(this.name||"")+":"+(this.varying?"1":"0"))}getHash(e){return this.name||super.getHash(e)}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const Un=(e,t)=>new Dn(e,t),In=(e,t)=>new Dn(e,t,!0),On=sn(Dn,"vec4","DiffuseColor"),Vn=sn(Dn,"vec3","DiffuseContribution"),kn=sn(Dn,"vec3","EmissiveColor"),Gn=sn(Dn,"float","Roughness"),zn=sn(Dn,"float","Metalness"),$n=sn(Dn,"float","Clearcoat"),Wn=sn(Dn,"float","ClearcoatRoughness"),Hn=sn(Dn,"vec3","Sheen"),qn=sn(Dn,"float","SheenRoughness"),jn=sn(Dn,"float","Iridescence"),Xn=sn(Dn,"float","IridescenceIOR"),Kn=sn(Dn,"float","IridescenceThickness"),Yn=sn(Dn,"float","AlphaT"),Qn=sn(Dn,"float","Anisotropy"),Zn=sn(Dn,"vec3","AnisotropyT"),Jn=sn(Dn,"vec3","AnisotropyB"),ea=sn(Dn,"color","SpecularColor"),ta=sn(Dn,"color","SpecularColorBlended"),ra=sn(Dn,"float","SpecularF90"),sa=sn(Dn,"float","Shininess"),ia=sn(Dn,"vec4","Output"),na=sn(Dn,"float","dashSize"),aa=sn(Dn,"float","gapSize"),oa=sn(Dn,"float","pointWidth"),ua=sn(Dn,"float","IOR"),la=sn(Dn,"float","Transmission"),da=sn(Dn,"float","Thickness"),ca=sn(Dn,"float","AttenuationDistance"),ha=sn(Dn,"color","AttenuationColor"),pa=sn(Dn,"float","Dispersion");class ga extends ui{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const ma=e=>new ga(e),fa=(e,t=0)=>new ga(e,!0,t),ya=fa("frame"),ba=fa("render"),xa=ma("object");class Ta extends yi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=xa}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),t}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const _a=(e,t)=>{const r=Yi(t||e);if(r===e&&(e=js(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new Ta(e,r)};class va extends ci{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const Na=(...e)=>{let t;if(1===e.length){const r=e[0];t=new va(null,r.length,r)}else{const r=e[0],s=e[1];t=new va(r,s)}return Zi(t)};Ni("toArray",(e,t)=>Na(Array(t).fill(e)));class Sa extends ci{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return ni.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.build(e),a=r.getNodeType(e),o=s.build(e,a),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=n);else if(i){const s=e.getVarFromNode(this,null,a),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)o("TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?tn(t):en(t[0]),new Aa(Zi(e),t));Ni("call",Ea);const wa={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ca extends ci{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ca(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const Ma=nn(Ca,"+").setParameterLength(2,1/0).setName("add"),Ba=nn(Ca,"-").setParameterLength(2,1/0).setName("sub"),La=nn(Ca,"*").setParameterLength(2,1/0).setName("mul"),Fa=nn(Ca,"/").setParameterLength(2,1/0).setName("div"),Pa=nn(Ca,"%").setParameterLength(2).setName("mod"),Da=nn(Ca,"==").setParameterLength(2).setName("equal"),Ua=nn(Ca,"!=").setParameterLength(2).setName("notEqual"),Ia=nn(Ca,"<").setParameterLength(2).setName("lessThan"),Oa=nn(Ca,">").setParameterLength(2).setName("greaterThan"),Va=nn(Ca,"<=").setParameterLength(2).setName("lessThanEqual"),ka=nn(Ca,">=").setParameterLength(2).setName("greaterThanEqual"),Ga=nn(Ca,"&&").setParameterLength(2,1/0).setName("and"),za=nn(Ca,"||").setParameterLength(2,1/0).setName("or"),$a=nn(Ca,"!").setParameterLength(1).setName("not"),Wa=nn(Ca,"^^").setParameterLength(2).setName("xor"),Ha=nn(Ca,"&").setParameterLength(2).setName("bitAnd"),qa=nn(Ca,"~").setParameterLength(1).setName("bitNot"),ja=nn(Ca,"|").setParameterLength(2).setName("bitOr"),Xa=nn(Ca,"^").setParameterLength(2).setName("bitXor"),Ka=nn(Ca,"<<").setParameterLength(2).setName("shiftLeft"),Ya=nn(Ca,">>").setParameterLength(2).setName("shiftRight"),Qa=un(([e])=>(e.addAssign(1),e)),Za=un(([e])=>(e.subAssign(1),e)),Ja=un(([e])=>{const t=mn(e).toConst();return e.addAssign(1),t}),eo=un(([e])=>{const t=mn(e).toConst();return e.subAssign(1),t});Ni("add",Ma),Ni("sub",Ba),Ni("mul",La),Ni("div",Fa),Ni("mod",Pa),Ni("equal",Da),Ni("notEqual",Ua),Ni("lessThan",Ia),Ni("greaterThan",Oa),Ni("lessThanEqual",Va),Ni("greaterThanEqual",ka),Ni("and",Ga),Ni("or",za),Ni("not",$a),Ni("xor",Wa),Ni("bitAnd",Ha),Ni("bitNot",qa),Ni("bitOr",ja),Ni("bitXor",Xa),Ni("shiftLeft",Ka),Ni("shiftRight",Ya),Ni("incrementBefore",Qa),Ni("decrementBefore",Za),Ni("increment",Ja),Ni("decrement",eo);const to=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),Pa(mn(e),mn(t)));Ni("modInt",to);class ro extends ci{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===ro.MAX||e===ro.MIN)&&arguments.length>3){let i=new ro(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===ro.LENGTH||t===ro.DISTANCE||t===ro.DOT?"float":t===ro.CROSS?"vec3":t===ro.ALL||t===ro.ANY?"bool":t===ro.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===ro.ONE_MINUS)i=Ba(1,t);else if(s===ro.RECIPROCAL)i=Fa(1,t);else if(s===ro.DIFFERENCE)i=Mo(Ba(t,r));else if(s===ro.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=An(vn(n),0):s=An(vn(s),0);const a=La(s,n).xyz;i=vo(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.generate(e,t);let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===ro.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===ro.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===ro.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==ro.MIN&&r!==ro.MAX?r===ro.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===ro.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===ro.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==ro.DFDX&&r!==ro.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}ro.ALL="all",ro.ANY="any",ro.RADIANS="radians",ro.DEGREES="degrees",ro.EXP="exp",ro.EXP2="exp2",ro.LOG="log",ro.LOG2="log2",ro.SQRT="sqrt",ro.INVERSE_SQRT="inversesqrt",ro.FLOOR="floor",ro.CEIL="ceil",ro.NORMALIZE="normalize",ro.FRACT="fract",ro.SIN="sin",ro.COS="cos",ro.TAN="tan",ro.ASIN="asin",ro.ACOS="acos",ro.ATAN="atan",ro.ABS="abs",ro.SIGN="sign",ro.LENGTH="length",ro.NEGATE="negate",ro.ONE_MINUS="oneMinus",ro.DFDX="dFdx",ro.DFDY="dFdy",ro.ROUND="round",ro.RECIPROCAL="reciprocal",ro.TRUNC="trunc",ro.FWIDTH="fwidth",ro.TRANSPOSE="transpose",ro.DETERMINANT="determinant",ro.INVERSE="inverse",ro.EQUALS="equals",ro.MIN="min",ro.MAX="max",ro.STEP="step",ro.REFLECT="reflect",ro.DISTANCE="distance",ro.DIFFERENCE="difference",ro.DOT="dot",ro.CROSS="cross",ro.POW="pow",ro.TRANSFORM_DIRECTION="transformDirection",ro.MIX="mix",ro.CLAMP="clamp",ro.REFRACT="refract",ro.SMOOTHSTEP="smoothstep",ro.FACEFORWARD="faceforward";const so=gn(1e-6),io=gn(1e6),no=gn(Math.PI),ao=gn(2*Math.PI),oo=gn(2*Math.PI),uo=gn(.5*Math.PI),lo=nn(ro,ro.ALL).setParameterLength(1),co=nn(ro,ro.ANY).setParameterLength(1),ho=nn(ro,ro.RADIANS).setParameterLength(1),po=nn(ro,ro.DEGREES).setParameterLength(1),go=nn(ro,ro.EXP).setParameterLength(1),mo=nn(ro,ro.EXP2).setParameterLength(1),fo=nn(ro,ro.LOG).setParameterLength(1),yo=nn(ro,ro.LOG2).setParameterLength(1),bo=nn(ro,ro.SQRT).setParameterLength(1),xo=nn(ro,ro.INVERSE_SQRT).setParameterLength(1),To=nn(ro,ro.FLOOR).setParameterLength(1),_o=nn(ro,ro.CEIL).setParameterLength(1),vo=nn(ro,ro.NORMALIZE).setParameterLength(1),No=nn(ro,ro.FRACT).setParameterLength(1),So=nn(ro,ro.SIN).setParameterLength(1),Ro=nn(ro,ro.COS).setParameterLength(1),Ao=nn(ro,ro.TAN).setParameterLength(1),Eo=nn(ro,ro.ASIN).setParameterLength(1),wo=nn(ro,ro.ACOS).setParameterLength(1),Co=nn(ro,ro.ATAN).setParameterLength(1,2),Mo=nn(ro,ro.ABS).setParameterLength(1),Bo=nn(ro,ro.SIGN).setParameterLength(1),Lo=nn(ro,ro.LENGTH).setParameterLength(1),Fo=nn(ro,ro.NEGATE).setParameterLength(1),Po=nn(ro,ro.ONE_MINUS).setParameterLength(1),Do=nn(ro,ro.DFDX).setParameterLength(1),Uo=nn(ro,ro.DFDY).setParameterLength(1),Io=nn(ro,ro.ROUND).setParameterLength(1),Oo=nn(ro,ro.RECIPROCAL).setParameterLength(1),Vo=nn(ro,ro.TRUNC).setParameterLength(1),ko=nn(ro,ro.FWIDTH).setParameterLength(1),Go=nn(ro,ro.TRANSPOSE).setParameterLength(1),zo=nn(ro,ro.DETERMINANT).setParameterLength(1),$o=nn(ro,ro.INVERSE).setParameterLength(1),Wo=nn(ro,ro.MIN).setParameterLength(2,1/0),Ho=nn(ro,ro.MAX).setParameterLength(2,1/0),qo=nn(ro,ro.STEP).setParameterLength(2),jo=nn(ro,ro.REFLECT).setParameterLength(2),Xo=nn(ro,ro.DISTANCE).setParameterLength(2),Ko=nn(ro,ro.DIFFERENCE).setParameterLength(2),Yo=nn(ro,ro.DOT).setParameterLength(2),Qo=nn(ro,ro.CROSS).setParameterLength(2),Zo=nn(ro,ro.POW).setParameterLength(2),Jo=e=>La(e,e),eu=e=>La(e,e,e),tu=e=>La(e,e,e,e),ru=nn(ro,ro.TRANSFORM_DIRECTION).setParameterLength(2),su=e=>La(Bo(e),Zo(Mo(e),1/3)),iu=e=>Yo(e,e),nu=nn(ro,ro.MIX).setParameterLength(3),au=(e,t=0,r=1)=>Zi(new ro(ro.CLAMP,Zi(e),Zi(t),Zi(r))),ou=e=>au(e),uu=nn(ro,ro.REFRACT).setParameterLength(3),lu=nn(ro,ro.SMOOTHSTEP).setParameterLength(3),du=nn(ro,ro.FACEFORWARD).setParameterLength(3),cu=un(([e])=>{const t=Yo(e.xy,bn(12.9898,78.233)),r=Pa(t,no);return No(So(r).mul(43758.5453))}),hu=(e,t,r)=>nu(t,r,e),pu=(e,t,r)=>lu(t,r,e),gu=(e,t)=>qo(t,e),mu=du,fu=xo;Ni("all",lo),Ni("any",co),Ni("radians",ho),Ni("degrees",po),Ni("exp",go),Ni("exp2",mo),Ni("log",fo),Ni("log2",yo),Ni("sqrt",bo),Ni("inverseSqrt",xo),Ni("floor",To),Ni("ceil",_o),Ni("normalize",vo),Ni("fract",No),Ni("sin",So),Ni("cos",Ro),Ni("tan",Ao),Ni("asin",Eo),Ni("acos",wo),Ni("atan",Co),Ni("abs",Mo),Ni("sign",Bo),Ni("length",Lo),Ni("lengthSq",iu),Ni("negate",Fo),Ni("oneMinus",Po),Ni("dFdx",Do),Ni("dFdy",Uo),Ni("round",Io),Ni("reciprocal",Oo),Ni("trunc",Vo),Ni("fwidth",ko),Ni("min",Wo),Ni("max",Ho),Ni("step",gu),Ni("reflect",jo),Ni("distance",Xo),Ni("dot",Yo),Ni("cross",Qo),Ni("pow",Zo),Ni("pow2",Jo),Ni("pow3",eu),Ni("pow4",tu),Ni("transformDirection",ru),Ni("mix",hu),Ni("clamp",au),Ni("refract",uu),Ni("smoothstep",pu),Ni("faceForward",du),Ni("difference",Ko),Ni("saturate",ou),Ni("cbrt",su),Ni("transpose",Go),Ni("determinant",zo),Ni("inverse",$o),Ni("rand",cu);class yu extends ui{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return e.flowBuildStage(this,"setup"),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.context.uniformFlow,a=e.getNodeProperties(this);a.condNode=t,a.ifNode=n?r:r.context({nodeBlock:r}),a.elseNode=s?n?s:s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?Un(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const bu=rn(yu).setParameterLength(2,3);Ni("select",bu);class xu extends ui{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const Tu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new xu(r,t)},_u=e=>Tu(e,{uniformFlow:!0}),vu=(e,t)=>Tu(e,{nodeName:t});function Nu(e,t,r=null){return Tu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function Su(e,t=null){return Tu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Ru(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),vu(e,t)}Ni("context",Tu),Ni("label",Ru),Ni("uniformFlow",_u),Ni("setName",vu),Ni("builtinShadowContext",(e,t,r)=>Nu(t,r,e)),Ni("builtinAOContext",(e,t)=>Su(t,e));class Au extends ui{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.');return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Eu=rn(Au),wu=(e,t=null)=>Eu(e,t).toStack(),Cu=(e,t=null)=>Eu(e,t,!0).toStack(),Mu=e=>Eu(e).setIntent(!0).toStack();Ni("toVar",wu),Ni("toConst",Cu),Ni("toVarIntent",Mu);class Bu extends ui{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const Lu=(e,t,r=null)=>Zi(new Bu(Zi(e),t,r));class Fu extends ui{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=Lu(e,"VERTEX"),this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null,this.global=!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),t.node=Lu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Zs.VERTEX);e.flowNodeFromShaderStage(Zs.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Pu=rn(Fu).setParameterLength(1,2),Du=e=>Pu(e);Ni("toVarying",Pu),Ni("toVertexStage",Du);const Uu=un(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return nu(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Iu=un(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return nu(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ou="WorkingColorSpace";class Vu extends ci{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===Ou?p.workingColorSpace:"OutputColorSpace"===t?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=An(Uu(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=An(Bn(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=An(Iu(i.rgb),i.a)),i):i}}const ku=(e,t)=>Zi(new Vu(Zi(e),Ou,t)),Gu=(e,t)=>Zi(new Vu(Zi(e),t,Ou));Ni("workingToColorSpace",ku),Ni("colorSpaceToWorking",Gu);let zu=class extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class $u extends ui{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Js.OBJECT}setGroup(e){return this.group=e,this}element(e){return new zu(this,Zi(e))}setNodeType(e){const t=_a(null,e);null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew Wu(e,t,r);class qu extends ci{static get type(){return"ToneMappingNode"}constructor(e,t=Xu,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Os(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=An(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const ju=(e,t,r)=>Zi(new qu(e,Zi(t),Zi(r))),Xu=Hu("toneMappingExposure","float");Ni("toneMapping",(e,t,r)=>ju(t,r,e));const Ku=new WeakMap;function Yu(e,t){let r=Ku.get(e);return void 0===r&&(r=new b(e,t),Ku.set(e,r)),r}class Qu extends yi{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Yu(s.array,i):Yu(s,i);const o=new y(a,r,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=Pu(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}function Zu(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Bn(new Qu(e,"vec3",9,0).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,3).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Ln(new Qu(e,"vec4",16,0).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,4).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,8).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Qu(e,t,r,s).setUsage(i)}const Ju=(e,t=null,r=0,s=0)=>Zu(e,t,r,s),el=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,f,!0),tl=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x,!0);Ni("toAttribute",e=>Ju(e.value));class rl extends ui{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Js.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const sl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;esl(e,r).setCount(t);Ni("compute",il),Ni("computeKernel",sl);class nl extends ui{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const al=e=>new nl(Zi(e));function ol(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),al(e).setParent(t)}Ni("cache",ol),Ni("isolate",al);class ul extends ui{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const ll=rn(ul).setParameterLength(2);Ni("bypass",ll);class dl extends ui{static get type(){return"RemapNode"}constructor(e,t,r,s=gn(0),i=gn(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const cl=rn(dl,null,null,{doClamp:!1}).setParameterLength(3,5),hl=rn(dl).setParameterLength(3,5);Ni("remap",cl),Ni("remapClamp",hl);class pl extends ui{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const gl=rn(pl).setParameterLength(1,2),ml=e=>(e?bu(e,gl("discard")):gl("discard")).toStack();Ni("discard",ml);class fl extends ci{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const yl=(e,t=null,r=null)=>Zi(new fl(Zi(e),t,r));Ni("renderOutput",yl);class bl extends ci{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e);if(null!==t)t(e,r);else{const t="--- TSL debug - "+e.shaderStage+" shader ---",s="-".repeat(t.length);let i="";i+="// #"+t+"#\n",i+=e.flow.code.replace(/^\t/gm,"")+"\n",i+="/* ... */ "+r+" /* ... */\n",i+="// #"+s+"#\n",_(i)}return r}}const xl=(e,t=null)=>Zi(new bl(Zi(e),t)).toStack();Ni("debug",xl);class Tl{constructor(){this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class _l extends ui{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=Js.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}getNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==Tl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function vl(e,t="",r=null){return(e=Zi(e)).before(new _l(e,t,r))}Ni("toInspector",vl);class Nl extends ui{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return Pu(this).build(e,r)}return d(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Sl=(e,t=null)=>new Nl(e,t),Rl=(e=0)=>Sl("uv"+(e>0?e:""),"vec2");class Al extends ui{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const El=rn(Al).setParameterLength(1,2);class wl extends Ta{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Js.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const Cl=rn(wl).setParameterLength(1),Ml=new N;class Bl extends Ta{static get type(){return"TextureNode"}constructor(e=Ml,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Js.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Rl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=_a(this.value.matrix)),this._matrixUniform.mul(vn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=_a(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(mn(El(this,this.levelNode).y).sub(t.y).sub(1)),t)),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");const s=un(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?Js.OBJECT:Js.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;null!==this.compareNode&&(e.renderer.hasCompatibility(A.TEXTURE_COMPARE)?n=this.compareNode:(null!==this.value.compareFunction&&this.value.compareFunction!==E&&v('TSL: Only "LessCompare" is supported for depth texture comparison fallback.'),a=this.compareNode)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:u,compareNode:l,compareStepNode:d,depthNode:c,gradNode:h,offsetNode:p}=s,g=this.generateUV(e,t),m=r?r.build(e,"float"):null,f=u?u.build(e,"float"):null,y=c?c.build(e,"int"):null,b=l?l.build(e,"float"):null,x=d?d.build(e,"float"):null,T=h?[h[0].build(e,"vec2"),h[1].build(e,"vec2")]:null,_=p?this.generateOffset(e,p):null,v=e.getVarFromNode(this);o=e.getPropertyName(v);let N=this.generateSnippet(e,i,g,m,f,y,b,T,_);null!==x&&(N=qo(gl(x,"float"),gl(N,a)).build(e,a)),e.addLineFlowCode(`${o} = ${N}`,this),n.snippet=N,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=Gu(gl(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Zi(e).mul(Cl(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===w||r.magFilter===w)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Zi(t)}level(e){const t=this.clone();return t.levelNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}size(e){return El(this,e)}bias(e){const t=this.clone();return t.biasNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Zi(e),Zi(t)],r.referenceNode=this.getBase(),Zi(r)}depth(e){const t=this.clone();return t.depthNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}offset(e){const t=this.clone();return t.offsetNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}const Ll=rn(Bl).setParameterLength(1,4).setName("texture"),Fl=(e=Ml,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Zi(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=Ll(e,t,r,s),i},Pl=(...e)=>Fl(...e).setSampler(!1);class Dl extends Ta{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Ul=(e,t,r)=>new Dl(e,t,r);class Il extends li{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class Ol extends Dl{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?qs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Js.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rnew Ol(e,t);class kl extends ui{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}const Gl=rn(kl).setParameterLength(1);let zl,$l;class Wl extends ui{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}getNodeType(){return this.scope===Wl.DPR?"float":this.scope===Wl.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Js.NONE;return this.scope!==Wl.SIZE&&this.scope!==Wl.VIEWPORT&&this.scope!==Wl.DPR||(e=Js.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Wl.VIEWPORT?null!==t?$l.copy(t.viewport):(e.getViewport($l),$l.multiplyScalar(e.getPixelRatio())):this.scope===Wl.DPR?this._output.value=e.getPixelRatio():null!==t?(zl.width=t.width,zl.height=t.height):e.getDrawingBufferSize(zl)}setup(){const e=this.scope;let r=null;return r=e===Wl.SIZE?_a(zl||(zl=new t)):e===Wl.VIEWPORT?_a($l||($l=new s)):e===Wl.DPR?_a(1):bn(Xl.div(jl)),this._output=r,r}generate(e){if(this.scope===Wl.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(jl).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Wl.COORDINATE="coordinate",Wl.VIEWPORT="viewport",Wl.SIZE="size",Wl.UV="uv",Wl.DPR="dpr";const Hl=sn(Wl,Wl.DPR),ql=sn(Wl,Wl.UV),jl=sn(Wl,Wl.SIZE),Xl=sn(Wl,Wl.COORDINATE),Kl=sn(Wl,Wl.VIEWPORT),Yl=Kl.zw,Ql=Xl.sub(Kl.xy),Zl=Ql.div(Yl),Jl=un(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),jl),"vec2").once()(),ed=_a(0,"uint").setName("u_cameraIndex").setGroup(fa("cameraIndex")).toVarying("v_cameraIndex"),td=_a("float").setName("cameraNear").setGroup(ba).onRenderUpdate(({camera:e})=>e.near),rd=_a("float").setName("cameraFar").setGroup(ba).onRenderUpdate(({camera:e})=>e.far),sd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Vl(r).setGroup(ba).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?Gl("gl_ViewID_OVR"):ed).toConst("cameraProjectionMatrix")}else t=_a("mat4").setName("cameraProjectionMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),id=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=Vl(r).setGroup(ba).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?Gl("gl_ViewID_OVR"):ed).toConst("cameraProjectionMatrixInverse")}else t=_a("mat4").setName("cameraProjectionMatrixInverse").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),nd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Vl(r).setGroup(ba).setName("cameraViewMatrices").element(e.isMultiViewCamera?Gl("gl_ViewID_OVR"):ed).toConst("cameraViewMatrix")}else t=_a("mat4").setName("cameraViewMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),ad=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);t=Vl(r).setGroup(ba).setName("cameraWorldMatrices").element(e.isMultiViewCamera?Gl("gl_ViewID_OVR"):ed).toConst("cameraWorldMatrix")}else t=_a("mat4").setName("cameraWorldMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorld);return t}).once()(),od=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);t=Vl(r).setGroup(ba).setName("cameraNormalMatrices").element(e.isMultiViewCamera?Gl("gl_ViewID_OVR"):ed).toConst("cameraNormalMatrix")}else t=_a("mat3").setName("cameraNormalMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.normalMatrix);return t}).once()(),ud=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld));return t}).once()(),ld=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);t=Vl(r,"vec4").setGroup(ba).setName("cameraViewports").element(ed).toConst("cameraViewport")}else t=An(0,0,jl.x,jl.y).toConst("cameraViewport");return t}).once()(),dd=new C;class cd extends ui{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Js.OBJECT,this.uniformNode=new Ta(null)}getNodeType(){const e=this.scope;return e===cd.WORLD_MATRIX?"mat4":e===cd.POSITION||e===cd.VIEW_POSITION||e===cd.DIRECTION||e===cd.SCALE?"vec3":e===cd.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===cd.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===cd.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===cd.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===cd.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===cd.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===cd.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),dd.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=dd.radius}}generate(e){const t=this.scope;return t===cd.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===cd.POSITION||t===cd.VIEW_POSITION||t===cd.DIRECTION||t===cd.SCALE?this.uniformNode.nodeType="vec3":t===cd.RADIUS&&(this.uniformNode.nodeType="float"),this.uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}cd.WORLD_MATRIX="worldMatrix",cd.POSITION="position",cd.SCALE="scale",cd.VIEW_POSITION="viewPosition",cd.DIRECTION="direction",cd.RADIUS="radius";const hd=rn(cd,cd.DIRECTION).setParameterLength(1),pd=rn(cd,cd.WORLD_MATRIX).setParameterLength(1),gd=rn(cd,cd.POSITION).setParameterLength(1),md=rn(cd,cd.SCALE).setParameterLength(1),fd=rn(cd,cd.VIEW_POSITION).setParameterLength(1),yd=rn(cd,cd.RADIUS).setParameterLength(1);class bd extends cd{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const xd=sn(bd,bd.DIRECTION),Td=sn(bd,bd.WORLD_MATRIX),_d=sn(bd,bd.POSITION),vd=sn(bd,bd.SCALE),Nd=sn(bd,bd.VIEW_POSITION),Sd=sn(bd,bd.RADIUS),Rd=_a(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Ad=_a(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Ed=un(e=>e.context.modelViewMatrix||wd).once()().toVar("modelViewMatrix"),wd=nd.mul(Td),Cd=un(e=>(e.context.isHighPrecisionModelViewMatrix=!0,_a("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Md=un(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return _a("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),Bd=un(e=>"fragment"!==e.shaderStage?(v("TSL: `clipSpace` is only available in fragment stage."),An()):e.context.clipSpace.toVarying("v_clipSpace")).once()(),Ld=Sl("position","vec3"),Fd=Ld.toVarying("positionLocal"),Pd=Ld.toVarying("positionPrevious"),Dd=un(e=>Td.mul(Fd).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Ud=un(()=>Fd.transformDirection(Td).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Id=un(e=>{if("fragment"===e.shaderStage&&e.material.vertexNode){const e=id.mul(Bd);return e.xyz.div(e.w).toVar("positionView")}return e.context.setupPositionView().toVarying("v_positionView")},"vec3").once(["POSITION","VERTEX"])(),Od=un(e=>{let t;return t=e.camera.isOrthographicCamera?vn(0,0,1):Id.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class Vd extends ui{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===M?"false":e.getFrontFacing()}}const kd=sn(Vd),Gd=gn(kd).mul(2).sub(1),zd=un(([e],{material:t})=>{const r=t.side;return r===M?e=e.mul(-1):r===B&&(e=e.mul(Gd)),e}),$d=Sl("normal","vec3"),Wd=un(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),vn(0,1,0)):$d,"vec3").once()().toVar("normalLocal"),Hd=Id.dFdx().cross(Id.dFdy()).normalize().toVar("normalFlat"),qd=un(e=>{let t;return t=!0===e.material.flatShading?Hd:Zd(Wd).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),jd=un(e=>{let t=qd.transformDirection(nd);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),Xd=un(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=qd,!0!==t.flatShading&&(s=zd(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),Kd=Xd.transformDirection(nd).toVar("normalWorld"),Yd=un(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?Xd:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),Qd=un(([e,t=Td])=>{const r=Bn(t),s=e.div(vn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),Zd=un(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=Rd.mul(e);return nd.transformDirection(s)}),Jd=un(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),Xd)).once(["NORMAL","VERTEX"])(),ec=un(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),Kd)).once(["NORMAL","VERTEX"])(),tc=un(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),Yd)).once(["NORMAL","VERTEX"])(),rc=new L,sc=new a,ic=_a(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),nc=_a(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),ac=_a(new a).onReference(function(e){return e.material}).onObjectUpdate(function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(rc.copy(r),sc.makeRotationFromEuler(rc)):sc.identity(),sc}),oc=Od.negate().reflect(Xd),uc=Od.negate().refract(Xd,ic),lc=oc.transformDirection(nd).toVar("reflectVector"),dc=uc.transformDirection(nd).toVar("reflectVector"),cc=new F;class hc extends Bl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===P?lc:e.mapping===D?dc:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),vn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?vn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=vn(t.x.negate(),t.yz)),ac.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const pc=rn(hc).setParameterLength(1,4).setName("cubeTexture"),gc=(e=cc,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Zi(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=pc(e,t,r,s),i};class mc extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class fc extends ui{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Js.OBJECT}element(e){return new mc(this,Zi(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Ul(null,e,this.count):Array.isArray(this.getValueFromReference())?Vl(null,e):"texture"===e?Fl(null):"cubeTexture"===e?gc(null):_a(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew fc(e,t,r),bc=(e,t,r,s)=>new fc(e,t,s,r);class xc extends fc{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const Tc=(e,t,r=null)=>new xc(e,t,r),_c=Rl(),vc=Id.dFdx(),Nc=Id.dFdy(),Sc=_c.dFdx(),Rc=_c.dFdy(),Ac=Xd,Ec=Nc.cross(Ac),wc=Ac.cross(vc),Cc=Ec.mul(Sc.x).add(wc.mul(Rc.x)),Mc=Ec.mul(Sc.y).add(wc.mul(Rc.y)),Bc=Cc.dot(Cc).max(Mc.dot(Mc)),Lc=Bc.equal(0).select(0,Bc.inverseSqrt()),Fc=Cc.mul(Lc).toVar("tangentViewFrame"),Pc=Mc.mul(Lc).toVar("bitangentViewFrame"),Dc=Sl("tangent","vec4"),Uc=Dc.xyz.toVar("tangentLocal"),Ic=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Ed.mul(An(Uc,0)).xyz.toVarying("v_tangentView").normalize():Fc,!0!==r.flatShading&&(s=zd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Oc=Ic.transformDirection(nd).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Vc=un(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(Dc.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),kc=Vc($d.cross(Dc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Gc=Vc(Wd.cross(Uc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),zc=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Vc(Xd.cross(Ic),"v_bitangentView").normalize():Pc,!0!==r.flatShading&&(s=zd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),$c=Vc(Kd.cross(Oc),"v_bitangentWorld").normalize().toVar("bitangentWorld"),Wc=Bn(Ic,zc,Xd).toVar("TBNViewMatrix"),Hc=Od.mul(Wc),qc=un(()=>{let e=Jn.cross(Od);return e=e.cross(Jn).normalize(),e=nu(e,Xd,Qn.mul(Gn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),jc=e=>Zi(e).mul(.5).add(.5),Xc=e=>vn(e,bo(ou(gn(1).sub(Yo(e,e)))));class Kc extends ci{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=U,this.unpackNormalMode=I}setup({material:e}){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===U?s===O?i=Xc(i.xy):s===V?i=Xc(i.yw):s!==I&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==I&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.flatShading&&(t=zd(t)),i=vn(i.xy.mul(t),i.z)}let n=null;return t===k?n=Zd(i):t===U?n=Wc.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=Xd),n}}const Yc=rn(Kc).setParameterLength(1,2),Qc=un(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Rl()),forceUVContext:!0}),s=gn(r(e=>e));return bn(gn(r(e=>e.add(e.dFdx()))).sub(s),gn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),Zc=un(e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(Gd),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class Jc extends ci{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Qc({textureNode:this.textureNode,bumpScale:e});return Zc({surf_pos:Id,surf_norm:Xd,dHdxy:t})}}const eh=rn(Jc).setParameterLength(1,2),th=new Map;class rh extends ui{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=th.get(e);return void 0===r&&(r=Tc(e,t),th.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===rh.COLOR){const e=void 0!==t.color?this.getColor(r):vn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===rh.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===rh.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:gn(1);else if(r===rh.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===rh.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===rh.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===rh.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===rh.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===rh.NORMAL)t.normalMap?(s=Yc(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=G&&t.normalMap.format!=z&&t.normalMap.format!=$||(s.unpackNormalMode=O)):s=t.bumpMap?eh(this.getTexture("bump").r,this.getFloat("bumpScale")):Xd;else if(r===rh.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===rh.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===rh.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Yc(this.getTexture(r),this.getCache(r+"Scale","vec2")):Xd;else if(r===rh.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===rh.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===rh.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Mn(kh.x,kh.y,kh.y.negate(),kh.x).mul(e.rg.mul(2).sub(bn(1)).normalize().mul(e.b))}else s=kh;else if(r===rh.IRIDESCENCE_THICKNESS){const e=yc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=yc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===rh.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===rh.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===rh.IOR)s=this.getFloat(r);else if(r===rh.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===rh.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===rh.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):gn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}rh.ALPHA_TEST="alphaTest",rh.COLOR="color",rh.OPACITY="opacity",rh.SHININESS="shininess",rh.SPECULAR="specular",rh.SPECULAR_STRENGTH="specularStrength",rh.SPECULAR_INTENSITY="specularIntensity",rh.SPECULAR_COLOR="specularColor",rh.REFLECTIVITY="reflectivity",rh.ROUGHNESS="roughness",rh.METALNESS="metalness",rh.NORMAL="normal",rh.CLEARCOAT="clearcoat",rh.CLEARCOAT_ROUGHNESS="clearcoatRoughness",rh.CLEARCOAT_NORMAL="clearcoatNormal",rh.EMISSIVE="emissive",rh.ROTATION="rotation",rh.SHEEN="sheen",rh.SHEEN_ROUGHNESS="sheenRoughness",rh.ANISOTROPY="anisotropy",rh.IRIDESCENCE="iridescence",rh.IRIDESCENCE_IOR="iridescenceIOR",rh.IRIDESCENCE_THICKNESS="iridescenceThickness",rh.IOR="ior",rh.TRANSMISSION="transmission",rh.THICKNESS="thickness",rh.ATTENUATION_DISTANCE="attenuationDistance",rh.ATTENUATION_COLOR="attenuationColor",rh.LINE_SCALE="scale",rh.LINE_DASH_SIZE="dashSize",rh.LINE_GAP_SIZE="gapSize",rh.LINE_WIDTH="linewidth",rh.LINE_DASH_OFFSET="dashOffset",rh.POINT_SIZE="size",rh.DISPERSION="dispersion",rh.LIGHT_MAP="light",rh.AO="ao";const sh=sn(rh,rh.ALPHA_TEST),ih=sn(rh,rh.COLOR),nh=sn(rh,rh.SHININESS),ah=sn(rh,rh.EMISSIVE),oh=sn(rh,rh.OPACITY),uh=sn(rh,rh.SPECULAR),lh=sn(rh,rh.SPECULAR_INTENSITY),dh=sn(rh,rh.SPECULAR_COLOR),ch=sn(rh,rh.SPECULAR_STRENGTH),hh=sn(rh,rh.REFLECTIVITY),ph=sn(rh,rh.ROUGHNESS),gh=sn(rh,rh.METALNESS),mh=sn(rh,rh.NORMAL),fh=sn(rh,rh.CLEARCOAT),yh=sn(rh,rh.CLEARCOAT_ROUGHNESS),bh=sn(rh,rh.CLEARCOAT_NORMAL),xh=sn(rh,rh.ROTATION),Th=sn(rh,rh.SHEEN),_h=sn(rh,rh.SHEEN_ROUGHNESS),vh=sn(rh,rh.ANISOTROPY),Nh=sn(rh,rh.IRIDESCENCE),Sh=sn(rh,rh.IRIDESCENCE_IOR),Rh=sn(rh,rh.IRIDESCENCE_THICKNESS),Ah=sn(rh,rh.TRANSMISSION),Eh=sn(rh,rh.THICKNESS),wh=sn(rh,rh.IOR),Ch=sn(rh,rh.ATTENUATION_DISTANCE),Mh=sn(rh,rh.ATTENUATION_COLOR),Bh=sn(rh,rh.LINE_SCALE),Lh=sn(rh,rh.LINE_DASH_SIZE),Fh=sn(rh,rh.LINE_GAP_SIZE),Ph=sn(rh,rh.LINE_WIDTH),Dh=sn(rh,rh.LINE_DASH_OFFSET),Uh=sn(rh,rh.POINT_SIZE),Ih=sn(rh,rh.DISPERSION),Oh=sn(rh,rh.LIGHT_MAP),Vh=sn(rh,rh.AO),kh=_a(new t).onReference(function(e){return e.material}).onRenderUpdate(function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}),Gh=un(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class zh extends li{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const $h=rn(zh).setParameterLength(2);class Wh extends Dl{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Gs(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ti.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return $h(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ti.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Ju(this.value),this._varying=Pu(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const Hh=(e,t=null,r=0)=>new Wh(e,t,r);class qh extends ui{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===qh.VERTEX)s=e.getVertexIndex();else if(r===qh.INSTANCE)s=e.getInstanceIndex();else if(r===qh.DRAW)s=e.getDrawIndex();else if(r===qh.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===qh.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==qh.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Pu(this).build(e,t)}return i}}qh.VERTEX="vertex",qh.INSTANCE="instance",qh.SUBGROUP="subgroup",qh.INVOCATION_LOCAL="invocationLocal",qh.INVOCATION_SUBGROUP="invocationSubgroup",qh.DRAW="draw";const jh=sn(qh,qh.VERTEX),Xh=sn(qh,qh.INSTANCE),Kh=sn(qh,qh.SUBGROUP),Yh=sn(qh,qh.INVOCATION_SUBGROUP),Qh=sn(qh,qh.INVOCATION_LOCAL),Zh=sn(qh,qh.DRAW);class Jh extends ui{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Js.FRAME,this.buffer=null,this.bufferColor=null,this.previousInstanceMatrixNode=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){let{instanceMatrixNode:t,instanceColorNode:r}=this;null===t&&(t=this._createInstanceMatrixNode(!0,e),this.instanceMatrixNode=t);const{instanceColor:s,isStorageColor:i}=this;if(s&&null===r){if(i)r=Hh(s,"vec3",Math.max(s.count,1)).element(Xh);else{const e=new W(s.array,3),t=s.usage===x?tl:el;this.bufferColor=e,r=vn(t(e,"vec3",3,0))}this.instanceColorNode=r}const n=t.mul(Fd).xyz;if(Fd.assign(n),e.needsPreviousData()&&Pd.assign(this.getPreviousInstancedPosition(e)),e.hasGeometryAttribute("normal")){const e=Qd(Wd,t);Wd.assign(e)}null!==this.instanceColorNode&&In("vec3","vInstanceColor").assign(this.instanceColorNode)}update(e){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)),null!==this.previousInstanceMatrixNode&&e.object.previousInstanceMatrix.array.set(this.instanceMatrix.array)}getPreviousInstancedPosition(e){const t=e.object;return null===this.previousInstanceMatrixNode&&(t.previousInstanceMatrix=this.instanceMatrix.clone(),this.previousInstanceMatrixNode=this._createInstanceMatrixNode(!1,e)),this.previousInstanceMatrixNode.mul(Pd).xyz}_createInstanceMatrixNode(e,t){let r;const{instanceMatrix:s}=this,{count:i}=s;if(this.isStorageMatrix)r=Hh(s,"mat4",Math.max(i,1)).element(Xh);else{if(i<=(!0===t.renderer.backend.isWebGPUBackend?1e3:250))r=Ul(s.array,"mat4",Math.max(i,1)).element(Xh);else{const t=new H(s.array,16,1);!0===e&&(this.buffer=t);const i=s.usage===x?tl:el,n=[i(t,"vec4",16,0),i(t,"vec4",16,4),i(t,"vec4",16,8),i(t,"vec4",16,12)];r=Ln(...n)}}return r}}const ep=rn(Jh).setParameterLength(2,3);class tp extends Jh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const rp=rn(tp).setParameterLength(1);class sp extends ui{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=Xh:this.batchingIdNode=Zh);const t=un(([e])=>{const t=mn(El(Pl(this.batchMesh._indirectTexture),0).x).toConst(),r=mn(e).mod(t).toConst(),s=mn(e).div(t).toConst();return Pl(this.batchMesh._indirectTexture,xn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(mn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=mn(El(Pl(s),0).x).toConst(),n=gn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Ln(Pl(s,xn(a,o)),Pl(s,xn(a.add(1),o)),Pl(s,xn(a.add(2),o)),Pl(s,xn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=un(([e])=>{const t=mn(El(Pl(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Pl(l,xn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);In("vec3","vBatchColor").assign(t)}const d=Bn(u);Fd.assign(u.mul(Fd));const c=Wd.div(vn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;Wd.assign(h),e.hasGeometryAttribute("tangent")&&Uc.mulAssign(d)}}const ip=rn(sp).setParameterLength(1),np=new WeakMap;class ap extends ui{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Js.OBJECT,this.skinIndexNode=Sl("skinIndex","uvec4"),this.skinWeightNode=Sl("skinWeight","vec4"),this.bindMatrixNode=yc("bindMatrix","mat4"),this.bindMatrixInverseNode=yc("bindMatrixInverse","mat4"),this.boneMatricesNode=bc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Fd,this.toPositionNode=Fd,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=Ma(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormalAndTangent(e=this.boneMatricesNode,t=Wd,r=Uc){const{skinIndexNode:s,skinWeightNode:i,bindMatrixNode:n,bindMatrixInverseNode:a}=this,o=e.element(s.x),u=e.element(s.y),l=e.element(s.z),d=e.element(s.w);let c=Ma(i.x.mul(o),i.y.mul(u),i.z.mul(l),i.w.mul(d));c=a.mul(c).mul(n);return{skinNormal:c.transformDirection(t).xyz,skinTangent:c.transformDirection(r).xyz}}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=bc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Pd)}setup(e){e.needsPreviousData()&&Pd.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const{skinNormal:t,skinTangent:r}=this.getSkinnedNormalAndTangent();Wd.assign(t),e.hasGeometryAttribute("tangent")&&Uc.assign(r)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;np.get(t)!==e.frameId&&(np.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const op=e=>new ap(e);class up extends ui{static get type(){return"LoopNode"}constructor(e=[]){super("void"),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew up(tn(e,"int")).toStack(),dp=()=>gl("break").toStack(),cp=new WeakMap,hp=new s,pp=un(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=mn(jh).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Pl(e,xn(u,o)).depth(i).xyz.mul(t)});class gp extends ui{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=_a(1),this.updateType=Js.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=cp.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new q(m,h,p,a);f.type=j,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=gn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Pl(this.mesh.morphTexture,xn(mn(e).add(1),mn(Xh))).r):t.assign(yc("morphTargetInfluences","float").element(e).toVar()),cn(t.notEqual(0),()=>{!0===s&&Fd.addAssign(pp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(0)})),!0===i&&Wd.addAssign(pp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(1)}))})})}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce((e,t)=>e+t,0)}}const mp=rn(gp).setParameterLength(1);class fp extends ui{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class yp extends fp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class bp extends xu{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:vn().toVar("directDiffuse"),directSpecular:vn().toVar("directSpecular"),indirectDiffuse:vn().toVar("indirectDiffuse"),indirectSpecular:vn().toVar("indirectSpecular")};return{radiance:vn().toVar("radiance"),irradiance:vn().toVar("irradiance"),iblIrradiance:vn().toVar("iblIrradiance"),ambientOcclusion:gn(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const xp=rn(bp);class Tp extends fp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const _p=new t;class vp extends Bl{static get type(){return"ViewportTextureNode"}constructor(e=ql,t=null,r=null){let s=null;null===r?(s=new X,s.minFilter=K,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Js.RENDER,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer.getRenderTarget();return this.value=this.getTextureForReference(t),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(_p):_p.set(r.width,r.height);const s=this.getTextureForReference(r);s.image.width===_p.width&&s.image.height===_p.height||(s.image.width=_p.width,s.image.height=_p.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const Np=rn(vp).setParameterLength(0,3),Sp=rn(vp,null,null,{generateMipmaps:!0}).setParameterLength(0,3),Rp=Sp(),Ap=(e=ql,t=null)=>Rp.sample(e,t);let Ep=null;class wp extends vp{static get type(){return"ViewportDepthTextureNode"}constructor(e=ql,t=null){null===Ep&&(Ep=new Y),super(e,t,Ep)}getTextureForReference(){return Ep}}const Cp=rn(wp).setParameterLength(0,2);class Mp extends ui{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Mp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Mp.DEPTH_BASE)null!==r&&(s=Dp().assign(r));else if(t===Mp.DEPTH)s=e.isPerspectiveCamera?Lp(Id.z,td,rd):Bp(Id.z,td,rd);else if(t===Mp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Fp(r,td,rd);s=Bp(e,td,rd)}else s=r;else s=Bp(Id.z,td,rd);return s}}Mp.DEPTH_BASE="depthBase",Mp.DEPTH="depth",Mp.LINEAR_DEPTH="linearDepth";const Bp=(e,t,r)=>e.add(t).div(t.sub(r)),Lp=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Fp=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Pp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=yo(e.negate().div(t)),i=yo(r.div(t));return s.div(i)},Dp=rn(Mp,Mp.DEPTH_BASE),Up=sn(Mp,Mp.DEPTH),Ip=rn(Mp,Mp.LINEAR_DEPTH).setParameterLength(0,1),Op=Ip(Cp());Up.assign=e=>Dp(e);class Vp extends ui{static get type(){return"ClippingNode"}constructor(e=Vp.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===Vp.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Vp.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return un(()=>{const r=gn().toVar("distanceToPlane"),s=gn().toVar("distanceToGradient"),i=gn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Vl(t).setGroup(ba);lp(n,({i:t})=>{const n=e.element(t);r.assign(Id.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(lu(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Vl(e).setGroup(ba),n=gn(1).toVar("intersectionClipOpacity");lp(a,({i:e})=>{const i=t.element(e);r.assign(Id.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(lu(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}On.a.mulAssign(i),On.a.equal(0).discard()})()}setupDefault(e,t){return un(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Vl(t).setGroup(ba);lp(r,({i:t})=>{const r=e.element(t);Id.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Vl(e).setGroup(ba),r=yn(!0).toVar("clipped");lp(s,({i:e})=>{const s=t.element(e);r.assign(Id.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),un(()=>{const s=Vl(e).setGroup(ba),i=Gl(t.getClipDistance());lp(r,({i:e})=>{const t=s.element(e),r=Id.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}Vp.ALPHA_TO_COVERAGE="alphaToCoverage",Vp.DEFAULT="default",Vp.HARDWARE="hardware";const kp=un(([e])=>No(La(1e4,So(La(17,e.x).add(La(.1,e.y)))).mul(Ma(.1,Mo(So(La(13,e.y).add(e.x))))))),Gp=un(([e])=>kp(bn(kp(e.xy),e.z))),zp=un(([e])=>{const t=Ho(Lo(Do(e.xyz)),Lo(Uo(e.xyz))),r=gn(1).div(gn(.05).mul(t)).toVar("pixScale"),s=bn(mo(To(yo(r))),mo(_o(yo(r)))),i=bn(Gp(To(s.x.mul(e.xyz))),Gp(To(s.y.mul(e.xyz)))),n=No(yo(r)),a=Ma(La(n.oneMinus(),i.x),La(n,i.y)),o=Wo(n,n.oneMinus()),u=vn(a.mul(a).div(La(2,o).mul(Ba(1,o))),a.sub(La(.5,o)).div(Ba(1,o)),Ba(1,Ba(1,a).mul(Ba(1,a)).div(La(2,o).mul(Ba(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return au(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class $p extends Nl{static get type(){return"VertexColorNode"}constructor(e){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}const Wp=(e=0)=>new $p(e),Hp=un(([e,t])=>Wo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),qp=un(([e,t])=>Wo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),jp=un(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Xp=un(([e,t])=>nu(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),qo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Kp=un(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return An(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)}).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),Yp=un(([e])=>An(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),Qp=un(([e])=>(cn(e.a.equal(0),()=>An(0)),An(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class Zp extends Q{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.maskNode=null,this.maskShadowNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,this.contextNode=null}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Us(t.slice(0,-4)),r.getCacheKey());return this.type+Is(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Lu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=this.setupVertex(e),i=Lu(this.vertexNode||s,"VERTEX");let n;e.context.clipSpace=i,e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==a&&e.stack.addToStack(a);const i=An(s,On.a).max(0);n=this.setupOutput(e,i),ia.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&ia.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=An(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.currentSamples;this.alphaToCoverage&&t>1?s=new Vp(Vp.ALPHA_TO_COVERAGE):e.stack.addToStack(new Vp)}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.addToStack(new Vp(Vp.HARDWARE)),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Pp(Id.z,td,rd):Bp(Id.z,td,rd))}null!==s&&Up.assign(s).toStack()}setupPositionView(){return Ed.mul(Fd).xyz}setupModelViewProjection(){return sd.mul(Id)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.position=e.removeStack(),Gh}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&mp(t).toStack(),!0===t.isSkinnedMesh&&op(t).toStack(),this.displacementMap){const e=Tc("displacementMap","texture"),t=Tc("displacementScale","float"),r=Tc("displacementBias","float");Fd.addAssign(Wd.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&ip(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&rp(t).toStack(),null!==this.positionNode&&Fd.assign(Lu(this.positionNode,"POSITION","vec3")),Fd}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&yn(this.maskNode).not().discard();let s=this.colorNode?An(this.colorNode):ih;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul(Wp())),t.instanceColor){s=In("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=In("vec3","vBatchColor").mul(s)}On.assign(s);const i=this.opacityNode?gn(this.opacityNode):oh;On.a.assign(On.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?gn(this.alphaTestNode):sh,!0===this.alphaToCoverage?(On.a=lu(n,n.add(ko(On.a)),On.a),On.a.lessThanEqual(0).discard()):On.a.lessThanEqual(n).discard()),!0===this.alphaHash&&On.a.lessThan(zp(Fd)).discard(),e.isOpaque()&&On.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?vn(0):On.rgb}setupNormal(){return this.normalNode?vn(this.normalNode):mh}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?Tc("envMap","cubeTexture"):Tc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Tp(Oh)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=Vh),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new yp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=xp(n,t,r,s)}else null!==r&&(a=vn(null!==s?nu(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(kn.assign(vn(i||ah)),a=a.add(kn)),a}setupFog(e,t){const r=e.fogNode;return r&&(ia.assign(t),t=An(r.toVar())),t}setupPremultipliedAlpha(e,t){return Yp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=Q.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.maskNode=e.maskNode,this.maskShadowNode=e.maskShadowNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,this.contextNode=e.contextNode,super.copy(e)}}const Jp=new Z;class eg extends Zp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(Jp),this.setValues(e)}}const tg=new J;class rg extends Zp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(tg),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?gn(this.offsetNode):Dh,t=this.dashScaleNode?gn(this.dashScaleNode):Bh,r=this.dashSizeNode?gn(this.dashSizeNode):Lh,s=this.gapSizeNode?gn(this.gapSizeNode):Fh;na.assign(r),aa.assign(s);const i=Pu(Sl("lineDistance").mul(t));(e?i.add(e):i).mod(na.add(aa)).greaterThan(na).discard()}}const sg=new J;class ig extends Zp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(sg),this.vertexColors=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=ee,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.vertexColors,i=this._useDash,n=this._useWorldUnits,a=un(({start:e,end:t})=>{const r=sd.element(2).element(2),s=sd.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return An(nu(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=un(()=>{const e=Sl("instanceStart"),t=Sl("instanceEnd"),r=An(Ed.mul(An(e,1))).toVar("start"),s=An(Ed.mul(An(t,1))).toVar("end");if(i){const e=this.dashScaleNode?gn(this.dashScaleNode):Bh,t=this.offsetNode?gn(this.offsetNode):Dh,r=Sl("instanceDistanceStart"),s=Sl("instanceDistanceEnd");let i=Ld.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),In("float","lineDistance").assign(i)}n&&(In("vec3","worldStart").assign(r.xyz),In("vec3","worldEnd").assign(s.xyz));const o=Kl.z.div(Kl.w),u=sd.element(2).element(3).equal(-1);cn(u,()=>{cn(r.z.lessThan(0).and(s.z.greaterThan(0)),()=>{s.assign(a({start:r,end:s}))}).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),()=>{r.assign(a({start:s,end:r}))})});const l=sd.mul(r),d=sd.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=An().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=nu(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=In("vec4","worldPos");o.assign(Ld.y.lessThan(.5).select(r,s));const u=Ph.mul(.5);o.addAssign(An(Ld.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(An(Ld.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(An(a.mul(u),0)),cn(Ld.y.greaterThan(1).or(Ld.y.lessThan(0)),()=>{o.subAssign(An(a.mul(2).mul(u),0))})),g.assign(sd.mul(o));const l=vn().toVar();l.assign(Ld.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=bn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Ld.x.lessThan(0).select(e.negate(),e)),cn(Ld.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(Ld.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Ph)),e.assign(e.div(Kl.w.div(Hl))),g.assign(Ld.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(An(e,0,0)))}return g})();const o=un(({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return bn(h,p)});if(this.colorNode=un(()=>{const e=Rl();if(i){const t=this.dashSizeNode?gn(this.dashSizeNode):Lh,r=this.gapSizeNode?gn(this.gapSizeNode):Fh;na.assign(t),aa.assign(r);const s=In("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(na.add(aa)).greaterThan(na).discard()}const a=gn(1).toVar("alpha");if(n){const e=In("vec3","worldStart"),s=In("vec3","worldEnd"),n=In("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:vn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Ph);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(lu(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=gn(s.fwidth()).toVar("dlen");cn(e.y.abs().greaterThan(1),()=>{a.assign(lu(i.oneMinus(),i.add(1),s).oneMinus())})}else cn(e.y.abs().greaterThan(1),()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()});let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Sl("instanceColorStart"),t=Sl("instanceColorEnd");u=Ld.y.lessThan(.5).select(e,t).mul(ih)}else u=ih;return An(u,a)})(),this.transparent){const e=this.opacityNode?gn(this.opacityNode):oh;this.outputNode=An(this.colorNode.rgb.mul(e).add(Ap().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const ng=new te;class ag extends Zp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(ng),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?gn(this.opacityNode):oh;On.assign(Gu(An(jc(Xd),e),re))}}const og=un(([e=Ud])=>{const t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return bn(t,r)});class ug extends se{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new ie(5,5,5),n=og(Ud),a=new Zp;a.colorNode=Fl(t,n,0),a.side=M,a.blending=ee;const o=new ne(i,a),u=new ae;u.add(o),t.minFilter===K&&(t.minFilter=oe);const l=new ue(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const lg=new WeakMap;class dg extends ci{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=gc(null);const t=new F;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Js.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===le||r===de){if(lg.has(e)){const t=lg.get(e);hg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new ug(r.height);s.fromEquirectangularTexture(t,e),hg(s.texture,e.mapping),this._cubeTexture=s.texture,lg.set(e,s.texture),e.addEventListener("dispose",cg)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function cg(e){const t=e.target;t.removeEventListener("dispose",cg);const r=lg.get(t);void 0!==r&&(lg.delete(t),r.dispose())}function hg(e,t){t===le?e.mapping=P:t===de&&(e.mapping=D)}const pg=rn(dg).setParameterLength(1);class gg extends fp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=pg(this.envNode)}}class mg extends fp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=gn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class fg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class yg extends fg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(An(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(An(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(On.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case pe:s.rgb.assign(nu(s.rgb,s.rgb.mul(i.rgb),ch.mul(hh)));break;case he:s.rgb.assign(nu(s.rgb,i.rgb,ch.mul(hh)));break;case ce:s.rgb.addAssign(i.rgb.mul(ch.mul(hh)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const bg=new ge;class xg extends Zp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(bg),this.setValues(e)}setupNormal(){return zd(qd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new gg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new mg(Oh)),t}setupOutgoingLight(){return On.rgb}setupLightingModel(){return new yg}}const Tg=un(({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))}),_g=un(e=>e.diffuseColor.mul(1/Math.PI)),vg=un(({dotNH:e})=>sa.mul(gn(.5)).add(1).mul(gn(1/Math.PI)).mul(e.pow(sa))),Ng=un(({lightDirection:e})=>{const t=e.add(Od).normalize(),r=Xd.dot(t).clamp(),s=Od.dot(t).clamp(),i=Tg({f0:ea,f90:1,dotVH:s}),n=gn(.25),a=vg({dotNH:r});return i.mul(n).mul(a)});class Sg extends yg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Xd.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(_g({diffuseColor:On.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(Ng({lightDirection:e})).mul(ch))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(_g({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const Rg=new me;class Ag extends Zp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Rg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new gg(t):null}setupLightingModel(){return new Sg(!1)}}const Eg=new fe;class wg extends Zp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Eg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new gg(t):null}setupLightingModel(){return new Sg}setupVariants(){const e=(this.shininessNode?gn(this.shininessNode):nh).max(1e-4);sa.assign(e);const t=this.specularNode||uh;ea.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Cg=un(e=>{if(!1===e.geometry.hasAttribute("normal"))return gn(0);const t=qd.dFdx().abs().max(qd.dFdy().abs());return t.x.max(t.y).max(t.z)}),Mg=un(e=>{const{roughness:t}=e,r=Cg();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),Bg=un(({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return Fa(.5,i.add(n).max(so))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Lg=un(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(vn(e.mul(r),t.mul(s),a).length()),l=a.mul(vn(e.mul(i),t.mul(n),o).length());return Fa(.5,u.add(l))}).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),Fg=un(({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)}).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Pg=gn(1/Math.PI),Dg=un(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=vn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Pg.mul(n.mul(u.pow2()))}).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),Ug=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=Xd,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Od).normalize(),d=n.dot(e).clamp(),c=n.dot(Od).clamp(),h=n.dot(l).clamp(),p=Od.dot(l).clamp();let g,m,f=Tg({f0:t,f90:r,dotVH:p});if(Ki(a)&&(f=jn.mix(f,i)),Ki(o)){const t=Zn.dot(e),r=Zn.dot(Od),s=Zn.dot(l),i=Jn.dot(e),n=Jn.dot(Od),a=Jn.dot(l);g=Lg({alphaT:Yn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Dg({alphaT:Yn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=Bg({alpha:u,dotNL:d,dotNV:c}),m=Fg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),Ig=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let Og=null;const Vg=un(({roughness:e,dotNV:t})=>{null===Og&&(Og=new ye(Ig,16,16,G,be),Og.name="DFG_LUT",Og.minFilter=oe,Og.magFilter=oe,Og.wrapS=xe,Og.wrapT=xe,Og.generateMipmaps=!1,Og.needsUpdate=!0);const r=bn(e,t);return Fl(Og,r).rg}),kg=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Ug({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=Xd.dot(e).clamp(),l=Xd.dot(Od).clamp(),d=Vg({roughness:s,dotNV:l}),c=Vg({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=gn(1).sub(g),y=gn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(gn(1).sub(f.mul(y).mul(b).mul(b)).add(so)),T=f.mul(y),_=x.mul(T);return o.add(_)}),Gg=un(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Vg({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),zg=un(({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(vn(t).mul(n)).div(n.oneMinus())}).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),$g=un(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=gn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return gn(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)}).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),Wg=un(({dotNV:e,dotNL:t})=>gn(1).div(gn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Hg=un(({lightDirection:e})=>{const t=e.add(Od).normalize(),r=Xd.dot(e).clamp(),s=Xd.dot(Od).clamp(),i=Xd.dot(t).clamp(),n=$g({roughness:qn,dotNH:i}),a=Wg({dotNV:s,dotNL:r});return Hn.mul(n).mul(a)}),qg=un(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=bn(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i}).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),jg=un(({f:e})=>{const t=e.length();return Ho(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),Xg=un(({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,Ho(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)}).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Kg=un(({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=vn().toVar();return cn(d.dot(r.sub(i)).greaterThanEqual(0),()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(Bn(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=vn(0).toVar();f.addAssign(Xg({v1:h,v2:p})),f.addAssign(Xg({v1:p,v2:g})),f.addAssign(Xg({v1:g,v2:m})),f.addAssign(Xg({v1:m,v2:h})),c.assign(vn(jg({f:f})))}),c}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Yg=un(({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=vn().toVar();return cn(o.dot(e.sub(t)).greaterThanEqual(0),()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=vn(0).toVar();d.addAssign(Xg({v1:n,v2:a})),d.addAssign(Xg({v1:a,v2:o})),d.addAssign(Xg({v1:o,v2:l})),d.addAssign(Xg({v1:l,v2:n})),u.assign(vn(jg({f:d.abs()})))}),u}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Qg=1/6,Zg=e=>La(Qg,La(e,La(e,e.negate().add(3)).sub(3)).add(1)),Jg=e=>La(Qg,La(e,La(e,La(3,e).sub(6))).add(4)),em=e=>La(Qg,La(e,La(e,La(-3,e).add(3)).add(3)).add(1)),tm=e=>La(Qg,Zo(e,3)),rm=e=>Zg(e).add(Jg(e)),sm=e=>em(e).add(tm(e)),im=e=>Ma(-1,Jg(e).div(Zg(e).add(Jg(e)))),nm=e=>Ma(1,tm(e).div(em(e).add(tm(e)))),am=(e,t,r)=>{const s=e.uvNode,i=La(s,t.zw).add(.5),n=To(i),a=No(i),o=rm(a.x),u=sm(a.x),l=im(a.x),d=nm(a.x),c=im(a.y),h=nm(a.y),p=bn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=bn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=bn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=bn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=rm(a.y).mul(Ma(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=sm(a.y).mul(Ma(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},om=un(([e,t])=>{const r=bn(e.size(mn(t))),s=bn(e.size(mn(t.add(1)))),i=Fa(1,r),n=Fa(1,s),a=am(e,An(i,r),To(t)),o=am(e,An(n,s),_o(t));return No(t).mix(a,o)}),um=un(([e,t])=>{const r=t.mul(Cl(e));return om(e,r)}),lm=un(([e,t,r,s,i])=>{const n=vn(uu(t.negate(),vo(e),Fa(1,s))),a=vn(Lo(i[0].xyz),Lo(i[1].xyz),Lo(i[2].xyz));return vo(n).mul(r.mul(a))}).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),dm=un(([e,t])=>e.mul(au(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),cm=Sp(),hm=Ap(),pm=un(([e,t,r],{material:s})=>{const i=(s.side===M?cm:hm).sample(e),n=yo(jl.x).mul(dm(t,r));return om(i,n)}),gm=un(([e,t,r])=>(cn(r.notEqual(0),()=>{const s=fo(t).negate().div(r);return go(s.negate().mul(e))}),vn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),mm=un(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=An().toVar(),f=vn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=vn(d.sub(i),d,d.add(i));lp({start:0,end:3},({i:i})=>{const d=n.element(i),g=lm(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(An(y,1))),x=bn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(bn(x.x,x.y.oneMinus()));const T=pm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(gm(Lo(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=lm(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(An(n,1))),y=bn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(bn(y.x,y.y.oneMinus())),m=pm(y,r,d),f=s.mul(gm(Lo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=vn(Gg({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return An(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),fm=Bn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),ym=(e,t)=>e.sub(t).div(e.add(t)).pow2(),bm=un(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=nu(e,t,lu(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();cn(a.lessThan(0),()=>vn(1));const o=a.sqrt(),u=ym(n,e),l=Tg({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=gn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return vn(1).add(t).div(vn(1).sub(t))})(i.clamp(0,.9999)),g=ym(p,n.toVec3()),m=Tg({f0:g,f90:1,dotVH:o}),f=vn(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),b=vn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(vn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return lp({start:1,end:2,condition:"<=",name:"m"},({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=vn(54856e-17,44201e-17,52481e-17),i=vn(1681e3,1795300,2208400),n=vn(43278e5,93046e5,66121e5),a=gn(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=vn(o.x.add(a),o.y,o.z).div(1.0685e-7),fm.mul(o)})(gn(e).mul(y),gn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(vn(0))}).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),xm=un(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=gn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=gn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),Tm=vn(.04),_m=gn(1);class vm extends fg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=vn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=vn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=vn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=vn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=vn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=Xd.dot(Od).clamp(),t=bm({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:ea}),r=bm({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:On.rgb});this.iridescenceFresnel=nu(t,r,zn),this.iridescenceF0Dielectric=zg({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=zg({f:r,f90:1,dotVH:e}),this.iridescenceF0=nu(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,zn)}if(!0===this.transmission){const t=Dd,r=ud.sub(Dd).normalize(),s=Kd,i=e.context;i.backdrop=mm(s,r,Gn,Vn,ta,ra,t,Td,nd,sd,ua,da,ha,ca,this.dispersion?pa:null),i.backdropAlpha=la,On.a.mulAssign(nu(1,i.backdrop.a,la))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=Xd.dot(Od).clamp(),a=Vg({roughness:Gn,dotNV:n}),o=i?jn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Xd.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(Hg({lightDirection:e})));const t=xm({normal:Xd,viewDir:Od,roughness:qn}),r=xm({normal:Xd,viewDir:e,roughness:qn}),i=Hn.r.max(Hn.g).max(Hn.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=Yd.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Ug({lightDirection:e,f0:Tm,f90:_m,roughness:Wn,normalView:Yd})))}r.directDiffuse.addAssign(s.mul(_g({diffuseColor:Vn}))),r.directSpecular.addAssign(s.mul(kg({lightDirection:e,f0:ta,f90:1,roughness:Gn,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=Xd,h=Od,p=Id.toVar(),g=qg({N:c,V:h,roughness:Gn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Bn(vn(m.x,0,m.y),vn(0,1,0),vn(m.z,0,m.w)).toVar(),b=ta.mul(f.x).add(ta.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(Kg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Vn).mul(Kg({N:c,V:h,P:p,mInv:Bn(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context,s=t.mul(_g({diffuseColor:Vn})).toVar();if(!0===this.sheen){const e=xm({normal:Xd,viewDir:Od,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(Hn,xm({normal:Xd,viewDir:Od,roughness:qn}))),!0===this.clearcoat){const e=Yd.dot(Od).clamp(),t=Gg({dotNV:e,specularColor:Tm,specularF90:_m,roughness:Wn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=vn().toVar("singleScatteringDielectric"),n=vn().toVar("multiScatteringDielectric"),a=vn().toVar("singleScatteringMetallic"),o=vn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ra,ea,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ra,On.rgb,this.iridescenceF0Metallic);const u=nu(i,a,zn),l=nu(n,o,zn),d=i.add(n),c=Vn.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=xm({normal:Xd,viewDir:Od,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=Xd.dot(Od).clamp().add(t),i=Gn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Yd.dot(Od).clamp(),r=Tg({dotVH:e,f0:Tm,f90:_m}),s=t.mul($n.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul($n));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const Nm=gn(1),Sm=gn(-2),Rm=gn(.8),Am=gn(-1),Em=gn(.4),wm=gn(2),Cm=gn(.305),Mm=gn(3),Bm=gn(.21),Lm=gn(4),Fm=gn(4),Pm=gn(16),Dm=un(([e])=>{const t=vn(Mo(e)).toVar(),r=gn(-1).toVar();return cn(t.x.greaterThan(t.z),()=>{cn(t.x.greaterThan(t.y),()=>{r.assign(bu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}).Else(()=>{cn(t.z.greaterThan(t.y),()=>{r.assign(bu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Um=un(([e,t])=>{const r=bn().toVar();return cn(t.equal(0),()=>{r.assign(bn(e.z,e.y).div(Mo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(bn(e.x.negate(),e.z.negate()).div(Mo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(bn(e.x.negate(),e.y).div(Mo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(bn(e.z.negate(),e.y).div(Mo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(bn(e.x.negate(),e.z).div(Mo(e.y)))}).Else(()=>{r.assign(bn(e.x,e.y).div(Mo(e.z)))}),La(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Im=un(([e])=>{const t=gn(0).toVar();return cn(e.greaterThanEqual(Rm),()=>{t.assign(Nm.sub(e).mul(Am.sub(Sm)).div(Nm.sub(Rm)).add(Sm))}).ElseIf(e.greaterThanEqual(Em),()=>{t.assign(Rm.sub(e).mul(wm.sub(Am)).div(Rm.sub(Em)).add(Am))}).ElseIf(e.greaterThanEqual(Cm),()=>{t.assign(Em.sub(e).mul(Mm.sub(wm)).div(Em.sub(Cm)).add(wm))}).ElseIf(e.greaterThanEqual(Bm),()=>{t.assign(Cm.sub(e).mul(Lm.sub(Mm)).div(Cm.sub(Bm)).add(Mm))}).Else(()=>{t.assign(gn(-2).mul(yo(La(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Om=un(([e,t])=>{const r=e.toVar();r.assign(La(2,r).sub(1));const s=vn(r,1).toVar();return cn(t.equal(0),()=>{s.assign(s.zyx)}).ElseIf(t.equal(1),()=>{s.assign(s.xzy),s.xz.mulAssign(-1)}).ElseIf(t.equal(2),()=>{s.x.mulAssign(-1)}).ElseIf(t.equal(3),()=>{s.assign(s.zyx),s.xz.mulAssign(-1)}).ElseIf(t.equal(4),()=>{s.assign(s.xzy),s.xy.mulAssign(-1)}).ElseIf(t.equal(5),()=>{s.z.mulAssign(-1)}),s}).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),Vm=un(([e,t,r,s,i,n])=>{const a=gn(r),o=vn(t),u=au(Im(a),Sm,n),l=No(u),d=To(u),c=vn(km(e,o,d,s,i,n)).toVar();return cn(l.notEqual(0),()=>{const t=vn(km(e,o,d.add(1),s,i,n)).toVar();c.assign(nu(c,t,l))}),c}),km=un(([e,t,r,s,i,n])=>{const a=gn(r).toVar(),o=vn(t),u=gn(Dm(o)).toVar(),l=gn(Ho(Fm.sub(a),0)).toVar();a.assign(Ho(a,Fm));const d=gn(mo(a)).toVar(),c=bn(Um(o,u).mul(d.sub(2)).add(1)).toVar();return cn(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(La(3,Pm))),c.y.addAssign(La(4,mo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(bn(),bn())}),Gm=un(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Ro(s),l=r.mul(u).add(i.cross(r).mul(So(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return km(e,l,t,n,a,o)}),zm=un(({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=vn(bu(t,r,Qo(r,s))).toVar();cn(h.equal(vn(0)),()=>{h.assign(vn(s.z,0,s.x.negate()))}),h.assign(vo(h));const p=vn().toVar();return p.addAssign(i.element(0).mul(Gm({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),lp({start:mn(1),end:e},({i:e})=>{cn(e.greaterThanEqual(n),()=>{dp()});const t=gn(a.mul(gn(e))).toVar();p.addAssign(i.element(e).mul(Gm({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(Gm({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),An(p,1)}),$m=un(([e])=>{const t=fn(e).toVar();return t.assign(t.shiftLeft(fn(16)).bitOr(t.shiftRight(fn(16)))),t.assign(t.bitAnd(fn(1431655765)).shiftLeft(fn(1)).bitOr(t.bitAnd(fn(2863311530)).shiftRight(fn(1)))),t.assign(t.bitAnd(fn(858993459)).shiftLeft(fn(2)).bitOr(t.bitAnd(fn(3435973836)).shiftRight(fn(2)))),t.assign(t.bitAnd(fn(252645135)).shiftLeft(fn(4)).bitOr(t.bitAnd(fn(4042322160)).shiftRight(fn(4)))),t.assign(t.bitAnd(fn(16711935)).shiftLeft(fn(8)).bitOr(t.bitAnd(fn(4278255360)).shiftRight(fn(8)))),gn(t).mul(2.3283064365386963e-10)}),Wm=un(([e,t])=>bn(gn(e).div(gn(t)),$m(e))),Hm=un(([e,t,r])=>{const s=r.mul(r).toConst(),i=vn(1,0,0).toConst(),n=Qo(t,i).toConst(),a=bo(e.x).toConst(),o=La(2,3.14159265359).mul(e.y).toConst(),u=a.mul(Ro(o)).toConst(),l=a.mul(So(o)).toVar(),d=La(.5,t.z.add(1)).toConst();l.assign(d.oneMinus().mul(bo(u.mul(u).oneMinus())).add(d.mul(l)));const c=i.mul(u).add(n.mul(l)).add(t.mul(bo(Ho(0,u.mul(u).add(l.mul(l)).oneMinus()))));return vo(vn(s.mul(c.x),s.mul(c.y),Ho(0,c.z)))}),qm=un(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=vn(s).toVar(),l=vn(0).toVar(),d=gn(0).toVar();return cn(e.lessThan(.001),()=>{l.assign(km(r,u,t,n,a,o))}).Else(()=>{const s=bu(Mo(u.z).lessThan(.999),vn(0,0,1),vn(1,0,0)),c=vo(Qo(s,u)).toVar(),h=Qo(u,c).toVar();lp({start:fn(0),end:i},({i:s})=>{const p=Wm(s,i),g=Hm(p,vn(0,0,1),e),m=vo(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=vo(m.mul(Yo(u,m).mul(2)).sub(u)),y=Ho(Yo(u,f),0);cn(y.greaterThan(0),()=>{const e=km(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),cn(d.greaterThan(0),()=>{l.assign(l.div(d))})}),An(l,1)}),jm=[.125,.215,.35,.446,.526,.582],Xm=20,Km=new _e(-1,1,1,-1,0,1),Ym=new ve(90,1),Qm=new e;let Zm=null,Jm=0,ef=0;const tf=new r,rf=new WeakMap,sf=[3,1,5,0,4,2],nf=Om(Rl(),Sl("faceIndex")).normalize(),af=vn(nf.x,nf.y,nf.z);class of{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=tf,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Zm=this._renderer.getRenderTarget(),Jm=this._renderer.getActiveCubeFace(),ef=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" instead.'),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=cf(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=hf(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===P||e.mapping===D?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=jm[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=sf[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Te;T.setAttribute("position",new Ee(y,g)),T.setAttribute("uv",new Ee(b,m)),T.setAttribute("faceIndex",new Ee(x,f)),s.push(new ne(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=Vl(new Array(Xm).fill(0)),n=_a(new r(0,1,0)),a=_a(0),o=gn(Xm),u=_a(0),l=_a(1),d=Fl(),c=_a(0),h=gn(1/t),p=gn(1/s),g=gn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:af,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=df("blur");return f.fragmentNode=zm({...m,latitudinal:u.equal(1)}),rf.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Fl(),i=_a(0),n=_a(0),a=gn(1/t),o=gn(1/r),u=gn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=df("ggx");return d.fragmentNode=qm({...l,N_immutable:af,GGX_SAMPLES:fn(512)}),rf.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ne(new Te,e);await this._renderer.compile(t,Km)}_sceneToCubeUV(e,t,r,s,i){const n=Ym;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Qm),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ne(new ie,new ge({name:"PMREM.Background",side:M,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(Qm),h=!0),u.setRenderTarget(s),u.clear(),h&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;lf(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===P||e.mapping===D;s?null===this._cubemapMaterial&&(this._cubemapMaterial=cf(e)):null===this._equirectMaterial&&(this._equirectMaterial=hf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;lf(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Km)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,lf(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,Km),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,lf(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,Km)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=rf.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):Xm;f>Xm&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),4*(this._cubeSize-T),3*T,2*T),u.setRenderTarget(t),u.render(c,Km)}}function uf(e,t){const r=new Ne(e,t,{magFilter:oe,minFilter:oe,generateMipmaps:!1,type:be,format:Re,colorSpace:Se});return r.texture.mapping=Ae,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function lf(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function df(e){const t=new Zp;return t.depthTest=!1,t.depthWrite=!1,t.blending=ee,t.name=`PMREM_${e}`,t}function cf(e){const t=df("cubemap");return t.fragmentNode=gc(e,af),t}function hf(e){const t=df("equirect");return t.fragmentNode=Fl(e,og(af),0),t}const pf=new WeakMap;function gf(e,t,r){const s=function(e){let t=pf.get(e);void 0===t&&(t=new WeakMap,pf.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class mf extends ci{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new N;s.isRenderTargetTexture=!0,this._texture=Fl(s),this._width=_a(0),this._height=_a(0),this._maxMip=_a(0),this.updateBeforeType=Js.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:gf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new of(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=ac.mul(vn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Vm(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const ff=rn(mf).setParameterLength(1,3),yf=new WeakMap;class bf extends fp{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=yf.get(e);void 0===s&&(s=ff(e),yf.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?qc:Xd,i=r.context(xf(Gn,s)).mul(nc),n=r.context(Tf(Kd)).mul(Math.PI).mul(nc),a=al(i),o=al(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(xf(Wn,Yd)).mul(nc),t=al(e);u.addAssign(t)}}}const xf=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Od.negate().reflect(t),r=tu(e).mix(r,t).normalize(),r=r.transformDirection(nd)),r),getTextureLevel:()=>e}},Tf=e=>({getUV:()=>e,getTextureLevel:()=>gn(1)}),_f=new we;class vf extends Zp{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(_f),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new bf(t):null}setupLightingModel(){return new vm}setupSpecular(){const e=nu(vn(.04),On.rgb,zn);ea.assign(vn(.04)),ta.assign(e),ra.assign(1)}setupVariants(){const e=this.metalnessNode?gn(this.metalnessNode):gh;zn.assign(e);let t=this.roughnessNode?gn(this.roughnessNode):ph;t=Mg({roughness:t}),Gn.assign(t),this.setupSpecular(),Vn.assign(On.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const Nf=new Ce;class Sf extends vf{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(Nf),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?gn(this.iorNode):wh;ua.assign(e),ea.assign(Wo(Jo(ua.sub(1).div(ua.add(1))).mul(dh),vn(1)).mul(lh)),ta.assign(nu(ea,On.rgb,zn)),ra.assign(nu(lh,1,zn))}setupLightingModel(){return new vm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?gn(this.clearcoatNode):fh,t=this.clearcoatRoughnessNode?gn(this.clearcoatRoughnessNode):yh;$n.assign(e),Wn.assign(Mg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?vn(this.sheenNode):Th,t=this.sheenRoughnessNode?gn(this.sheenRoughnessNode):_h;Hn.assign(e),qn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?gn(this.iridescenceNode):Nh,t=this.iridescenceIORNode?gn(this.iridescenceIORNode):Sh,r=this.iridescenceThicknessNode?gn(this.iridescenceThicknessNode):Rh;jn.assign(e),Xn.assign(t),Kn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?bn(this.anisotropyNode):vh).toVar();Qn.assign(e.length()),cn(Qn.equal(0),()=>{e.assign(bn(1,0))}).Else(()=>{e.divAssign(bn(Qn)),Qn.assign(Qn.saturate())}),Yn.assign(Qn.pow2().mix(Gn.pow2(),1)),Zn.assign(Wc[0].mul(e.x).add(Wc[1].mul(e.y))),Jn.assign(Wc[1].mul(e.x).sub(Wc[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?gn(this.transmissionNode):Ah,t=this.thicknessNode?gn(this.thicknessNode):Eh,r=this.attenuationDistanceNode?gn(this.attenuationDistanceNode):Ch,s=this.attenuationColorNode?vn(this.attenuationColorNode):Mh;if(la.assign(e),da.assign(t),ca.assign(r),ha.assign(s),this.useDispersion){const e=this.dispersionNode?gn(this.dispersionNode):Ih;pa.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?vn(this.clearcoatNormalNode):bh}setup(e){e.context.setupClearcoatNormal=()=>Lu(this.setupClearcoatNormal(e),"NORMAL","vec3"),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class Rf extends vm{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(Xd.mul(a)).normalize(),h=gn(Od.dot(c.negate()).saturate().pow(l).mul(d)),p=vn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Af extends Sf{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=gn(.1),this.thicknessAmbientNode=gn(0),this.thicknessAttenuationNode=gn(.1),this.thicknessPowerNode=gn(2),this.thicknessScaleNode=gn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new Rf(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const Ef=un(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=bn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=Tc("gradientMap","texture").context({getUV:()=>i});return vn(e.r)}{const e=i.fwidth().mul(.5);return nu(vn(.7),vn(1),lu(gn(.7).sub(e.x),gn(.7).add(e.x),i.x))}});class wf extends fg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Ef({normal:$d,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(_g({diffuseColor:On.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(_g({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const Cf=new Me;class Mf extends Zp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Cf),this.setValues(e)}setupLightingModel(){return new wf}}const Bf=un(()=>{const e=vn(Od.z,0,Od.x.negate()).normalize(),t=Od.cross(e);return bn(e.dot(Xd),t.dot(Xd)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Lf=new Be;class Ff extends Zp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Lf),this.setValues(e)}setupVariants(e){const t=Bf;let r;r=e.material.matcap?Tc("matcap","texture").context({getUV:()=>t}):vn(nu(.2,.8,t.y)),On.rgb.mulAssign(r.rgb)}}class Pf extends ci{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return Mn(e,s,s.negate(),e).mul(r)}{const e=t,s=Ln(An(1,0,0,0),An(0,Ro(e.x),So(e.x).negate(),0),An(0,So(e.x),Ro(e.x),0),An(0,0,0,1)),i=Ln(An(Ro(e.y),0,So(e.y),0),An(0,1,0,0),An(So(e.y).negate(),0,Ro(e.y),0),An(0,0,0,1)),n=Ln(An(Ro(e.z),So(e.z).negate(),0,0),An(So(e.z),Ro(e.z),0,0),An(0,0,1,0),An(0,0,0,1));return s.mul(i).mul(n).mul(An(r,1)).xyz}}}const Df=rn(Pf).setParameterLength(2),Uf=new Le;class If extends Zp{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(Uf),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=Ed.mul(vn(s||0));let u=bn(Td[0].xyz.length(),Td[1].xyz.length());null!==n&&(u=u.mul(bn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=Ld.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new $u(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=gn(i||xh),c=Df(l,d);return An(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const Of=new Fe,Vf=new t;class kf extends If{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Of),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Ed.mul(vn(e||Fd)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?bn(n):Uh;u=u.mul(Hl),r.isPerspectiveCamera&&!0===a&&(u=u.mul(Gf.div(Id.z.negate()))),i&&i.isNode&&(u=u.mul(bn(i)));let l=Ld.xy;if(s&&s.isNode){const e=gn(s);l=Df(l,e)}return l=l.mul(u),l=l.div(Yl.div(2)),l=l.mul(o.w),o=o.add(An(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const Gf=_a(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(Vf);this.value=.5*t.y});class zf extends fg{constructor(){super(),this.shadowNode=gn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){On.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(On.rgb)}}const $f=new Pe;class Wf extends Zp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues($f),this.setValues(e)}setupLightingModel(){return new zf}}const Hf=Un("vec3"),qf=Un("vec3"),jf=Un("vec3");class Xf extends fg{constructor(){super()}start(e){const{material:t}=e,r=Un("vec3"),s=Un("vec3");cn(ud.sub(Dd).length().greaterThan(Sd.mul(2)),()=>{r.assign(ud),s.assign(Dd)}).Else(()=>{r.assign(Dd),s.assign(ud)});const i=s.sub(r),n=_a("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=gn(0).toVar(),l=vn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),lp(n,()=>{const s=r.add(o.mul(u)),i=nd.mul(An(s,1)).xyz;let n;null!==t.depthNode&&(qf.assign(Ip(Lp(i.z,td,rd))),e.context.sceneDepthNode=Ip(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,Hf.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&Hf.mulAssign(n);const d=Hf.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),jf.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?cn(r.greaterThanEqual(qf),()=>{Hf.addAssign(e)}):Hf.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(Yg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(jf)}}class Kf extends Zp{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=M,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new Xf}}class Yf{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,this._context="undefined"!=typeof self?self:null,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class Qf{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getIndirectOffset(){return this._geometries.getIndirectOffset(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.id),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Us(s)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=Os(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Os(e,1)),e=Os(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const ey=[];class ty{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);ey[0]=e,ey[1]=t,ey[2]=n,ey[3]=i;let l=u.get(ey);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(ey,l)):(l.camera=s,l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),ey[0]=null,ey[1]=null,ey[2]=null,ey[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Qf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Jf(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class ry{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const sy=1,iy=2,ny=3,ay=4,oy=16;class uy extends ry{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===sy?this.backend.createAttribute(e):t===iy?this.backend.createIndexAttribute(e):t===ny?this.backend.createStorageAttribute(e):t===ay&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,ny):this.updateAttribute(e,sy);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,iy);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,ay)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndirectOffset(e){return e.geometry.indirectOffset}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=dy(t),e.set(t,r)):r.version!==ly(t)&&(this.attributes.delete(r),r=dy(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class hy{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):o("WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class py{constructor(e){this.cacheKey=e,this.usedTimes=0}}class gy extends py{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class my extends py{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let fy=0;class yy{constructor(e,t,r,s=null,i=null){this.id=fy++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class by extends ry{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new yy(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new yy(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new yy(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new my(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new gy(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class xy extends ry{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ay:ny;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ay:ny;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0,i=!1));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture&&!0===o.mipmapsAutoUpdate){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0,i=!1)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function Ty(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function _y(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function vy(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===B&&!1===e.forceSinglePass}class Ny{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(vy(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(vy(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||Ty),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||_y),this.transparent.length>1&&this.transparent.sort(t||_y)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new Y,l.format=e.stencilBuffer?Oe:Ve,l.type=e.stencilBuffer?ke:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,l.isArrayTexture=!0===e.multiview&&a.depth>1,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:Ge}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,this.info.memory.textures++,e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=My){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1)):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput(e)?this.outputNode.build(e,...t):super.build(e,...t),ln(r),e.removeActiveStack(this),o}}const Dy=rn(Py).setParameterLength(0,1);class Uy extends ui{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1})),this.name=t,this.isStructLayoutNode=!0}getLength(){const e=Float32Array.BYTES_PER_ELEMENT;let t=1,r=0;for(const s of this.membersLayout){const i=s.type,n=Ws(i),a=Hs(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}getMemberType(e,t){const r=this.membersLayout.find(e=>e.name===t);return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Iy extends ui{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.getMemberType(e,t)}_getChildren(){const e=super._getChildren(),t=e.find(e=>e.childNode===this.structTypeNode);return e.splice(e.indexOf(t),1),e.push(t),e}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structTypeNode.membersLayout,this.values)}`,this),t.name}}class Oy extends ui{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(){return"OutputType"}generate(e){const t=e.getDataFromNode(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;tnew qy(e,"uint","float"),Ky={};class Yy extends ro{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(jy(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return fn;case"int":return mn;case"uvec2":return Tn;case"uvec3":return Sn;case"uvec4":return wn;case"ivec2":return xn;case"ivec3":return Nn;case"ivec4":return En}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t);const i=gn(s.bitAnd(Fo(s))),n=Xy(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{cn(e.equal(fn(0)),()=>fn(32));const s=fn(0),i=fn(0);return this._resolveElementType(e,s,t),cn(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),cn(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),cn(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),cn(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),cn(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(fn(1)).bitAnd(fn(1431655765)))),s.assign(s.bitAnd(fn(858993459)).add(s.shiftRight(fn(2)).bitAnd(fn(858993459))));const i=s.add(s.shiftRight(fn(4))).bitAnd(fn(252645135)).mul(fn(16843009)).shiftRight(fn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return un(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}Yy.COUNT_TRAILING_ZEROS="countTrailingZeros",Yy.COUNT_LEADING_ZEROS="countLeadingZeros",Yy.COUNT_ONE_BITS="countOneBits";const Qy=nn(Yy,Yy.COUNT_TRAILING_ZEROS).setParameterLength(1),Zy=nn(Yy,Yy.COUNT_LEADING_ZEROS).setParameterLength(1),Jy=nn(Yy,Yy.COUNT_ONE_BITS).setParameterLength(1),eb=un(([e])=>{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)}),tb=(e,t)=>Zo(La(4,e.mul(Ba(1,e))),t);class rb extends ci{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}getNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const sb=nn(rb,"snorm").setParameterLength(1),ib=nn(rb,"unorm").setParameterLength(1),nb=nn(rb,"float16").setParameterLength(1);class ab extends ci{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}getNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const ob=nn(ab,"snorm").setParameterLength(1),ub=nn(ab,"unorm").setParameterLength(1),lb=nn(ab,"float16").setParameterLength(1),db=un(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),cb=un(([e])=>vn(db(e.z.add(db(e.y.mul(1)))),db(e.z.add(db(e.x.mul(1)))),db(e.y.add(db(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),hb=un(([e,t,r])=>{const s=vn(e).toVar(),i=gn(1.4).toVar(),n=gn(0).toVar(),a=vn(s).toVar();return lp({start:gn(0),end:gn(3),type:"float",condition:"<="},()=>{const e=vn(cb(a.mul(2))).toVar();s.addAssign(e.add(r.mul(gn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=gn(db(s.z.add(db(s.x.add(db(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)}),n}).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class pb extends ui{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}getNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const gb=rn(pb),mb=e=>(...t)=>gb(e,...t),fb=_a(0).setGroup(ba).onRenderUpdate(e=>e.time),yb=_a(0).setGroup(ba).onRenderUpdate(e=>e.deltaTime),bb=_a(0,"uint").setGroup(ba).onRenderUpdate(e=>e.frameId);const xb=un(([e,t,r=bn(.5)])=>Df(e.sub(r),t).add(r)),Tb=un(([e,t,r=bn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),_b=un(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Td.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Td;const i=nd.mul(s);return Ki(t)&&(i[0][0]=Td[0].length(),i[0][1]=0,i[0][2]=0),Ki(r)&&(i[1][0]=0,i[1][1]=Td[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,sd.mul(i).mul(Fd)}),vb=un(([e=null])=>{const t=Ip();return Ip(Cp(e)).sub(t).lessThan(0).select(ql,e)}),Nb=un(([e,t=Rl(),r=gn(0)])=>{const s=e.x,i=e.y,n=r.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=e.reciprocal(),l=bn(a,o);return t.add(l).mul(u)}),Sb=un(([e,t=null,r=null,s=gn(1),i=Fd,n=Wd])=>{let a=n.abs().normalize();a=a.div(a.dot(vn(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=Fl(d,o).mul(a.x),g=Fl(c,u).mul(a.y),m=Fl(h,l).mul(a.z);return Ma(p,g,m)}),Rb=new je,Ab=new r,Eb=new r,wb=new r,Cb=new a,Mb=new r(0,0,-1),Bb=new s,Lb=new r,Fb=new r,Pb=new s,Db=new t,Ub=new Ne,Ib=ql.flipX();Ub.depthTexture=new Y(1,1);let Ob=!1;class Vb extends Bl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Ub.texture,Ib),this._reflectorBaseNode=e.reflector||new kb(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Zi(new Vb({defaultTexture:Ub.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class kb extends ui{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Xe,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Js.RENDER:Js.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Db),e.setSize(Math.round(Db.width*r),Math.round(Db.height*r))}setup(e){return this._updateResolution(Ub,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new Ne(0,0,{type:be,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=Ke,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new Y),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&Ob)return!1;Ob=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Db),this._updateResolution(o,s),Eb.setFromMatrixPosition(n.matrixWorld),wb.setFromMatrixPosition(r.matrixWorld),Cb.extractRotation(n.matrixWorld),Ab.set(0,0,1),Ab.applyMatrix4(Cb),Lb.subVectors(Eb,wb);let u=!1;if(!0===Lb.dot(Ab)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Ob=!1);u=!0}Lb.reflect(Ab).negate(),Lb.add(Eb),Cb.extractRotation(r.matrixWorld),Mb.set(0,0,-1),Mb.applyMatrix4(Cb),Mb.add(wb),Fb.subVectors(Eb,Mb),Fb.reflect(Ab).negate(),Fb.add(Eb),a.coordinateSystem=r.coordinateSystem,a.position.copy(Lb),a.up.set(0,1,0),a.up.applyMatrix4(Cb),a.up.reflect(Ab),a.lookAt(Fb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Rb.setFromNormalAndCoplanarPoint(Ab,Eb),Rb.applyMatrix4(a.matrixWorldInverse),Bb.set(Rb.normal.x,Rb.normal.y,Rb.normal.z,Rb.constant);const l=a.projectionMatrix;Pb.x=(Math.sign(Bb.x)+l.elements[8])/l.elements[0],Pb.y=(Math.sign(Bb.y)+l.elements[9])/l.elements[5],Pb.z=-1,Pb.w=(1+l.elements[10])/l.elements[14],Bb.multiplyScalar(1/Bb.dot(Pb));l.elements[2]=Bb.x,l.elements[6]=Bb.y,l.elements[10]=s.coordinateSystem===h?Bb.z-0:Bb.z+1-0,l.elements[14]=Bb.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,Ob=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const Gb=new _e(-1,1,1,-1,0,1);class zb extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Ye([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Ye(t,2))}}const $b=new zb;class Wb extends ne{constructor(e=null){super($b,e),this.camera=Gb,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,Gb)}render(e){e.render(this,Gb)}}const Hb=new t;class qb extends Bl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new Ne(t,r,s);super(i.texture,Rl()),this.isRTTNode=!0,this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new Wb(new Zp),this.updateBeforeType=Js.RENDER}get autoResize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoResize){const t=e.getPixelRatio(),r=e.getSize(Hb),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Bl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const jb=(e,...t)=>Zi(new qb(Zi(e),...t)),Xb=un(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=bn(e.x,e.y.oneMinus()).mul(2).sub(1),i=An(vn(e,t),1)):i=An(vn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=An(r.mul(i));return n.xyz.div(n.w)}),Kb=un(([e,t])=>{const r=t.mul(An(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return bn(s.x,s.y.oneMinus())}),Yb=un(([e,t,r])=>{const s=El(Pl(t)),i=xn(e.mul(s)).toVar(),n=Pl(t,i).toVar(),a=Pl(t,i.sub(xn(2,0))).toVar(),o=Pl(t,i.sub(xn(1,0))).toVar(),u=Pl(t,i.add(xn(1,0))).toVar(),l=Pl(t,i.add(xn(2,0))).toVar(),d=Pl(t,i.add(xn(0,2))).toVar(),c=Pl(t,i.add(xn(0,1))).toVar(),h=Pl(t,i.sub(xn(0,1))).toVar(),p=Pl(t,i.sub(xn(0,2))).toVar(),g=Mo(Ba(gn(2).mul(o).sub(a),n)).toVar(),m=Mo(Ba(gn(2).mul(u).sub(l),n)).toVar(),f=Mo(Ba(gn(2).mul(c).sub(d),n)).toVar(),y=Mo(Ba(gn(2).mul(h).sub(p),n)).toVar(),b=Xb(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(Xb(e.sub(bn(gn(1).div(s.x),0)),o,r)),b.negate().add(Xb(e.add(bn(gn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(Xb(e.add(bn(0,gn(1).div(s.y))),c,r)),b.negate().add(Xb(e.sub(bn(0,gn(1).div(s.y))),h,r)));return vo(Qo(x,T))}),Qb=un(([e])=>No(gn(52.9829189).mul(No(Yo(e,bn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),Zb=un(([e,t,r])=>{const s=gn(2.399963229728653),i=bo(gn(e).add(.5).div(gn(t))),n=gn(e).mul(s).add(r);return bn(Ro(n),So(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class Jb extends ui{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Rl())}sample(e){return this.callback(e)}}class ex extends ui{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===ex.OBJECT?this.updateType=Js.OBJECT:e===ex.MATERIAL?this.updateType=Js.RENDER:e===ex.BEFORE_OBJECT?this.updateBeforeType=Js.OBJECT:e===ex.BEFORE_MATERIAL&&(this.updateBeforeType=Js.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}ex.OBJECT="object",ex.MATERIAL="material",ex.BEFORE_OBJECT="beforeObject",ex.BEFORE_MATERIAL="beforeMaterial";const tx=(e,t)=>new ex(e,t).toStack();class rx extends W{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class sx extends Ee{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class ix extends ui{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const nx=sn(ix),ax=new L,ox=new a;class ux extends ui{static get type(){return"SceneNode"}constructor(e=ux.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===ux.BACKGROUND_BLURRINESS?s=yc("backgroundBlurriness","float",r):t===ux.BACKGROUND_INTENSITY?s=yc("backgroundIntensity","float",r):t===ux.BACKGROUND_ROTATION?s=_a("mat4").setName("backgroundRotation").setGroup(ba).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Qe?(ax.copy(r.backgroundRotation),ax.x*=-1,ax.y*=-1,ax.z*=-1,ox.makeRotationFromEuler(ax)):ox.identity(),ox}):o("SceneNode: Unknown scope:",t),s}}ux.BACKGROUND_BLURRINESS="backgroundBlurriness",ux.BACKGROUND_INTENSITY="backgroundIntensity",ux.BACKGROUND_ROTATION="backgroundRotation";const lx=sn(ux,ux.BACKGROUND_BLURRINESS),dx=sn(ux,ux.BACKGROUND_INTENSITY),cx=sn(ux,ux.BACKGROUND_ROTATION);class hx extends Bl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=ti.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(ti.READ_WRITE)}toReadOnly(){return this.setAccess(ti.READ_ONLY)}toWriteOnly(){return this.setAccess(ti.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e.mipLevel=this.mipLevel,e}}const px=rn(hx).setParameterLength(1,3),gx=un(({texture:e,uv:t})=>{const r=1e-4,s=vn().toVar();return cn(t.x.lessThan(r),()=>{s.assign(vn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(vn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(vn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(vn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(vn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(vn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(vn(-.01,0,0))).r.sub(e.sample(t.add(vn(r,0,0))).r),n=e.sample(t.add(vn(0,-.01,0))).r.sub(e.sample(t.add(vn(0,r,0))).r),a=e.sample(t.add(vn(0,0,-.01))).r.sub(e.sample(t.add(vn(0,0,r))).r);s.assign(vn(i,n,a))}),s.normalize()});class mx extends Bl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return vn(.5,.5,.5)}setUpdateMatrix(){}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return gx({texture:this,uv:e})}}const fx=rn(mx).setParameterLength(1,3);class yx extends fc{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const bx=new WeakMap;class xx extends ci{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Js.OBJECT,this.updateAfterType=Js.OBJECT,this.previousModelWorldMatrix=_a(new a),this.previousProjectionMatrix=_a(new a).setGroup(ba),this.previousCameraViewMatrix=_a(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=_x(r);this.previousModelWorldMatrix.value.copy(s);const i=Tx(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){_x(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?sd:_a(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Ed).mul(Fd),s=this.previousProjectionMatrix.mul(t).mul(Pd),i=r.xy.div(r.w),n=s.xy.div(s.w);return Ba(i,n)}}function Tx(e){let t=bx.get(e);return void 0===t&&(t={},bx.set(e,t)),t}function _x(e,t=0){const r=Tx(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const vx=sn(xx),Nx=un(([e])=>Ex(e.rgb)),Sx=un(([e,t=gn(1)])=>t.mix(Ex(e.rgb),e.rgb)),Rx=un(([e,t=gn(1)])=>{const r=Ma(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return nu(e.rgb,s,i)}),Ax=un(([e,t=gn(1)])=>{const r=vn(.57735,.57735,.57735),s=t.cos();return vn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Yo(r,e.rgb).mul(s.oneMinus())))))}),Ex=(e,t=vn(p.getLuminanceCoefficients(new r)))=>Yo(e,t),wx=un(([e,t=vn(1),s=vn(0),i=vn(1),n=gn(1),a=vn(p.getLuminanceCoefficients(new r,Se))])=>{const o=e.rgb.dot(vn(a)),u=Ho(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return cn(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),cn(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),cn(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),An(u.rgb,e.a)});class Cx extends ci{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Mx=rn(Cx).setParameterLength(2);let Bx=null;class Lx extends vp{static get type(){return"ViewportSharedTextureNode"}constructor(e=ql,t=null){null===Bx&&(Bx=new X),super(e,t,Bx)}getTextureForReference(){return Bx}updateReference(){return this}}const Fx=rn(Lx).setParameterLength(0,2),Px=new t;class Dx extends Bl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Ux extends Dx{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}class Ix extends ci{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new Y;i.isRenderTargetTexture=!0,i.name="depth";const n=new Ne(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:be,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=_a(0),this._cameraFar=_a(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Js.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=new Ux(this,e),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=new Ux(this,e,!0),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Fp(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Bp(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getOutputBufferType(),this.scope===Ix.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Px.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Px)),this._pixelRatio=i,this.setSize(Px.width,Px.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:Tu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Ix.COLOR="color",Ix.DEPTH="depth";class Ox extends Ix{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Ix.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)}),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Zp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=M;const t=Wd.negate(),r=sd.mul(Ed),s=gn(1),i=r.mul(An(Fd,1)),n=r.mul(An(Fd.add(t),1)),a=vo(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=An(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Vx=un(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),kx=un(([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp()).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Gx=un(([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)}).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),zx=un(([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)}),$x=un(([e,t])=>{const r=Bn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Bn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=zx(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Wx=Bn(vn(1.6605,-.1246,-.0182),vn(-.5876,1.1329,-.1006),vn(-.0728,-.0083,1.1187)),Hx=Bn(vn(.6274,.0691,.0164),vn(.3293,.9195,.088),vn(.0433,.0113,.8956)),qx=un(([e])=>{const t=vn(e).toVar(),r=vn(t.mul(t)).toVar(),s=vn(r.mul(r)).toVar();return gn(15.5).mul(s.mul(r)).sub(La(40.14,s.mul(t))).add(La(31.96,s).sub(La(6.868,r.mul(t))).add(La(.4298,r).add(La(.1191,t).sub(.00232))))}),jx=un(([e,t])=>{const r=vn(e).toVar(),s=Bn(vn(.856627153315983,.137318972929847,.11189821299995),vn(.0951212405381588,.761241990602591,.0767994186031903),vn(.0482516061458583,.101439036467562,.811302368396859)),i=Bn(vn(1.1271005818144368,-.1413297634984383,-.14132976349843826),vn(-.11060664309660323,1.157823702216272,-.11060664309660294),vn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=gn(-12.47393),a=gn(4.026069);return r.mulAssign(t),r.assign(Hx.mul(r)),r.assign(s.mul(r)),r.assign(Ho(r,1e-10)),r.assign(yo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(au(r,0,1)),r.assign(qx(r)),r.assign(i.mul(r)),r.assign(Zo(Ho(vn(0),r),vn(2.2))),r.assign(Wx.mul(r)),r.assign(au(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Xx=un(([e,t])=>{const r=gn(.76),s=gn(.15);e=e.mul(t);const i=Wo(e.r,Wo(e.g,e.b)),n=bu(i.lessThan(.08),i.sub(La(6.25,i.mul(i))),.04);e.subAssign(n);const a=Ho(e.r,Ho(e.g,e.b));cn(a.lessThan(r),()=>e);const o=Ba(1,r),u=Ba(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=Ba(1,Fa(1,s.mul(a.sub(u)).add(1)));return nu(e,vn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class Kx extends ui{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const Yx=rn(Kx).setParameterLength(1,3);class Qx extends Kx{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const Zx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Jx extends ui{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new u,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:gn()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Ks(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Ys(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const eT=rn(Jx).setParameterLength(1);class tT extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class rT{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const sT=new tT;class iT extends ui{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new tT,this._output=eT(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=eT(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=eT(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new rT(this),t=sT.get("THREE"),r=sT.get("TSL"),s=this.getMethod(),i=[e,this._local,sT,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:gn()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[Us(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Is(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const nT=rn(iT).setParameterLength(1,2);function aT(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Id.z).negate()}const oT=un(([e,t],r)=>{const s=aT(r);return lu(e,t,s)}),uT=un(([e],t)=>{const r=aT(t);return e.mul(e,r,r).negate().exp().oneMinus()}),lT=un(([e,t],r)=>{const s=aT(r),i=t.sub(Dd.y).max(0).toConst().mul(s).toConst();return e.mul(e,i,i).negate().exp().oneMinus()}),dT=un(([e,t])=>An(t.toFloat().mix(ia.rgb,e.toVec3()),ia.a));let cT=null,hT=null;class pT extends ui{static get type(){return"RangeNode"}constructor(e=gn(),t=gn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(qs(t.value)),i=e.getTypeLength(qs(r.value));return s>i?s:i}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Error('THREE.TSL: No "ConstNode" found in node graph.');return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(qs(a)),d=e.getTypeLength(qs(o));cT=cT||new s,hT=hT||new s,cT.setScalar(0),hT.setScalar(0),1===u?cT.setScalar(a):a.isColor?cT.set(a.r,a.g,a.b,1):cT.set(a.x,a.y,a.z||0,a.w||0),1===d?hT.setScalar(o):o.isColor?hT.set(o.r,o.g,o.b,1):hT.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew mT(e,t),yT=fT("numWorkgroups","uvec3"),bT=fT("workgroupId","uvec3"),xT=fT("globalId","uvec3"),TT=fT("localId","uvec3"),_T=fT("subgroupSize","uint");class vT extends ui{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}}const NT=rn(vT);class ST extends li{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class RT extends ui{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new ST(this,e)}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class AT extends ui{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=gl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}AT.ATOMIC_LOAD="atomicLoad",AT.ATOMIC_STORE="atomicStore",AT.ATOMIC_ADD="atomicAdd",AT.ATOMIC_SUB="atomicSub",AT.ATOMIC_MAX="atomicMax",AT.ATOMIC_MIN="atomicMin",AT.ATOMIC_AND="atomicAnd",AT.ATOMIC_OR="atomicOr",AT.ATOMIC_XOR="atomicXor";const ET=rn(AT),wT=(e,t,r)=>ET(e,t,r).toStack();class CT extends ci{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}getNodeType(e){const t=this.method;return t===CT.SUBGROUP_ELECT?"bool":t===CT.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===CT.SUBGROUP_BROADCAST||r===CT.SUBGROUP_SHUFFLE||r===CT.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===CT.SUBGROUP_SHUFFLE_XOR||r===CT.SUBGROUP_SHUFFLE_DOWN||r===CT.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}CT.SUBGROUP_ELECT="subgroupElect",CT.SUBGROUP_BALLOT="subgroupBallot",CT.SUBGROUP_ADD="subgroupAdd",CT.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",CT.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",CT.SUBGROUP_MUL="subgroupMul",CT.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",CT.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",CT.SUBGROUP_AND="subgroupAnd",CT.SUBGROUP_OR="subgroupOr",CT.SUBGROUP_XOR="subgroupXor",CT.SUBGROUP_MIN="subgroupMin",CT.SUBGROUP_MAX="subgroupMax",CT.SUBGROUP_ALL="subgroupAll",CT.SUBGROUP_ANY="subgroupAny",CT.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",CT.QUAD_SWAP_X="quadSwapX",CT.QUAD_SWAP_Y="quadSwapY",CT.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",CT.SUBGROUP_BROADCAST="subgroupBroadcast",CT.SUBGROUP_SHUFFLE="subgroupShuffle",CT.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",CT.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",CT.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",CT.QUAD_BROADCAST="quadBroadcast";const MT=nn(CT,CT.SUBGROUP_ELECT).setParameterLength(0),BT=nn(CT,CT.SUBGROUP_BALLOT).setParameterLength(1),LT=nn(CT,CT.SUBGROUP_ADD).setParameterLength(1),FT=nn(CT,CT.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),PT=nn(CT,CT.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),DT=nn(CT,CT.SUBGROUP_MUL).setParameterLength(1),UT=nn(CT,CT.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),IT=nn(CT,CT.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),OT=nn(CT,CT.SUBGROUP_AND).setParameterLength(1),VT=nn(CT,CT.SUBGROUP_OR).setParameterLength(1),kT=nn(CT,CT.SUBGROUP_XOR).setParameterLength(1),GT=nn(CT,CT.SUBGROUP_MIN).setParameterLength(1),zT=nn(CT,CT.SUBGROUP_MAX).setParameterLength(1),$T=nn(CT,CT.SUBGROUP_ALL).setParameterLength(0),WT=nn(CT,CT.SUBGROUP_ANY).setParameterLength(0),HT=nn(CT,CT.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),qT=nn(CT,CT.QUAD_SWAP_X).setParameterLength(1),jT=nn(CT,CT.QUAD_SWAP_Y).setParameterLength(1),XT=nn(CT,CT.QUAD_SWAP_DIAGONAL).setParameterLength(1),KT=nn(CT,CT.SUBGROUP_BROADCAST).setParameterLength(2),YT=nn(CT,CT.SUBGROUP_SHUFFLE).setParameterLength(2),QT=nn(CT,CT.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),ZT=nn(CT,CT.SUBGROUP_SHUFFLE_UP).setParameterLength(2),JT=nn(CT,CT.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),e_=nn(CT,CT.QUAD_BROADCAST).setParameterLength(1);let t_;function r_(e){t_=t_||new WeakMap;let t=t_.get(e);return void 0===t&&t_.set(e,t={}),t}function s_(e){const t=r_(e);return t.shadowMatrix||(t.shadowMatrix=_a("mat4").setGroup(ba).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function i_(e,t=Dd){const r=s_(e).mul(t);return r.xyz.div(r.w)}function n_(e){const t=r_(e);return t.position||(t.position=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function a_(e){const t=r_(e);return t.targetPosition||(t.targetPosition=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function o_(e){const t=r_(e);return t.viewPosition||(t.viewPosition=_a(new r).setGroup(ba).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const u_=e=>nd.transformDirection(n_(e).sub(a_(e))),l_=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},d_=new WeakMap,c_=[];class h_ extends ui{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Un("vec3","totalDiffuse"),this.totalSpecularNode=Un("vec3","totalSpecular"),this.outgoingLightNode=Un("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Zi(e));else{let s=null;if(null!==r&&(s=l_(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;d_.has(e)?s=d_.get(e):(s=new r(e),d_.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getNodeProperties(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=vn(null!==l?l.mix(g,u):u)),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class p_ extends ui{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Js.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){g_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Dd)}}const g_=Un("vec3","shadowPositionWorld");function m_(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function f_(e,t){return t=m_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function y_(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function b_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function x_(e,t){return t=b_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function T_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function __(e,t,r){return r=x_(t,r=f_(e,r))}function v_(e,t,r){y_(e,r),T_(t,r)}var N_=Object.freeze({__proto__:null,resetRendererAndSceneState:__,resetRendererState:f_,resetSceneState:x_,restoreRendererAndSceneState:v_,restoreRendererState:y_,restoreSceneState:T_,saveRendererAndSceneState:function(e,t,r={}){return r=b_(t,r=m_(e,r))},saveRendererState:m_,saveSceneState:b_});const S_=new WeakMap,R_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),A_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=yc("mapSize","vec2",r).setGroup(ba),a=yc("radius","float",r).setGroup(ba),o=bn(1).div(n),u=a.mul(o.x),l=Qb(Xl.xy).mul(6.28318530718);return Ma(i(t.xy.add(Zb(0,5,l).mul(u)),t.z),i(t.xy.add(Zb(1,5,l).mul(u)),t.z),i(t.xy.add(Zb(2,5,l).mul(u)),t.z),i(t.xy.add(Zb(3,5,l).mul(u)),t.z),i(t.xy.add(Zb(4,5,l).mul(u)),t.z)).mul(.2)}),E_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=yc("mapSize","vec2",r).setGroup(ba),a=bn(1).div(n),o=a.x,u=a.y,l=t.xy,d=No(l.mul(n).add(.5));return l.subAssign(d.mul(a)),Ma(i(l,t.z),i(l.add(bn(o,0)),t.z),i(l.add(bn(0,u)),t.z),i(l.add(a),t.z),nu(i(l.add(bn(o.negate(),0)),t.z),i(l.add(bn(o.mul(2),0)),t.z),d.x),nu(i(l.add(bn(o.negate(),u)),t.z),i(l.add(bn(o.mul(2),u)),t.z),d.x),nu(i(l.add(bn(0,u.negate())),t.z),i(l.add(bn(0,u.mul(2))),t.z),d.y),nu(i(l.add(bn(o,u.negate())),t.z),i(l.add(bn(o,u.mul(2))),t.z),d.y),nu(nu(i(l.add(bn(o.negate(),u.negate())),t.z),i(l.add(bn(o.mul(2),u.negate())),t.z),d.x),nu(i(l.add(bn(o.negate(),u.mul(2))),t.z),i(l.add(bn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),w_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e).sample(t.xy);e.isArrayTexture&&(s=s.depth(r)),s=s.rg;const i=s.x,n=Ho(1e-7,s.y.mul(s.y)),a=qo(t.z,i);cn(a.equal(1),()=>gn(1));const o=t.z.sub(i);let u=n.div(n.add(o.mul(o)));return u=au(Ba(u,.3).div(.65)),Ho(a,u)}),C_=e=>{let t=S_.get(e);return void 0===t&&(t=new Zp,t.colorNode=An(0,0,0,1),t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.blending=ee,t.fog=!1,S_.set(e,t)),t},M_=e=>{const t=S_.get(e);void 0!==t&&(t.dispose(),S_.delete(e))},B_=new Qf,L_=[],F_=(e,t,r,s)=>{L_[0]=e,L_[1]=t;let i=B_.get(L_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ze)&&(s&&(Xs(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,B_.set(L_,i)),L_[0]=null,L_[1]=null,i},P_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanVertical"),a=gn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));lp({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(Xl.xy,bn(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),D_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanHorizontal"),a=gn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));lp({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(Xl.xy,bn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(Ma(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),U_=[R_,A_,E_,w_];let I_;const O_=new Wb;class V_ extends p_{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._currentShadowType=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n});return a.select(o,gn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=yc("bias","float",r).setGroup(ba);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===h&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=yc("near","float",r.camera).setGroup(ba),s=yc("far","float",r.camera).setGroup(ba);n=Pp(e.negate(),t,s)}return a=vn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return U_[e]}setupRenderTarget(e,t){const r=new Y(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=Je;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t,camera:r}=e,{light:s,shadow:i}=this,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(i,e),o=t.shadowMap.type;if(o===et||o===tt?(n.minFilter=oe,n.magFilter=oe):(n.minFilter=w,n.magFilter=w),i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),o===Ze&&!0!==i.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}));let t=Fl(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Fl(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const s=yc("blurSamples","float",i).setGroup(ba),o=yc("radius","float",i).setGroup(ba),u=yc("mapSize","vec2",i).setGroup(ba);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Zp);l.fragmentNode=P_({samples:s,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Zp),l.fragmentNode=D_({samples:s,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const u=yc("intensity","float",i).setGroup(ba),l=yc("normalBias","float",i).setGroup(ba),d=s_(s).mul(g_.add(Kd.mul(l))),c=this.setupShadowCoord(e,d),h=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===h)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const p=o===Ze&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,g=this.setupShadowFilter(e,{filterFn:h,shadowTexture:a.texture,depthTexture:p,shadowCoord:c,shadow:i,depthLayer:this.depthLayer});let m,f;!0===t.shadowMap.transmitted&&(a.texture.isCubeTexture?m=gc(a.texture,c.xyz):(m=Fl(a.texture,c),n.isArrayTexture&&(m=m.depth(this.depthLayer)))),f=m?nu(1,g.rgb.mix(m,1),u.mul(m.a)).toVar():nu(1,g,u).toVar(),this.shadowMap=a,this.shadow.map=a;const y=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return m&&f.toInspector(`${y} / Color`,()=>this.shadowMap.texture.isCubeTexture?gc(this.shadowMap.texture):Fl(this.shadowMap.texture)),f.toInspector(`${y} / Depth`,()=>this.shadowMap.texture.isCubeTexture?gc(this.shadowMap.texture).r.oneMinus():Pl(this.shadowMap.depthTexture,Rl().mul(El(Fl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return un(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");I_=__(i,n,I_),n.overrideMaterial=C_(r),i.setRenderObjectFunction(F_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===Ze&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,v_(i,n,I_)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),O_.material=this.vsmMaterialVertical,O_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),O_.material=this.vsmMaterialHorizontal,O_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,M_(this.light),this.shadowMap&&(this.shadowMap.dispose(),this.shadowMap=null),null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null)}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const k_=(e,t)=>new V_(e,t),G_=new e,z_=new a,$_=new r,W_=new r,H_=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],q_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],j_=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],X_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],K_=un(({depthTexture:e,bd3D:t,dp:r})=>gc(e,t).compare(r)),Y_=un(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=yc("radius","float",s).setGroup(ba),n=yc("mapSize","vec2",s).setGroup(ba),a=i.div(n.x),o=Mo(t),u=vo(Qo(t,o.x.greaterThan(o.z).select(vn(0,1,0),vn(1,0,0)))),l=Qo(t,u),d=Qb(Xl.xy).mul(6.28318530718),c=Zb(0,5,d),h=Zb(1,5,d),p=Zb(2,5,d),g=Zb(3,5,d),m=Zb(4,5,d);return gc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(gc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(gc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(gc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(gc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),Q_=un(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toConst(),n=i.abs().toConst(),a=n.x.max(n.y).max(n.z),o=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.near),u=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.far),l=yc("bias","float",s).setGroup(ba),d=gn(1).toVar();return cn(a.sub(u).lessThanEqual(0).and(a.sub(o).greaterThanEqual(0)),()=>{const r=Lp(a.negate(),o,u);r.addAssign(l);const n=i.normalize();d.assign(e({depthTexture:t,bd3D:n,dp:r,shadow:s}))}),d});class Z_ extends V_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===rt?K_:Y_}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return Q_({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new st(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=Je;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?H_:j_,d=u?q_:X_;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(G_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),$_.setFromMatrixPosition(s.matrixWorld),a.position.copy($_),W_.copy(a.position),W_.add(l[e]),a.up.copy(d[e]),a.lookAt(W_),a.updateMatrixWorld(),o.makeTranslation(-$_.x,-$_.y,-$_.z),z_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(z_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const J_=(e,t)=>new Z_(e,t);class ev extends fp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||_a(this.color).setGroup(ba),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Js.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return o_(this.light).sub(e.context.positionView||Id)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return k_(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Zi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const tv=un(({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)}),rv=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=tv({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class sv extends ev{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(2).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return J_(this.light)}setupDirect(e){return rv({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const iv=un(([e=Rl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),nv=un(([e=Rl()],{renderer:t,material:r})=>{const s=iu(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=gn(s.fwidth()).toVar();i=lu(e.oneMinus(),e.add(1),s).oneMinus()}else i=bu(s.greaterThan(1),0,1);return i}),av=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=yn(e).toVar();return bu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),ov=un(([e,t])=>{const r=yn(t).toVar(),s=gn(e).toVar();return bu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),uv=un(([e])=>{const t=gn(e).toVar();return mn(To(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),lv=un(([e,t])=>{const r=gn(e).toVar();return t.assign(uv(r)),r.sub(gn(t))}),dv=mb([un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=gn(s).toVar(),l=gn(r).toVar(),d=gn(t).toVar(),c=gn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=vn(s).toVar(),l=vn(r).toVar(),d=vn(t).toVar(),c=vn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),cv=mb([un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=gn(o).toVar(),m=gn(a).toVar(),f=gn(n).toVar(),y=gn(i).toVar(),b=gn(s).toVar(),x=gn(r).toVar(),T=gn(t).toVar(),_=gn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=vn(o).toVar(),m=vn(a).toVar(),f=vn(n).toVar(),y=vn(i).toVar(),b=vn(s).toVar(),x=vn(r).toVar(),T=vn(t).toVar(),_=vn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),hv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=fn(e).toVar(),a=fn(n.bitAnd(fn(7))).toVar(),o=gn(av(a.lessThan(fn(4)),i,s)).toVar(),u=gn(La(2,av(a.lessThan(fn(4)),s,i))).toVar();return ov(o,yn(a.bitAnd(fn(1)))).add(ov(u,yn(a.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),pv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=fn(e).toVar(),u=fn(o.bitAnd(fn(15))).toVar(),l=gn(av(u.lessThan(fn(8)),a,n)).toVar(),d=gn(av(u.lessThan(fn(4)),n,av(u.equal(fn(12)).or(u.equal(fn(14))),a,i))).toVar();return ov(l,yn(u.bitAnd(fn(1)))).add(ov(d,yn(u.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),gv=mb([hv,pv]),mv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=Sn(e).toVar();return vn(gv(n.x,i,s),gv(n.y,i,s),gv(n.z,i,s))}).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),fv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=Sn(e).toVar();return vn(gv(o.x,a,n,i),gv(o.y,a,n,i),gv(o.z,a,n,i))}).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),yv=mb([mv,fv]),bv=un(([e])=>{const t=gn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),xv=un(([e])=>{const t=gn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),Tv=mb([bv,un(([e])=>{const t=vn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),_v=mb([xv,un(([e])=>{const t=vn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),vv=un(([e,t])=>{const r=mn(t).toVar(),s=fn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(mn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),Nv=un(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(vv(r,mn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(vv(e,mn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(vv(t,mn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(vv(r,mn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(vv(e,mn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(vv(t,mn(4))),t.addAssign(e)}),Sv=un(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=fn(e).toVar();return s.bitXorAssign(i),s.subAssign(vv(i,mn(14))),n.bitXorAssign(s),n.subAssign(vv(s,mn(11))),i.bitXorAssign(n),i.subAssign(vv(n,mn(25))),s.bitXorAssign(i),s.subAssign(vv(i,mn(16))),n.bitXorAssign(s),n.subAssign(vv(s,mn(4))),i.bitXorAssign(n),i.subAssign(vv(n,mn(14))),s.bitXorAssign(i),s.subAssign(vv(i,mn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),Rv=un(([e])=>{const t=fn(e).toVar();return gn(t).div(gn(fn(mn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Av=un(([e])=>{const t=gn(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),Ev=mb([un(([e])=>{const t=mn(e).toVar(),r=fn(fn(1)).toVar(),s=fn(fn(mn(3735928559)).add(r.shiftLeft(fn(2))).add(fn(13))).toVar();return Sv(s.add(fn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(fn(2)).toVar(),n=fn().toVar(),a=fn().toVar(),o=fn().toVar();return n.assign(a.assign(o.assign(fn(mn(3735928559)).add(i.shiftLeft(fn(2))).add(fn(13))))),n.addAssign(fn(s)),a.addAssign(fn(r)),Sv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(fn(3)).toVar(),o=fn().toVar(),u=fn().toVar(),l=fn().toVar();return o.assign(u.assign(l.assign(fn(mn(3735928559)).add(a.shiftLeft(fn(2))).add(fn(13))))),o.addAssign(fn(n)),u.addAssign(fn(i)),l.addAssign(fn(s)),Sv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),un(([e,t,r,s])=>{const i=mn(s).toVar(),n=mn(r).toVar(),a=mn(t).toVar(),o=mn(e).toVar(),u=fn(fn(4)).toVar(),l=fn().toVar(),d=fn().toVar(),c=fn().toVar();return l.assign(d.assign(c.assign(fn(mn(3735928559)).add(u.shiftLeft(fn(2))).add(fn(13))))),l.addAssign(fn(o)),d.addAssign(fn(a)),c.addAssign(fn(n)),Nv(l,d,c),l.addAssign(fn(i)),Sv(l,d,c)}).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),un(([e,t,r,s,i])=>{const n=mn(i).toVar(),a=mn(s).toVar(),o=mn(r).toVar(),u=mn(t).toVar(),l=mn(e).toVar(),d=fn(fn(5)).toVar(),c=fn().toVar(),h=fn().toVar(),p=fn().toVar();return c.assign(h.assign(p.assign(fn(mn(3735928559)).add(d.shiftLeft(fn(2))).add(fn(13))))),c.addAssign(fn(l)),h.addAssign(fn(u)),p.addAssign(fn(o)),Nv(c,h,p),c.addAssign(fn(a)),h.addAssign(fn(n)),Sv(c,h,p)}).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),wv=mb([un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(Ev(s,r)).toVar(),n=Sn().toVar();return n.x.assign(i.bitAnd(mn(255))),n.y.assign(i.shiftRight(mn(8)).bitAnd(mn(255))),n.z.assign(i.shiftRight(mn(16)).bitAnd(mn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(Ev(n,i,s)).toVar(),o=Sn().toVar();return o.x.assign(a.bitAnd(mn(255))),o.y.assign(a.shiftRight(mn(8)).bitAnd(mn(255))),o.z.assign(a.shiftRight(mn(16)).bitAnd(mn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Cv=mb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(lv(t.x,r)).toVar(),n=gn(lv(t.y,s)).toVar(),a=gn(Av(i)).toVar(),o=gn(Av(n)).toVar(),u=gn(dv(gv(Ev(r,s),i,n),gv(Ev(r.add(mn(1)),s),i.sub(1),n),gv(Ev(r,s.add(mn(1))),i,n.sub(1)),gv(Ev(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return Tv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(lv(t.x,r)).toVar(),a=gn(lv(t.y,s)).toVar(),o=gn(lv(t.z,i)).toVar(),u=gn(Av(n)).toVar(),l=gn(Av(a)).toVar(),d=gn(Av(o)).toVar(),c=gn(cv(gv(Ev(r,s,i),n,a,o),gv(Ev(r.add(mn(1)),s,i),n.sub(1),a,o),gv(Ev(r,s.add(mn(1)),i),n,a.sub(1),o),gv(Ev(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),gv(Ev(r,s,i.add(mn(1))),n,a,o.sub(1)),gv(Ev(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),gv(Ev(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),gv(Ev(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return _v(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),Mv=mb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(lv(t.x,r)).toVar(),n=gn(lv(t.y,s)).toVar(),a=gn(Av(i)).toVar(),o=gn(Av(n)).toVar(),u=vn(dv(yv(wv(r,s),i,n),yv(wv(r.add(mn(1)),s),i.sub(1),n),yv(wv(r,s.add(mn(1))),i,n.sub(1)),yv(wv(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return Tv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(lv(t.x,r)).toVar(),a=gn(lv(t.y,s)).toVar(),o=gn(lv(t.z,i)).toVar(),u=gn(Av(n)).toVar(),l=gn(Av(a)).toVar(),d=gn(Av(o)).toVar(),c=vn(cv(yv(wv(r,s,i),n,a,o),yv(wv(r.add(mn(1)),s,i),n.sub(1),a,o),yv(wv(r,s.add(mn(1)),i),n,a.sub(1),o),yv(wv(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),yv(wv(r,s,i.add(mn(1))),n,a,o.sub(1)),yv(wv(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),yv(wv(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),yv(wv(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return _v(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),Bv=mb([un(([e])=>{const t=gn(e).toVar(),r=mn(uv(t)).toVar();return Rv(Ev(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(uv(t.x)).toVar(),s=mn(uv(t.y)).toVar();return Rv(Ev(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(uv(t.x)).toVar(),s=mn(uv(t.y)).toVar(),i=mn(uv(t.z)).toVar();return Rv(Ev(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=An(e).toVar(),r=mn(uv(t.x)).toVar(),s=mn(uv(t.y)).toVar(),i=mn(uv(t.z)).toVar(),n=mn(uv(t.w)).toVar();return Rv(Ev(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Lv=mb([un(([e])=>{const t=gn(e).toVar(),r=mn(uv(t)).toVar();return vn(Rv(Ev(r,mn(0))),Rv(Ev(r,mn(1))),Rv(Ev(r,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(uv(t.x)).toVar(),s=mn(uv(t.y)).toVar();return vn(Rv(Ev(r,s,mn(0))),Rv(Ev(r,s,mn(1))),Rv(Ev(r,s,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(uv(t.x)).toVar(),s=mn(uv(t.y)).toVar(),i=mn(uv(t.z)).toVar();return vn(Rv(Ev(r,s,i,mn(0))),Rv(Ev(r,s,i,mn(1))),Rv(Ev(r,s,i,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=An(e).toVar(),r=mn(uv(t.x)).toVar(),s=mn(uv(t.y)).toVar(),i=mn(uv(t.z)).toVar(),n=mn(uv(t.w)).toVar();return vn(Rv(Ev(r,s,i,n,mn(0))),Rv(Ev(r,s,i,n,mn(1))),Rv(Ev(r,s,i,n,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Fv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=gn(0).toVar(),l=gn(1).toVar();return lp(a,()=>{u.addAssign(l.mul(Cv(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Pv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(0).toVar(),l=gn(1).toVar();return lp(a,()=>{u.addAssign(l.mul(Mv(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Dv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar();return bn(Fv(o,a,n,i),Fv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i))}).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Uv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(Pv(o,a,n,i)).toVar(),l=gn(Fv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i)).toVar();return An(u,l)}).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Iv=mb([un(([e,t,r,s,i,n,a])=>{const o=mn(a).toVar(),u=gn(n).toVar(),l=mn(i).toVar(),d=mn(s).toVar(),c=mn(r).toVar(),h=mn(t).toVar(),p=bn(e).toVar(),g=vn(Lv(bn(h.add(d),c.add(l)))).toVar(),m=bn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=bn(bn(gn(h),gn(c)).add(m)).toVar(),y=bn(f.sub(p)).toVar();return cn(o.equal(mn(2)),()=>Mo(y.x).add(Mo(y.y))),cn(o.equal(mn(3)),()=>Ho(Mo(y.x),Mo(y.y))),Yo(y,y)}).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),un(([e,t,r,s,i,n,a,o,u])=>{const l=mn(u).toVar(),d=gn(o).toVar(),c=mn(a).toVar(),h=mn(n).toVar(),p=mn(i).toVar(),g=mn(s).toVar(),m=mn(r).toVar(),f=mn(t).toVar(),y=vn(e).toVar(),b=vn(Lv(vn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=vn(vn(gn(f),gn(m),gn(g)).add(b)).toVar(),T=vn(x.sub(y)).toVar();return cn(l.equal(mn(2)),()=>Mo(T.x).add(Mo(T.y)).add(Mo(T.z))),cn(l.equal(mn(3)),()=>Ho(Mo(T.x),Mo(T.y),Mo(T.z))),Yo(T,T)}).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Ov=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(lv(n.x,a),lv(n.y,o)).toVar(),l=gn(1e6).toVar();return lp({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{lp({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Iv(u,e,t,a,o,i,s)).toVar();l.assign(Wo(l,r))})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Vv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(lv(n.x,a),lv(n.y,o)).toVar(),l=bn(1e6,1e6).toVar();return lp({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{lp({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Iv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),kv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(lv(n.x,a),lv(n.y,o)).toVar(),l=vn(1e6,1e6,1e6).toVar();return lp({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{lp({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Iv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.z.assign(l.y),l.y.assign(r)}).ElseIf(r.lessThan(l.z),()=>{l.z.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Gv=mb([Ov,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(lv(n.x,a),lv(n.y,o),lv(n.z,u)).toVar(),d=gn(1e6).toVar();return lp({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{lp({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{lp({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Iv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(Wo(d,n))})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),zv=mb([Vv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(lv(n.x,a),lv(n.y,o),lv(n.z,u)).toVar(),d=bn(1e6,1e6).toVar();return lp({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{lp({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{lp({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Iv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),$v=mb([kv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(lv(n.x,a),lv(n.y,o),lv(n.z,u)).toVar(),d=vn(1e6,1e6,1e6).toVar();return lp({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{lp({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{lp({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Iv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.z.assign(d.y),d.y.assign(n)}).ElseIf(n.lessThan(d.z),()=>{d.z.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Wv=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=bn(t).toVar(),p=bn(r).toVar(),g=bn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Lv(v))}),cn(c.equal(mn(2)),()=>{N.assign($v(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Pv(vn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Hv=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=vn(t).toVar(),p=vn(r).toVar(),g=vn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Lv(v))}),cn(c.equal(mn(2)),()=>{N.assign($v(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Pv(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),qv=un(([e])=>{const t=e.y,r=e.z,s=vn().toVar();return cn(t.lessThan(1e-4),()=>{s.assign(vn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(To(i)).mul(6).toVar();const n=mn(Vo(i)),a=i.sub(gn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());cn(n.equal(mn(0)),()=>{s.assign(vn(r,l,o))}).ElseIf(n.equal(mn(1)),()=>{s.assign(vn(u,r,o))}).ElseIf(n.equal(mn(2)),()=>{s.assign(vn(o,r,l))}).ElseIf(n.equal(mn(3)),()=>{s.assign(vn(o,u,r))}).ElseIf(n.equal(mn(4)),()=>{s.assign(vn(l,o,r))}).Else(()=>{s.assign(vn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),jv=un(([e])=>{const t=vn(e).toVar(),r=gn(t.x).toVar(),s=gn(t.y).toVar(),i=gn(t.z).toVar(),n=gn(Wo(r,Wo(s,i))).toVar(),a=gn(Ho(r,Ho(s,i))).toVar(),o=gn(a.sub(n)).toVar(),u=gn().toVar(),l=gn().toVar(),d=gn().toVar();return d.assign(a),cn(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),cn(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{cn(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(Ma(2,i.sub(r).div(o)))}).Else(()=>{u.assign(Ma(4,r.sub(s).div(o)))}),u.mulAssign(1/6),cn(u.lessThan(0),()=>{u.addAssign(1)})}),vn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),Xv=un(([e])=>{const t=vn(e).toVar(),r=Rn(Oa(t,vn(.04045))).toVar(),s=vn(t.div(12.92)).toVar(),i=vn(Zo(Ho(t.add(vn(.055)),vn(0)).div(1.055),vn(2.4))).toVar();return nu(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Kv=(e,t)=>{e=gn(e),t=gn(t);const r=bn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return lu(e.sub(r),e.add(r),t)},Yv=(e,t,r,s)=>nu(e,t,r[s].clamp()),Qv=(e,t,r,s,i)=>nu(e,t,Kv(r,s[i])),Zv=un(([e,t,r])=>{const s=vo(e).toVar(),i=Ba(gn(.5).mul(t.sub(r)),Dd).div(s).toVar(),n=Ba(gn(-.5).mul(t.sub(r)),Dd).div(s).toVar(),a=vn().toVar();a.x=s.x.greaterThan(gn(0)).select(i.x,n.x),a.y=s.y.greaterThan(gn(0)).select(i.y,n.y),a.z=s.z.greaterThan(gn(0)).select(i.z,n.z);const o=Wo(a.x,a.y,a.z).toVar();return Dd.add(s.mul(o)).toVar().sub(r)}),Jv=un(([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(La(r,r).sub(La(s,s)))),n});var eN=Object.freeze({__proto__:null,BRDF_GGX:Ug,BRDF_Lambert:_g,BasicPointShadowFilter:K_,BasicShadowFilter:R_,Break:dp,Const:Cu,Continue:()=>gl("continue").toStack(),DFGLUT:Vg,D_GGX:Fg,Discard:ml,EPSILON:so,F_Schlick:Tg,Fn:un,HALF_PI:uo,INFINITY:io,If:cn,Loop:lp,NodeAccess:ti,NodeShaderStage:Zs,NodeType:ei,NodeUpdateType:Js,OnBeforeMaterialUpdate:e=>tx(ex.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>tx(ex.BEFORE_OBJECT,e),OnMaterialUpdate:e=>tx(ex.MATERIAL,e),OnObjectUpdate:e=>tx(ex.OBJECT,e),PCFShadowFilter:A_,PCFSoftShadowFilter:E_,PI:no,PI2:ao,PointShadowFilter:Y_,Return:()=>gl("return").toStack(),Schlick_to_F0:zg,ScriptableNodeResources:sT,ShaderNode:Qi,Stack:hn,Switch:(...e)=>_i.Switch(...e),TBNViewMatrix:Wc,TWO_PI:oo,VSMShadowFilter:w_,V_GGX_SmithCorrelated:Bg,Var:wu,VarIntent:Mu,abs:Mo,acesFilmicToneMapping:$x,acos:wo,add:Ma,addMethodChaining:Ni,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:jx,all:lo,alphaT:Yn,and:Ga,anisotropy:Qn,anisotropyB:Jn,anisotropyT:Zn,any:co,append:e=>(d("TSL: append() has been renamed to Stack()."),hn(e)),array:Na,arrayBuffer:e=>new xi(e,"ArrayBuffer"),asin:Eo,assign:Ra,atan:Co,atomicAdd:(e,t)=>wT(AT.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>wT(AT.ATOMIC_AND,e,t),atomicFunc:wT,atomicLoad:e=>wT(AT.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>wT(AT.ATOMIC_MAX,e,t),atomicMin:(e,t)=>wT(AT.ATOMIC_MIN,e,t),atomicOr:(e,t)=>wT(AT.ATOMIC_OR,e,t),atomicStore:(e,t)=>wT(AT.ATOMIC_STORE,e,t),atomicSub:(e,t)=>wT(AT.ATOMIC_SUB,e,t),atomicXor:(e,t)=>wT(AT.ATOMIC_XOR,e,t),attenuationColor:ha,attenuationDistance:ca,attribute:Sl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new sx(e,r,s);return Hh(i,t,e)},backgroundBlurriness:lx,backgroundIntensity:dx,backgroundRotation:cx,batch:ip,bentNormalView:qc,billboarding:_b,bitAnd:Ha,bitNot:qa,bitOr:ja,bitXor:Xa,bitangentGeometry:kc,bitangentLocal:Gc,bitangentView:zc,bitangentWorld:$c,bitcast:jy,blendBurn:Hp,blendColor:Kp,blendDodge:qp,blendOverlay:Xp,blendScreen:jp,blur:zm,bool:yn,buffer:Ul,bufferAttribute:Ju,builtin:Gl,builtinAOContext:Su,builtinShadowContext:Nu,bumpMap:eh,bvec2:_n,bvec3:Rn,bvec4:Cn,bypass:ll,cache:ol,call:Ea,cameraFar:rd,cameraIndex:ed,cameraNear:td,cameraNormalMatrix:od,cameraPosition:ud,cameraProjectionMatrix:sd,cameraProjectionMatrixInverse:id,cameraViewMatrix:nd,cameraViewport:ld,cameraWorldMatrix:ad,cbrt:su,cdl:wx,ceil:_o,checker:iv,cineonToneMapping:Gx,clamp:au,clearcoat:$n,clearcoatNormalView:Yd,clearcoatRoughness:Wn,clipSpace:Bd,code:Yx,color:pn,colorSpaceToWorking:Gu,colorToDirection:e=>Zi(e).mul(2).sub(1),compute:il,computeKernel:sl,computeSkinning:(e,t=null)=>{const r=new ap(e);return r.positionNode=Hh(new W(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(Xh).toVar(),r.skinIndexNode=Hh(new W(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(Xh).toVar(),r.skinWeightNode=Hh(new W(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(Xh).toVar(),r.bindMatrixNode=_a(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=_a(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Ul(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Zi(r)},context:Tu,convert:Pn,convertColorSpace:(e,t,r)=>Zi(new Vu(Zi(e),t,r)),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():jb(e,...t),cos:Ro,countLeadingZeros:Zy,countOneBits:Jy,countTrailingZeros:Qy,cross:Qo,cubeTexture:gc,cubeTextureBase:pc,dFdx:Do,dFdy:Uo,dashSize:na,debug:xl,decrement:eo,decrementBefore:Za,defaultBuildStages:si,defaultShaderStages:ri,defined:Ki,degrees:po,deltaTime:yb,densityFogFactor:uT,depth:Up,depthPass:(e,t,r)=>new Ix(Ix.DEPTH,e,t,r),determinant:zo,difference:Ko,diffuseColor:On,diffuseContribution:Vn,directPointLight:rv,directionToColor:jc,directionToFaceDirection:zd,dispersion:pa,disposeShadowMaterial:M_,distance:Xo,div:Fa,dot:Yo,drawIndex:Zh,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x),element:Fn,emissive:kn,equal:Da,equirectUV:og,exp:go,exp2:mo,exponentialHeightFogFactor:lT,expression:gl,faceDirection:Gd,faceForward:du,faceforward:mu,float:gn,floatBitsToInt:e=>new qy(e,"int","float"),floatBitsToUint:Xy,floor:To,fog:dT,fract:No,frameGroup:ya,frameId:bb,frontFacing:kd,fwidth:ko,gain:(e,t)=>e.lessThan(.5)?tb(e.mul(2),t).div(2):Ba(1,tb(La(Ba(1,e),2),t).div(2)),gapSize:aa,getConstNodeType:Yi,getCurrentStack:dn,getDirection:Om,getDistanceAttenuation:tv,getGeometryRoughness:Cg,getNormalFromDepth:Yb,getParallaxCorrectNormal:Zv,getRoughness:Mg,getScreenPosition:Kb,getShIrradianceAt:Jv,getShadowMaterial:C_,getShadowRenderObjectFunction:F_,getTextureIndex:$y,getViewPosition:Xb,ggxConvolution:qm,globalId:xT,glsl:(e,t)=>Yx(e,t,"glsl"),glslFn:(e,t)=>Zx(e,t,"glsl"),grayscale:Nx,greaterThan:Oa,greaterThanEqual:ka,hash:eb,highpModelNormalViewMatrix:Md,highpModelViewMatrix:Cd,hue:Ax,increment:Ja,incrementBefore:Qa,inspector:vl,instance:ep,instanceIndex:Xh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new rx(e,r,s);return Hh(i,t,e)},instancedBufferAttribute:el,instancedDynamicBufferAttribute:tl,instancedMesh:rp,int:mn,intBitsToFloat:e=>new qy(e,"float","int"),interleavedGradientNoise:Qb,inverse:$o,inverseSqrt:xo,inversesqrt:fu,invocationLocalIndex:Qh,invocationSubgroupIndex:Yh,ior:ua,iridescence:jn,iridescenceIOR:Xn,iridescenceThickness:Kn,isolate:al,ivec2:xn,ivec3:Nn,ivec4:En,js:(e,t)=>Yx(e,t,"js"),label:Ru,length:Lo,lengthSq:iu,lessThan:Ia,lessThanEqual:Va,lightPosition:n_,lightProjectionUV:i_,lightShadowMatrix:s_,lightTargetDirection:u_,lightTargetPosition:a_,lightViewPosition:o_,lightingContext:xp,lights:(e=[])=>(new h_).setLights(e),linearDepth:Ip,linearToneMapping:Vx,localId:TT,log:fo,log2:yo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(fo(r.div(t)));return gn(Math.E).pow(s).mul(t).negate()},luminance:Ex,mat2:Mn,mat3:Bn,mat4:Ln,matcapUV:Bf,materialAO:Vh,materialAlphaTest:sh,materialAnisotropy:vh,materialAnisotropyVector:kh,materialAttenuationColor:Mh,materialAttenuationDistance:Ch,materialClearcoat:fh,materialClearcoatNormal:bh,materialClearcoatRoughness:yh,materialColor:ih,materialDispersion:Ih,materialEmissive:ah,materialEnvIntensity:nc,materialEnvRotation:ac,materialIOR:wh,materialIridescence:Nh,materialIridescenceIOR:Sh,materialIridescenceThickness:Rh,materialLightMap:Oh,materialLineDashOffset:Dh,materialLineDashSize:Lh,materialLineGapSize:Fh,materialLineScale:Bh,materialLineWidth:Ph,materialMetalness:gh,materialNormal:mh,materialOpacity:oh,materialPointSize:Uh,materialReference:Tc,materialReflectivity:hh,materialRefractionRatio:ic,materialRotation:xh,materialRoughness:ph,materialSheen:Th,materialSheenRoughness:_h,materialShininess:nh,materialSpecular:uh,materialSpecularColor:dh,materialSpecularIntensity:lh,materialSpecularStrength:ch,materialThickness:Eh,materialTransmission:Ah,max:Ho,maxMipLevel:Cl,mediumpModelViewMatrix:wd,metalness:zn,min:Wo,mix:nu,mixElement:hu,mod:Pa,modInt:to,modelDirection:xd,modelNormalMatrix:Rd,modelPosition:_d,modelRadius:Sd,modelScale:vd,modelViewMatrix:Ed,modelViewPosition:Nd,modelViewProjection:Gh,modelWorldMatrix:Td,modelWorldMatrixInverse:Ad,morphReference:mp,mrt:Hy,mul:La,mx_aastep:Kv,mx_add:(e,t=gn(0))=>Ma(e,t),mx_atan2:(e=gn(0),t=gn(1))=>Co(e,t),mx_cell_noise_float:(e=Rl())=>Bv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>gn(e).sub(r).mul(t).add(r),mx_divide:(e,t=gn(1))=>Fa(e,t),mx_fractal_noise_float:(e=Rl(),t=3,r=2,s=.5,i=1)=>Fv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Rl(),t=3,r=2,s=.5,i=1)=>Dv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Rl(),t=3,r=2,s=.5,i=1)=>Pv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Rl(),t=3,r=2,s=.5,i=1)=>Uv(e,mn(t),r,s).mul(i),mx_frame:()=>bb,mx_heighttonormal:(e,t)=>(e=vn(e),t=gn(t),eh(e,t)),mx_hsvtorgb:qv,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=gn(1))=>Ba(t,e),mx_modulo:(e,t=gn(1))=>Pa(e,t),mx_multiply:(e,t=gn(1))=>La(e,t),mx_noise_float:(e=Rl(),t=1,r=0)=>Cv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Rl(),t=1,r=0)=>Mv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Rl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return An(Mv(e),Cv(e.add(bn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=bn(.5,.5),r=bn(1,1),s=gn(0),i=bn(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=bn(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=gn(1))=>Zo(e,t),mx_ramp4:(e,t,r,s,i=Rl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=nu(e,t,n),u=nu(r,s,n);return nu(o,u,a)},mx_ramplr:(e,t,r=Rl())=>Yv(e,t,r,"x"),mx_ramptb:(e,t,r=Rl())=>Yv(e,t,r,"y"),mx_rgbtohsv:jv,mx_rotate2d:(e,t)=>{e=bn(e);const r=(t=gn(t)).mul(Math.PI/180);return Df(e,r)},mx_rotate3d:(e,t,r)=>{e=vn(e),t=gn(t),r=vn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=gn(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=gn(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Rl())=>Qv(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Rl())=>Qv(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:Xv,mx_subtract:(e,t=gn(0))=>Ba(e,t),mx_timer:()=>fb,mx_transform_uv:(e=1,t=0,r=Rl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Wv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Hv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Rl(),t=1)=>Gv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec2:(e=Rl(),t=1)=>zv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec3:(e=Rl(),t=1)=>$v(e.convert("vec2|vec3"),t,mn(1)),negate:Fo,neutralToneMapping:Xx,nodeArray:tn,nodeImmutable:sn,nodeObject:Zi,nodeObjectIntent:Ji,nodeObjects:en,nodeProxy:rn,nodeProxyIntent:nn,normalFlat:Hd,normalGeometry:$d,normalLocal:Wd,normalMap:Yc,normalView:Xd,normalViewGeometry:qd,normalWorld:Kd,normalWorldGeometry:jd,normalize:vo,not:$a,notEqual:Ua,numWorkgroups:yT,objectDirection:hd,objectGroup:xa,objectPosition:gd,objectRadius:yd,objectScale:md,objectViewPosition:fd,objectWorldMatrix:pd,oneMinus:Po,or:za,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=fb)=>e.fract(),oscSine:(e=fb)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=fb)=>e.fract().round(),oscTriangle:(e=fb)=>e.add(.5).fract().mul(2).sub(1).abs(),output:ia,outputStruct:Vy,overloadingFn:mb,packHalf2x16:nb,packSnorm2x16:sb,packUnorm2x16:ib,parabola:tb,parallaxDirection:Hc,parallaxUV:(e,t)=>e.sub(Hc.mul(t)),parameter:(e,t)=>new Fy(e,t),pass:(e,t,r)=>new Ix(Ix.COLOR,e,t,r),passTexture:(e,t)=>new Dx(e,t),pcurve:(e,t,r)=>Zo(Fa(Zo(e,t),Ma(Zo(e,t),Zo(Ba(1,e),r))),1/t),perspectiveDepthToViewZ:Fp,pmremTexture:ff,pointShadow:J_,pointUV:nx,pointWidth:oa,positionGeometry:Ld,positionLocal:Fd,positionPrevious:Pd,positionView:Id,positionViewDirection:Od,positionWorld:Dd,positionWorldDirection:Ud,posterize:Mx,pow:Zo,pow2:Jo,pow3:eu,pow4:tu,premultiplyAlpha:Yp,property:Un,quadBroadcast:e_,quadSwapDiagonal:XT,quadSwapX:qT,quadSwapY:jT,radians:ho,rand:cu,range:gT,rangeFogFactor:oT,reciprocal:Oo,reference:yc,referenceBuffer:bc,reflect:jo,reflectVector:lc,reflectView:oc,reflector:e=>new Vb(e),refract:uu,refractVector:dc,refractView:uc,reinhardToneMapping:kx,remap:cl,remapClamp:hl,renderGroup:ba,renderOutput:yl,rendererReference:Hu,replaceDefaultUV:function(e,t=null){return Tu(t,{getUV:e})},rotate:Df,rotateUV:xb,roughness:Gn,round:Io,rtt:jb,sRGBTransferEOTF:Uu,sRGBTransferOETF:Iu,sample:(e,t=null)=>new Jb(e,Zi(t)),sampler:e=>(!0===e.isNode?e:Fl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Fl(e)).convert("samplerComparison"),saturate:ou,saturation:Sx,screenCoordinate:Xl,screenDPR:Hl,screenSize:jl,screenUV:ql,scriptable:nT,scriptableValue:eT,select:bu,setCurrentStack:ln,setName:vu,shaderStages:ii,shadow:k_,shadowPositionWorld:g_,shapeCircle:nv,sharedUniformGroup:fa,sheen:Hn,sheenRoughness:qn,shiftLeft:Ka,shiftRight:Ya,shininess:sa,sign:Bo,sin:So,sinc:(e,t)=>So(no.mul(t.mul(e).sub(1))).div(no.mul(t.mul(e).sub(1))),skinning:op,smoothstep:lu,smoothstepElement:pu,specularColor:ea,specularColorBlended:ta,specularF90:ra,spherizeUV:Tb,split:(e,t)=>Zi(new gi(Zi(e),t)),spritesheetUV:Nb,sqrt:bo,stack:Dy,step:qo,stepElement:gu,storage:Hh,storageBarrier:()=>NT("storage").toStack(),storageTexture:px,string:(e="")=>new xi(e,"string"),struct:(e,t=null)=>{const r=new Uy(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;efx(e,t).level(r),texture3DLoad:(...e)=>fx(...e).setSampler(!1),textureBarrier:()=>NT("texture").toStack(),textureBicubic:um,textureBicubicLevel:om,textureCubeUV:Vm,textureLevel:(e,t,r)=>Fl(e,t).level(r),textureLoad:Pl,textureSize:El,textureStore:(e,t,r)=>{const s=px(e,t,r);return null!==r&&s.toStack(),s},thickness:da,time:fb,toneMapping:ju,toneMappingExposure:Xu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Zi(new Ox(t,r,Zi(s),Zi(i),Zi(n))),transformDirection:ru,transformNormal:Qd,transformNormalToView:Zd,transformedClearcoatNormalView:tc,transformedNormalView:Jd,transformedNormalWorld:ec,transmission:la,transpose:Go,triNoise3D:hb,triplanarTexture:(...e)=>Sb(...e),triplanarTextures:Sb,trunc:Vo,uint:fn,uintBitsToFloat:e=>new qy(e,"float","uint"),uniform:_a,uniformArray:Vl,uniformCubeTexture:(e=cc)=>pc(e),uniformFlow:_u,uniformGroup:ma,uniformTexture:(e=Ml)=>Fl(e),unpackHalf2x16:lb,unpackNormal:Xc,unpackSnorm2x16:ob,unpackUnorm2x16:ub,unpremultiplyAlpha:Qp,userData:(e,t,r)=>new yx(e,t,r),uv:Rl,uvec2:Tn,uvec3:Sn,uvec4:wn,varying:Pu,varyingProperty:In,vec2:bn,vec3:vn,vec4:An,vectorComponents:ni,velocity:vx,vertexColor:Wp,vertexIndex:jh,vertexStage:Du,vibrance:Rx,viewZToLogarithmicDepth:Pp,viewZToOrthographicDepth:Bp,viewZToPerspectiveDepth:Lp,viewport:Kl,viewportCoordinate:Ql,viewportDepthTexture:Cp,viewportLinearDepth:Op,viewportMipTexture:Sp,viewportOpaqueMipTexture:Ap,viewportResolution:Jl,viewportSafeUV:vb,viewportSharedTexture:Fx,viewportSize:Yl,viewportTexture:Np,viewportUV:Zl,vogelDiskSample:Zb,wgsl:(e,t)=>Yx(e,t,"wgsl"),wgslFn:(e,t)=>Zx(e,t,"wgsl"),workgroupArray:(e,t)=>new RT("Workgroup",e,t),workgroupBarrier:()=>NT("workgroup").toStack(),workgroupId:bT,workingToColorSpace:ku,xor:Wa});const tN=new Ly;class rN extends ry{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(tN),tN.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(tN),tN.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;tN.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=An(l).mul(dx).context({getUV:()=>cx.mul(jd),getTextureLevel:()=>lx}),p=sd.element(3).element(3).equal(1),g=Fa(1,sd.element(1).element(1)).mul(3),m=p.select(Fd.mul(g),Fd),f=Ed.mul(An(m,0));let y=sd.mul(An(f.xyz,1));y=y.setZ(y.w);const b=new Zp;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=M,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ne(new it(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=An(l).mul(dx),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?tN.set(0,0,0,1):"alpha-blend"===a&&tN.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=tN.r,T.g=tN.g,T.b=tN.b,T.a=tN.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let sN=0;class iN{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=sN++}}class nN{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new iN(t.name,[],t.index,t.bindingsReference);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class aN{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class oN{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class uN{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class lN extends uN{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class dN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let cN=0;class hN{constructor(e=null){this.id=cN++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class pN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class gN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class mN extends gN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class fN extends gN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class yN extends gN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class bN extends gN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class xN extends gN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class TN extends gN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class _N extends gN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class vN extends gN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class NN extends mN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class SN extends fN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class RN extends yN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class AN extends bN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class EN extends xN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class wN extends TN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class CN extends _N{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class MN extends vN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let BN=0;const LN=new WeakMap,FN=new WeakMap,PN=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),DN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class UN{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.types={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=Dy(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new hN,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:BN++})}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===ze&&!1===e.alphaToCoverage}getBindGroupsCache(){let e=FN.get(this.renderer);return void 0===e&&(e=new Qf,FN.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new Ne(e,t,r)}createCubeRenderTarget(e,t){return new ug(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new iN(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new iN(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of ii)for(const s in r[e]){const i=r[e][s],n=t[s]||(t[s]=[]);for(const e of i)!1===n.includes(e)&&n.push(e)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order);for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${DN(n.r)}, ${DN(n.g)}, ${DN(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new aN(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===R)return"int";if(t===S)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=Gs(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return PN.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ot||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Dy(this.stack);const e=dn();return this.stacks.push(e),ln(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,ln(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new aN("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const a=this.structs.index++;null===r&&(r="StructType"+a),n=new pN(r,t),this.structs[s].push(n),this.types[s][r]=e,i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new oN(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new uN(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new lN(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,d(`TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new dN("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new Qx,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new Fy(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new hN,this.stack=Dy();for(const r of si)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){d("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){d("Abstract function.")}getVaryings(){d("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){d("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){d("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Zp),e.build(this)}else this.addFlow("compute",e);for(const e of si){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ii){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getSharedDataFromNode(e){let t=LN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new NN(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new SN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new RN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new AN(e);else if("color"===t)s=new EN(e);else if("mat2"===t)s=new wN(e);else if("mat3"===t)s=new CN(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new MN(e)}r.cache=s}return s}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,this.getTypeFromLength(i,this.getComponentType(t)),r)):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${ut} - Node System\n`}needsPreviousData(){const e=this.renderer.getMRT();return e&&e.has("velocity")||!0===Xs(this.object).useVelocity}}class IN{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===Js.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===Js.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class ON{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}ON.isNodeFunctionInput=!0;class VN extends ev{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class kN extends ev{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:u_(this.light),lightColor:e}}}class GN extends ev{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=n_(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=_a(new e).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=Kd.dot(s).mul(.5).add(.5),n=nu(r,t,i);e.context.irradiance.addAssign(n)}}class zN extends ev{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=_a(0).setGroup(ba),this.penumbraCosNode=_a(0).setGroup(ba),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(0).setGroup(ba),this.colorNode=_a(this.color).setGroup(ba)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e,t){const{coneCosNode:r,penumbraCosNode:s}=this;return lu(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=i_(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(u_(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=tv({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=Fl(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class $N extends zN{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=Fl(r,bn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}class WN extends ev{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Vl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=Jv(Kd,this.lightProbe);e.context.irradiance.addAssign(t)}}const HN=un(([e,t])=>{const r=e.abs().sub(t);return Lo(Ho(r,0)).add(Wo(Ho(r.x,r.y),0))});class qN extends zN{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=gn(0),r=this.penumbraCosNode,s=s_(this.light).mul(e.context.positionWorld||Dd);return cn(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=HN(e.xy.sub(bn(.5)),bn(.5)),n=Fa(-1,Ba(1,wo(r)).sub(1));t.assign(ou(i.mul(-2).mul(n)))}),t}}const jN=new a,XN=new a;let KN=null;class YN extends ev{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=_a(new r).setGroup(ba),this.halfWidth=_a(new r).setGroup(ba),this.updateType=Js.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;XN.identity(),jN.copy(t.matrixWorld),jN.premultiply(r),XN.extractRotation(jN),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(XN),this.halfHeight.value.applyMatrix4(XN)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Fl(KN.LTC_FLOAT_1),r=Fl(KN.LTC_FLOAT_2)):(t=Fl(KN.LTC_HALF_1),r=Fl(KN.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:o_(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){KN=e}}class QN{parseFunction(){d("Abstract function.")}}class ZN{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}ZN.isNodeFunction=!0;const JN=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,eS=/[a-z_0-9]+/gi,tS="#pragma main";class rS extends ZN{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(tS),r=-1!==t?e.slice(t+12):e,s=r.match(JN);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=eS.exec(i));)n.push(a);const o=[];let u=0;for(;u{const r=this.backend.createNodeBuilder(e.object,this.renderer);return r.scene=e.scene,r.material=t,r.camera=e.camera,r.context.material=t,r.lightsNode=e.lightsNode,r.environmentNode=this.getEnvironmentNode(e.scene),r.fogNode=this.getFogNode(e.scene),r.clippingContext=e.clippingContext,this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview&&r.enableMultiview(),r};let n=t(e.material);try{n.build()}catch(e){n=t(new Zp),n.build(),o("TSL: "+e)}r=this._createNodeBuilderState(n),s.set(i,r)}r.usedTimes++,t.nodeBuilderState=r}return r}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new nN(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){nS[0]=e,nS[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(nS)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&aS.push(t.getCacheKey(!0)),i&&aS.push(i.getCacheKey()),n&&aS.push(n.getCacheKey()),aS.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),aS.push(this.renderer.shadowMap.enabled?1:0),aS.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Is(aS),this.callHashCache.set(nS,s),aS.length=0}return nS.length=0,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===le||r.mapping===de||r.mapping===Ae){if(e.backgroundBlurriness>0||r.mapping===Ae)return ff(r);{let e;return e=!0===r.isCubeTexture?gc(r):Fl(r),pg(e)}}if(!0===r.isTexture)return Fl(r,ql.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("WebGPUNodes: Unsupported background configuration.",r)},s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,()=>{if(r.isFogExp2){const e=yc("color","color",r).setGroup(ba),t=yc("density","float",r).setGroup(ba);return dT(e,uT(t))}if(r.isFog){const e=yc("color","color",r).setGroup(ba),t=yc("near","float",r).setGroup(ba),s=yc("far","float",r).setGroup(ba);return dT(e,oT(t,s))}o("Renderer: Unsupported fog configuration.",r)});t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,()=>!0===r.isCubeTexture?gc(r):!0===r.isTexture?Fl(r):void o("Nodes: Unsupported environment configuration.",r));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace+","+e.xr.isPresenting}hasOutputChange(e){return iS.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?fx(e,vn(ql,Gl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Fl(e,ql).renderOutput(t.toneMapping,t.currentColorSpace);return iS.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new IN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const uS=new je;class lS{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new yS(i.framebufferWidth,i.framebufferHeight,{format:Re,type:Ge,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),i.layers.mask=6|e.layers.mask,n.layers.mask=-5&i.layers.mask,a.layers.mask=-3&i.layers.mask;const o=e.parent,u=i.cameras;_S(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function RS(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function AS(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(this._renderTarget,this._mrt),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){return null!==this._initPromise||(this._initPromise=new Promise(async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new oS(this,r),this._animation=new Yf(this,this._nodes,this.info),this._attributes=new uy(r),this._background=new rN(this,this._nodes),this._geometries=new cy(this._attributes,this.info),this._textures=new By(this,r,this.info),this._pipelines=new by(r,this._nodes),this._bindings=new xy(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new ty(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Ry(this.lighting),this._bundles=new hS,this._renderContexts=new Cy,this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._handleObjectFunction,u=this._compilationPromises,l=!0===e.isScene?e:wS;null===r&&(r=e);const d=this._renderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new lS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(e,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u,await Promise.all(p)}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=Cd,t.modelNormalViewMatrix=Md):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===Cd&&e.modelNormalViewMatrix===Md}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=_,g.viewportValue.maxDepth=v,g.viewport=!1===g.viewportValue.equals(MS),g.scissorValue.copy(x).multiplyScalar(T).floor(),g.scissor=y._scissorTest&&!1===g.scissorValue.equals(MS),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new lS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const N=t.isArrayCamera?LS:BS;t.isArrayCamera||(FS.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),N.setFromProjectionMatrix(FS,t.coordinateSystem,t.reversedDepth));const S=this._renderLists.get(e,t);if(S.begin(),this._projectObject(e,t,0,S,g.clippingContext),S.finish(),!0===this.sortObjects&&S.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=CS.width,g.height=CS.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=S.occlusionQueryCount,g.scissorValue.max(PS.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,S,g),g.camera=t,this.backend.beginRender(g);const{bundles:R,lightsNode:A,transparentDoublePass:E,transparent:w,opaque:C}=S;return R.length>0&&this._renderBundles(R,l,A),!0===this.opaque&&C.length>0&&this._renderObjects(C,t,l,A),!0===this.transparent&&w.length>0&&this._renderTransparents(w,E,t,l,A),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._height=t,this.setViewport(0,0,e,t)}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,n)}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.get(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){!0===this._initialized&&(this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach(e=>{null!==e&&e.dispose()})),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.deleteForCompute(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=PS.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=PS.copy(t).floor()}else t=PS.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t),this._inspector.copyFramebufferToTexture(e)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n),this._inspector.copyTextureToTexture(e,t)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?LS:BS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&PS.setFromMatrixPosition(e.matrixWorld).applyMatrix4(FS);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,PS.z,null,i)}}else if(e.isLineLoop)o("Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if(e.isMesh||e.isLine||e.isPoints){const n=t.isArrayCamera?LS:BS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),PS.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(FS)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=M;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=ct;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=B}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n(t.not().discard(),e))(u)}}e.depthNode&&e.depthNode.isNode&&(l=e.depthNode),e.castShadowPositionNode&&e.castShadowPositionNode.isNode?o=e.castShadowPositionNode:e.positionNode&&e.positionNode.isNode&&(o=e.positionNode),r={version:t,colorNode:u,depthNode:l,positionNode:o},this._cacheShadowNodes.set(e,r)}return r}renderObject(e,t,r,s,i,n,a,o=null,u=null){let l,d,c,h,p=!1;if(e.onBeforeRender(this,t,r,s,i,n),!0===i.allowOverride&&null!==t.overrideMaterial){const e=t.overrideMaterial;if(p=!0,l=t.overrideMaterial.colorNode,d=t.overrideMaterial.depthNode,c=t.overrideMaterial.positionNode,h=t.overrideMaterial.side,i.positionNode&&i.positionNode.isNode&&(e.positionNode=i.positionNode),e.alphaTest=i.alphaTest,e.alphaMap=i.alphaMap,e.transparent=i.transparent||i.transmission>0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);this.shadowMap.type===Ze?e.side=null!==i.shadowSide?i.shadowSide:i.side:e.side=null!==i.shadowSide?i.shadowSide:DS[i.side],null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===B&&!1===i.forceSinglePass?(i.side=M,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=ct,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=B):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){return this.backend.hasCompatibility(e)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class IS{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class OS extends IS{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(oy-e%oy)%oy;var e}get buffer(){return this._buffer}update(){return!0}}class VS extends OS{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let kS=0;class GS extends VS{constructor(e,t){super("UniformBuffer_"+kS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class zS extends VS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.generation=null,this.version=0},this.texture=t,this.version=t?t.version:0,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=0},e.texture=this.texture,e}}let qS=0;class jS extends HS{constructor(e,t){super(e,t),this.id=qS++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class XS extends jS{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class KS extends XS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class YS extends XS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const QS={bitcast_int_uint:new Kx("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new Kx("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},ZS={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},JS={low:"lowp",medium:"mediump",high:"highp"},eR={swizzleAssign:!0,storageBuffer:!1},tR={perspective:"smooth",linear:"noperspective"},rR={centroid:"centroid"},sR="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision highp sampler2DShadow;\nprecision highp sampler2DArrayShadow;\nprecision highp samplerCubeShadow;\n";class iR extends UN{constructor(e,t){super(e,t,new sS),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=QS[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==QS[e]&&this._include(e),ZS[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`${e} ? ${t} : ${r}`}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?Tt:_t;2===s?n=i?Rt:G:3===s?n=i?At:Et:4===s&&(n=i?wt:Re);const a={Float32Array:j,Uint8Array:Ge,Uint16Array:St,Uint32Array:S,Int8Array:Nt,Int16Array:vt,Int32Array:R,Uint8ClampedArray:Ge},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=JS[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=JS[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${tR[s.interpolationType]||s.interpolationType} ${rR[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${tR[e.interpolationType]||e.interpolationType} ${rR[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce((e,t)=>e*t,1)}u`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=eR[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}eR[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new XS(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new KS(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new YS(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new GS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new WS(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let nR=null,aR=null;class oR{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[Ct.RENDER]:null,[Ct.COMPUTE]:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?Ct.COMPUTE:Ct.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return nR=nR||new t,this.renderer.getDrawingBufferSize(nR)}setScissorTest(){}getClearColor(){const e=this.renderer;return aR=aR||new Ly,e.getClearColor(aR),aR.getRGB(aR),aR}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Mt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${ut} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}deleteBindGroupData(){}dispose(){}}let uR,lR,dR=0;class cR{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class hR{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===R,id:dR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new cR(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e0?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()})}}let mR,fR,yR,bR=!1;class xR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===bR&&(this._init(),bR=!0)}_init(){const e=this.gl;mR={[Vr]:e.REPEAT,[xe]:e.CLAMP_TO_EDGE,[Or]:e.MIRRORED_REPEAT},fR={[w]:e.NEAREST,[kr]:e.NEAREST_MIPMAP_NEAREST,[at]:e.NEAREST_MIPMAP_LINEAR,[oe]:e.LINEAR,[nt]:e.LINEAR_MIPMAP_NEAREST,[K]:e.LINEAR_MIPMAP_LINEAR},yR={[qr]:e.NEVER,[Hr]:e.ALWAYS,[E]:e.LESS,[Je]:e.LEQUAL,[Wr]:e.EQUAL,[$r]:e.GEQUAL,[zr]:e.GREATER,[Gr]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];d("WebGLBackend: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}if(t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)}return t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this,n=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,o),r.texParameteri(e,r.TEXTURE_WRAP_S,mR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,mR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,mR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,fR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===oe&&u?K:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,fR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,yR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===w)return;if(t.minFilter!==at&&t.minFilter!==K)return;if(t.type===j&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(!e.isRenderTargetTexture&&void 0!==n)if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0){const t=Xr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e));i.bindRenderbuffer(i.RENDERBUFFER,null)}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();a.state.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function TR(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class _R{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class vR{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const NR={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class SR{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){o("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){o("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise(t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){o("Error checking query:",e),t(this.lastValue)}};n()})}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class ER extends oR{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.currentSamples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new _R(this),this.capabilities=new vR(this),this.attributeUtils=new hR(this),this.textureUtils=new xR(this),this.bufferRenderer=new SR(this),this.state=new pR(this),this.utils=new gR(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed")}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e._autoAllocateDepthBuffer&&!1===e.multiview&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new AR(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e)),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(v("WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):v("WebGLBackend: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()});return void t.push(i)}this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=(e.getShaderInfoLog(t)||"").trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=(s.getProgramInfoLog(e)||"").trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");o("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&d("WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;eNR[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=wy(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const wR="point-list",CR="line-list",MR="line-strip",BR="triangle-list",LR="triangle-strip",FR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},PR="never",DR="less",UR="equal",IR="less-equal",OR="greater",VR="not-equal",kR="greater-equal",GR="always",zR="store",$R="load",WR="clear",HR="ccw",qR="cw",jR="none",XR="back",KR="uint16",YR="uint32",QR="r8unorm",ZR="r8snorm",JR="r8uint",eA="r8sint",tA="r16uint",rA="r16sint",sA="r16float",iA="rg8unorm",nA="rg8snorm",aA="rg8uint",oA="rg8sint",uA="r32uint",lA="r32sint",dA="r32float",cA="rg16uint",hA="rg16sint",pA="rg16float",gA="rgba8unorm",mA="rgba8unorm-srgb",fA="rgba8snorm",yA="rgba8uint",bA="rgba8sint",xA="bgra8unorm",TA="bgra8unorm-srgb",_A="rgb9e5ufloat",vA="rgb10a2unorm",NA="rg11b10ufloat",SA="rg32uint",RA="rg32sint",AA="rg32float",EA="rgba16uint",wA="rgba16sint",CA="rgba16float",MA="rgba32uint",BA="rgba32sint",LA="rgba32float",FA="depth16unorm",PA="depth24plus",DA="depth24plus-stencil8",UA="depth32float",IA="depth32float-stencil8",OA="bc1-rgba-unorm",VA="bc1-rgba-unorm-srgb",kA="bc2-rgba-unorm",GA="bc2-rgba-unorm-srgb",zA="bc3-rgba-unorm",$A="bc3-rgba-unorm-srgb",WA="bc4-r-unorm",HA="bc4-r-snorm",qA="bc5-rg-unorm",jA="bc5-rg-snorm",XA="bc6h-rgb-ufloat",KA="bc6h-rgb-float",YA="bc7-rgba-unorm",QA="bc7-rgba-unorm-srgb",ZA="etc2-rgb8unorm",JA="etc2-rgb8unorm-srgb",eE="etc2-rgb8a1unorm",tE="etc2-rgb8a1unorm-srgb",rE="etc2-rgba8unorm",sE="etc2-rgba8unorm-srgb",iE="eac-r11unorm",nE="eac-r11snorm",aE="eac-rg11unorm",oE="eac-rg11snorm",uE="astc-4x4-unorm",lE="astc-4x4-unorm-srgb",dE="astc-5x4-unorm",cE="astc-5x4-unorm-srgb",hE="astc-5x5-unorm",pE="astc-5x5-unorm-srgb",gE="astc-6x5-unorm",mE="astc-6x5-unorm-srgb",fE="astc-6x6-unorm",yE="astc-6x6-unorm-srgb",bE="astc-8x5-unorm",xE="astc-8x5-unorm-srgb",TE="astc-8x6-unorm",_E="astc-8x6-unorm-srgb",vE="astc-8x8-unorm",NE="astc-8x8-unorm-srgb",SE="astc-10x5-unorm",RE="astc-10x5-unorm-srgb",AE="astc-10x6-unorm",EE="astc-10x6-unorm-srgb",wE="astc-10x8-unorm",CE="astc-10x8-unorm-srgb",ME="astc-10x10-unorm",BE="astc-10x10-unorm-srgb",LE="astc-12x10-unorm",FE="astc-12x10-unorm-srgb",PE="astc-12x12-unorm",DE="astc-12x12-unorm-srgb",UE="clamp-to-edge",IE="repeat",OE="mirror-repeat",VE="linear",kE="nearest",GE="zero",zE="one",$E="src",WE="one-minus-src",HE="src-alpha",qE="one-minus-src-alpha",jE="dst",XE="one-minus-dst",KE="dst-alpha",YE="one-minus-dst-alpha",QE="src-alpha-saturated",ZE="constant",JE="one-minus-constant",ew="add",tw="subtract",rw="reverse-subtract",sw="min",iw="max",nw=0,aw=15,ow="keep",uw="zero",lw="replace",dw="invert",cw="increment-clamp",hw="decrement-clamp",pw="increment-wrap",gw="decrement-wrap",mw="storage",fw="read-only-storage",yw="write-only",bw="read-only",xw="read-write",Tw="non-filtering",_w="comparison",vw="float",Nw="unfilterable-float",Sw="depth",Rw="sint",Aw="uint",Ew="2d",ww="3d",Cw="2d",Mw="2d-array",Bw="cube",Lw="3d",Fw="all",Pw="vertex",Dw="instance",Uw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"},Iw={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class Ow extends HS{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class Vw extends OS{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let kw=0;class Gw extends Vw{constructor(e,t){super("StorageBuffer_"+kw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ti.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class zw extends ry{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:VE}),this.flipYSampler=e.createSampler({minFilter:kE}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:LR,stripIndexFormat:YR},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:LR,stripIndexFormat:YR},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Cw,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:Cw,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:WR,storeOp:zR,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0,s=null){const i=this.get(e);void 0===i.layers&&(i.layers=[]);const n=i.layers[r]||this._mipmapCreateBundles(e,t,r),a=s||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(a,n),null===s&&this.device.queue.submit([a.finish()]),i.layers[r]=n}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Cw,baseArrayLayer:r});const a=[];for(let o=1;o0)for(let t=0,n=s.length;t0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new zw(this.backend.device)),e}_generateMipmaps(e,t,r=0,s=null){this._getPassUtils().generateMipmaps(e,t,r,s)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,Xw=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,Kw={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class Yw extends ZN{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(jw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=Xw.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class Qw extends QN{parseFunction(e){return new Yw(e)}}const Zw={[ti.READ_ONLY]:"read",[ti.WRITE_ONLY]:"write",[ti.READ_WRITE]:"read_write"},Jw={[Vr]:"repeat",[xe]:"clamp",[Or]:"mirror"},eC={vertex:FR.VERTEX,fragment:FR.FRAGMENT,compute:FR.COMPUTE},tC={instance:!0,swizzleAssign:!1,storageBuffer:!0},rC={"^^":"tsl_xor"},sC={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},iC={},nC={tsl_xor:new Kx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new Kx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new Kx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new Kx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new Kx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new Kx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new Kx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new Kx("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new Kx("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new Kx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new Kx("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new Kx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new Kx("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},aC={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let oC="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(oC+="diagnostic( off, derivative_uniformity );\n");class uC extends UN{constructor(e,t){super(e,t,new Qw),this.uniformGroups={},this.uniformGroupsBindings={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${Jw[e.wrapS]}S_${Jw[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=iC[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Vr?(s.push(nC.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===xe?(s.push(nC.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Or?(s.push(nC.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",iC[t]=r=new Kx(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Au(new pl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Au(new pl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Au(new pl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u"){this._include("biquadraticTexture");const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${a}`),`tsl_biquadraticTexture( ${t}, ${n}( ${r} ), ${a}, u32( ${i} ) )`}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";return i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`),r=`${u}( ${a}( ${r} ) * ${u}( ${o} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction&&this.renderer.hasCompatibility(A.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===j||!1===this.isSampleCompare(e)&&e.minFilter===w&&e.magFilter===w||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"cubeDepthTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=rC[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),ti.READ_WRITE):ti.READ_ONLY:e.access}getStorageAccess(e,t){return Zw[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new YS(i.name,i.node,o,n):new XS(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new KS(i.name,i.node,o,n):"texture3D"===t&&(s=new YS(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(eC[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new Ow(`${i.name}_sampler`,i.node,o);e.setVisibility(eC[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?GS:Gw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|eC[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e?(e=new WS(u,o),e.setVisibility(eC[r]),this.uniformGroups[u]=e,l.push(e)):(e.setVisibility(e.getVisibility()|eC[r]),-1===l.indexOf(e)&&l.push(e)),a=this.getNodeUniform(i,t);const s=a.name;e.uniforms.some(e=>e.name===s)||e.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","builtinClipSpace","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!1===this.isUnfilterable(t)&&!0!==i.node.isStorageTextureNode)&&(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=qw(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}let s=this.uniformGroupsBindings[e];void 0===s&&(s={index:a.binding++,id:a.group},this.uniformGroupsBindings[e]=s),n[e]={index:s.index,id:s.id,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.builtinClipSpace = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return sC[e]||e}isAvailable(e){let t=tC[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),tC[e]=t),t}_getWGSLMethod(e){return void 0!==nC[e]&&this._include(e),aC[e]}_include(e){const t=nC[e];return t.build(this),this.addInclude(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${oC}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){const[r,s,i]=t;return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class lC{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return e.depth&&(t=null!==e.depthTexture?this.getTextureFormatGPU(e.depthTexture):e.stencil?DA:PA),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.currentSamples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?wR:e.isLineSegments||e.isMesh&&!0===t.wireframe?CR:e.isLine?MR:e.isMesh?BR:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ge)return xA;if(e===be)return CA;throw new Error("Unsupported output buffer type.")}}const dC=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&dC.set(Float16Array,["float16"]);const cC=new Map([[ot,["float16"]]]),hC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class pC{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=Kr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=Fw;let o;o=t.isSampledCubeTexture?Bw:t.isSampledTexture3D?Lw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Mw:Cw,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&FR.COMPUTE&&(s.access===ti.READ_WRITE||s.access===ti.WRITE_ONLY)?e.type=mw:e.type=fw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===ti.READ_WRITE?xw:t===ti.WRITE_ONLY?yw:bw,s.texture.isArrayTexture?e.viewDimension=Mw:s.texture.is3DTexture&&(e.viewDimension=Lw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=Nw)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=Nw:t.sampleType=Sw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=Rw:e===S?t.sampleType=Aw:e===j&&(this.backend.hasFeature("float32-filterable")?t.sampleType=vw:t.sampleType=Nw)}s.isSampledCubeTexture?t.viewDimension=Bw:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=Mw:s.isSampledTexture3D&&(t.viewDimension=Lw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(A.TEXTURE_COMPARE)?t.type=_w:t.type=Tw),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class fC{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===ee||s.blending===ze&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures,r=e.context.mrt;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},A={},E=e.context.depth,w=e.context.stencil;if(!0!==E&&!0!==w||(!0===E&&(A.format=N,A.depthWriteEnabled=s.depthWrite,A.depthCompare=v),!0===w&&(A.stencilFront=f,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(A.depthBias=s.polygonOffsetUnits,A.depthBiasSlopeScale=s.polygonOffsetFactor,A.depthBiasClamp=0),R.depthStencil=A),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(R),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(R)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),e()});t.push(e)}}createBundleEncoder(e,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:s.getCurrentColorFormats(e),depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e),{layoutGPU:s}=t.layout;a.push(s)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===ht){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:ew},r={srcFactor:i,dstFactor:n,operation:ew}};if(e.premultipliedAlpha)switch(s){case ze:i(zE,qE,zE,qE);break;case qt:i(zE,zE,zE,zE);break;case Ht:i(GE,WE,GE,zE);break;case Wt:i(jE,qE,GE,zE)}else switch(s){case ze:i(HE,qE,zE,qE);break;case qt:i(HE,zE,zE,zE);break;case Ht:o(`WebGPURenderer: "SubtractiveBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`);break;case Wt:o(`WebGPURenderer: "MultiplyBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case pt:t=GE;break;case kt:t=zE;break;case Vt:t=$E;break;case Dt:t=WE;break;case $e:t=HE;break;case We:t=qE;break;case It:t=jE;break;case Pt:t=XE;break;case Ut:t=KE;break;case Ft:t=YE;break;case Ot:t=QE;break;case 211:t=ZE;break;case 212:t=JE;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ss:t=PR;break;case rs:t=GR;break;case ts:t=DR;break;case es:t=IR;break;case Jr:t=UR;break;case Zr:t=kR;break;case Qr:t=OR;break;case Yr:t=VR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case cs:t=ow;break;case ds:t=uw;break;case ls:t=lw;break;case us:t=dw;break;case os:t=cw;break;case as:t=hw;break;case ns:t=pw;break;case is:t=gw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case He:t=ew;break;case Lt:t=tw;break;case Bt:t=rw;break;case ps:t=sw;break;case hs:t=iw;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?KR:YR);let n=r.side===M;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?qR:HR,s.cullMode=r.side===B?jR:XR,s}_getColorWriteMask(e){return!0===e.colorWrite?aw:nw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=GR;else{const r=e.depthFunc;switch(r){case er:t=PR;break;case Jt:t=GR;break;case Zt:t=DR;break;case Qt:t=IR;break;case Yt:t=UR;break;case Kt:t=kR;break;case Xt:t=OR;break;case jt:t=VR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class yC extends RR{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class bC extends oR{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.defaultRenderPassdescriptor=null,this.utils=new lC(this),this.attributeUtils=new pC(this),this.bindingUtils=new mC(this),this.pipelineUtils=new fC(this),this.textureUtils=new Hw(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[A.TEXTURE_COMPARE]:t}}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:t.compatibilityMode?"compatibility":void 0},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(Uw),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}else r=t.device;r.lost.then(t=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Uw.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${ut} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===be?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:$R}),this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e),n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n),l=u.pipeline;if(!0===u.error)return;const d=e.getIndex(),c=null!==d,h=e.getDrawParameters();if(null===h)return;const p=(t,r)=>{this.pipelineUtils.setPipeline(t,l),r.pipeline=l;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(p(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&v("WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===c?s.drawIndexed(i[o],n,e[o]/d.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===c){const{vertexCount:i,instanceCount:n,firstVertex:a}=h,o=e.getIndirect();if(null!==o){const t=this.get(o).buffer,r=e.getIndirectOffset(),i=Array.isArray(r)?r:[r];for(let e=0;e0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new ER(e)));super(new t(e),e),this.library=new _C,this.isWebGPURenderer=!0}}class NC extends Es{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class SC{constructor(e,t=An(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Zp;r.name="PostProcessing",this._quadMesh=new Wb(r),this._quadMesh.name="Post-Processing",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=yl(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){v('PostProcessing: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class RC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class AC extends sx{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class EC extends ws{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Cs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):o(t),this.manager.itemError(e)}},r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(o("NodeLoader: Node type not found:",e),gn()):new this.nodes[e]}}class wC extends Ms{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class CC extends Bs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new EC;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new wC;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t Date: Mon, 19 Jan 2026 02:35:17 -0800 Subject: [PATCH 7/7] ColladaLoader: Split into modular files. (#32796) Co-authored-by: Claude Opus 4.5 --- examples/jsm/loaders/ColladaLoader.js | 4050 +---------------- .../jsm/loaders/collada/ColladaComposer.js | 2210 +++++++++ examples/jsm/loaders/collada/ColladaParser.js | 1928 ++++++++ 3 files changed, 4162 insertions(+), 4026 deletions(-) create mode 100644 examples/jsm/loaders/collada/ColladaComposer.js create mode 100644 examples/jsm/loaders/collada/ColladaParser.js diff --git a/examples/jsm/loaders/ColladaLoader.js b/examples/jsm/loaders/ColladaLoader.js index f7a7c34c4821b9..4530d09a4367cc 100644 --- a/examples/jsm/loaders/ColladaLoader.js +++ b/examples/jsm/loaders/ColladaLoader.js @@ -1,45 +1,14 @@ import { - AmbientLight, - AnimationClip, - Bone, - BufferGeometry, - ClampToEdgeWrapping, - Color, - ColorManagement, - DirectionalLight, - DoubleSide, FileLoader, - Float32BufferAttribute, - FrontSide, - Group, - Line, - LineBasicMaterial, - LineSegments, Loader, LoaderUtils, - MathUtils, - Matrix4, - Mesh, - MeshBasicMaterial, - MeshLambertMaterial, - MeshPhongMaterial, - OrthographicCamera, - PerspectiveCamera, - PointLight, - Quaternion, - QuaternionKeyframeTrack, - RepeatWrapping, Scene, - Skeleton, - SkinnedMesh, - SpotLight, - TextureLoader, - Vector2, - Vector3, - VectorKeyframeTrack, - SRGBColorSpace + TextureLoader } from 'three'; + import { TGALoader } from '../loaders/TGALoader.js'; +import { ColladaParser } from './collada/ColladaParser.js'; +import { ColladaComposer } from './collada/ColladaComposer.js'; /** * A loader for the Collada format. @@ -117,4016 +86,44 @@ class ColladaLoader extends Loader { */ parse( text, path ) { - function getElementsByTagName( xml, name ) { - - // Non recursive xml.getElementsByTagName() ... - - const array = []; - const childNodes = xml.childNodes; - - for ( let i = 0, l = childNodes.length; i < l; i ++ ) { - - const child = childNodes[ i ]; - - if ( child.nodeName === name ) { - - array.push( child ); - - } - - } - - return array; - - } - - function parseStrings( text ) { - - if ( text.length === 0 ) return []; - - const parts = text.trim().split( /\s+/ ); - const array = new Array( parts.length ); - - for ( let i = 0, l = parts.length; i < l; i ++ ) { - - array[ i ] = parts[ i ]; - - } - - return array; - - } - - function parseFloats( text ) { - - if ( text.length === 0 ) return []; - - const parts = text.trim().split( /\s+/ ); - const array = new Array( parts.length ); - - for ( let i = 0, l = parts.length; i < l; i ++ ) { - - array[ i ] = parseFloat( parts[ i ] ); - - } - - return array; - - } - - function parseInts( text ) { - - if ( text.length === 0 ) return []; - - const parts = text.trim().split( /\s+/ ); - const array = new Array( parts.length ); - - for ( let i = 0, l = parts.length; i < l; i ++ ) { - - array[ i ] = parseInt( parts[ i ] ); - - } - - return array; - - } - - function parseId( text ) { - - return text.substring( 1 ); - - } - - function generateId() { - - return 'three_default_' + ( count ++ ); - - } - - function isEmpty( object ) { - - return Object.keys( object ).length === 0; - - } - - // asset - - function parseAsset( xml ) { - - return { - unit: parseAssetUnit( getElementsByTagName( xml, 'unit' )[ 0 ] ), - upAxis: parseAssetUpAxis( getElementsByTagName( xml, 'up_axis' )[ 0 ] ) - }; - - } - - function parseAssetUnit( xml ) { - - if ( ( xml !== undefined ) && ( xml.hasAttribute( 'meter' ) === true ) ) { - - return parseFloat( xml.getAttribute( 'meter' ) ); - - } else { - - return 1; // default 1 meter - - } - - } - - function parseAssetUpAxis( xml ) { - - return xml !== undefined ? xml.textContent : 'Y_UP'; - - } - - // library - - function parseLibrary( xml, libraryName, nodeName, parser ) { - - const library = getElementsByTagName( xml, libraryName )[ 0 ]; - - if ( library !== undefined ) { - - const elements = getElementsByTagName( library, nodeName ); - - for ( let i = 0; i < elements.length; i ++ ) { - - parser( elements[ i ] ); - - } - - } - - } - - function buildLibrary( data, builder ) { - - for ( const name in data ) { - - const object = data[ name ]; - object.build = builder( data[ name ] ); - - } - - } - - // get - - function getBuild( data, builder ) { - - if ( data.build !== undefined ) return data.build; - - data.build = builder( data ); - - return data.build; - - } - - // animation - - function parseAnimation( xml ) { - - const data = { - sources: {}, - samplers: {}, - channels: {} - }; - - let hasChildren = false; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - let id; - - switch ( child.nodeName ) { - - case 'source': - id = child.getAttribute( 'id' ); - data.sources[ id ] = parseSource( child ); - break; - - case 'sampler': - id = child.getAttribute( 'id' ); - data.samplers[ id ] = parseAnimationSampler( child ); - break; - - case 'channel': - id = child.getAttribute( 'target' ); - data.channels[ id ] = parseAnimationChannel( child ); - break; - - case 'animation': - // hierarchy of related animations - parseAnimation( child ); - hasChildren = true; - break; - - default: - console.log( child ); - - } - - } - - if ( hasChildren === false ) { - - // since 'id' attributes can be optional, it's necessary to generate a UUID for unique assignment - - library.animations[ xml.getAttribute( 'id' ) || MathUtils.generateUUID() ] = data; - - } - - } - - function parseAnimationSampler( xml ) { - - const data = { - inputs: {}, - }; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'input': - const id = parseId( child.getAttribute( 'source' ) ); - const semantic = child.getAttribute( 'semantic' ); - data.inputs[ semantic ] = id; - break; - - } - - } - - return data; - - } - - function parseAnimationChannel( xml ) { - - const data = {}; - - const target = xml.getAttribute( 'target' ); - - // parsing SID Addressing Syntax - - let parts = target.split( '/' ); - - const id = parts.shift(); - let sid = parts.shift(); - - // check selection syntax - - const arraySyntax = ( sid.indexOf( '(' ) !== - 1 ); - const memberSyntax = ( sid.indexOf( '.' ) !== - 1 ); - - if ( memberSyntax ) { - - // member selection access - - parts = sid.split( '.' ); - sid = parts.shift(); - data.member = parts.shift(); - - } else if ( arraySyntax ) { - - // array-access syntax. can be used to express fields in one-dimensional vectors or two-dimensional matrices. - - const indices = sid.split( '(' ); - sid = indices.shift(); - - for ( let i = 0; i < indices.length; i ++ ) { - - indices[ i ] = parseInt( indices[ i ].replace( /\)/, '' ) ); - - } - - data.indices = indices; - - } - - data.id = id; - data.sid = sid; - - data.arraySyntax = arraySyntax; - data.memberSyntax = memberSyntax; - - data.sampler = parseId( xml.getAttribute( 'source' ) ); - - return data; - - } - - function buildAnimation( data ) { - - const tracks = []; - - const channels = data.channels; - const samplers = data.samplers; - const sources = data.sources; - - for ( const target in channels ) { - - if ( channels.hasOwnProperty( target ) ) { - - const channel = channels[ target ]; - const sampler = samplers[ channel.sampler ]; - - const inputId = sampler.inputs.INPUT; - const outputId = sampler.inputs.OUTPUT; - - const inputSource = sources[ inputId ]; - const outputSource = sources[ outputId ]; - - const animation = buildAnimationChannel( channel, inputSource, outputSource ); - - createKeyframeTracks( animation, tracks ); - - } - - } - - return tracks; - - } - - function getAnimation( id ) { - - return getBuild( library.animations[ id ], buildAnimation ); - - } - - function buildAnimationChannel( channel, inputSource, outputSource ) { - - const node = library.nodes[ channel.id ]; - const object3D = getNode( node.id ); - - const transform = node.transforms[ channel.sid ]; - const defaultMatrix = node.matrix.clone().transpose(); - - let time, stride; - let i, il, j, jl; - - const data = {}; - - // the collada spec allows the animation of data in various ways. - // depending on the transform type (matrix, translate, rotate, scale), we execute different logic - - switch ( transform ) { - - case 'matrix': - - for ( i = 0, il = inputSource.array.length; i < il; i ++ ) { - - time = inputSource.array[ i ]; - stride = i * outputSource.stride; - - if ( data[ time ] === undefined ) data[ time ] = {}; - - if ( channel.arraySyntax === true ) { - - const value = outputSource.array[ stride ]; - const index = channel.indices[ 0 ] + 4 * channel.indices[ 1 ]; - - data[ time ][ index ] = value; - - } else { - - for ( j = 0, jl = outputSource.stride; j < jl; j ++ ) { - - data[ time ][ j ] = outputSource.array[ stride + j ]; - - } - - } - - } - - break; - - case 'translate': - console.warn( 'THREE.ColladaLoader: Animation transform type "%s" not yet implemented.', transform ); - break; - - case 'rotate': - console.warn( 'THREE.ColladaLoader: Animation transform type "%s" not yet implemented.', transform ); - break; - - case 'scale': - console.warn( 'THREE.ColladaLoader: Animation transform type "%s" not yet implemented.', transform ); - break; - - } - - const keyframes = prepareAnimationData( data, defaultMatrix ); - - const animation = { - name: object3D.uuid, - keyframes: keyframes - }; + if ( text.length === 0 ) { - return animation; + return { scene: new Scene() }; } - function prepareAnimationData( data, defaultMatrix ) { - - const keyframes = []; - - // transfer data into a sortable array - - for ( const time in data ) { - - keyframes.push( { time: parseFloat( time ), value: data[ time ] } ); - - } - - // ensure keyframes are sorted by time - - keyframes.sort( ascending ); - - // now we clean up all animation data, so we can use them for keyframe tracks - - for ( let i = 0; i < 16; i ++ ) { - - transformAnimationData( keyframes, i, defaultMatrix.elements[ i ] ); - - } - - return keyframes; + // Parse XML to library data + const parser = new ColladaParser(); + const parseResult = parser.parse( text ); - // array sort function + if ( parseResult === null ) { - function ascending( a, b ) { - - return a.time - b.time; - - } + return null; } - const position = new Vector3(); - const scale = new Vector3(); - const quaternion = new Quaternion(); - - function createKeyframeTracks( animation, tracks ) { - - const keyframes = animation.keyframes; - const name = animation.name; - - const times = []; - const positionData = []; - const quaternionData = []; - const scaleData = []; - - for ( let i = 0, l = keyframes.length; i < l; i ++ ) { + const { library, asset, collada } = parseResult; - const keyframe = keyframes[ i ]; - - const time = keyframe.time; - const value = keyframe.value; - - matrix.fromArray( value ).transpose(); - matrix.decompose( position, quaternion, scale ); - - times.push( time ); - positionData.push( position.x, position.y, position.z ); - quaternionData.push( quaternion.x, quaternion.y, quaternion.z, quaternion.w ); - scaleData.push( scale.x, scale.y, scale.z ); + // Setup texture loaders + const textureLoader = new TextureLoader( this.manager ); + textureLoader.setPath( this.resourcePath || path ).setCrossOrigin( this.crossOrigin ); - } + let tgaLoader; - if ( positionData.length > 0 ) tracks.push( new VectorKeyframeTrack( name + '.position', times, positionData ) ); - if ( quaternionData.length > 0 ) tracks.push( new QuaternionKeyframeTrack( name + '.quaternion', times, quaternionData ) ); - if ( scaleData.length > 0 ) tracks.push( new VectorKeyframeTrack( name + '.scale', times, scaleData ) ); + if ( TGALoader ) { - return tracks; + tgaLoader = new TGALoader( this.manager ); + tgaLoader.setPath( this.resourcePath || path ); } - function transformAnimationData( keyframes, property, defaultValue ) { - - let keyframe; - - let empty = true; - let i, l; - - // check, if values of a property are missing in our keyframes - - for ( i = 0, l = keyframes.length; i < l; i ++ ) { - - keyframe = keyframes[ i ]; - - if ( keyframe.value[ property ] === undefined ) { - - keyframe.value[ property ] = null; // mark as missing - - } else { - - empty = false; - - } - - } - - if ( empty === true ) { - - // no values at all, so we set a default value - - for ( i = 0, l = keyframes.length; i < l; i ++ ) { - - keyframe = keyframes[ i ]; - - keyframe.value[ property ] = defaultValue; - - } - - } else { - - // filling gaps - - createMissingKeyframes( keyframes, property ); - - } - - } - - function createMissingKeyframes( keyframes, property ) { - - let prev, next; - - for ( let i = 0, l = keyframes.length; i < l; i ++ ) { - - const keyframe = keyframes[ i ]; - - if ( keyframe.value[ property ] === null ) { - - prev = getPrev( keyframes, i, property ); - next = getNext( keyframes, i, property ); - - if ( prev === null ) { - - keyframe.value[ property ] = next.value[ property ]; - continue; - - } - - if ( next === null ) { - - keyframe.value[ property ] = prev.value[ property ]; - continue; - - } - - interpolate( keyframe, prev, next, property ); - - } - - } - - } - - function getPrev( keyframes, i, property ) { - - while ( i >= 0 ) { - - const keyframe = keyframes[ i ]; - - if ( keyframe.value[ property ] !== null ) return keyframe; - - i --; - - } - - return null; - - } - - function getNext( keyframes, i, property ) { - - while ( i < keyframes.length ) { - - const keyframe = keyframes[ i ]; - - if ( keyframe.value[ property ] !== null ) return keyframe; - - i ++; - - } - - return null; - - } - - function interpolate( key, prev, next, property ) { - - if ( ( next.time - prev.time ) === 0 ) { - - key.value[ property ] = prev.value[ property ]; - return; - - } - - key.value[ property ] = ( ( key.time - prev.time ) * ( next.value[ property ] - prev.value[ property ] ) / ( next.time - prev.time ) ) + prev.value[ property ]; - - } - - // animation clips - - function parseAnimationClip( xml ) { - - const data = { - name: xml.getAttribute( 'id' ) || 'default', - start: parseFloat( xml.getAttribute( 'start' ) || 0 ), - end: parseFloat( xml.getAttribute( 'end' ) || 0 ), - animations: [] - }; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'instance_animation': - data.animations.push( parseId( child.getAttribute( 'url' ) ) ); - break; - - } - - } - - library.clips[ xml.getAttribute( 'id' ) ] = data; - - } - - function buildAnimationClip( data ) { - - const tracks = []; - - const name = data.name; - const duration = ( data.end - data.start ) || - 1; - const animations = data.animations; - - for ( let i = 0, il = animations.length; i < il; i ++ ) { - - const animationTracks = getAnimation( animations[ i ] ); - - for ( let j = 0, jl = animationTracks.length; j < jl; j ++ ) { - - tracks.push( animationTracks[ j ] ); - - } - - } - - return new AnimationClip( name, duration, tracks ); - - } - - function getAnimationClip( id ) { - - return getBuild( library.clips[ id ], buildAnimationClip ); - - } - - // controller - - function parseController( xml ) { - - const data = {}; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'skin': - // there is exactly one skin per controller - data.id = parseId( child.getAttribute( 'source' ) ); - data.skin = parseSkin( child ); - break; - - case 'morph': - data.id = parseId( child.getAttribute( 'source' ) ); - console.warn( 'THREE.ColladaLoader: Morph target animation not supported yet.' ); - break; - - } - - } - - library.controllers[ xml.getAttribute( 'id' ) ] = data; - - } - - function parseSkin( xml ) { - - const data = { - sources: {} - }; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'bind_shape_matrix': - data.bindShapeMatrix = parseFloats( child.textContent ); - break; - - case 'source': - const id = child.getAttribute( 'id' ); - data.sources[ id ] = parseSource( child ); - break; - - case 'joints': - data.joints = parseJoints( child ); - break; - - case 'vertex_weights': - data.vertexWeights = parseVertexWeights( child ); - break; - - } - - } - - return data; - - } - - function parseJoints( xml ) { - - const data = { - inputs: {} - }; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'input': - const semantic = child.getAttribute( 'semantic' ); - const id = parseId( child.getAttribute( 'source' ) ); - data.inputs[ semantic ] = id; - break; - - } - - } - - return data; - - } - - function parseVertexWeights( xml ) { - - const data = { - inputs: {} - }; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'input': - const semantic = child.getAttribute( 'semantic' ); - const id = parseId( child.getAttribute( 'source' ) ); - const offset = parseInt( child.getAttribute( 'offset' ) ); - data.inputs[ semantic ] = { id: id, offset: offset }; - break; - - case 'vcount': - data.vcount = parseInts( child.textContent ); - break; - - case 'v': - data.v = parseInts( child.textContent ); - break; - - } - - } - - return data; - - } - - function buildController( data ) { - - const build = { - id: data.id - }; - - const geometry = library.geometries[ build.id ]; - - if ( data.skin !== undefined ) { - - build.skin = buildSkin( data.skin ); - - // we enhance the 'sources' property of the corresponding geometry with our skin data - - geometry.sources.skinIndices = build.skin.indices; - geometry.sources.skinWeights = build.skin.weights; - - } - - return build; - - } - - function buildSkin( data ) { - - const BONE_LIMIT = 4; - - const build = { - joints: [], // this must be an array to preserve the joint order - indices: { - array: [], - stride: BONE_LIMIT - }, - weights: { - array: [], - stride: BONE_LIMIT - } - }; - - const sources = data.sources; - const vertexWeights = data.vertexWeights; - - const vcount = vertexWeights.vcount; - const v = vertexWeights.v; - const jointOffset = vertexWeights.inputs.JOINT.offset; - const weightOffset = vertexWeights.inputs.WEIGHT.offset; - - const jointSource = data.sources[ data.joints.inputs.JOINT ]; - const inverseSource = data.sources[ data.joints.inputs.INV_BIND_MATRIX ]; - - const weights = sources[ vertexWeights.inputs.WEIGHT.id ].array; - let stride = 0; - - let i, j, l; - - // process skin data for each vertex - - for ( i = 0, l = vcount.length; i < l; i ++ ) { - - const jointCount = vcount[ i ]; // this is the amount of joints that affect a single vertex - const vertexSkinData = []; - - for ( j = 0; j < jointCount; j ++ ) { - - const skinIndex = v[ stride + jointOffset ]; - const weightId = v[ stride + weightOffset ]; - const skinWeight = weights[ weightId ]; - - vertexSkinData.push( { index: skinIndex, weight: skinWeight } ); - - stride += 2; - - } - - // we sort the joints in descending order based on the weights. - // this ensures, we only proceed the most important joints of the vertex - - vertexSkinData.sort( descending ); - - // now we provide for each vertex a set of four index and weight values. - // the order of the skin data matches the order of vertices - - for ( j = 0; j < BONE_LIMIT; j ++ ) { - - const d = vertexSkinData[ j ]; - - if ( d !== undefined ) { - - build.indices.array.push( d.index ); - build.weights.array.push( d.weight ); - - } else { - - build.indices.array.push( 0 ); - build.weights.array.push( 0 ); - - } - - } - - } - - // setup bind matrix - - if ( data.bindShapeMatrix ) { - - build.bindMatrix = new Matrix4().fromArray( data.bindShapeMatrix ).transpose(); - - } else { - - build.bindMatrix = new Matrix4().identity(); - - } - - // process bones and inverse bind matrix data - - for ( i = 0, l = jointSource.array.length; i < l; i ++ ) { - - const name = jointSource.array[ i ]; - const boneInverse = new Matrix4().fromArray( inverseSource.array, i * inverseSource.stride ).transpose(); - - build.joints.push( { name: name, boneInverse: boneInverse } ); - - } - - return build; - - // array sort function - - function descending( a, b ) { - - return b.weight - a.weight; - - } - - } - - function getController( id ) { - - return getBuild( library.controllers[ id ], buildController ); - - } - - // image - - function parseImage( xml ) { - - const data = { - init_from: getElementsByTagName( xml, 'init_from' )[ 0 ].textContent - }; - - library.images[ xml.getAttribute( 'id' ) ] = data; - - } - - function buildImage( data ) { - - if ( data.build !== undefined ) return data.build; - - return data.init_from; - - } - - function getImage( id ) { - - const data = library.images[ id ]; - - if ( data !== undefined ) { - - return getBuild( data, buildImage ); - - } - - console.warn( 'THREE.ColladaLoader: Couldn\'t find image with ID:', id ); - - return null; - - } - - // effect - - function parseEffect( xml ) { - - const data = {}; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'profile_COMMON': - data.profile = parseEffectProfileCOMMON( child ); - break; - - } - - } - - library.effects[ xml.getAttribute( 'id' ) ] = data; - - } - - function parseEffectProfileCOMMON( xml ) { - - const data = { - surfaces: {}, - samplers: {} - }; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'newparam': - parseEffectNewparam( child, data ); - break; - - case 'technique': - data.technique = parseEffectTechnique( child ); - break; - - case 'extra': - data.extra = parseEffectExtra( child ); - break; - - } - - } - - return data; - - } - - function parseEffectNewparam( xml, data ) { - - const sid = xml.getAttribute( 'sid' ); - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'surface': - data.surfaces[ sid ] = parseEffectSurface( child ); - break; - - case 'sampler2D': - data.samplers[ sid ] = parseEffectSampler( child ); - break; - - } - - } - - } - - function parseEffectSurface( xml ) { - - const data = {}; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'init_from': - data.init_from = child.textContent; - break; - - } - - } - - return data; - - } - - function parseEffectSampler( xml ) { - - const data = {}; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'source': - data.source = child.textContent; - break; - - } - - } - - return data; - - } - - function parseEffectTechnique( xml ) { - - const data = {}; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'constant': - case 'lambert': - case 'blinn': - case 'phong': - data.type = child.nodeName; - data.parameters = parseEffectParameters( child ); - break; - - case 'extra': - data.extra = parseEffectExtra( child ); - break; - - } - - } - - return data; - - } - - function parseEffectParameters( xml ) { - - const data = {}; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'emission': - case 'diffuse': - case 'specular': - case 'bump': - case 'ambient': - case 'shininess': - case 'transparency': - data[ child.nodeName ] = parseEffectParameter( child ); - break; - case 'transparent': - data[ child.nodeName ] = { - opaque: child.hasAttribute( 'opaque' ) ? child.getAttribute( 'opaque' ) : 'A_ONE', - data: parseEffectParameter( child ) - }; - break; - - } - - } - - return data; - - } - - function parseEffectParameter( xml ) { - - const data = {}; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'color': - data[ child.nodeName ] = parseFloats( child.textContent ); - break; - - case 'float': - data[ child.nodeName ] = parseFloat( child.textContent ); - break; - - case 'texture': - data[ child.nodeName ] = { id: child.getAttribute( 'texture' ), extra: parseEffectParameterTexture( child ) }; - break; - - } - - } - - return data; - - } - - function parseEffectParameterTexture( xml ) { - - const data = { - technique: {} - }; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'extra': - parseEffectParameterTextureExtra( child, data ); - break; - - } - - } - - return data; - - } - - function parseEffectParameterTextureExtra( xml, data ) { - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'technique': - parseEffectParameterTextureExtraTechnique( child, data ); - break; - - } - - } - - } - - function parseEffectParameterTextureExtraTechnique( xml, data ) { - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'repeatU': - case 'repeatV': - case 'offsetU': - case 'offsetV': - data.technique[ child.nodeName ] = parseFloat( child.textContent ); - break; - - case 'wrapU': - case 'wrapV': - - // some files have values for wrapU/wrapV which become NaN via parseInt - - if ( child.textContent.toUpperCase() === 'TRUE' ) { - - data.technique[ child.nodeName ] = 1; - - } else if ( child.textContent.toUpperCase() === 'FALSE' ) { - - data.technique[ child.nodeName ] = 0; - - } else { - - data.technique[ child.nodeName ] = parseInt( child.textContent ); - - } - - break; - - case 'bump': - data[ child.nodeName ] = parseEffectExtraTechniqueBump( child ); - break; - - } - - } - - } - - function parseEffectExtra( xml ) { - - const data = {}; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'technique': - data.technique = parseEffectExtraTechnique( child ); - break; - - } - - } - - return data; - - } - - function parseEffectExtraTechnique( xml ) { - - const data = {}; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'double_sided': - data[ child.nodeName ] = parseInt( child.textContent ); - break; - - case 'bump': - data[ child.nodeName ] = parseEffectExtraTechniqueBump( child ); - break; - - } - - } - - return data; - - } - - function parseEffectExtraTechniqueBump( xml ) { - - const data = {}; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'texture': - data[ child.nodeName ] = { id: child.getAttribute( 'texture' ), texcoord: child.getAttribute( 'texcoord' ), extra: parseEffectParameterTexture( child ) }; - break; - - } - - } - - return data; - - } - - function buildEffect( data ) { - - return data; - - } - - function getEffect( id ) { - - return getBuild( library.effects[ id ], buildEffect ); - - } - - // material - - function parseMaterial( xml ) { - - const data = { - name: xml.getAttribute( 'name' ) - }; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'instance_effect': - data.url = parseId( child.getAttribute( 'url' ) ); - break; - - } - - } - - library.materials[ xml.getAttribute( 'id' ) ] = data; - - } - - function getTextureLoader( image ) { - - let loader; - - let extension = image.slice( ( image.lastIndexOf( '.' ) - 1 >>> 0 ) + 2 ); // http://www.jstips.co/en/javascript/get-file-extension/ - extension = extension.toLowerCase(); - - switch ( extension ) { - - case 'tga': - loader = tgaLoader; - break; - - default: - loader = textureLoader; - - } - - return loader; - - } - - function buildMaterial( data ) { - - const effect = getEffect( data.url ); - const technique = effect.profile.technique; - - let material; - - switch ( technique.type ) { - - case 'phong': - case 'blinn': - material = new MeshPhongMaterial(); - break; - - case 'lambert': - material = new MeshLambertMaterial(); - break; - - default: - material = new MeshBasicMaterial(); - break; - - } - - material.name = data.name || ''; - - function getTexture( textureObject, colorSpace = null ) { - - const sampler = effect.profile.samplers[ textureObject.id ]; - let image = null; - - // get image - - if ( sampler !== undefined ) { - - const surface = effect.profile.surfaces[ sampler.source ]; - image = getImage( surface.init_from ); - - } else { - - console.warn( 'THREE.ColladaLoader: Undefined sampler. Access image directly (see #12530).' ); - image = getImage( textureObject.id ); - - } - - // create texture if image is available - - if ( image !== null ) { - - const loader = getTextureLoader( image ); - - if ( loader !== undefined ) { - - const texture = loader.load( image ); - - const extra = textureObject.extra; - - if ( extra !== undefined && extra.technique !== undefined && isEmpty( extra.technique ) === false ) { - - const technique = extra.technique; - - texture.wrapS = technique.wrapU ? RepeatWrapping : ClampToEdgeWrapping; - texture.wrapT = technique.wrapV ? RepeatWrapping : ClampToEdgeWrapping; - - texture.offset.set( technique.offsetU || 0, technique.offsetV || 0 ); - texture.repeat.set( technique.repeatU || 1, technique.repeatV || 1 ); - - } else { - - texture.wrapS = RepeatWrapping; - texture.wrapT = RepeatWrapping; - - } - - if ( colorSpace !== null ) { - - texture.colorSpace = colorSpace; - - } - - return texture; - - } else { - - console.warn( 'THREE.ColladaLoader: Loader for texture %s not found.', image ); - - return null; - - } - - } else { - - console.warn( 'THREE.ColladaLoader: Couldn\'t create texture with ID:', textureObject.id ); - - return null; - - } - - } - - const parameters = technique.parameters; - - for ( const key in parameters ) { - - const parameter = parameters[ key ]; - - switch ( key ) { - - case 'diffuse': - if ( parameter.color ) material.color.fromArray( parameter.color ); - if ( parameter.texture ) material.map = getTexture( parameter.texture, SRGBColorSpace ); - break; - case 'specular': - if ( parameter.color && material.specular ) material.specular.fromArray( parameter.color ); - if ( parameter.texture ) material.specularMap = getTexture( parameter.texture ); - break; - case 'bump': - if ( parameter.texture ) material.normalMap = getTexture( parameter.texture ); - break; - case 'ambient': - if ( parameter.texture ) material.lightMap = getTexture( parameter.texture, SRGBColorSpace ); - break; - case 'shininess': - if ( parameter.float && material.shininess ) material.shininess = parameter.float; - break; - case 'emission': - if ( parameter.color && material.emissive ) material.emissive.fromArray( parameter.color ); - if ( parameter.texture ) material.emissiveMap = getTexture( parameter.texture, SRGBColorSpace ); - break; - - } - - } - - ColorManagement.colorSpaceToWorking( material.color, SRGBColorSpace ); - if ( material.specular ) ColorManagement.colorSpaceToWorking( material.specular, SRGBColorSpace ); - if ( material.emissive ) ColorManagement.colorSpaceToWorking( material.emissive, SRGBColorSpace ); - - // - - let transparent = parameters[ 'transparent' ]; - let transparency = parameters[ 'transparency' ]; - - // does not exist but - - if ( transparency === undefined && transparent ) { - - transparency = { - float: 1 - }; - - } - - // does not exist but - - if ( transparent === undefined && transparency ) { - - transparent = { - opaque: 'A_ONE', - data: { - color: [ 1, 1, 1, 1 ] - } }; - - } - - if ( transparent && transparency ) { - - // handle case if a texture exists but no color - - if ( transparent.data.texture ) { - - // we do not set an alpha map (see #13792) - - material.transparent = true; - - } else { - - const color = transparent.data.color; - - switch ( transparent.opaque ) { - - case 'A_ONE': - material.opacity = color[ 3 ] * transparency.float; - break; - case 'RGB_ZERO': - material.opacity = 1 - ( color[ 0 ] * transparency.float ); - break; - case 'A_ZERO': - material.opacity = 1 - ( color[ 3 ] * transparency.float ); - break; - case 'RGB_ONE': - material.opacity = color[ 0 ] * transparency.float; - break; - default: - console.warn( 'THREE.ColladaLoader: Invalid opaque type "%s" of transparent tag.', transparent.opaque ); - - } - - if ( material.opacity < 1 ) material.transparent = true; - - } - - } - - // - - - if ( technique.extra !== undefined && technique.extra.technique !== undefined ) { - - const techniques = technique.extra.technique; - - for ( const k in techniques ) { - - const v = techniques[ k ]; - - switch ( k ) { - - case 'double_sided': - material.side = ( v === 1 ? DoubleSide : FrontSide ); - break; - - case 'bump': - material.normalMap = getTexture( v.texture ); - material.normalScale = new Vector2( 1, 1 ); - break; - - } - - } - - } - - return material; - - } - - function getMaterial( id ) { - - return getBuild( library.materials[ id ], buildMaterial ); - - } - - // camera - - function parseCamera( xml ) { - - const data = { - name: xml.getAttribute( 'name' ) - }; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'optics': - data.optics = parseCameraOptics( child ); - break; - - } - - } - - library.cameras[ xml.getAttribute( 'id' ) ] = data; - - } - - function parseCameraOptics( xml ) { - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - switch ( child.nodeName ) { - - case 'technique_common': - return parseCameraTechnique( child ); - - } - - } - - return {}; - - } - - function parseCameraTechnique( xml ) { - - const data = {}; - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - switch ( child.nodeName ) { - - case 'perspective': - case 'orthographic': - - data.technique = child.nodeName; - data.parameters = parseCameraParameters( child ); - - break; - - } - - } - - return data; - - } - - function parseCameraParameters( xml ) { - - const data = {}; - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - switch ( child.nodeName ) { - - case 'xfov': - case 'yfov': - case 'xmag': - case 'ymag': - case 'znear': - case 'zfar': - case 'aspect_ratio': - data[ child.nodeName ] = parseFloat( child.textContent ); - break; - - } - - } - - return data; - - } - - function buildCamera( data ) { - - let camera; - - switch ( data.optics.technique ) { - - case 'perspective': - camera = new PerspectiveCamera( - data.optics.parameters.yfov, - data.optics.parameters.aspect_ratio, - data.optics.parameters.znear, - data.optics.parameters.zfar - ); - break; - - case 'orthographic': - let ymag = data.optics.parameters.ymag; - let xmag = data.optics.parameters.xmag; - const aspectRatio = data.optics.parameters.aspect_ratio; - - xmag = ( xmag === undefined ) ? ( ymag * aspectRatio ) : xmag; - ymag = ( ymag === undefined ) ? ( xmag / aspectRatio ) : ymag; - - xmag *= 0.5; - ymag *= 0.5; - - camera = new OrthographicCamera( - - xmag, xmag, ymag, - ymag, // left, right, top, bottom - data.optics.parameters.znear, - data.optics.parameters.zfar - ); - break; - - default: - camera = new PerspectiveCamera(); - break; - - } - - camera.name = data.name || ''; - - return camera; - - } - - function getCamera( id ) { - - const data = library.cameras[ id ]; - - if ( data !== undefined ) { - - return getBuild( data, buildCamera ); - - } - - console.warn( 'THREE.ColladaLoader: Couldn\'t find camera with ID:', id ); - - return null; - - } - - // light - - function parseLight( xml ) { - - let data = {}; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'technique_common': - data = parseLightTechnique( child ); - break; - - } - - } - - library.lights[ xml.getAttribute( 'id' ) ] = data; - - } - - function parseLightTechnique( xml ) { - - const data = {}; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'directional': - case 'point': - case 'spot': - case 'ambient': - - data.technique = child.nodeName; - data.parameters = parseLightParameters( child ); - - } - - } - - return data; - - } - - function parseLightParameters( xml ) { - - const data = {}; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'color': - const array = parseFloats( child.textContent ); - data.color = new Color().fromArray( array ); - ColorManagement.colorSpaceToWorking( data.color, SRGBColorSpace ); - break; - - case 'falloff_angle': - data.falloffAngle = parseFloat( child.textContent ); - break; - - case 'quadratic_attenuation': - const f = parseFloat( child.textContent ); - data.distance = f ? Math.sqrt( 1 / f ) : 0; - break; - - } - - } - - return data; - - } - - function buildLight( data ) { - - let light; - - switch ( data.technique ) { - - case 'directional': - light = new DirectionalLight(); - break; - - case 'point': - light = new PointLight(); - break; - - case 'spot': - light = new SpotLight(); - break; - - case 'ambient': - light = new AmbientLight(); - break; - - } - - if ( data.parameters.color ) light.color.copy( data.parameters.color ); - if ( data.parameters.distance ) light.distance = data.parameters.distance; - - return light; - - } - - function getLight( id ) { - - const data = library.lights[ id ]; - - if ( data !== undefined ) { - - return getBuild( data, buildLight ); - - } - - console.warn( 'THREE.ColladaLoader: Couldn\'t find light with ID:', id ); - - return null; - - } - - // geometry - - function parseGeometry( xml ) { - - const data = { - name: xml.getAttribute( 'name' ), - sources: {}, - vertices: {}, - primitives: [] - }; - - const mesh = getElementsByTagName( xml, 'mesh' )[ 0 ]; - - // the following tags inside geometry are not supported yet (see https://github.com/mrdoob/three.js/pull/12606): convex_mesh, spline, brep - if ( mesh === undefined ) return; - - for ( let i = 0; i < mesh.childNodes.length; i ++ ) { - - const child = mesh.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - const id = child.getAttribute( 'id' ); - - switch ( child.nodeName ) { - - case 'source': - data.sources[ id ] = parseSource( child ); - break; - - case 'vertices': - // data.sources[ id ] = data.sources[ parseId( getElementsByTagName( child, 'input' )[ 0 ].getAttribute( 'source' ) ) ]; - data.vertices = parseGeometryVertices( child ); - break; - - case 'polygons': - console.warn( 'THREE.ColladaLoader: Unsupported primitive type: ', child.nodeName ); - break; - - case 'lines': - case 'linestrips': - case 'polylist': - case 'triangles': - data.primitives.push( parseGeometryPrimitive( child ) ); - break; - - default: - console.log( child ); - - } - - } - - library.geometries[ xml.getAttribute( 'id' ) ] = data; - - } - - function parseSource( xml ) { - - const data = { - array: [], - stride: 3 - }; - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'float_array': - data.array = parseFloats( child.textContent ); - break; - - case 'Name_array': - data.array = parseStrings( child.textContent ); - break; - - case 'technique_common': - const accessor = getElementsByTagName( child, 'accessor' )[ 0 ]; - - if ( accessor !== undefined ) { - - data.stride = parseInt( accessor.getAttribute( 'stride' ) ); - - } - - break; - - } - - } - - return data; - - } - - function parseGeometryVertices( xml ) { - - const data = {}; - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - data[ child.getAttribute( 'semantic' ) ] = parseId( child.getAttribute( 'source' ) ); - - } - - return data; - - } - - function parseGeometryPrimitive( xml ) { - - const primitive = { - type: xml.nodeName, - material: xml.getAttribute( 'material' ), - count: parseInt( xml.getAttribute( 'count' ) ), - inputs: {}, - stride: 0, - hasUV: false - }; - - for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'input': - const id = parseId( child.getAttribute( 'source' ) ); - const semantic = child.getAttribute( 'semantic' ); - const offset = parseInt( child.getAttribute( 'offset' ) ); - const set = parseInt( child.getAttribute( 'set' ) ); - const inputname = ( set > 0 ? semantic + set : semantic ); - primitive.inputs[ inputname ] = { id: id, offset: offset }; - primitive.stride = Math.max( primitive.stride, offset + 1 ); - if ( semantic === 'TEXCOORD' ) primitive.hasUV = true; - break; - - case 'vcount': - primitive.vcount = parseInts( child.textContent ); - break; - - case 'p': - primitive.p = parseInts( child.textContent ); - break; - - } - - } - - return primitive; - - } - - function groupPrimitives( primitives ) { - - const build = {}; - - for ( let i = 0; i < primitives.length; i ++ ) { - - const primitive = primitives[ i ]; - - if ( build[ primitive.type ] === undefined ) build[ primitive.type ] = []; - - build[ primitive.type ].push( primitive ); - - } - - return build; - - } - - function checkUVCoordinates( primitives ) { - - let count = 0; - - for ( let i = 0, l = primitives.length; i < l; i ++ ) { - - const primitive = primitives[ i ]; - - if ( primitive.hasUV === true ) { - - count ++; - - } - - } - - if ( count > 0 && count < primitives.length ) { - - primitives.uvsNeedsFix = true; - - } - - } - - function buildGeometry( data ) { - - const build = {}; - - const sources = data.sources; - const vertices = data.vertices; - const primitives = data.primitives; - - if ( primitives.length === 0 ) return {}; - - // our goal is to create one buffer geometry for a single type of primitives - // first, we group all primitives by their type - - const groupedPrimitives = groupPrimitives( primitives ); - - for ( const type in groupedPrimitives ) { - - const primitiveType = groupedPrimitives[ type ]; - - // second, ensure consistent uv coordinates for each type of primitives (polylist,triangles or lines) - - checkUVCoordinates( primitiveType ); - - // third, create a buffer geometry for each type of primitives - - build[ type ] = buildGeometryType( primitiveType, sources, vertices ); - - } - - return build; - - } - - function buildGeometryType( primitives, sources, vertices ) { - - const build = {}; - - const position = { array: [], stride: 0 }; - const normal = { array: [], stride: 0 }; - const uv = { array: [], stride: 0 }; - const uv1 = { array: [], stride: 0 }; - const color = { array: [], stride: 0 }; - - const skinIndex = { array: [], stride: 4 }; - const skinWeight = { array: [], stride: 4 }; - - const geometry = new BufferGeometry(); - - const materialKeys = []; - - let start = 0; - - for ( let p = 0; p < primitives.length; p ++ ) { - - const primitive = primitives[ p ]; - const inputs = primitive.inputs; - - // groups - - let count = 0; - - switch ( primitive.type ) { - - case 'lines': - case 'linestrips': - count = primitive.count * 2; - break; - - case 'triangles': - count = primitive.count * 3; - break; - - case 'polylist': - - for ( let g = 0; g < primitive.count; g ++ ) { - - const vc = primitive.vcount[ g ]; - - switch ( vc ) { - - case 3: - count += 3; // single triangle - break; - - case 4: - count += 6; // quad, subdivided into two triangles - break; - - default: - count += ( vc - 2 ) * 3; // polylist with more than four vertices - break; - - } - - } - - break; - - default: - console.warn( 'THREE.ColladaLoader: Unknown primitive type:', primitive.type ); - - } - - geometry.addGroup( start, count, p ); - start += count; - - // material - - if ( primitive.material ) { - - materialKeys.push( primitive.material ); - - } - - // geometry data - - for ( const name in inputs ) { - - const input = inputs[ name ]; - - switch ( name ) { - - case 'VERTEX': - for ( const key in vertices ) { - - const id = vertices[ key ]; - - switch ( key ) { - - case 'POSITION': - const prevLength = position.array.length; - buildGeometryData( primitive, sources[ id ], input.offset, position.array ); - position.stride = sources[ id ].stride; - - if ( sources.skinWeights && sources.skinIndices ) { - - buildGeometryData( primitive, sources.skinIndices, input.offset, skinIndex.array ); - buildGeometryData( primitive, sources.skinWeights, input.offset, skinWeight.array ); - - } - - // see #3803 - - if ( primitive.hasUV === false && primitives.uvsNeedsFix === true ) { - - const count = ( position.array.length - prevLength ) / position.stride; - - for ( let i = 0; i < count; i ++ ) { - - // fill missing uv coordinates - - uv.array.push( 0, 0 ); - - } - - } - - break; - - case 'NORMAL': - buildGeometryData( primitive, sources[ id ], input.offset, normal.array ); - normal.stride = sources[ id ].stride; - break; - - case 'COLOR': - buildGeometryData( primitive, sources[ id ], input.offset, color.array ); - color.stride = sources[ id ].stride; - break; - - case 'TEXCOORD': - buildGeometryData( primitive, sources[ id ], input.offset, uv.array ); - uv.stride = sources[ id ].stride; - break; - - case 'TEXCOORD1': - buildGeometryData( primitive, sources[ id ], input.offset, uv1.array ); - uv.stride = sources[ id ].stride; - break; - - default: - console.warn( 'THREE.ColladaLoader: Semantic "%s" not handled in geometry build process.', key ); - - } - - } - - break; - - case 'NORMAL': - buildGeometryData( primitive, sources[ input.id ], input.offset, normal.array ); - normal.stride = sources[ input.id ].stride; - break; - - case 'COLOR': - buildGeometryData( primitive, sources[ input.id ], input.offset, color.array, true ); - color.stride = sources[ input.id ].stride; - break; - - case 'TEXCOORD': - buildGeometryData( primitive, sources[ input.id ], input.offset, uv.array ); - uv.stride = sources[ input.id ].stride; - break; - - case 'TEXCOORD1': - buildGeometryData( primitive, sources[ input.id ], input.offset, uv1.array ); - uv1.stride = sources[ input.id ].stride; - break; - - } - - } - - } - - // build geometry - - if ( position.array.length > 0 ) geometry.setAttribute( 'position', new Float32BufferAttribute( position.array, position.stride ) ); - if ( normal.array.length > 0 ) geometry.setAttribute( 'normal', new Float32BufferAttribute( normal.array, normal.stride ) ); - if ( color.array.length > 0 ) geometry.setAttribute( 'color', new Float32BufferAttribute( color.array, color.stride ) ); - if ( uv.array.length > 0 ) geometry.setAttribute( 'uv', new Float32BufferAttribute( uv.array, uv.stride ) ); - if ( uv1.array.length > 0 ) geometry.setAttribute( 'uv1', new Float32BufferAttribute( uv1.array, uv1.stride ) ); - - if ( skinIndex.array.length > 0 ) geometry.setAttribute( 'skinIndex', new Float32BufferAttribute( skinIndex.array, skinIndex.stride ) ); - if ( skinWeight.array.length > 0 ) geometry.setAttribute( 'skinWeight', new Float32BufferAttribute( skinWeight.array, skinWeight.stride ) ); - - build.data = geometry; - build.type = primitives[ 0 ].type; - build.materialKeys = materialKeys; - - return build; - - } - - function buildGeometryData( primitive, source, offset, array, isColor = false ) { - - const indices = primitive.p; - const stride = primitive.stride; - const vcount = primitive.vcount; - - function pushVector( i ) { - - let index = indices[ i + offset ] * sourceStride; - const length = index + sourceStride; - - for ( ; index < length; index ++ ) { - - array.push( sourceArray[ index ] ); - - } - - if ( isColor ) { - - // convert the vertex colors from srgb to linear if present - const startIndex = array.length - sourceStride - 1; - tempColor.setRGB( - array[ startIndex + 0 ], - array[ startIndex + 1 ], - array[ startIndex + 2 ], - SRGBColorSpace - ); - - array[ startIndex + 0 ] = tempColor.r; - array[ startIndex + 1 ] = tempColor.g; - array[ startIndex + 2 ] = tempColor.b; - - } - - } - - const sourceArray = source.array; - const sourceStride = source.stride; - - if ( primitive.vcount !== undefined ) { - - let index = 0; - - for ( let i = 0, l = vcount.length; i < l; i ++ ) { - - const count = vcount[ i ]; - - if ( count === 4 ) { - - const a = index + stride * 0; - const b = index + stride * 1; - const c = index + stride * 2; - const d = index + stride * 3; - - pushVector( a ); pushVector( b ); pushVector( d ); - pushVector( b ); pushVector( c ); pushVector( d ); - - } else if ( count === 3 ) { - - const a = index + stride * 0; - const b = index + stride * 1; - const c = index + stride * 2; - - pushVector( a ); pushVector( b ); pushVector( c ); - - } else if ( count > 4 ) { - - for ( let k = 1, kl = ( count - 2 ); k <= kl; k ++ ) { - - const a = index + stride * 0; - const b = index + stride * k; - const c = index + stride * ( k + 1 ); - - pushVector( a ); pushVector( b ); pushVector( c ); - - } - - } - - index += stride * count; - - } - - } else { - - for ( let i = 0, l = indices.length; i < l; i += stride ) { - - pushVector( i ); - - } - - } - - } - - function getGeometry( id ) { - - return getBuild( library.geometries[ id ], buildGeometry ); - - } - - // kinematics - - function parseKinematicsModel( xml ) { - - const data = { - name: xml.getAttribute( 'name' ) || '', - joints: {}, - links: [] - }; - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'technique_common': - parseKinematicsTechniqueCommon( child, data ); - break; - - } - - } - - library.kinematicsModels[ xml.getAttribute( 'id' ) ] = data; - - } - - function buildKinematicsModel( data ) { - - if ( data.build !== undefined ) return data.build; - - return data; - - } - - function getKinematicsModel( id ) { - - return getBuild( library.kinematicsModels[ id ], buildKinematicsModel ); - - } - - function parseKinematicsTechniqueCommon( xml, data ) { - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'joint': - data.joints[ child.getAttribute( 'sid' ) ] = parseKinematicsJoint( child ); - break; - - case 'link': - data.links.push( parseKinematicsLink( child ) ); - break; - - } - - } - - } - - function parseKinematicsJoint( xml ) { - - let data; - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'prismatic': - case 'revolute': - data = parseKinematicsJointParameter( child ); - break; - - } - - } - - return data; - - } - - function parseKinematicsJointParameter( xml ) { - - const data = { - sid: xml.getAttribute( 'sid' ), - name: xml.getAttribute( 'name' ) || '', - axis: new Vector3(), - limits: { - min: 0, - max: 0 - }, - type: xml.nodeName, - static: false, - zeroPosition: 0, - middlePosition: 0 - }; - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'axis': - const array = parseFloats( child.textContent ); - data.axis.fromArray( array ); - break; - case 'limits': - const max = child.getElementsByTagName( 'max' )[ 0 ]; - const min = child.getElementsByTagName( 'min' )[ 0 ]; - - data.limits.max = parseFloat( max.textContent ); - data.limits.min = parseFloat( min.textContent ); - break; - - } - - } - - // if min is equal to or greater than max, consider the joint static - - if ( data.limits.min >= data.limits.max ) { - - data.static = true; - - } - - // calculate middle position - - data.middlePosition = ( data.limits.min + data.limits.max ) / 2.0; - - return data; - - } - - function parseKinematicsLink( xml ) { - - const data = { - sid: xml.getAttribute( 'sid' ), - name: xml.getAttribute( 'name' ) || '', - attachments: [], - transforms: [] - }; - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'attachment_full': - data.attachments.push( parseKinematicsAttachment( child ) ); - break; - - case 'matrix': - case 'translate': - case 'rotate': - data.transforms.push( parseKinematicsTransform( child ) ); - break; - - } - - } - - return data; - - } - - function parseKinematicsAttachment( xml ) { - - const data = { - joint: xml.getAttribute( 'joint' ).split( '/' ).pop(), - transforms: [], - links: [] - }; - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'link': - data.links.push( parseKinematicsLink( child ) ); - break; - - case 'matrix': - case 'translate': - case 'rotate': - data.transforms.push( parseKinematicsTransform( child ) ); - break; - - } - - } - - return data; - - } - - function parseKinematicsTransform( xml ) { - - const data = { - type: xml.nodeName - }; - - const array = parseFloats( xml.textContent ); - - switch ( data.type ) { - - case 'matrix': - data.obj = new Matrix4(); - data.obj.fromArray( array ).transpose(); - break; - - case 'translate': - data.obj = new Vector3(); - data.obj.fromArray( array ); - break; - - case 'rotate': - data.obj = new Vector3(); - data.obj.fromArray( array ); - data.angle = MathUtils.degToRad( array[ 3 ] ); - break; - - } - - return data; - - } - - // physics - - function parsePhysicsModel( xml ) { - - const data = { - name: xml.getAttribute( 'name' ) || '', - rigidBodies: {} - }; - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'rigid_body': - data.rigidBodies[ child.getAttribute( 'name' ) ] = {}; - parsePhysicsRigidBody( child, data.rigidBodies[ child.getAttribute( 'name' ) ] ); - break; - - } - - } - - library.physicsModels[ xml.getAttribute( 'id' ) ] = data; - - } - - function parsePhysicsRigidBody( xml, data ) { - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'technique_common': - parsePhysicsTechniqueCommon( child, data ); - break; - - } - - } - - } - - function parsePhysicsTechniqueCommon( xml, data ) { - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'inertia': - data.inertia = parseFloats( child.textContent ); - break; - - case 'mass': - data.mass = parseFloats( child.textContent )[ 0 ]; - break; - - } - - } - - } - - // scene - - function parseKinematicsScene( xml ) { - - const data = { - bindJointAxis: [] - }; - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'bind_joint_axis': - data.bindJointAxis.push( parseKinematicsBindJointAxis( child ) ); - break; - - } - - } - - library.kinematicsScenes[ parseId( xml.getAttribute( 'url' ) ) ] = data; - - } - - function parseKinematicsBindJointAxis( xml ) { - - const data = { - target: xml.getAttribute( 'target' ).split( '/' ).pop() - }; - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - switch ( child.nodeName ) { - - case 'axis': - const param = child.getElementsByTagName( 'param' )[ 0 ]; - data.axis = param.textContent; - const tmpJointIndex = data.axis.split( 'inst_' ).pop().split( 'axis' )[ 0 ]; - data.jointIndex = tmpJointIndex.substring( 0, tmpJointIndex.length - 1 ); - break; - - } - - } - - return data; - - } - - function buildKinematicsScene( data ) { - - if ( data.build !== undefined ) return data.build; - - return data; - - } - - function getKinematicsScene( id ) { - - return getBuild( library.kinematicsScenes[ id ], buildKinematicsScene ); - - } - - function setupKinematics() { - - const kinematicsModelId = Object.keys( library.kinematicsModels )[ 0 ]; - const kinematicsSceneId = Object.keys( library.kinematicsScenes )[ 0 ]; - const visualSceneId = Object.keys( library.visualScenes )[ 0 ]; - - if ( kinematicsModelId === undefined || kinematicsSceneId === undefined ) return; - - const kinematicsModel = getKinematicsModel( kinematicsModelId ); - const kinematicsScene = getKinematicsScene( kinematicsSceneId ); - const visualScene = getVisualScene( visualSceneId ); - - const bindJointAxis = kinematicsScene.bindJointAxis; - const jointMap = {}; - - for ( let i = 0, l = bindJointAxis.length; i < l; i ++ ) { - - const axis = bindJointAxis[ i ]; - - // the result of the following query is an element of type 'translate', 'rotate','scale' or 'matrix' - - const targetElement = collada.querySelector( '[sid="' + axis.target + '"]' ); - - if ( targetElement ) { - - // get the parent of the transform element - - const parentVisualElement = targetElement.parentElement; - - // connect the joint of the kinematics model with the element in the visual scene - - connect( axis.jointIndex, parentVisualElement ); - - } - - } - - function connect( jointIndex, visualElement ) { - - const visualElementName = visualElement.getAttribute( 'name' ); - const joint = kinematicsModel.joints[ jointIndex ]; - - visualScene.traverse( function ( object ) { - - if ( object.name === visualElementName ) { - - jointMap[ jointIndex ] = { - object: object, - transforms: buildTransformList( visualElement ), - joint: joint, - position: joint.zeroPosition - }; - - } - - } ); - - } - - const m0 = new Matrix4(); - - kinematics = { - - joints: kinematicsModel && kinematicsModel.joints, - - getJointValue: function ( jointIndex ) { - - const jointData = jointMap[ jointIndex ]; - - if ( jointData ) { - - return jointData.position; - - } else { - - console.warn( 'THREE.ColladaLoader: Joint ' + jointIndex + ' doesn\'t exist.' ); - - } - - }, - - setJointValue: function ( jointIndex, value ) { - - const jointData = jointMap[ jointIndex ]; - - if ( jointData ) { - - const joint = jointData.joint; - - if ( value > joint.limits.max || value < joint.limits.min ) { - - console.warn( 'THREE.ColladaLoader: Joint ' + jointIndex + ' value ' + value + ' outside of limits (min: ' + joint.limits.min + ', max: ' + joint.limits.max + ').' ); - - } else if ( joint.static ) { - - console.warn( 'THREE.ColladaLoader: Joint ' + jointIndex + ' is static.' ); - - } else { - - const object = jointData.object; - const axis = joint.axis; - const transforms = jointData.transforms; - - matrix.identity(); - - // each update, we have to apply all transforms in the correct order - - for ( let i = 0; i < transforms.length; i ++ ) { - - const transform = transforms[ i ]; - - // if there is a connection of the transform node with a joint, apply the joint value - - if ( transform.sid && transform.sid.indexOf( jointIndex ) !== - 1 ) { - - switch ( joint.type ) { - - case 'revolute': - matrix.multiply( m0.makeRotationAxis( axis, MathUtils.degToRad( value ) ) ); - break; - - case 'prismatic': - matrix.multiply( m0.makeTranslation( axis.x * value, axis.y * value, axis.z * value ) ); - break; - - default: - console.warn( 'THREE.ColladaLoader: Unknown joint type: ' + joint.type ); - break; - - } - - } else { - - switch ( transform.type ) { - - case 'matrix': - matrix.multiply( transform.obj ); - break; - - case 'translate': - matrix.multiply( m0.makeTranslation( transform.obj.x, transform.obj.y, transform.obj.z ) ); - break; - - case 'scale': - matrix.scale( transform.obj ); - break; - - case 'rotate': - matrix.multiply( m0.makeRotationAxis( transform.obj, transform.angle ) ); - break; - - } - - } - - } - - object.matrix.copy( matrix ); - object.matrix.decompose( object.position, object.quaternion, object.scale ); - - jointMap[ jointIndex ].position = value; - - } - - } else { - - console.log( 'THREE.ColladaLoader: ' + jointIndex + ' does not exist.' ); - - } - - } - - }; - - } - - function buildTransformList( node ) { - - const transforms = []; - - const xml = collada.querySelector( '[id="' + node.id + '"]' ); - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - let array, vector; - - switch ( child.nodeName ) { - - case 'matrix': - array = parseFloats( child.textContent ); - const matrix = new Matrix4().fromArray( array ).transpose(); - transforms.push( { - sid: child.getAttribute( 'sid' ), - type: child.nodeName, - obj: matrix - } ); - break; - - case 'translate': - case 'scale': - array = parseFloats( child.textContent ); - vector = new Vector3().fromArray( array ); - transforms.push( { - sid: child.getAttribute( 'sid' ), - type: child.nodeName, - obj: vector - } ); - break; - - case 'rotate': - array = parseFloats( child.textContent ); - vector = new Vector3().fromArray( array ); - const angle = MathUtils.degToRad( array[ 3 ] ); - transforms.push( { - sid: child.getAttribute( 'sid' ), - type: child.nodeName, - obj: vector, - angle: angle - } ); - break; - - } - - } - - return transforms; - - } - - // nodes - - function prepareNodes( xml ) { - - const elements = xml.getElementsByTagName( 'node' ); - - // ensure all node elements have id attributes - - for ( let i = 0; i < elements.length; i ++ ) { - - const element = elements[ i ]; - - if ( element.hasAttribute( 'id' ) === false ) { - - element.setAttribute( 'id', generateId() ); - - } - - } - - } - - const matrix = new Matrix4(); - const vector = new Vector3(); - - function parseNode( xml ) { - - const data = { - name: xml.getAttribute( 'name' ) || '', - type: xml.getAttribute( 'type' ), - id: xml.getAttribute( 'id' ), - sid: xml.getAttribute( 'sid' ), - matrix: new Matrix4(), - nodes: [], - instanceCameras: [], - instanceControllers: [], - instanceLights: [], - instanceGeometries: [], - instanceNodes: [], - transforms: {} - }; - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - if ( child.nodeType !== 1 ) continue; - - let array; - - switch ( child.nodeName ) { - - case 'node': - data.nodes.push( child.getAttribute( 'id' ) ); - parseNode( child ); - break; - - case 'instance_camera': - data.instanceCameras.push( parseId( child.getAttribute( 'url' ) ) ); - break; - - case 'instance_controller': - data.instanceControllers.push( parseNodeInstance( child ) ); - break; - - case 'instance_light': - data.instanceLights.push( parseId( child.getAttribute( 'url' ) ) ); - break; - - case 'instance_geometry': - data.instanceGeometries.push( parseNodeInstance( child ) ); - break; - - case 'instance_node': - data.instanceNodes.push( parseId( child.getAttribute( 'url' ) ) ); - break; - - case 'matrix': - array = parseFloats( child.textContent ); - data.matrix.multiply( matrix.fromArray( array ).transpose() ); - data.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName; - break; - - case 'translate': - array = parseFloats( child.textContent ); - vector.fromArray( array ); - data.matrix.multiply( matrix.makeTranslation( vector.x, vector.y, vector.z ) ); - data.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName; - break; - - case 'rotate': - array = parseFloats( child.textContent ); - const angle = MathUtils.degToRad( array[ 3 ] ); - data.matrix.multiply( matrix.makeRotationAxis( vector.fromArray( array ), angle ) ); - data.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName; - break; - - case 'scale': - array = parseFloats( child.textContent ); - data.matrix.scale( vector.fromArray( array ) ); - data.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName; - break; - - case 'extra': - break; - - default: - console.log( child ); - - } - - } - - if ( hasNode( data.id ) ) { - - console.warn( 'THREE.ColladaLoader: There is already a node with ID %s. Exclude current node from further processing.', data.id ); - - } else { - - library.nodes[ data.id ] = data; - - } - - return data; - - } - - function parseNodeInstance( xml ) { - - const data = { - id: parseId( xml.getAttribute( 'url' ) ), - materials: {}, - skeletons: [] - }; - - for ( let i = 0; i < xml.childNodes.length; i ++ ) { - - const child = xml.childNodes[ i ]; - - switch ( child.nodeName ) { - - case 'bind_material': - const instances = child.getElementsByTagName( 'instance_material' ); - - for ( let j = 0; j < instances.length; j ++ ) { - - const instance = instances[ j ]; - const symbol = instance.getAttribute( 'symbol' ); - const target = instance.getAttribute( 'target' ); - - data.materials[ symbol ] = parseId( target ); - - } - - break; - - case 'skeleton': - data.skeletons.push( parseId( child.textContent ) ); - break; - - default: - break; - - } - - } - - return data; - - } - - function buildSkeleton( skeletons, joints ) { - - const boneData = []; - const sortedBoneData = []; - - let i, j, data; - - // a skeleton can have multiple root bones. collada expresses this - // situation with multiple "skeleton" tags per controller instance - - for ( i = 0; i < skeletons.length; i ++ ) { - - const skeleton = skeletons[ i ]; - - let root; - - if ( hasNode( skeleton ) ) { - - root = getNode( skeleton ); - buildBoneHierarchy( root, joints, boneData ); - - } else if ( hasVisualScene( skeleton ) ) { - - // handle case where the skeleton refers to the visual scene (#13335) - - const visualScene = library.visualScenes[ skeleton ]; - const children = visualScene.children; - - for ( let j = 0; j < children.length; j ++ ) { - - const child = children[ j ]; - - if ( child.type === 'JOINT' ) { - - const root = getNode( child.id ); - buildBoneHierarchy( root, joints, boneData ); - - } - - } - - } else { - - console.error( 'THREE.ColladaLoader: Unable to find root bone of skeleton with ID:', skeleton ); - - } - - } - - // sort bone data (the order is defined in the corresponding controller) - - for ( i = 0; i < joints.length; i ++ ) { - - for ( j = 0; j < boneData.length; j ++ ) { - - data = boneData[ j ]; - - if ( data.bone.name === joints[ i ].name ) { - - sortedBoneData[ i ] = data; - data.processed = true; - break; - - } - - } - - } - - // add unprocessed bone data at the end of the list - - for ( i = 0; i < boneData.length; i ++ ) { - - data = boneData[ i ]; - - if ( data.processed === false ) { - - sortedBoneData.push( data ); - data.processed = true; - - } - - } - - // setup arrays for skeleton creation - - const bones = []; - const boneInverses = []; - - for ( i = 0; i < sortedBoneData.length; i ++ ) { - - data = sortedBoneData[ i ]; - - bones.push( data.bone ); - boneInverses.push( data.boneInverse ); - - } - - return new Skeleton( bones, boneInverses ); - - } - - function buildBoneHierarchy( root, joints, boneData ) { - - // setup bone data from visual scene - - root.traverse( function ( object ) { - - if ( object.isBone === true ) { - - let boneInverse; - - // retrieve the boneInverse from the controller data - - for ( let i = 0; i < joints.length; i ++ ) { - - const joint = joints[ i ]; - - if ( joint.name === object.name ) { - - boneInverse = joint.boneInverse; - break; - - } - - } - - if ( boneInverse === undefined ) { - - // Unfortunately, there can be joints in the visual scene that are not part of the - // corresponding controller. In this case, we have to create a dummy boneInverse matrix - // for the respective bone. This bone won't affect any vertices, because there are no skin indices - // and weights defined for it. But we still have to add the bone to the sorted bone list in order to - // ensure a correct animation of the model. - - boneInverse = new Matrix4(); - - } - - boneData.push( { bone: object, boneInverse: boneInverse, processed: false } ); - - } - - } ); - - } - - function buildNode( data ) { - - const objects = []; - - const matrix = data.matrix; - const nodes = data.nodes; - const type = data.type; - const instanceCameras = data.instanceCameras; - const instanceControllers = data.instanceControllers; - const instanceLights = data.instanceLights; - const instanceGeometries = data.instanceGeometries; - const instanceNodes = data.instanceNodes; - - // nodes - - for ( let i = 0, l = nodes.length; i < l; i ++ ) { - - objects.push( getNode( nodes[ i ] ) ); - - } - - // instance cameras - - for ( let i = 0, l = instanceCameras.length; i < l; i ++ ) { - - const instanceCamera = getCamera( instanceCameras[ i ] ); - - if ( instanceCamera !== null ) { - - objects.push( instanceCamera.clone() ); - - } - - } - - // instance controllers - - for ( let i = 0, l = instanceControllers.length; i < l; i ++ ) { - - const instance = instanceControllers[ i ]; - const controller = getController( instance.id ); - const geometries = getGeometry( controller.id ); - const newObjects = buildObjects( geometries, instance.materials ); - - const skeletons = instance.skeletons; - const joints = controller.skin.joints; - - const skeleton = buildSkeleton( skeletons, joints ); - - for ( let j = 0, jl = newObjects.length; j < jl; j ++ ) { - - const object = newObjects[ j ]; - - if ( object.isSkinnedMesh ) { - - object.bind( skeleton, controller.skin.bindMatrix ); - object.normalizeSkinWeights(); - - } - - objects.push( object ); - - } - - } - - // instance lights - - for ( let i = 0, l = instanceLights.length; i < l; i ++ ) { - - const instanceLight = getLight( instanceLights[ i ] ); - - if ( instanceLight !== null ) { - - objects.push( instanceLight.clone() ); - - } - - } - - // instance geometries - - for ( let i = 0, l = instanceGeometries.length; i < l; i ++ ) { - - const instance = instanceGeometries[ i ]; - - // a single geometry instance in collada can lead to multiple object3Ds. - // this is the case when primitives are combined like triangles and lines - - const geometries = getGeometry( instance.id ); - const newObjects = buildObjects( geometries, instance.materials ); - - for ( let j = 0, jl = newObjects.length; j < jl; j ++ ) { - - objects.push( newObjects[ j ] ); - - } - - } - - // instance nodes - - for ( let i = 0, l = instanceNodes.length; i < l; i ++ ) { - - objects.push( getNode( instanceNodes[ i ] ).clone() ); - - } - - let object; - - if ( nodes.length === 0 && objects.length === 1 ) { - - object = objects[ 0 ]; - - } else { - - object = ( type === 'JOINT' ) ? new Bone() : new Group(); - - for ( let i = 0; i < objects.length; i ++ ) { - - object.add( objects[ i ] ); - - } - - } - - object.name = ( type === 'JOINT' ) ? data.sid : data.name; - object.matrix.copy( matrix ); - object.matrix.decompose( object.position, object.quaternion, object.scale ); - - return object; - - } - - const fallbackMaterial = new MeshBasicMaterial( { - name: Loader.DEFAULT_MATERIAL_NAME, - color: 0xff00ff - } ); - - function resolveMaterialBinding( keys, instanceMaterials ) { - - const materials = []; - - for ( let i = 0, l = keys.length; i < l; i ++ ) { - - const id = instanceMaterials[ keys[ i ] ]; - - if ( id === undefined ) { - - console.warn( 'THREE.ColladaLoader: Material with key %s not found. Apply fallback material.', keys[ i ] ); - materials.push( fallbackMaterial ); - - } else { - - materials.push( getMaterial( id ) ); - - } - - } - - return materials; - - } - - function buildObjects( geometries, instanceMaterials ) { - - const objects = []; - - for ( const type in geometries ) { - - const geometry = geometries[ type ]; - - const materials = resolveMaterialBinding( geometry.materialKeys, instanceMaterials ); - - // handle case if no materials are defined - - if ( materials.length === 0 ) { - - if ( type === 'lines' || type === 'linestrips' ) { - - materials.push( new LineBasicMaterial() ); - - } else { - - materials.push( new MeshPhongMaterial() ); - - } - - } - - // Collada allows to use phong and lambert materials with lines. Replacing these cases with LineBasicMaterial. - - if ( type === 'lines' || type === 'linestrips' ) { - - for ( let i = 0, l = materials.length; i < l; i ++ ) { - - const material = materials[ i ]; - - if ( material.isMeshPhongMaterial === true || material.isMeshLambertMaterial === true ) { - - const lineMaterial = new LineBasicMaterial(); - - // copy compatible properties - - lineMaterial.color.copy( material.color ); - lineMaterial.opacity = material.opacity; - lineMaterial.transparent = material.transparent; - - // replace material - - materials[ i ] = lineMaterial; - - } - - } - - } - - // regard skinning - - const skinning = ( geometry.data.attributes.skinIndex !== undefined ); - - // choose between a single or multi materials (material array) - - const material = ( materials.length === 1 ) ? materials[ 0 ] : materials; - - // now create a specific 3D object - - let object; - - switch ( type ) { - - case 'lines': - object = new LineSegments( geometry.data, material ); - break; - - case 'linestrips': - object = new Line( geometry.data, material ); - break; - - case 'triangles': - case 'polylist': - if ( skinning ) { - - object = new SkinnedMesh( geometry.data, material ); - - } else { - - object = new Mesh( geometry.data, material ); - - } - - break; - - } - - objects.push( object ); - - } - - return objects; - - } - - function hasNode( id ) { - - return library.nodes[ id ] !== undefined; - - } - - function getNode( id ) { - - return getBuild( library.nodes[ id ], buildNode ); - - } - - // visual scenes - - function parseVisualScene( xml ) { - - const data = { - name: xml.getAttribute( 'name' ), - children: [] - }; - - prepareNodes( xml ); - - const elements = getElementsByTagName( xml, 'node' ); - - for ( let i = 0; i < elements.length; i ++ ) { - - data.children.push( parseNode( elements[ i ] ) ); - - } - - library.visualScenes[ xml.getAttribute( 'id' ) ] = data; - - } - - function buildVisualScene( data ) { - - const group = new Group(); - group.name = data.name; - - const children = data.children; - - for ( let i = 0; i < children.length; i ++ ) { - - const child = children[ i ]; - - group.add( getNode( child.id ) ); - - } - - return group; - - } - - function hasVisualScene( id ) { - - return library.visualScenes[ id ] !== undefined; - - } - - function getVisualScene( id ) { - - return getBuild( library.visualScenes[ id ], buildVisualScene ); - - } - - // scenes - - function parseScene( xml ) { - - const instance = getElementsByTagName( xml, 'instance_visual_scene' )[ 0 ]; - return getVisualScene( parseId( instance.getAttribute( 'url' ) ) ); - - } - - function setupAnimations() { - - const clips = library.clips; - - if ( isEmpty( clips ) === true ) { - - if ( isEmpty( library.animations ) === false ) { - - // if there are animations but no clips, we create a default clip for playback - - const tracks = []; - - for ( const id in library.animations ) { - - const animationTracks = getAnimation( id ); - - for ( let i = 0, l = animationTracks.length; i < l; i ++ ) { - - tracks.push( animationTracks[ i ] ); - - } - - } - - animations.push( new AnimationClip( 'default', - 1, tracks ) ); - - } - - } else { - - for ( const id in clips ) { - - animations.push( getAnimationClip( id ) ); - - } - - } - - } - - // convert the parser error element into text with each child elements text - // separated by new lines. - - function parserErrorToText( parserError ) { - - let result = ''; - const stack = [ parserError ]; - - while ( stack.length ) { - - const node = stack.shift(); - - if ( node.nodeType === Node.TEXT_NODE ) { - - result += node.textContent; - - } else { - - result += '\n'; - stack.push( ...node.childNodes ); - - } - - } - - return result.trim(); - - } - - if ( text.length === 0 ) { - - return { scene: new Scene() }; - - } - - const xml = new DOMParser().parseFromString( text, 'application/xml' ); - - const collada = getElementsByTagName( xml, 'COLLADA' )[ 0 ]; - - const parserError = xml.getElementsByTagName( 'parsererror' )[ 0 ]; - if ( parserError !== undefined ) { - - // Chrome will return parser error with a div in it - - const errorElement = getElementsByTagName( parserError, 'div' )[ 0 ]; - let errorText; - - if ( errorElement ) { - - errorText = errorElement.textContent; - - } else { - - errorText = parserErrorToText( parserError ); - - } - - console.error( 'THREE.ColladaLoader: Failed to parse collada file.\n', errorText ); - - return null; - - } - - // metadata - - const version = collada.getAttribute( 'version' ); - console.debug( 'THREE.ColladaLoader: File version', version ); - - const asset = parseAsset( getElementsByTagName( collada, 'asset' )[ 0 ] ); - const textureLoader = new TextureLoader( this.manager ); - textureLoader.setPath( this.resourcePath || path ).setCrossOrigin( this.crossOrigin ); - - let tgaLoader; - - if ( TGALoader ) { - - tgaLoader = new TGALoader( this.manager ); - tgaLoader.setPath( this.resourcePath || path ); - - } - - // - - const tempColor = new Color(); - const animations = []; - let kinematics = {}; - let count = 0; - - // - - const library = { - animations: {}, - clips: {}, - controllers: {}, - images: {}, - effects: {}, - materials: {}, - cameras: {}, - lights: {}, - geometries: {}, - nodes: {}, - visualScenes: {}, - kinematicsModels: {}, - physicsModels: {}, - kinematicsScenes: {} - }; - - parseLibrary( collada, 'library_animations', 'animation', parseAnimation ); - parseLibrary( collada, 'library_animation_clips', 'animation_clip', parseAnimationClip ); - parseLibrary( collada, 'library_controllers', 'controller', parseController ); - parseLibrary( collada, 'library_images', 'image', parseImage ); - parseLibrary( collada, 'library_effects', 'effect', parseEffect ); - parseLibrary( collada, 'library_materials', 'material', parseMaterial ); - parseLibrary( collada, 'library_cameras', 'camera', parseCamera ); - parseLibrary( collada, 'library_lights', 'light', parseLight ); - parseLibrary( collada, 'library_geometries', 'geometry', parseGeometry ); - parseLibrary( collada, 'library_nodes', 'node', parseNode ); - parseLibrary( collada, 'library_visual_scenes', 'visual_scene', parseVisualScene ); - parseLibrary( collada, 'library_kinematics_models', 'kinematics_model', parseKinematicsModel ); - parseLibrary( collada, 'library_physics_models', 'physics_model', parsePhysicsModel ); - parseLibrary( collada, 'scene', 'instance_kinematics_scene', parseKinematicsScene ); - - buildLibrary( library.animations, buildAnimation ); - buildLibrary( library.clips, buildAnimationClip ); - buildLibrary( library.controllers, buildController ); - buildLibrary( library.images, buildImage ); - buildLibrary( library.effects, buildEffect ); - buildLibrary( library.materials, buildMaterial ); - buildLibrary( library.cameras, buildCamera ); - buildLibrary( library.lights, buildLight ); - buildLibrary( library.geometries, buildGeometry ); - buildLibrary( library.visualScenes, buildVisualScene ); - - setupAnimations(); - setupKinematics(); + // Compose Three.js objects from library data + const composer = new ColladaComposer( library, collada, textureLoader, tgaLoader ); + const { scene, animations, kinematics } = composer.compose(); - const scene = parseScene( getElementsByTagName( collada, 'scene' )[ 0 ] ); scene.animations = animations; + // Handle coordinate system conversion if ( asset.upAxis === 'Z_UP' ) { console.warn( 'THREE.ColladaLoader: You are loading an asset with a Z-UP coordinate system. The loader just rotates the asset to transform it into Y-UP. The vertex data are not converted, see #24289.' ); @@ -4134,6 +131,7 @@ class ColladaLoader extends Loader { } + // Apply unit scale scene.scale.multiplyScalar( asset.unit ); return { diff --git a/examples/jsm/loaders/collada/ColladaComposer.js b/examples/jsm/loaders/collada/ColladaComposer.js new file mode 100644 index 00000000000000..d0f5c997a89760 --- /dev/null +++ b/examples/jsm/loaders/collada/ColladaComposer.js @@ -0,0 +1,2210 @@ +import { + AmbientLight, + AnimationClip, + Bone, + BufferGeometry, + ClampToEdgeWrapping, + Color, + ColorManagement, + DirectionalLight, + DoubleSide, + Float32BufferAttribute, + FrontSide, + Group, + Line, + LineBasicMaterial, + LineSegments, + Loader, + MathUtils, + Matrix4, + Mesh, + MeshBasicMaterial, + MeshLambertMaterial, + MeshPhongMaterial, + OrthographicCamera, + PerspectiveCamera, + PointLight, + Quaternion, + QuaternionKeyframeTrack, + RepeatWrapping, + Skeleton, + SkinnedMesh, + SpotLight, + Vector2, + Vector3, + VectorKeyframeTrack, + SRGBColorSpace +} from 'three'; + +import { getElementsByTagName, parseFloats } from './ColladaParser.js'; + +/** + * ColladaComposer converts parsed library data into Three.js objects. + */ +class ColladaComposer { + + constructor( library, collada, textureLoader, tgaLoader ) { + + this.library = library; + this.collada = collada; + this.textureLoader = textureLoader; + this.tgaLoader = tgaLoader; + + this.tempColor = new Color(); + this.animations = []; + this.kinematics = {}; + + // Reusable objects for animation + this.position = new Vector3(); + this.scale = new Vector3(); + this.quaternion = new Quaternion(); + this.matrix = new Matrix4(); + + } + + compose() { + + const library = this.library; + + this.buildLibrary( library.animations, this.buildAnimation.bind( this ) ); + this.buildLibrary( library.clips, this.buildAnimationClip.bind( this ) ); + this.buildLibrary( library.controllers, this.buildController.bind( this ) ); + this.buildLibrary( library.images, this.buildImage.bind( this ) ); + this.buildLibrary( library.effects, this.buildEffect.bind( this ) ); + this.buildLibrary( library.materials, this.buildMaterial.bind( this ) ); + this.buildLibrary( library.cameras, this.buildCamera.bind( this ) ); + this.buildLibrary( library.lights, this.buildLight.bind( this ) ); + this.buildLibrary( library.geometries, this.buildGeometry.bind( this ) ); + this.buildLibrary( library.visualScenes, this.buildVisualScene.bind( this ) ); + + this.setupAnimations(); + this.setupKinematics(); + + const scene = this.parseScene( getElementsByTagName( this.collada, 'scene' )[ 0 ] ); + scene.animations = this.animations; + + return { + scene: scene, + animations: this.animations, + kinematics: this.kinematics + }; + + } + + buildLibrary( data, builder ) { + + for ( const name in data ) { + + const object = data[ name ]; + object.build = builder( data[ name ] ); + + } + + } + + // get + + getBuild( data, builder ) { + + if ( data.build !== undefined ) return data.build; + + data.build = builder( data ); + + return data.build; + + } + + isEmpty( object ) { + + return Object.keys( object ).length === 0; + + } + + // animation + + buildAnimation( data ) { + + const tracks = []; + + const channels = data.channels; + const samplers = data.samplers; + const sources = data.sources; + + for ( const target in channels ) { + + if ( channels.hasOwnProperty( target ) ) { + + const channel = channels[ target ]; + const sampler = samplers[ channel.sampler ]; + + const inputId = sampler.inputs.INPUT; + const outputId = sampler.inputs.OUTPUT; + + const inputSource = sources[ inputId ]; + const outputSource = sources[ outputId ]; + + const animation = this.buildAnimationChannel( channel, inputSource, outputSource ); + + this.createKeyframeTracks( animation, tracks ); + + } + + } + + return tracks; + + } + + getAnimation( id ) { + + return this.getBuild( this.library.animations[ id ], this.buildAnimation.bind( this ) ); + + } + + buildAnimationChannel( channel, inputSource, outputSource ) { + + const node = this.library.nodes[ channel.id ]; + const object3D = this.getNode( node.id ); + + const transform = node.transforms[ channel.sid ]; + const defaultMatrix = node.matrix.clone().transpose(); + + let time, stride; + let i, il, j, jl; + + const data = {}; + + // the collada spec allows the animation of data in various ways. + // depending on the transform type (matrix, translate, rotate, scale), we execute different logic + + switch ( transform ) { + + case 'matrix': + + for ( i = 0, il = inputSource.array.length; i < il; i ++ ) { + + time = inputSource.array[ i ]; + stride = i * outputSource.stride; + + if ( data[ time ] === undefined ) data[ time ] = {}; + + if ( channel.arraySyntax === true ) { + + const value = outputSource.array[ stride ]; + const index = channel.indices[ 0 ] + 4 * channel.indices[ 1 ]; + + data[ time ][ index ] = value; + + } else { + + for ( j = 0, jl = outputSource.stride; j < jl; j ++ ) { + + data[ time ][ j ] = outputSource.array[ stride + j ]; + + } + + } + + } + + break; + + case 'translate': + console.warn( 'THREE.ColladaLoader: Animation transform type "%s" not yet implemented.', transform ); + break; + + case 'rotate': + console.warn( 'THREE.ColladaLoader: Animation transform type "%s" not yet implemented.', transform ); + break; + + case 'scale': + console.warn( 'THREE.ColladaLoader: Animation transform type "%s" not yet implemented.', transform ); + break; + + } + + const keyframes = this.prepareAnimationData( data, defaultMatrix ); + + const animation = { + name: object3D.uuid, + keyframes: keyframes + }; + + return animation; + + } + + prepareAnimationData( data, defaultMatrix ) { + + const keyframes = []; + + // transfer data into a sortable array + + for ( const time in data ) { + + keyframes.push( { time: parseFloat( time ), value: data[ time ] } ); + + } + + // ensure keyframes are sorted by time + + keyframes.sort( ascending ); + + // now we clean up all animation data, so we can use them for keyframe tracks + + for ( let i = 0; i < 16; i ++ ) { + + this.transformAnimationData( keyframes, i, defaultMatrix.elements[ i ] ); + + } + + return keyframes; + + // array sort function + + function ascending( a, b ) { + + return a.time - b.time; + + } + + } + + createKeyframeTracks( animation, tracks ) { + + const keyframes = animation.keyframes; + const name = animation.name; + + const times = []; + const positionData = []; + const quaternionData = []; + const scaleData = []; + + const position = this.position; + const quaternion = this.quaternion; + const scale = this.scale; + const matrix = this.matrix; + + for ( let i = 0, l = keyframes.length; i < l; i ++ ) { + + const keyframe = keyframes[ i ]; + + const time = keyframe.time; + const value = keyframe.value; + + matrix.fromArray( value ).transpose(); + matrix.decompose( position, quaternion, scale ); + + times.push( time ); + positionData.push( position.x, position.y, position.z ); + quaternionData.push( quaternion.x, quaternion.y, quaternion.z, quaternion.w ); + scaleData.push( scale.x, scale.y, scale.z ); + + } + + if ( positionData.length > 0 ) tracks.push( new VectorKeyframeTrack( name + '.position', times, positionData ) ); + if ( quaternionData.length > 0 ) tracks.push( new QuaternionKeyframeTrack( name + '.quaternion', times, quaternionData ) ); + if ( scaleData.length > 0 ) tracks.push( new VectorKeyframeTrack( name + '.scale', times, scaleData ) ); + + return tracks; + + } + + transformAnimationData( keyframes, property, defaultValue ) { + + let keyframe; + + let empty = true; + let i, l; + + // check, if values of a property are missing in our keyframes + + for ( i = 0, l = keyframes.length; i < l; i ++ ) { + + keyframe = keyframes[ i ]; + + if ( keyframe.value[ property ] === undefined ) { + + keyframe.value[ property ] = null; // mark as missing + + } else { + + empty = false; + + } + + } + + if ( empty === true ) { + + // no values at all, so we set a default value + + for ( i = 0, l = keyframes.length; i < l; i ++ ) { + + keyframe = keyframes[ i ]; + + keyframe.value[ property ] = defaultValue; + + } + + } else { + + // filling gaps + + this.createMissingKeyframes( keyframes, property ); + + } + + } + + createMissingKeyframes( keyframes, property ) { + + let prev, next; + + for ( let i = 0, l = keyframes.length; i < l; i ++ ) { + + const keyframe = keyframes[ i ]; + + if ( keyframe.value[ property ] === null ) { + + prev = this.getPrev( keyframes, i, property ); + next = this.getNext( keyframes, i, property ); + + if ( prev === null ) { + + keyframe.value[ property ] = next.value[ property ]; + continue; + + } + + if ( next === null ) { + + keyframe.value[ property ] = prev.value[ property ]; + continue; + + } + + this.interpolate( keyframe, prev, next, property ); + + } + + } + + } + + getPrev( keyframes, i, property ) { + + while ( i >= 0 ) { + + const keyframe = keyframes[ i ]; + + if ( keyframe.value[ property ] !== null ) return keyframe; + + i --; + + } + + return null; + + } + + getNext( keyframes, i, property ) { + + while ( i < keyframes.length ) { + + const keyframe = keyframes[ i ]; + + if ( keyframe.value[ property ] !== null ) return keyframe; + + i ++; + + } + + return null; + + } + + interpolate( key, prev, next, property ) { + + if ( ( next.time - prev.time ) === 0 ) { + + key.value[ property ] = prev.value[ property ]; + return; + + } + + key.value[ property ] = ( ( key.time - prev.time ) * ( next.value[ property ] - prev.value[ property ] ) / ( next.time - prev.time ) ) + prev.value[ property ]; + + } + + // animation clips + + buildAnimationClip( data ) { + + const tracks = []; + + const name = data.name; + const duration = ( data.end - data.start ) || - 1; + const animations = data.animations; + + for ( let i = 0, il = animations.length; i < il; i ++ ) { + + const animationTracks = this.getAnimation( animations[ i ] ); + + for ( let j = 0, jl = animationTracks.length; j < jl; j ++ ) { + + tracks.push( animationTracks[ j ] ); + + } + + } + + return new AnimationClip( name, duration, tracks ); + + } + + getAnimationClip( id ) { + + return this.getBuild( this.library.clips[ id ], this.buildAnimationClip.bind( this ) ); + + } + + // controller + + buildController( data ) { + + const build = { + id: data.id + }; + + const geometry = this.library.geometries[ build.id ]; + + if ( data.skin !== undefined ) { + + build.skin = this.buildSkin( data.skin ); + + // we enhance the 'sources' property of the corresponding geometry with our skin data + + geometry.sources.skinIndices = build.skin.indices; + geometry.sources.skinWeights = build.skin.weights; + + } + + return build; + + } + + buildSkin( data ) { + + const BONE_LIMIT = 4; + + const build = { + joints: [], // this must be an array to preserve the joint order + indices: { + array: [], + stride: BONE_LIMIT + }, + weights: { + array: [], + stride: BONE_LIMIT + } + }; + + const sources = data.sources; + const vertexWeights = data.vertexWeights; + + const vcount = vertexWeights.vcount; + const v = vertexWeights.v; + const jointOffset = vertexWeights.inputs.JOINT.offset; + const weightOffset = vertexWeights.inputs.WEIGHT.offset; + + const jointSource = data.sources[ data.joints.inputs.JOINT ]; + const inverseSource = data.sources[ data.joints.inputs.INV_BIND_MATRIX ]; + + const weights = sources[ vertexWeights.inputs.WEIGHT.id ].array; + let stride = 0; + + let i, j, l; + + // process skin data for each vertex + + for ( i = 0, l = vcount.length; i < l; i ++ ) { + + const jointCount = vcount[ i ]; // this is the amount of joints that affect a single vertex + const vertexSkinData = []; + + for ( j = 0; j < jointCount; j ++ ) { + + const skinIndex = v[ stride + jointOffset ]; + const weightId = v[ stride + weightOffset ]; + const skinWeight = weights[ weightId ]; + + vertexSkinData.push( { index: skinIndex, weight: skinWeight } ); + + stride += 2; + + } + + // we sort the joints in descending order based on the weights. + // this ensures, we only proceed the most important joints of the vertex + + vertexSkinData.sort( descending ); + + // now we provide for each vertex a set of four index and weight values. + // the order of the skin data matches the order of vertices + + for ( j = 0; j < BONE_LIMIT; j ++ ) { + + const d = vertexSkinData[ j ]; + + if ( d !== undefined ) { + + build.indices.array.push( d.index ); + build.weights.array.push( d.weight ); + + } else { + + build.indices.array.push( 0 ); + build.weights.array.push( 0 ); + + } + + } + + } + + // setup bind matrix + + if ( data.bindShapeMatrix ) { + + build.bindMatrix = new Matrix4().fromArray( data.bindShapeMatrix ).transpose(); + + } else { + + build.bindMatrix = new Matrix4().identity(); + + } + + // process bones and inverse bind matrix data + + for ( i = 0, l = jointSource.array.length; i < l; i ++ ) { + + const name = jointSource.array[ i ]; + const boneInverse = new Matrix4().fromArray( inverseSource.array, i * inverseSource.stride ).transpose(); + + build.joints.push( { name: name, boneInverse: boneInverse } ); + + } + + return build; + + // array sort function + + function descending( a, b ) { + + return b.weight - a.weight; + + } + + } + + getController( id ) { + + return this.getBuild( this.library.controllers[ id ], this.buildController.bind( this ) ); + + } + + // image + + buildImage( data ) { + + if ( data.build !== undefined ) return data.build; + + return data.init_from; + + } + + getImage( id ) { + + const data = this.library.images[ id ]; + + if ( data !== undefined ) { + + return this.getBuild( data, this.buildImage.bind( this ) ); + + } + + console.warn( 'THREE.ColladaLoader: Couldn\'t find image with ID:', id ); + + return null; + + } + + // effect + + buildEffect( data ) { + + return data; + + } + + getEffect( id ) { + + return this.getBuild( this.library.effects[ id ], this.buildEffect.bind( this ) ); + + } + + // material + + getTextureLoader( image ) { + + let loader; + + let extension = image.slice( ( image.lastIndexOf( '.' ) - 1 >>> 0 ) + 2 ); // http://www.jstips.co/en/javascript/get-file-extension/ + extension = extension.toLowerCase(); + + switch ( extension ) { + + case 'tga': + loader = this.tgaLoader; + break; + + default: + loader = this.textureLoader; + + } + + return loader; + + } + + buildMaterial( data ) { + + const effect = this.getEffect( data.url ); + const technique = effect.profile.technique; + + let material; + + switch ( technique.type ) { + + case 'phong': + case 'blinn': + material = new MeshPhongMaterial(); + break; + + case 'lambert': + material = new MeshLambertMaterial(); + break; + + default: + material = new MeshBasicMaterial(); + break; + + } + + material.name = data.name || ''; + + const self = this; + + function getTexture( textureObject, colorSpace = null ) { + + const sampler = effect.profile.samplers[ textureObject.id ]; + let image = null; + + // get image + + if ( sampler !== undefined ) { + + const surface = effect.profile.surfaces[ sampler.source ]; + image = self.getImage( surface.init_from ); + + } else { + + console.warn( 'THREE.ColladaLoader: Undefined sampler. Access image directly (see #12530).' ); + image = self.getImage( textureObject.id ); + + } + + // create texture if image is available + + if ( image !== null ) { + + const loader = self.getTextureLoader( image ); + + if ( loader !== undefined ) { + + const texture = loader.load( image ); + + const extra = textureObject.extra; + + if ( extra !== undefined && extra.technique !== undefined && self.isEmpty( extra.technique ) === false ) { + + const technique = extra.technique; + + texture.wrapS = technique.wrapU ? RepeatWrapping : ClampToEdgeWrapping; + texture.wrapT = technique.wrapV ? RepeatWrapping : ClampToEdgeWrapping; + + texture.offset.set( technique.offsetU || 0, technique.offsetV || 0 ); + texture.repeat.set( technique.repeatU || 1, technique.repeatV || 1 ); + + } else { + + texture.wrapS = RepeatWrapping; + texture.wrapT = RepeatWrapping; + + } + + if ( colorSpace !== null ) { + + texture.colorSpace = colorSpace; + + } + + return texture; + + } else { + + console.warn( 'THREE.ColladaLoader: Loader for texture %s not found.', image ); + + return null; + + } + + } else { + + console.warn( 'THREE.ColladaLoader: Couldn\'t create texture with ID:', textureObject.id ); + + return null; + + } + + } + + const parameters = technique.parameters; + + for ( const key in parameters ) { + + const parameter = parameters[ key ]; + + switch ( key ) { + + case 'diffuse': + if ( parameter.color ) material.color.fromArray( parameter.color ); + if ( parameter.texture ) material.map = getTexture( parameter.texture, SRGBColorSpace ); + break; + case 'specular': + if ( parameter.color && material.specular ) material.specular.fromArray( parameter.color ); + if ( parameter.texture ) material.specularMap = getTexture( parameter.texture ); + break; + case 'bump': + if ( parameter.texture ) material.normalMap = getTexture( parameter.texture ); + break; + case 'ambient': + if ( parameter.texture ) material.lightMap = getTexture( parameter.texture, SRGBColorSpace ); + break; + case 'shininess': + if ( parameter.float && material.shininess ) material.shininess = parameter.float; + break; + case 'emission': + if ( parameter.color && material.emissive ) material.emissive.fromArray( parameter.color ); + if ( parameter.texture ) material.emissiveMap = getTexture( parameter.texture, SRGBColorSpace ); + break; + + } + + } + + ColorManagement.colorSpaceToWorking( material.color, SRGBColorSpace ); + if ( material.specular ) ColorManagement.colorSpaceToWorking( material.specular, SRGBColorSpace ); + if ( material.emissive ) ColorManagement.colorSpaceToWorking( material.emissive, SRGBColorSpace ); + + // + + let transparent = parameters[ 'transparent' ]; + let transparency = parameters[ 'transparency' ]; + + // does not exist but + + if ( transparency === undefined && transparent ) { + + transparency = { + float: 1 + }; + + } + + // does not exist but + + if ( transparent === undefined && transparency ) { + + transparent = { + opaque: 'A_ONE', + data: { + color: [ 1, 1, 1, 1 ] + } }; + + } + + if ( transparent && transparency ) { + + // handle case if a texture exists but no color + + if ( transparent.data.texture ) { + + // we do not set an alpha map (see #13792) + + material.transparent = true; + + } else { + + const color = transparent.data.color; + + switch ( transparent.opaque ) { + + case 'A_ONE': + material.opacity = color[ 3 ] * transparency.float; + break; + case 'RGB_ZERO': + material.opacity = 1 - ( color[ 0 ] * transparency.float ); + break; + case 'A_ZERO': + material.opacity = 1 - ( color[ 3 ] * transparency.float ); + break; + case 'RGB_ONE': + material.opacity = color[ 0 ] * transparency.float; + break; + default: + console.warn( 'THREE.ColladaLoader: Invalid opaque type "%s" of transparent tag.', transparent.opaque ); + + } + + if ( material.opacity < 1 ) material.transparent = true; + + } + + } + + // + + + if ( technique.extra !== undefined && technique.extra.technique !== undefined ) { + + const techniques = technique.extra.technique; + + for ( const k in techniques ) { + + const v = techniques[ k ]; + + switch ( k ) { + + case 'double_sided': + material.side = ( v === 1 ? DoubleSide : FrontSide ); + break; + + case 'bump': + material.normalMap = getTexture( v.texture ); + material.normalScale = new Vector2( 1, 1 ); + break; + + } + + } + + } + + return material; + + } + + getMaterial( id ) { + + return this.getBuild( this.library.materials[ id ], this.buildMaterial.bind( this ) ); + + } + + // camera + + buildCamera( data ) { + + let camera; + + switch ( data.optics.technique ) { + + case 'perspective': + camera = new PerspectiveCamera( + data.optics.parameters.yfov, + data.optics.parameters.aspect_ratio, + data.optics.parameters.znear, + data.optics.parameters.zfar + ); + break; + + case 'orthographic': + let ymag = data.optics.parameters.ymag; + let xmag = data.optics.parameters.xmag; + const aspectRatio = data.optics.parameters.aspect_ratio; + + xmag = ( xmag === undefined ) ? ( ymag * aspectRatio ) : xmag; + ymag = ( ymag === undefined ) ? ( xmag / aspectRatio ) : ymag; + + xmag *= 0.5; + ymag *= 0.5; + + camera = new OrthographicCamera( + - xmag, xmag, ymag, - ymag, // left, right, top, bottom + data.optics.parameters.znear, + data.optics.parameters.zfar + ); + break; + + default: + camera = new PerspectiveCamera(); + break; + + } + + camera.name = data.name || ''; + + return camera; + + } + + getCamera( id ) { + + const data = this.library.cameras[ id ]; + + if ( data !== undefined ) { + + return this.getBuild( data, this.buildCamera.bind( this ) ); + + } + + console.warn( 'THREE.ColladaLoader: Couldn\'t find camera with ID:', id ); + + return null; + + } + + // light + + buildLight( data ) { + + let light; + + switch ( data.technique ) { + + case 'directional': + light = new DirectionalLight(); + break; + + case 'point': + light = new PointLight(); + break; + + case 'spot': + light = new SpotLight(); + break; + + case 'ambient': + light = new AmbientLight(); + break; + + } + + if ( data.parameters.color ) light.color.copy( data.parameters.color ); + if ( data.parameters.distance ) light.distance = data.parameters.distance; + + return light; + + } + + getLight( id ) { + + const data = this.library.lights[ id ]; + + if ( data !== undefined ) { + + return this.getBuild( data, this.buildLight.bind( this ) ); + + } + + console.warn( 'THREE.ColladaLoader: Couldn\'t find light with ID:', id ); + + return null; + + } + + // geometry + + groupPrimitives( primitives ) { + + const build = {}; + + for ( let i = 0; i < primitives.length; i ++ ) { + + const primitive = primitives[ i ]; + + if ( build[ primitive.type ] === undefined ) build[ primitive.type ] = []; + + build[ primitive.type ].push( primitive ); + + } + + return build; + + } + + checkUVCoordinates( primitives ) { + + let count = 0; + + for ( let i = 0, l = primitives.length; i < l; i ++ ) { + + const primitive = primitives[ i ]; + + if ( primitive.hasUV === true ) { + + count ++; + + } + + } + + if ( count > 0 && count < primitives.length ) { + + primitives.uvsNeedsFix = true; + + } + + } + + buildGeometry( data ) { + + const build = {}; + + const sources = data.sources; + const vertices = data.vertices; + const primitives = data.primitives; + + if ( primitives.length === 0 ) return {}; + + // our goal is to create one buffer geometry for a single type of primitives + // first, we group all primitives by their type + + const groupedPrimitives = this.groupPrimitives( primitives ); + + for ( const type in groupedPrimitives ) { + + const primitiveType = groupedPrimitives[ type ]; + + // second, ensure consistent uv coordinates for each type of primitives (polylist,triangles or lines) + + this.checkUVCoordinates( primitiveType ); + + // third, create a buffer geometry for each type of primitives + + build[ type ] = this.buildGeometryType( primitiveType, sources, vertices ); + + } + + return build; + + } + + buildGeometryType( primitives, sources, vertices ) { + + const build = {}; + + const position = { array: [], stride: 0 }; + const normal = { array: [], stride: 0 }; + const uv = { array: [], stride: 0 }; + const uv1 = { array: [], stride: 0 }; + const color = { array: [], stride: 0 }; + + const skinIndex = { array: [], stride: 4 }; + const skinWeight = { array: [], stride: 4 }; + + const geometry = new BufferGeometry(); + + const materialKeys = []; + + let start = 0; + + for ( let p = 0; p < primitives.length; p ++ ) { + + const primitive = primitives[ p ]; + const inputs = primitive.inputs; + + // groups + + let count = 0; + + switch ( primitive.type ) { + + case 'lines': + case 'linestrips': + count = primitive.count * 2; + break; + + case 'triangles': + count = primitive.count * 3; + break; + + case 'polylist': + + for ( let g = 0; g < primitive.count; g ++ ) { + + const vc = primitive.vcount[ g ]; + + switch ( vc ) { + + case 3: + count += 3; // single triangle + break; + + case 4: + count += 6; // quad, subdivided into two triangles + break; + + default: + count += ( vc - 2 ) * 3; // polylist with more than four vertices + break; + + } + + } + + break; + + default: + console.warn( 'THREE.ColladaLoader: Unknown primitive type:', primitive.type ); + + } + + geometry.addGroup( start, count, p ); + start += count; + + // material + + if ( primitive.material ) { + + materialKeys.push( primitive.material ); + + } + + // geometry data + + for ( const name in inputs ) { + + const input = inputs[ name ]; + + switch ( name ) { + + case 'VERTEX': + for ( const key in vertices ) { + + const id = vertices[ key ]; + + switch ( key ) { + + case 'POSITION': + const prevLength = position.array.length; + this.buildGeometryData( primitive, sources[ id ], input.offset, position.array ); + position.stride = sources[ id ].stride; + + if ( sources.skinWeights && sources.skinIndices ) { + + this.buildGeometryData( primitive, sources.skinIndices, input.offset, skinIndex.array ); + this.buildGeometryData( primitive, sources.skinWeights, input.offset, skinWeight.array ); + + } + + // see #3803 + + if ( primitive.hasUV === false && primitives.uvsNeedsFix === true ) { + + const count = ( position.array.length - prevLength ) / position.stride; + + for ( let i = 0; i < count; i ++ ) { + + // fill missing uv coordinates + + uv.array.push( 0, 0 ); + + } + + } + + break; + + case 'NORMAL': + this.buildGeometryData( primitive, sources[ id ], input.offset, normal.array ); + normal.stride = sources[ id ].stride; + break; + + case 'COLOR': + this.buildGeometryData( primitive, sources[ id ], input.offset, color.array ); + color.stride = sources[ id ].stride; + break; + + case 'TEXCOORD': + this.buildGeometryData( primitive, sources[ id ], input.offset, uv.array ); + uv.stride = sources[ id ].stride; + break; + + case 'TEXCOORD1': + this.buildGeometryData( primitive, sources[ id ], input.offset, uv1.array ); + uv.stride = sources[ id ].stride; + break; + + default: + console.warn( 'THREE.ColladaLoader: Semantic "%s" not handled in geometry build process.', key ); + + } + + } + + break; + + case 'NORMAL': + this.buildGeometryData( primitive, sources[ input.id ], input.offset, normal.array ); + normal.stride = sources[ input.id ].stride; + break; + + case 'COLOR': + this.buildGeometryData( primitive, sources[ input.id ], input.offset, color.array, true ); + color.stride = sources[ input.id ].stride; + break; + + case 'TEXCOORD': + this.buildGeometryData( primitive, sources[ input.id ], input.offset, uv.array ); + uv.stride = sources[ input.id ].stride; + break; + + case 'TEXCOORD1': + this.buildGeometryData( primitive, sources[ input.id ], input.offset, uv1.array ); + uv1.stride = sources[ input.id ].stride; + break; + + } + + } + + } + + // build geometry + + if ( position.array.length > 0 ) geometry.setAttribute( 'position', new Float32BufferAttribute( position.array, position.stride ) ); + if ( normal.array.length > 0 ) geometry.setAttribute( 'normal', new Float32BufferAttribute( normal.array, normal.stride ) ); + if ( color.array.length > 0 ) geometry.setAttribute( 'color', new Float32BufferAttribute( color.array, color.stride ) ); + if ( uv.array.length > 0 ) geometry.setAttribute( 'uv', new Float32BufferAttribute( uv.array, uv.stride ) ); + if ( uv1.array.length > 0 ) geometry.setAttribute( 'uv1', new Float32BufferAttribute( uv1.array, uv1.stride ) ); + + if ( skinIndex.array.length > 0 ) geometry.setAttribute( 'skinIndex', new Float32BufferAttribute( skinIndex.array, skinIndex.stride ) ); + if ( skinWeight.array.length > 0 ) geometry.setAttribute( 'skinWeight', new Float32BufferAttribute( skinWeight.array, skinWeight.stride ) ); + + build.data = geometry; + build.type = primitives[ 0 ].type; + build.materialKeys = materialKeys; + + return build; + + } + + buildGeometryData( primitive, source, offset, array, isColor = false ) { + + const indices = primitive.p; + const stride = primitive.stride; + const vcount = primitive.vcount; + + const tempColor = this.tempColor; + + function pushVector( i ) { + + let index = indices[ i + offset ] * sourceStride; + const length = index + sourceStride; + + for ( ; index < length; index ++ ) { + + array.push( sourceArray[ index ] ); + + } + + if ( isColor ) { + + // convert the vertex colors from srgb to linear if present + const startIndex = array.length - sourceStride - 1; + tempColor.setRGB( + array[ startIndex + 0 ], + array[ startIndex + 1 ], + array[ startIndex + 2 ], + SRGBColorSpace + ); + + array[ startIndex + 0 ] = tempColor.r; + array[ startIndex + 1 ] = tempColor.g; + array[ startIndex + 2 ] = tempColor.b; + + } + + } + + const sourceArray = source.array; + const sourceStride = source.stride; + + if ( primitive.vcount !== undefined ) { + + let index = 0; + + for ( let i = 0, l = vcount.length; i < l; i ++ ) { + + const count = vcount[ i ]; + + if ( count === 4 ) { + + const a = index + stride * 0; + const b = index + stride * 1; + const c = index + stride * 2; + const d = index + stride * 3; + + pushVector( a ); pushVector( b ); pushVector( d ); + pushVector( b ); pushVector( c ); pushVector( d ); + + } else if ( count === 3 ) { + + const a = index + stride * 0; + const b = index + stride * 1; + const c = index + stride * 2; + + pushVector( a ); pushVector( b ); pushVector( c ); + + } else if ( count > 4 ) { + + for ( let k = 1, kl = ( count - 2 ); k <= kl; k ++ ) { + + const a = index + stride * 0; + const b = index + stride * k; + const c = index + stride * ( k + 1 ); + + pushVector( a ); pushVector( b ); pushVector( c ); + + } + + } + + index += stride * count; + + } + + } else { + + for ( let i = 0, l = indices.length; i < l; i += stride ) { + + pushVector( i ); + + } + + } + + } + + getGeometry( id ) { + + return this.getBuild( this.library.geometries[ id ], this.buildGeometry.bind( this ) ); + + } + + // kinematics + + buildKinematicsModel( data ) { + + if ( data.build !== undefined ) return data.build; + + return data; + + } + + getKinematicsModel( id ) { + + return this.getBuild( this.library.kinematicsModels[ id ], this.buildKinematicsModel.bind( this ) ); + + } + + buildKinematicsScene( data ) { + + if ( data.build !== undefined ) return data.build; + + return data; + + } + + getKinematicsScene( id ) { + + return this.getBuild( this.library.kinematicsScenes[ id ], this.buildKinematicsScene.bind( this ) ); + + } + + setupKinematics() { + + const kinematicsModelId = Object.keys( this.library.kinematicsModels )[ 0 ]; + const kinematicsSceneId = Object.keys( this.library.kinematicsScenes )[ 0 ]; + const visualSceneId = Object.keys( this.library.visualScenes )[ 0 ]; + + if ( kinematicsModelId === undefined || kinematicsSceneId === undefined ) return; + + const kinematicsModel = this.getKinematicsModel( kinematicsModelId ); + const kinematicsScene = this.getKinematicsScene( kinematicsSceneId ); + const visualScene = this.getVisualScene( visualSceneId ); + + const bindJointAxis = kinematicsScene.bindJointAxis; + const jointMap = {}; + + const collada = this.collada; + const self = this; + + for ( let i = 0, l = bindJointAxis.length; i < l; i ++ ) { + + const axis = bindJointAxis[ i ]; + + // the result of the following query is an element of type 'translate', 'rotate','scale' or 'matrix' + + const targetElement = collada.querySelector( '[sid="' + axis.target + '"]' ); + + if ( targetElement ) { + + // get the parent of the transform element + + const parentVisualElement = targetElement.parentElement; + + // connect the joint of the kinematics model with the element in the visual scene + + connect( axis.jointIndex, parentVisualElement ); + + } + + } + + function connect( jointIndex, visualElement ) { + + const visualElementName = visualElement.getAttribute( 'name' ); + const joint = kinematicsModel.joints[ jointIndex ]; + const transforms = self.buildTransformList( visualElement ); + + visualScene.traverse( function ( object ) { + + if ( object.name === visualElementName ) { + + jointMap[ jointIndex ] = { + object: object, + transforms: transforms, + joint: joint, + position: joint.zeroPosition + }; + + } + + } ); + + } + + const m0 = new Matrix4(); + const matrix = this.matrix; + + this.kinematics = { + + joints: kinematicsModel && kinematicsModel.joints, + + getJointValue: function ( jointIndex ) { + + const jointData = jointMap[ jointIndex ]; + + if ( jointData ) { + + return jointData.position; + + } else { + + console.warn( 'THREE.ColladaLoader: Joint ' + jointIndex + ' doesn\'t exist.' ); + + } + + }, + + setJointValue: function ( jointIndex, value ) { + + const jointData = jointMap[ jointIndex ]; + + if ( jointData ) { + + const joint = jointData.joint; + + if ( value > joint.limits.max || value < joint.limits.min ) { + + console.warn( 'THREE.ColladaLoader: Joint ' + jointIndex + ' value ' + value + ' outside of limits (min: ' + joint.limits.min + ', max: ' + joint.limits.max + ').' ); + + } else if ( joint.static ) { + + console.warn( 'THREE.ColladaLoader: Joint ' + jointIndex + ' is static.' ); + + } else { + + const object = jointData.object; + const axis = joint.axis; + const transforms = jointData.transforms; + + matrix.identity(); + + // each update, we have to apply all transforms in the correct order + + for ( let i = 0; i < transforms.length; i ++ ) { + + const transform = transforms[ i ]; + + // if there is a connection of the transform node with a joint, apply the joint value + + if ( transform.sid && transform.sid.indexOf( jointIndex ) !== - 1 ) { + + switch ( joint.type ) { + + case 'revolute': + matrix.multiply( m0.makeRotationAxis( axis, MathUtils.degToRad( value ) ) ); + break; + + case 'prismatic': + matrix.multiply( m0.makeTranslation( axis.x * value, axis.y * value, axis.z * value ) ); + break; + + default: + console.warn( 'THREE.ColladaLoader: Unknown joint type: ' + joint.type ); + break; + + } + + } else { + + switch ( transform.type ) { + + case 'matrix': + matrix.multiply( transform.obj ); + break; + + case 'translate': + matrix.multiply( m0.makeTranslation( transform.obj.x, transform.obj.y, transform.obj.z ) ); + break; + + case 'scale': + matrix.scale( transform.obj ); + break; + + case 'rotate': + matrix.multiply( m0.makeRotationAxis( transform.obj, transform.angle ) ); + break; + + } + + } + + } + + object.matrix.copy( matrix ); + object.matrix.decompose( object.position, object.quaternion, object.scale ); + + jointMap[ jointIndex ].position = value; + + } + + } else { + + console.warn( 'THREE.ColladaLoader: Joint ' + jointIndex + ' does not exist.' ); + + } + + } + + }; + + } + + buildTransformList( node ) { + + const transforms = []; + + const xml = this.collada.querySelector( '[id="' + node.id + '"]' ); + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + let array, vector; + + switch ( child.nodeName ) { + + case 'matrix': + array = parseFloats( child.textContent ); + const matrix = new Matrix4().fromArray( array ).transpose(); + transforms.push( { + sid: child.getAttribute( 'sid' ), + type: child.nodeName, + obj: matrix + } ); + break; + + case 'translate': + case 'scale': + array = parseFloats( child.textContent ); + vector = new Vector3().fromArray( array ); + transforms.push( { + sid: child.getAttribute( 'sid' ), + type: child.nodeName, + obj: vector + } ); + break; + + case 'rotate': + array = parseFloats( child.textContent ); + vector = new Vector3().fromArray( array ); + const angle = MathUtils.degToRad( array[ 3 ] ); + transforms.push( { + sid: child.getAttribute( 'sid' ), + type: child.nodeName, + obj: vector, + angle: angle + } ); + break; + + } + + } + + return transforms; + + } + + // nodes + + buildSkeleton( skeletons, joints ) { + + const boneData = []; + const sortedBoneData = []; + + let i, j, data; + + // a skeleton can have multiple root bones. collada expresses this + // situation with multiple "skeleton" tags per controller instance + + for ( i = 0; i < skeletons.length; i ++ ) { + + const skeleton = skeletons[ i ]; + + let root; + + if ( this.hasNode( skeleton ) ) { + + root = this.getNode( skeleton ); + this.buildBoneHierarchy( root, joints, boneData ); + + } else if ( this.hasVisualScene( skeleton ) ) { + + // handle case where the skeleton refers to the visual scene (#13335) + + const visualScene = this.library.visualScenes[ skeleton ]; + const children = visualScene.children; + + for ( let j = 0; j < children.length; j ++ ) { + + const child = children[ j ]; + + if ( child.type === 'JOINT' ) { + + const root = this.getNode( child.id ); + this.buildBoneHierarchy( root, joints, boneData ); + + } + + } + + } else { + + console.error( 'THREE.ColladaLoader: Unable to find root bone of skeleton with ID:', skeleton ); + + } + + } + + // sort bone data (the order is defined in the corresponding controller) + + for ( i = 0; i < joints.length; i ++ ) { + + for ( j = 0; j < boneData.length; j ++ ) { + + data = boneData[ j ]; + + if ( data.bone.name === joints[ i ].name ) { + + sortedBoneData[ i ] = data; + data.processed = true; + break; + + } + + } + + } + + // add unprocessed bone data at the end of the list + + for ( i = 0; i < boneData.length; i ++ ) { + + data = boneData[ i ]; + + if ( data.processed === false ) { + + sortedBoneData.push( data ); + data.processed = true; + + } + + } + + // setup arrays for skeleton creation + + const bones = []; + const boneInverses = []; + + for ( i = 0; i < sortedBoneData.length; i ++ ) { + + data = sortedBoneData[ i ]; + + bones.push( data.bone ); + boneInverses.push( data.boneInverse ); + + } + + return new Skeleton( bones, boneInverses ); + + } + + buildBoneHierarchy( root, joints, boneData ) { + + // setup bone data from visual scene + + root.traverse( function ( object ) { + + if ( object.isBone === true ) { + + let boneInverse; + + // retrieve the boneInverse from the controller data + + for ( let i = 0; i < joints.length; i ++ ) { + + const joint = joints[ i ]; + + if ( joint.name === object.name ) { + + boneInverse = joint.boneInverse; + break; + + } + + } + + if ( boneInverse === undefined ) { + + // Unfortunately, there can be joints in the visual scene that are not part of the + // corresponding controller. In this case, we have to create a dummy boneInverse matrix + // for the respective bone. This bone won't affect any vertices, because there are no skin indices + // and weights defined for it. But we still have to add the bone to the sorted bone list in order to + // ensure a correct animation of the model. + + boneInverse = new Matrix4(); + + } + + boneData.push( { bone: object, boneInverse: boneInverse, processed: false } ); + + } + + } ); + + } + + buildNode( data ) { + + const objects = []; + + const matrix = data.matrix; + const nodes = data.nodes; + const type = data.type; + const instanceCameras = data.instanceCameras; + const instanceControllers = data.instanceControllers; + const instanceLights = data.instanceLights; + const instanceGeometries = data.instanceGeometries; + const instanceNodes = data.instanceNodes; + + // nodes + + for ( let i = 0, l = nodes.length; i < l; i ++ ) { + + objects.push( this.getNode( nodes[ i ] ) ); + + } + + // instance cameras + + for ( let i = 0, l = instanceCameras.length; i < l; i ++ ) { + + const instanceCamera = this.getCamera( instanceCameras[ i ] ); + + if ( instanceCamera !== null ) { + + objects.push( instanceCamera.clone() ); + + } + + } + + // instance controllers + + for ( let i = 0, l = instanceControllers.length; i < l; i ++ ) { + + const instance = instanceControllers[ i ]; + const controller = this.getController( instance.id ); + const geometries = this.getGeometry( controller.id ); + const newObjects = this.buildObjects( geometries, instance.materials ); + + const skeletons = instance.skeletons; + const joints = controller.skin.joints; + + const skeleton = this.buildSkeleton( skeletons, joints ); + + for ( let j = 0, jl = newObjects.length; j < jl; j ++ ) { + + const object = newObjects[ j ]; + + if ( object.isSkinnedMesh ) { + + object.bind( skeleton, controller.skin.bindMatrix ); + object.normalizeSkinWeights(); + + } + + objects.push( object ); + + } + + } + + // instance lights + + for ( let i = 0, l = instanceLights.length; i < l; i ++ ) { + + const instanceLight = this.getLight( instanceLights[ i ] ); + + if ( instanceLight !== null ) { + + objects.push( instanceLight.clone() ); + + } + + } + + // instance geometries + + for ( let i = 0, l = instanceGeometries.length; i < l; i ++ ) { + + const instance = instanceGeometries[ i ]; + + // a single geometry instance in collada can lead to multiple object3Ds. + // this is the case when primitives are combined like triangles and lines + + const geometries = this.getGeometry( instance.id ); + const newObjects = this.buildObjects( geometries, instance.materials ); + + for ( let j = 0, jl = newObjects.length; j < jl; j ++ ) { + + objects.push( newObjects[ j ] ); + + } + + } + + // instance nodes + + for ( let i = 0, l = instanceNodes.length; i < l; i ++ ) { + + objects.push( this.getNode( instanceNodes[ i ] ).clone() ); + + } + + let object; + + if ( nodes.length === 0 && objects.length === 1 ) { + + object = objects[ 0 ]; + + } else { + + object = ( type === 'JOINT' ) ? new Bone() : new Group(); + + for ( let i = 0; i < objects.length; i ++ ) { + + object.add( objects[ i ] ); + + } + + } + + object.name = ( type === 'JOINT' ) ? data.sid : data.name; + object.matrix.copy( matrix ); + object.matrix.decompose( object.position, object.quaternion, object.scale ); + + return object; + + } + + resolveMaterialBinding( keys, instanceMaterials ) { + + const materials = []; + + for ( let i = 0, l = keys.length; i < l; i ++ ) { + + const id = instanceMaterials[ keys[ i ] ]; + + if ( id === undefined ) { + + console.warn( 'THREE.ColladaLoader: Material with key %s not found. Apply fallback material.', keys[ i ] ); + materials.push( this.fallbackMaterial ); + + } else { + + materials.push( this.getMaterial( id ) ); + + } + + } + + return materials; + + } + + get fallbackMaterial() { + + if ( this._fallbackMaterial === undefined ) { + + this._fallbackMaterial = new MeshBasicMaterial( { + name: Loader.DEFAULT_MATERIAL_NAME, + color: 0xff00ff + } ); + + } + + return this._fallbackMaterial; + + } + + buildObjects( geometries, instanceMaterials ) { + + const objects = []; + + for ( const type in geometries ) { + + const geometry = geometries[ type ]; + + const materials = this.resolveMaterialBinding( geometry.materialKeys, instanceMaterials ); + + // handle case if no materials are defined + + if ( materials.length === 0 ) { + + if ( type === 'lines' || type === 'linestrips' ) { + + materials.push( new LineBasicMaterial() ); + + } else { + + materials.push( new MeshPhongMaterial() ); + + } + + } + + // Collada allows to use phong and lambert materials with lines. Replacing these cases with LineBasicMaterial. + + if ( type === 'lines' || type === 'linestrips' ) { + + for ( let i = 0, l = materials.length; i < l; i ++ ) { + + const material = materials[ i ]; + + if ( material.isMeshPhongMaterial === true || material.isMeshLambertMaterial === true ) { + + const lineMaterial = new LineBasicMaterial(); + + // copy compatible properties + + lineMaterial.color.copy( material.color ); + lineMaterial.opacity = material.opacity; + lineMaterial.transparent = material.transparent; + + // replace material + + materials[ i ] = lineMaterial; + + } + + } + + } + + // regard skinning + + const skinning = ( geometry.data.attributes.skinIndex !== undefined ); + + // choose between a single or multi materials (material array) + + const material = ( materials.length === 1 ) ? materials[ 0 ] : materials; + + // now create a specific 3D object + + let object; + + switch ( type ) { + + case 'lines': + object = new LineSegments( geometry.data, material ); + break; + + case 'linestrips': + object = new Line( geometry.data, material ); + break; + + case 'triangles': + case 'polylist': + if ( skinning ) { + + object = new SkinnedMesh( geometry.data, material ); + + } else { + + object = new Mesh( geometry.data, material ); + + } + + break; + + } + + objects.push( object ); + + } + + return objects; + + } + + hasNode( id ) { + + return this.library.nodes[ id ] !== undefined; + + } + + getNode( id ) { + + return this.getBuild( this.library.nodes[ id ], this.buildNode.bind( this ) ); + + } + + // visual scenes + + buildVisualScene( data ) { + + const group = new Group(); + group.name = data.name; + + const children = data.children; + + for ( let i = 0; i < children.length; i ++ ) { + + const child = children[ i ]; + + group.add( this.getNode( child.id ) ); + + } + + return group; + + } + + hasVisualScene( id ) { + + return this.library.visualScenes[ id ] !== undefined; + + } + + getVisualScene( id ) { + + return this.getBuild( this.library.visualScenes[ id ], this.buildVisualScene.bind( this ) ); + + } + + // scenes + + parseScene( xml ) { + + const instance = getElementsByTagName( xml, 'instance_visual_scene' )[ 0 ]; + return this.getVisualScene( this.parseId( instance.getAttribute( 'url' ) ) ); + + } + + parseId( text ) { + + return text.substring( 1 ); + + } + + setupAnimations() { + + const clips = this.library.clips; + + if ( this.isEmpty( clips ) === true ) { + + if ( this.isEmpty( this.library.animations ) === false ) { + + // if there are animations but no clips, we create a default clip for playback + + const tracks = []; + + for ( const id in this.library.animations ) { + + const animationTracks = this.getAnimation( id ); + + for ( let i = 0, l = animationTracks.length; i < l; i ++ ) { + + tracks.push( animationTracks[ i ] ); + + } + + } + + this.animations.push( new AnimationClip( 'default', - 1, tracks ) ); + + } + + } else { + + for ( const id in clips ) { + + this.animations.push( this.getAnimationClip( id ) ); + + } + + } + + } + +} + +export { ColladaComposer }; diff --git a/examples/jsm/loaders/collada/ColladaParser.js b/examples/jsm/loaders/collada/ColladaParser.js new file mode 100644 index 00000000000000..fafe09fe3e815a --- /dev/null +++ b/examples/jsm/loaders/collada/ColladaParser.js @@ -0,0 +1,1928 @@ +import { + Color, + ColorManagement, + MathUtils, + Matrix4, + Vector3, + SRGBColorSpace +} from 'three'; + +/** + * Utility functions for parsing + */ + +function getElementsByTagName( xml, name ) { + + // Non recursive xml.getElementsByTagName() ... + + const array = []; + const childNodes = xml.childNodes; + + for ( let i = 0, l = childNodes.length; i < l; i ++ ) { + + const child = childNodes[ i ]; + + if ( child.nodeName === name ) { + + array.push( child ); + + } + + } + + return array; + +} + +function parseStrings( text ) { + + if ( text.length === 0 ) return []; + + return text.trim().split( /\s+/ ); + +} + +function parseFloats( text ) { + + if ( text.length === 0 ) return []; + + return text.trim().split( /\s+/ ).map( parseFloat ); + +} + +function parseInts( text ) { + + if ( text.length === 0 ) return []; + + return text.trim().split( /\s+/ ).map( s => parseInt( s ) ); + +} + +function parseId( text ) { + + return text.substring( 1 ); + +} + +/** + * ColladaParser handles XML parsing and converts Collada XML to intermediate data structures. + */ +class ColladaParser { + + constructor() { + + this.count = 0; + + } + + generateId() { + + return 'three_default_' + ( this.count ++ ); + + } + + parse( text ) { + + if ( text.length === 0 ) { + + return null; + + } + + const xml = new DOMParser().parseFromString( text, 'application/xml' ); + + const collada = getElementsByTagName( xml, 'COLLADA' )[ 0 ]; + + const parserError = xml.getElementsByTagName( 'parsererror' )[ 0 ]; + if ( parserError !== undefined ) { + + // Chrome will return parser error with a div in it + + const errorElement = getElementsByTagName( parserError, 'div' )[ 0 ]; + let errorText; + + if ( errorElement ) { + + errorText = errorElement.textContent; + + } else { + + errorText = this.parserErrorToText( parserError ); + + } + + console.error( 'THREE.ColladaLoader: Failed to parse collada file.\n', errorText ); + + return null; + + } + + // metadata + + const version = collada.getAttribute( 'version' ); + console.debug( 'THREE.ColladaLoader: File version', version ); + + const asset = this.parseAsset( getElementsByTagName( collada, 'asset' )[ 0 ] ); + + // + + const library = { + animations: {}, + clips: {}, + controllers: {}, + images: {}, + effects: {}, + materials: {}, + cameras: {}, + lights: {}, + geometries: {}, + nodes: {}, + visualScenes: {}, + kinematicsModels: {}, + physicsModels: {}, + kinematicsScenes: {} + }; + + this.library = library; + this.collada = collada; + + this.parseLibrary( collada, 'library_animations', 'animation', this.parseAnimation.bind( this ) ); + this.parseLibrary( collada, 'library_animation_clips', 'animation_clip', this.parseAnimationClip.bind( this ) ); + this.parseLibrary( collada, 'library_controllers', 'controller', this.parseController.bind( this ) ); + this.parseLibrary( collada, 'library_images', 'image', this.parseImage.bind( this ) ); + this.parseLibrary( collada, 'library_effects', 'effect', this.parseEffect.bind( this ) ); + this.parseLibrary( collada, 'library_materials', 'material', this.parseMaterial.bind( this ) ); + this.parseLibrary( collada, 'library_cameras', 'camera', this.parseCamera.bind( this ) ); + this.parseLibrary( collada, 'library_lights', 'light', this.parseLight.bind( this ) ); + this.parseLibrary( collada, 'library_geometries', 'geometry', this.parseGeometry.bind( this ) ); + this.parseLibrary( collada, 'library_nodes', 'node', this.parseNode.bind( this ) ); + this.parseLibrary( collada, 'library_visual_scenes', 'visual_scene', this.parseVisualScene.bind( this ) ); + this.parseLibrary( collada, 'library_kinematics_models', 'kinematics_model', this.parseKinematicsModel.bind( this ) ); + this.parseLibrary( collada, 'library_physics_models', 'physics_model', this.parsePhysicsModel.bind( this ) ); + this.parseLibrary( collada, 'scene', 'instance_kinematics_scene', this.parseKinematicsScene.bind( this ) ); + + return { + library: library, + asset: asset, + collada: collada + }; + + } + + // convert the parser error element into text with each child elements text + // separated by new lines. + + parserErrorToText( parserError ) { + + const parts = []; + const stack = [ parserError ]; + + while ( stack.length ) { + + const node = stack.shift(); + + if ( node.nodeType === Node.TEXT_NODE ) { + + parts.push( node.textContent ); + + } else { + + parts.push( '\n' ); + stack.push( ...node.childNodes ); + + } + + } + + return parts.join( '' ).trim(); + + } + + // asset + + parseAsset( xml ) { + + return { + unit: this.parseAssetUnit( getElementsByTagName( xml, 'unit' )[ 0 ] ), + upAxis: this.parseAssetUpAxis( getElementsByTagName( xml, 'up_axis' )[ 0 ] ) + }; + + } + + parseAssetUnit( xml ) { + + if ( ( xml !== undefined ) && ( xml.hasAttribute( 'meter' ) === true ) ) { + + return parseFloat( xml.getAttribute( 'meter' ) ); + + } else { + + return 1; // default 1 meter + + } + + } + + parseAssetUpAxis( xml ) { + + return xml !== undefined ? xml.textContent : 'Y_UP'; + + } + + // library + + parseLibrary( xml, libraryName, nodeName, parser ) { + + const library = getElementsByTagName( xml, libraryName )[ 0 ]; + + if ( library !== undefined ) { + + const elements = getElementsByTagName( library, nodeName ); + + for ( let i = 0; i < elements.length; i ++ ) { + + parser( elements[ i ] ); + + } + + } + + } + + // animation + + parseAnimation( xml ) { + + const data = { + sources: {}, + samplers: {}, + channels: {} + }; + + let hasChildren = false; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + let id; + + switch ( child.nodeName ) { + + case 'source': + id = child.getAttribute( 'id' ); + data.sources[ id ] = this.parseSource( child ); + break; + + case 'sampler': + id = child.getAttribute( 'id' ); + data.samplers[ id ] = this.parseAnimationSampler( child ); + break; + + case 'channel': + id = child.getAttribute( 'target' ); + data.channels[ id ] = this.parseAnimationChannel( child ); + break; + + case 'animation': + // hierarchy of related animations + this.parseAnimation( child ); + hasChildren = true; + break; + + default: + + } + + } + + if ( hasChildren === false ) { + + // since 'id' attributes can be optional, it's necessary to generate a UUID for unique assignment + + this.library.animations[ xml.getAttribute( 'id' ) || MathUtils.generateUUID() ] = data; + + } + + } + + parseAnimationSampler( xml ) { + + const data = { + inputs: {}, + }; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'input': + const id = parseId( child.getAttribute( 'source' ) ); + const semantic = child.getAttribute( 'semantic' ); + data.inputs[ semantic ] = id; + break; + + } + + } + + return data; + + } + + parseAnimationChannel( xml ) { + + const data = {}; + + const target = xml.getAttribute( 'target' ); + + // parsing SID Addressing Syntax + + let parts = target.split( '/' ); + + const id = parts.shift(); + let sid = parts.shift(); + + // check selection syntax + + const arraySyntax = ( sid.indexOf( '(' ) !== - 1 ); + const memberSyntax = ( sid.indexOf( '.' ) !== - 1 ); + + if ( memberSyntax ) { + + // member selection access + + parts = sid.split( '.' ); + sid = parts.shift(); + data.member = parts.shift(); + + } else if ( arraySyntax ) { + + // array-access syntax. can be used to express fields in one-dimensional vectors or two-dimensional matrices. + + const indices = sid.split( '(' ); + sid = indices.shift(); + + for ( let i = 0; i < indices.length; i ++ ) { + + indices[ i ] = parseInt( indices[ i ].replace( /\)/, '' ) ); + + } + + data.indices = indices; + + } + + data.id = id; + data.sid = sid; + + data.arraySyntax = arraySyntax; + data.memberSyntax = memberSyntax; + + data.sampler = parseId( xml.getAttribute( 'source' ) ); + + return data; + + } + + // animation clips + + parseAnimationClip( xml ) { + + const data = { + name: xml.getAttribute( 'id' ) || 'default', + start: parseFloat( xml.getAttribute( 'start' ) || 0 ), + end: parseFloat( xml.getAttribute( 'end' ) || 0 ), + animations: [] + }; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'instance_animation': + data.animations.push( parseId( child.getAttribute( 'url' ) ) ); + break; + + } + + } + + this.library.clips[ xml.getAttribute( 'id' ) ] = data; + + } + + // controller + + parseController( xml ) { + + const data = {}; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'skin': + // there is exactly one skin per controller + data.id = parseId( child.getAttribute( 'source' ) ); + data.skin = this.parseSkin( child ); + break; + + case 'morph': + data.id = parseId( child.getAttribute( 'source' ) ); + console.warn( 'THREE.ColladaLoader: Morph target animation not supported yet.' ); + break; + + } + + } + + this.library.controllers[ xml.getAttribute( 'id' ) ] = data; + + } + + parseSkin( xml ) { + + const data = { + sources: {} + }; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'bind_shape_matrix': + data.bindShapeMatrix = parseFloats( child.textContent ); + break; + + case 'source': + const id = child.getAttribute( 'id' ); + data.sources[ id ] = this.parseSource( child ); + break; + + case 'joints': + data.joints = this.parseJoints( child ); + break; + + case 'vertex_weights': + data.vertexWeights = this.parseVertexWeights( child ); + break; + + } + + } + + return data; + + } + + parseJoints( xml ) { + + const data = { + inputs: {} + }; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'input': + const semantic = child.getAttribute( 'semantic' ); + const id = parseId( child.getAttribute( 'source' ) ); + data.inputs[ semantic ] = id; + break; + + } + + } + + return data; + + } + + parseVertexWeights( xml ) { + + const data = { + inputs: {} + }; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'input': + const semantic = child.getAttribute( 'semantic' ); + const id = parseId( child.getAttribute( 'source' ) ); + const offset = parseInt( child.getAttribute( 'offset' ) ); + data.inputs[ semantic ] = { id: id, offset: offset }; + break; + + case 'vcount': + data.vcount = parseInts( child.textContent ); + break; + + case 'v': + data.v = parseInts( child.textContent ); + break; + + } + + } + + return data; + + } + + // image + + parseImage( xml ) { + + const data = { + init_from: getElementsByTagName( xml, 'init_from' )[ 0 ].textContent + }; + + this.library.images[ xml.getAttribute( 'id' ) ] = data; + + } + + // effect + + parseEffect( xml ) { + + const data = {}; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'profile_COMMON': + data.profile = this.parseEffectProfileCOMMON( child ); + break; + + } + + } + + this.library.effects[ xml.getAttribute( 'id' ) ] = data; + + } + + parseEffectProfileCOMMON( xml ) { + + const data = { + surfaces: {}, + samplers: {} + }; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'newparam': + this.parseEffectNewparam( child, data ); + break; + + case 'technique': + data.technique = this.parseEffectTechnique( child ); + break; + + case 'extra': + data.extra = this.parseEffectExtra( child ); + break; + + } + + } + + return data; + + } + + parseEffectNewparam( xml, data ) { + + const sid = xml.getAttribute( 'sid' ); + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'surface': + data.surfaces[ sid ] = this.parseEffectSurface( child ); + break; + + case 'sampler2D': + data.samplers[ sid ] = this.parseEffectSampler( child ); + break; + + } + + } + + } + + parseEffectSurface( xml ) { + + const data = {}; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'init_from': + data.init_from = child.textContent; + break; + + } + + } + + return data; + + } + + parseEffectSampler( xml ) { + + const data = {}; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'source': + data.source = child.textContent; + break; + + } + + } + + return data; + + } + + parseEffectTechnique( xml ) { + + const data = {}; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'constant': + case 'lambert': + case 'blinn': + case 'phong': + data.type = child.nodeName; + data.parameters = this.parseEffectParameters( child ); + break; + + case 'extra': + data.extra = this.parseEffectExtra( child ); + break; + + } + + } + + return data; + + } + + parseEffectParameters( xml ) { + + const data = {}; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'emission': + case 'diffuse': + case 'specular': + case 'bump': + case 'ambient': + case 'shininess': + case 'transparency': + data[ child.nodeName ] = this.parseEffectParameter( child ); + break; + case 'transparent': + data[ child.nodeName ] = { + opaque: child.hasAttribute( 'opaque' ) ? child.getAttribute( 'opaque' ) : 'A_ONE', + data: this.parseEffectParameter( child ) + }; + break; + + } + + } + + return data; + + } + + parseEffectParameter( xml ) { + + const data = {}; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'color': + data[ child.nodeName ] = parseFloats( child.textContent ); + break; + + case 'float': + data[ child.nodeName ] = parseFloat( child.textContent ); + break; + + case 'texture': + data[ child.nodeName ] = { id: child.getAttribute( 'texture' ), extra: this.parseEffectParameterTexture( child ) }; + break; + + } + + } + + return data; + + } + + parseEffectParameterTexture( xml ) { + + const data = { + technique: {} + }; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'extra': + this.parseEffectParameterTextureExtra( child, data ); + break; + + } + + } + + return data; + + } + + parseEffectParameterTextureExtra( xml, data ) { + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'technique': + this.parseEffectParameterTextureExtraTechnique( child, data ); + break; + + } + + } + + } + + parseEffectParameterTextureExtraTechnique( xml, data ) { + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'repeatU': + case 'repeatV': + case 'offsetU': + case 'offsetV': + data.technique[ child.nodeName ] = parseFloat( child.textContent ); + break; + + case 'wrapU': + case 'wrapV': + + // some files have values for wrapU/wrapV which become NaN via parseInt + + if ( child.textContent.toUpperCase() === 'TRUE' ) { + + data.technique[ child.nodeName ] = 1; + + } else if ( child.textContent.toUpperCase() === 'FALSE' ) { + + data.technique[ child.nodeName ] = 0; + + } else { + + data.technique[ child.nodeName ] = parseInt( child.textContent ); + + } + + break; + + case 'bump': + data[ child.nodeName ] = this.parseEffectExtraTechniqueBump( child ); + break; + + } + + } + + } + + parseEffectExtra( xml ) { + + const data = {}; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'technique': + data.technique = this.parseEffectExtraTechnique( child ); + break; + + } + + } + + return data; + + } + + parseEffectExtraTechnique( xml ) { + + const data = {}; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'double_sided': + data[ child.nodeName ] = parseInt( child.textContent ); + break; + + case 'bump': + data[ child.nodeName ] = this.parseEffectExtraTechniqueBump( child ); + break; + + } + + } + + return data; + + } + + parseEffectExtraTechniqueBump( xml ) { + + const data = {}; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'texture': + data[ child.nodeName ] = { id: child.getAttribute( 'texture' ), texcoord: child.getAttribute( 'texcoord' ), extra: this.parseEffectParameterTexture( child ) }; + break; + + } + + } + + return data; + + } + + // material + + parseMaterial( xml ) { + + const data = { + name: xml.getAttribute( 'name' ) + }; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'instance_effect': + data.url = parseId( child.getAttribute( 'url' ) ); + break; + + } + + } + + this.library.materials[ xml.getAttribute( 'id' ) ] = data; + + } + + // camera + + parseCamera( xml ) { + + const data = { + name: xml.getAttribute( 'name' ) + }; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'optics': + data.optics = this.parseCameraOptics( child ); + break; + + } + + } + + this.library.cameras[ xml.getAttribute( 'id' ) ] = data; + + } + + parseCameraOptics( xml ) { + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + switch ( child.nodeName ) { + + case 'technique_common': + return this.parseCameraTechnique( child ); + + } + + } + + return {}; + + } + + parseCameraTechnique( xml ) { + + const data = {}; + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + switch ( child.nodeName ) { + + case 'perspective': + case 'orthographic': + + data.technique = child.nodeName; + data.parameters = this.parseCameraParameters( child ); + + break; + + } + + } + + return data; + + } + + parseCameraParameters( xml ) { + + const data = {}; + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + switch ( child.nodeName ) { + + case 'xfov': + case 'yfov': + case 'xmag': + case 'ymag': + case 'znear': + case 'zfar': + case 'aspect_ratio': + data[ child.nodeName ] = parseFloat( child.textContent ); + break; + + } + + } + + return data; + + } + + // light + + parseLight( xml ) { + + let data = {}; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'technique_common': + data = this.parseLightTechnique( child ); + break; + + } + + } + + this.library.lights[ xml.getAttribute( 'id' ) ] = data; + + } + + parseLightTechnique( xml ) { + + const data = {}; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'directional': + case 'point': + case 'spot': + case 'ambient': + + data.technique = child.nodeName; + data.parameters = this.parseLightParameters( child ); + break; + + } + + } + + return data; + + } + + parseLightParameters( xml ) { + + const data = {}; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'color': + const array = parseFloats( child.textContent ); + data.color = new Color().fromArray( array ); + ColorManagement.colorSpaceToWorking( data.color, SRGBColorSpace ); + break; + + case 'falloff_angle': + data.falloffAngle = parseFloat( child.textContent ); + break; + + case 'quadratic_attenuation': + const f = parseFloat( child.textContent ); + data.distance = f ? Math.sqrt( 1 / f ) : 0; + break; + + } + + } + + return data; + + } + + // geometry + + parseGeometry( xml ) { + + const data = { + name: xml.getAttribute( 'name' ), + sources: {}, + vertices: {}, + primitives: [] + }; + + const mesh = getElementsByTagName( xml, 'mesh' )[ 0 ]; + + // the following tags inside geometry are not supported yet (see https://github.com/mrdoob/three.js/pull/12606): convex_mesh, spline, brep + if ( mesh === undefined ) return; + + for ( let i = 0; i < mesh.childNodes.length; i ++ ) { + + const child = mesh.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + const id = child.getAttribute( 'id' ); + + switch ( child.nodeName ) { + + case 'source': + data.sources[ id ] = this.parseSource( child ); + break; + + case 'vertices': + // data.sources[ id ] = data.sources[ parseId( getElementsByTagName( child, 'input' )[ 0 ].getAttribute( 'source' ) ) ]; + data.vertices = this.parseGeometryVertices( child ); + break; + + case 'polygons': + console.warn( 'THREE.ColladaLoader: Unsupported primitive type: ', child.nodeName ); + break; + + case 'lines': + case 'linestrips': + case 'polylist': + case 'triangles': + data.primitives.push( this.parseGeometryPrimitive( child ) ); + break; + + default: + + } + + } + + this.library.geometries[ xml.getAttribute( 'id' ) ] = data; + + } + + parseSource( xml ) { + + const data = { + array: [], + stride: 3 + }; + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'float_array': + data.array = parseFloats( child.textContent ); + break; + + case 'Name_array': + data.array = parseStrings( child.textContent ); + break; + + case 'technique_common': + const accessor = getElementsByTagName( child, 'accessor' )[ 0 ]; + + if ( accessor !== undefined ) { + + data.stride = parseInt( accessor.getAttribute( 'stride' ) ); + + } + + break; + + } + + } + + return data; + + } + + parseGeometryVertices( xml ) { + + const data = {}; + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + data[ child.getAttribute( 'semantic' ) ] = parseId( child.getAttribute( 'source' ) ); + + } + + return data; + + } + + parseGeometryPrimitive( xml ) { + + const primitive = { + type: xml.nodeName, + material: xml.getAttribute( 'material' ), + count: parseInt( xml.getAttribute( 'count' ) ), + inputs: {}, + stride: 0, + hasUV: false + }; + + for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'input': + const id = parseId( child.getAttribute( 'source' ) ); + const semantic = child.getAttribute( 'semantic' ); + const offset = parseInt( child.getAttribute( 'offset' ) ); + const set = parseInt( child.getAttribute( 'set' ) ); + const inputname = ( set > 0 ? semantic + set : semantic ); + primitive.inputs[ inputname ] = { id: id, offset: offset }; + primitive.stride = Math.max( primitive.stride, offset + 1 ); + if ( semantic === 'TEXCOORD' ) primitive.hasUV = true; + break; + + case 'vcount': + primitive.vcount = parseInts( child.textContent ); + break; + + case 'p': + primitive.p = parseInts( child.textContent ); + break; + + } + + } + + return primitive; + + } + + // kinematics + + parseKinematicsModel( xml ) { + + const data = { + name: xml.getAttribute( 'name' ) || '', + joints: {}, + links: [] + }; + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'technique_common': + this.parseKinematicsTechniqueCommon( child, data ); + break; + + } + + } + + this.library.kinematicsModels[ xml.getAttribute( 'id' ) ] = data; + + } + + parseKinematicsTechniqueCommon( xml, data ) { + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'joint': + data.joints[ child.getAttribute( 'sid' ) ] = this.parseKinematicsJoint( child ); + break; + + case 'link': + data.links.push( this.parseKinematicsLink( child ) ); + break; + + } + + } + + } + + parseKinematicsJoint( xml ) { + + let data; + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'prismatic': + case 'revolute': + data = this.parseKinematicsJointParameter( child ); + break; + + } + + } + + return data; + + } + + parseKinematicsJointParameter( xml ) { + + const data = { + sid: xml.getAttribute( 'sid' ), + name: xml.getAttribute( 'name' ) || '', + axis: new Vector3(), + limits: { + min: 0, + max: 0 + }, + type: xml.nodeName, + static: false, + zeroPosition: 0, + middlePosition: 0 + }; + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'axis': + const array = parseFloats( child.textContent ); + data.axis.fromArray( array ); + break; + case 'limits': + const max = child.getElementsByTagName( 'max' )[ 0 ]; + const min = child.getElementsByTagName( 'min' )[ 0 ]; + + data.limits.max = parseFloat( max.textContent ); + data.limits.min = parseFloat( min.textContent ); + break; + + } + + } + + // if min is equal to or greater than max, consider the joint static + + if ( data.limits.min >= data.limits.max ) { + + data.static = true; + + } + + // calculate middle position + + data.middlePosition = ( data.limits.min + data.limits.max ) / 2.0; + + return data; + + } + + parseKinematicsLink( xml ) { + + const data = { + sid: xml.getAttribute( 'sid' ), + name: xml.getAttribute( 'name' ) || '', + attachments: [], + transforms: [] + }; + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'attachment_full': + data.attachments.push( this.parseKinematicsAttachment( child ) ); + break; + + case 'matrix': + case 'translate': + case 'rotate': + data.transforms.push( this.parseKinematicsTransform( child ) ); + break; + + } + + } + + return data; + + } + + parseKinematicsAttachment( xml ) { + + const data = { + joint: xml.getAttribute( 'joint' ).split( '/' ).pop(), + transforms: [], + links: [] + }; + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'link': + data.links.push( this.parseKinematicsLink( child ) ); + break; + + case 'matrix': + case 'translate': + case 'rotate': + data.transforms.push( this.parseKinematicsTransform( child ) ); + break; + + } + + } + + return data; + + } + + parseKinematicsTransform( xml ) { + + const data = { + type: xml.nodeName + }; + + const array = parseFloats( xml.textContent ); + + switch ( data.type ) { + + case 'matrix': + data.obj = new Matrix4(); + data.obj.fromArray( array ).transpose(); + break; + + case 'translate': + data.obj = new Vector3(); + data.obj.fromArray( array ); + break; + + case 'rotate': + data.obj = new Vector3(); + data.obj.fromArray( array ); + data.angle = MathUtils.degToRad( array[ 3 ] ); + break; + + } + + return data; + + } + + // physics + + parsePhysicsModel( xml ) { + + const data = { + name: xml.getAttribute( 'name' ) || '', + rigidBodies: {} + }; + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'rigid_body': + data.rigidBodies[ child.getAttribute( 'name' ) ] = {}; + this.parsePhysicsRigidBody( child, data.rigidBodies[ child.getAttribute( 'name' ) ] ); + break; + + } + + } + + this.library.physicsModels[ xml.getAttribute( 'id' ) ] = data; + + } + + parsePhysicsRigidBody( xml, data ) { + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'technique_common': + this.parsePhysicsTechniqueCommon( child, data ); + break; + + } + + } + + } + + parsePhysicsTechniqueCommon( xml, data ) { + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'inertia': + data.inertia = parseFloats( child.textContent ); + break; + + case 'mass': + data.mass = parseFloats( child.textContent )[ 0 ]; + break; + + } + + } + + } + + // scene + + parseKinematicsScene( xml ) { + + const data = { + bindJointAxis: [] + }; + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'bind_joint_axis': + data.bindJointAxis.push( this.parseKinematicsBindJointAxis( child ) ); + break; + + } + + } + + this.library.kinematicsScenes[ parseId( xml.getAttribute( 'url' ) ) ] = data; + + } + + parseKinematicsBindJointAxis( xml ) { + + const data = { + target: xml.getAttribute( 'target' ).split( '/' ).pop() + }; + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'axis': + const param = child.getElementsByTagName( 'param' )[ 0 ]; + data.axis = param.textContent; + const tmpJointIndex = data.axis.split( 'inst_' ).pop().split( 'axis' )[ 0 ]; + data.jointIndex = tmpJointIndex.substring( 0, tmpJointIndex.length - 1 ); + break; + + } + + } + + return data; + + } + + // nodes + + prepareNodes( xml ) { + + const elements = xml.getElementsByTagName( 'node' ); + + // ensure all node elements have id attributes + + for ( let i = 0; i < elements.length; i ++ ) { + + const element = elements[ i ]; + + if ( element.hasAttribute( 'id' ) === false ) { + + element.setAttribute( 'id', this.generateId() ); + + } + + } + + } + + parseNode( xml ) { + + const matrix = new Matrix4(); + const vector = new Vector3(); + + const data = { + name: xml.getAttribute( 'name' ) || '', + type: xml.getAttribute( 'type' ), + id: xml.getAttribute( 'id' ), + sid: xml.getAttribute( 'sid' ), + matrix: new Matrix4(), + nodes: [], + instanceCameras: [], + instanceControllers: [], + instanceLights: [], + instanceGeometries: [], + instanceNodes: [], + transforms: {} + }; + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + let array; + + switch ( child.nodeName ) { + + case 'node': + data.nodes.push( child.getAttribute( 'id' ) ); + this.parseNode( child ); + break; + + case 'instance_camera': + data.instanceCameras.push( parseId( child.getAttribute( 'url' ) ) ); + break; + + case 'instance_controller': + data.instanceControllers.push( this.parseNodeInstance( child ) ); + break; + + case 'instance_light': + data.instanceLights.push( parseId( child.getAttribute( 'url' ) ) ); + break; + + case 'instance_geometry': + data.instanceGeometries.push( this.parseNodeInstance( child ) ); + break; + + case 'instance_node': + data.instanceNodes.push( parseId( child.getAttribute( 'url' ) ) ); + break; + + case 'matrix': + array = parseFloats( child.textContent ); + data.matrix.multiply( matrix.fromArray( array ).transpose() ); + data.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName; + break; + + case 'translate': + array = parseFloats( child.textContent ); + vector.fromArray( array ); + data.matrix.multiply( matrix.makeTranslation( vector.x, vector.y, vector.z ) ); + data.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName; + break; + + case 'rotate': + array = parseFloats( child.textContent ); + const angle = MathUtils.degToRad( array[ 3 ] ); + data.matrix.multiply( matrix.makeRotationAxis( vector.fromArray( array ), angle ) ); + data.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName; + break; + + case 'scale': + array = parseFloats( child.textContent ); + data.matrix.scale( vector.fromArray( array ) ); + data.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName; + break; + + case 'extra': + break; + + default: + + } + + } + + if ( this.hasNode( data.id ) ) { + + console.warn( 'THREE.ColladaLoader: There is already a node with ID %s. Exclude current node from further processing.', data.id ); + + } else { + + this.library.nodes[ data.id ] = data; + + } + + return data; + + } + + parseNodeInstance( xml ) { + + const data = { + id: parseId( xml.getAttribute( 'url' ) ), + materials: {}, + skeletons: [] + }; + + for ( let i = 0; i < xml.childNodes.length; i ++ ) { + + const child = xml.childNodes[ i ]; + + switch ( child.nodeName ) { + + case 'bind_material': + const instances = child.getElementsByTagName( 'instance_material' ); + + for ( let j = 0; j < instances.length; j ++ ) { + + const instance = instances[ j ]; + const symbol = instance.getAttribute( 'symbol' ); + const target = instance.getAttribute( 'target' ); + + data.materials[ symbol ] = parseId( target ); + + } + + break; + + case 'skeleton': + data.skeletons.push( parseId( child.textContent ) ); + break; + + default: + break; + + } + + } + + return data; + + } + + // visual scenes + + parseVisualScene( xml ) { + + const data = { + name: xml.getAttribute( 'name' ), + children: [] + }; + + this.prepareNodes( xml ); + + const elements = getElementsByTagName( xml, 'node' ); + + for ( let i = 0; i < elements.length; i ++ ) { + + data.children.push( this.parseNode( elements[ i ] ) ); + + } + + this.library.visualScenes[ xml.getAttribute( 'id' ) ] = data; + + } + + hasNode( id ) { + + return this.library.nodes[ id ] !== undefined; + + } + +} + +export { ColladaParser, getElementsByTagName, parseStrings, parseFloats, parseInts, parseId };