From b8b37cdf4fd1bd0d920c99d956c176703dd9ac44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E7=82=B3=E6=9D=83?= <695601626@qq.com> Date: Sun, 11 Jan 2026 16:39:35 +0800 Subject: [PATCH 1/5] examples: jolt-physics@1.0.0 (#32711) --- examples/jsm/physics/JoltPhysics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/jsm/physics/JoltPhysics.js b/examples/jsm/physics/JoltPhysics.js index e406a2385341a8..d21a5871a3448e 100644 --- a/examples/jsm/physics/JoltPhysics.js +++ b/examples/jsm/physics/JoltPhysics.js @@ -1,6 +1,6 @@ import { Clock, Vector3, Quaternion, Matrix4 } from 'three'; -const JOLT_PATH = 'https://cdn.jsdelivr.net/npm/jolt-physics@0.23.0/dist/jolt-physics.wasm-compat.js'; +const JOLT_PATH = 'https://cdn.jsdelivr.net/npm/jolt-physics@1.0.0/dist/jolt-physics.wasm-compat.js'; const frameRate = 60; From fbdbb63fe8854fcee4d5a357499cf877d345ee4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E7=82=B3=E6=9D=83?= <695601626@qq.com> Date: Sun, 11 Jan 2026 16:41:53 +0800 Subject: [PATCH 2/5] Editor: use ES6 const/let for `app.js` (#32712) --- editor/js/libs/app.js | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/editor/js/libs/app.js b/editor/js/libs/app.js index c99837dc668af6..7ff6a4336f1f0d 100644 --- a/editor/js/libs/app.js +++ b/editor/js/libs/app.js @@ -1,16 +1,16 @@ -var APP = { +const APP = { Player: function () { - var renderer = new THREE.WebGLRenderer( { antialias: true } ); + const renderer = new THREE.WebGLRenderer( { antialias: true } ); renderer.setPixelRatio( window.devicePixelRatio ); // TODO: Use player.setPixelRatio() - var loader = new THREE.ObjectLoader(); - var camera, scene; + const loader = new THREE.ObjectLoader(); + let camera, scene; - var events = {}; + let events = {}; - var dom = document.createElement( 'div' ); + const dom = document.createElement( 'div' ); dom.appendChild( renderer.domElement ); this.dom = dom; @@ -21,7 +21,7 @@ var APP = { this.load = function ( json ) { - var project = json.project; + const project = json.project; if ( project.shadows !== undefined ) renderer.shadowMap.enabled = project.shadows; if ( project.shadowType !== undefined ) renderer.shadowMap.type = project.shadowType; @@ -43,8 +43,8 @@ var APP = { update: [] }; - var scriptWrapParams = 'player,renderer,scene,camera'; - var scriptWrapResultObj = {}; + let scriptWrapParams = 'player,renderer,scene,camera'; + const scriptWrapResultObj = {}; for ( var eventKey in events ) { @@ -53,11 +53,11 @@ var APP = { } - var scriptWrapResult = JSON.stringify( scriptWrapResultObj ).replace( /\"/g, '' ); + const scriptWrapResult = JSON.stringify( scriptWrapResultObj ).replace( /\"/g, '' ); - for ( var uuid in json.scripts ) { + for ( let uuid in json.scripts ) { - var object = scene.getObjectByProperty( 'uuid', uuid, true ); + const object = scene.getObjectByProperty( 'uuid', uuid, true ); if ( object === undefined ) { @@ -66,15 +66,15 @@ var APP = { } - var scripts = json.scripts[ uuid ]; + const scripts = json.scripts[ uuid ]; - for ( var i = 0; i < scripts.length; i ++ ) { + for ( let i = 0; i < scripts.length; i ++ ) { - var script = scripts[ i ]; + const script = scripts[ i ]; - var functions = ( new Function( scriptWrapParams, script.source + '\nreturn ' + scriptWrapResult + ';' ).bind( object ) )( this, renderer, scene, camera ); + const functions = ( new Function( scriptWrapParams, script.source + '\nreturn ' + scriptWrapResult + ';' ).bind( object ) )( this, renderer, scene, camera ); - for ( var name in functions ) { + for ( let name in functions ) { if ( functions[ name ] === undefined ) continue; @@ -135,7 +135,7 @@ var APP = { function dispatch( array, event ) { - for ( var i = 0, l = array.length; i < l; i ++ ) { + for ( let i = 0, l = array.length; i < l; i ++ ) { array[ i ]( event ); @@ -143,7 +143,7 @@ var APP = { } - var time, startTime, prevTime; + let time, startTime, prevTime; function animate() { From 49fef3976229e339458de5464a68ac06e0f8ed1d Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Sun, 11 Jan 2026 09:46:47 +0100 Subject: [PATCH 3/5] Renderer: Shadow map improvements. (#32705) --- .../webgpu_postprocessing_outline.jpg | Bin 56018 -> 26153 bytes examples/screenshots/webgpu_shadowmap_csm.jpg | Bin 41470 -> 21953 bytes .../screenshots/webgpu_shadowmap_opacity.jpg | Bin 97496 -> 46337 bytes examples/webgpu_postprocessing_outline.html | 1 - examples/webgpu_postprocessing_sss.html | 1 - examples/webgpu_shadowmap.html | 2 -- examples/webgpu_shadowmap_csm.html | 1 - examples/webgpu_shadowmap_opacity.html | 1 - src/nodes/lighting/PointShadowNode.js | 21 ++++++------ src/nodes/lighting/ShadowFilterNode.js | 32 ++---------------- src/nodes/lighting/ShadowNode.js | 18 ++++++++-- src/renderers/common/Renderer.js | 14 ++++++-- .../shadowmap_pars_fragment.glsl.js | 22 +++++++----- .../webgl-fallback/nodes/GLSLNodeBuilder.js | 6 ++-- 14 files changed, 57 insertions(+), 62 deletions(-) diff --git a/examples/screenshots/webgpu_postprocessing_outline.jpg b/examples/screenshots/webgpu_postprocessing_outline.jpg index c09d12dedf1943e9e376bb939db17843f8440574..c05437e71226a9e3f08587bb02c5771378212237 100644 GIT binary patch literal 26153 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 diff --git a/examples/screenshots/webgpu_shadowmap_csm.jpg b/examples/screenshots/webgpu_shadowmap_csm.jpg index 8674c524948d1c461a8bb7286c2b651d27588430..7502b71d6b84df4ed2457eaada9673bdd7e68d0d 100644 GIT binary patch literal 21953 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

vi%cB?uzZfOe|wO%p@6> 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 NfcF3Sm%zS_{}&raCa?ei diff --git a/examples/screenshots/webgpu_shadowmap_opacity.jpg b/examples/screenshots/webgpu_shadowmap_opacity.jpg index 16450768c6b59331bb32aabe8bd5cbccf3f84bbc..4ee4da268f26b4649f2d34aae8c4a7948a0c5723 100644 GIT binary patch literal 46337 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 A;s5{u literal 97496 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

(h$epy{zumH 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

nf)n{4h0 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 diff --git a/examples/webgpu_postprocessing_outline.html b/examples/webgpu_postprocessing_outline.html index f389053b6c1330..bb962bee6de1ea 100644 --- a/examples/webgpu_postprocessing_outline.html +++ b/examples/webgpu_postprocessing_outline.html @@ -87,7 +87,6 @@ light.castShadow = true; light.shadow.mapSize.width = 2048; light.shadow.mapSize.height = 2048; - light.shadow.bias = - 0.005; const d = 10; diff --git a/examples/webgpu_postprocessing_sss.html b/examples/webgpu_postprocessing_sss.html index c5c468ddba03c9..fd6ab9321188df 100644 --- a/examples/webgpu_postprocessing_sss.html +++ b/examples/webgpu_postprocessing_sss.html @@ -73,7 +73,6 @@ dirLight.shadow.camera.right = 4; dirLight.shadow.camera.near = 0.1; dirLight.shadow.camera.far = 40; - dirLight.shadow.bias = - 0.001; dirLight.shadow.mapSize.width = 1024; dirLight.shadow.mapSize.height = 1024; scene.add( dirLight ); diff --git a/examples/webgpu_shadowmap.html b/examples/webgpu_shadowmap.html index 6c59f307325404..cb12078980cd39 100644 --- a/examples/webgpu_shadowmap.html +++ b/examples/webgpu_shadowmap.html @@ -68,7 +68,6 @@ spotLight.shadow.camera.far = 200; spotLight.shadow.mapSize.width = 2048; spotLight.shadow.mapSize.height = 2048; - spotLight.shadow.bias = - 0.002; spotLight.shadow.radius = 4; scene.add( spotLight ); @@ -85,7 +84,6 @@ dirLight.shadow.mapSize.width = 2048; dirLight.shadow.mapSize.height = 2048; dirLight.shadow.radius = 4; - dirLight.shadow.bias = - 0.0005; dirGroup = new THREE.Group(); dirGroup.add( dirLight ); diff --git a/examples/webgpu_shadowmap_csm.html b/examples/webgpu_shadowmap_csm.html index 73e4f452ca1548..4c59a5a9e4d183 100644 --- a/examples/webgpu_shadowmap_csm.html +++ b/examples/webgpu_shadowmap_csm.html @@ -126,7 +126,6 @@ csmDirectionalLight.shadow.camera.bottom = - 1000; csmDirectionalLight.shadow.camera.left = - 1000; csmDirectionalLight.shadow.camera.right = 1000; - csmDirectionalLight.shadow.bias = - 0.001; csm = new CSMShadowNode( csmDirectionalLight, { cascades: 4, maxFar: params.maxFar, mode: params.mode } ); diff --git a/examples/webgpu_shadowmap_opacity.html b/examples/webgpu_shadowmap_opacity.html index b7aa881b333268..2b3ae51971c8a5 100644 --- a/examples/webgpu_shadowmap_opacity.html +++ b/examples/webgpu_shadowmap_opacity.html @@ -83,7 +83,6 @@ dirLight.shadow.mapSize.width = 2048; dirLight.shadow.mapSize.height = 2048; dirLight.shadow.radius = 4; - dirLight.shadow.bias = - 0.0005; dirLight.shadow.autoUpdate = false; dirLight.shadow.needsUpdate = true; diff --git a/src/nodes/lighting/PointShadowNode.js b/src/nodes/lighting/PointShadowNode.js index 45334a7a93a036..1d3ec51802d03d 100644 --- a/src/nodes/lighting/PointShadowNode.js +++ b/src/nodes/lighting/PointShadowNode.js @@ -7,11 +7,12 @@ import { renderGroup } from '../core/UniformGroupNode.js'; import { Matrix4 } from '../../math/Matrix4.js'; import { Vector3 } from '../../math/Vector3.js'; import { Color } from '../../math/Color.js'; -import { BasicShadowMap, LessCompare, WebGPUCoordinateSystem } from '../../constants.js'; +import { BasicShadowMap, LessEqualCompare, WebGPUCoordinateSystem } from '../../constants.js'; import { CubeDepthTexture } from '../../textures/CubeDepthTexture.js'; import { screenCoordinate } from '../display/ScreenNode.js'; import { interleavedGradientNoise, vogelDiskSample } from '../utils/PostProcessingUtils.js'; import { abs, normalize, cross } from '../math/MathNode.js'; +import { viewZToPerspectiveDepth } from '../display/ViewportDepthNode.js'; const _clearColor = /*@__PURE__*/ new Color(); const _projScreenMatrix = /*@__PURE__*/ new Matrix4(); @@ -97,23 +98,23 @@ const pointShadowFilter = /*@__PURE__*/ Fn( ( { filterFn, depthTexture, shadowCo // for point lights, the uniform @vShadowCoord is re-purposed to hold // the vector from the light to the world-space position of the fragment. - const lightToPosition = shadowCoord.xyz.toVar(); - const lightToPositionLength = lightToPosition.length(); + const shadowPosition = shadowCoord.xyz.toConst(); + const shadowPositionAbs = shadowPosition.abs().toConst(); + const viewZ = shadowPositionAbs.x.max( shadowPositionAbs.y ).max( shadowPositionAbs.z ); - const cameraNearLocal = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.near ); - const cameraFarLocal = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.far ); + const shadowCameraNear = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.near ); + const shadowCameraFar = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.far ); const bias = reference( 'bias', 'float', shadow ).setGroup( renderGroup ); const result = float( 1.0 ).toVar(); - If( lightToPositionLength.sub( cameraFarLocal ).lessThanEqual( 0.0 ).and( lightToPositionLength.sub( cameraNearLocal ).greaterThanEqual( 0.0 ) ), () => { + If( viewZ.sub( shadowCameraFar ).lessThanEqual( 0.0 ).and( viewZ.sub( shadowCameraNear ).greaterThanEqual( 0.0 ) ), () => { - // dp = normalized distance from light to fragment position - const dp = lightToPositionLength.sub( cameraNearLocal ).div( cameraFarLocal.sub( cameraNearLocal ) ).toVar(); // need to clamp? + const dp = viewZToPerspectiveDepth( viewZ.negate(), shadowCameraNear, shadowCameraFar ); dp.addAssign( bias ); // bd3D = base direction 3D (direction from light to fragment) - const bd3D = lightToPosition.normalize(); + const bd3D = shadowPosition.normalize(); // percentage-closer filtering using cube texture sampling result.assign( filterFn( { depthTexture, bd3D, dp, shadow } ) ); @@ -205,7 +206,7 @@ class PointShadowNode extends ShadowNode { const depthTexture = new CubeDepthTexture( shadow.mapSize.width ); depthTexture.name = 'PointShadowDepthTexture'; - depthTexture.compareFunction = LessCompare; + depthTexture.compareFunction = LessEqualCompare; const shadowMap = builder.createCubeRenderTarget( shadow.mapSize.width ); shadowMap.texture.name = 'PointShadowMap'; diff --git a/src/nodes/lighting/ShadowFilterNode.js b/src/nodes/lighting/ShadowFilterNode.js index b41f42dc754dff..4773cab1ef58af 100644 --- a/src/nodes/lighting/ShadowFilterNode.js +++ b/src/nodes/lighting/ShadowFilterNode.js @@ -5,10 +5,9 @@ import { mix, fract, step, max, clamp } from '../math/MathNode.js'; import { add, sub } from '../math/OperatorNode.js'; import { renderGroup } from '../core/UniformGroupNode.js'; import NodeMaterial from '../../materials/nodes/NodeMaterial.js'; -import { objectPosition } from '../accessors/Object3DNode.js'; -import { positionWorld } from '../accessors/Position.js'; import { screenCoordinate } from '../display/ScreenNode.js'; import { interleavedGradientNoise, vogelDiskSample } from '../utils/PostProcessingUtils.js'; +import { NoBlending } from '../../constants.js'; const shadowMaterialLib = /*@__PURE__*/ new WeakMap(); @@ -211,31 +210,6 @@ export const VSMShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, } ); -// - -const linearDistance = /*@__PURE__*/ Fn( ( [ position, cameraNear, cameraFar ] ) => { - - let dist = positionWorld.sub( position ).length(); - dist = dist.sub( cameraNear ).div( cameraFar.sub( cameraNear ) ); - dist = dist.saturate(); // clamp to [ 0, 1 ] - - return dist; - -} ); - -const linearShadowDistance = ( light ) => { - - const camera = light.shadow.camera; - - const nearDistance = reference( 'near', 'float', camera ).setGroup( renderGroup ); - const farDistance = reference( 'far', 'float', camera ).setGroup( renderGroup ); - - const referencePosition = objectPosition( light ); - - return linearDistance( referencePosition, nearDistance, farDistance ); - -}; - /** * Retrieves or creates a shadow material for the given light source. * @@ -256,13 +230,11 @@ export const getShadowMaterial = ( light ) => { if ( material === undefined ) { - const depthNode = light.isPointLight ? linearShadowDistance( light ) : null; - material = new NodeMaterial(); material.colorNode = vec4( 0, 0, 0, 1 ); - material.depthNode = depthNode; material.isShadowPassMaterial = true; // Use to avoid other overrideMaterial override material.colorNode unintentionally when using material.shadowNode material.name = 'ShadowMaterial'; + material.blending = NoBlending; material.fog = false; shadowMaterialLib.set( light, material ); diff --git a/src/nodes/lighting/ShadowNode.js b/src/nodes/lighting/ShadowNode.js index 964c2aed00ba8f..a402cc09818a74 100644 --- a/src/nodes/lighting/ShadowNode.js +++ b/src/nodes/lighting/ShadowNode.js @@ -11,7 +11,7 @@ import NodeMaterial from '../../materials/nodes/NodeMaterial.js'; import QuadMesh from '../../renderers/common/QuadMesh.js'; import { Loop } from '../utils/LoopNode.js'; import { screenCoordinate } from '../display/ScreenNode.js'; -import { HalfFloatType, LessCompare, RGFormat, VSMShadowMap, WebGPUCoordinateSystem } from '../../constants.js'; +import { HalfFloatType, LessEqualCompare, LinearFilter, NearestFilter, PCFShadowMap, PCFSoftShadowMap, RGFormat, VSMShadowMap, WebGPUCoordinateSystem } from '../../constants.js'; import { renderGroup } from '../core/UniformGroupNode.js'; import { viewZToLogarithmicDepth } from '../display/ViewportDepthNode.js'; import { lightShadowMatrix } from '../accessors/Lights.js'; @@ -400,7 +400,7 @@ class ShadowNode extends ShadowBaseNode { const depthTexture = new DepthTexture( shadow.mapSize.width, shadow.mapSize.height ); depthTexture.name = 'ShadowDepthTexture'; - depthTexture.compareFunction = LessCompare; + depthTexture.compareFunction = LessEqualCompare; const shadowMap = builder.createRenderTarget( shadow.mapSize.width, shadow.mapSize.height ); shadowMap.texture.name = 'ShadowMap'; @@ -423,9 +423,21 @@ class ShadowNode extends ShadowBaseNode { const { light, shadow } = this; + const { depthTexture, shadowMap } = this.setupRenderTarget( shadow, builder ); + const shadowMapType = renderer.shadowMap.type; - const { depthTexture, shadowMap } = this.setupRenderTarget( shadow, builder ); + if ( shadowMapType === PCFShadowMap || shadowMapType === PCFSoftShadowMap ) { + + depthTexture.minFilter = LinearFilter; + depthTexture.magFilter = LinearFilter; + + } else { + + depthTexture.minFilter = NearestFilter; + depthTexture.magFilter = NearestFilter; + + } shadow.camera.coordinateSystem = camera.coordinateSystem; shadow.camera.updateProjectionMatrix(); diff --git a/src/renderers/common/Renderer.js b/src/renderers/common/Renderer.js index 7227d2c92cf833..e689a252fe9a7b 100644 --- a/src/renderers/common/Renderer.js +++ b/src/renderers/common/Renderer.js @@ -30,7 +30,7 @@ import { Matrix4 } from '../../math/Matrix4.js'; import { Vector2 } from '../../math/Vector2.js'; import { Vector4 } from '../../math/Vector4.js'; import { RenderTarget } from '../../core/RenderTarget.js'; -import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping, LinearFilter, HalfFloatType, RGBAFormat, PCFShadowMap } from '../../constants.js'; +import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping, LinearFilter, HalfFloatType, RGBAFormat, PCFShadowMap, VSMShadowMap } from '../../constants.js'; import { float, vec3, vec4, Fn } from '../../nodes/tsl/TSLCore.js'; import { reference } from '../../nodes/accessors/ReferenceNode.js'; @@ -47,6 +47,8 @@ const _frustumArray = /*@__PURE__*/ new FrustumArray(); const _projScreenMatrix = /*@__PURE__*/ new Matrix4(); const _vector4 = /*@__PURE__*/ new Vector4(); +const _shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide }; + /** * Base class for renderers. */ @@ -3183,7 +3185,15 @@ class Renderer { const { colorNode, depthNode, positionNode } = this._getShadowNodes( material ); - overrideMaterial.side = material.shadowSide === null ? material.side : material.shadowSide; + if ( this.shadowMap.type === VSMShadowMap ) { + + overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side; + + } else { + + overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : _shadowSide[ material.side ]; + + } if ( colorNode !== null ) overrideMaterial.colorNode = colorNode; if ( depthNode !== null ) overrideMaterial.depthNode = depthNode; diff --git a/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js index ca97b9bfe434d1..1a41e209cc8ff9 100644 --- a/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js @@ -280,12 +280,18 @@ export default /* glsl */` // Use IGN to rotate sampling pattern per pixel float phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718; + vec2 sample0 = vogelDiskSample( 0, 5, phi ); + vec2 sample1 = vogelDiskSample( 1, 5, phi ); + vec2 sample2 = vogelDiskSample( 2, 5, phi ); + vec2 sample3 = vogelDiskSample( 3, 5, phi ); + vec2 sample4 = vogelDiskSample( 4, 5, phi ); + shadow = ( - texture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 0, 5, phi ).x + bitangent * vogelDiskSample( 0, 5, phi ).y ) * texelSize, dp ) ) + - texture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 1, 5, phi ).x + bitangent * vogelDiskSample( 1, 5, phi ).y ) * texelSize, dp ) ) + - texture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 2, 5, phi ).x + bitangent * vogelDiskSample( 2, 5, phi ).y ) * texelSize, dp ) ) + - texture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 3, 5, phi ).x + bitangent * vogelDiskSample( 3, 5, phi ).y ) * texelSize, dp ) ) + - texture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 4, 5, phi ).x + bitangent * vogelDiskSample( 4, 5, phi ).y ) * texelSize, dp ) ) + texture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) + + texture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) + + texture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) + + texture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) + + texture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) ) ) * 0.2; } @@ -304,9 +310,6 @@ export default /* glsl */` // the vector from the light to the world-space position of the fragment. vec3 lightToPosition = shadowCoord.xyz; - // Direction from light to fragment - vec3 bd3D = normalize( lightToPosition ); - // For cube shadow maps, depth is stored as distance along each face's view axis, not radial distance // The view-space depth is the maximum component of the direction vector (which face is sampled) vec3 absVec = abs( lightToPosition ); @@ -319,6 +322,9 @@ export default /* glsl */` float dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) ); dp += shadowBias; + // Direction from light to fragment + vec3 bd3D = normalize( lightToPosition ); + float depth = textureCube( shadowMap, bd3D ).r; #ifdef USE_REVERSED_DEPTH_BUFFER diff --git a/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js b/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js index bbe4917eda200b..c9f27782a181ee 100644 --- a/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +++ b/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js @@ -69,9 +69,9 @@ precision highp isampler3D; precision highp isamplerCube; precision highp isampler2DArray; -precision lowp sampler2DShadow; -precision lowp sampler2DArrayShadow; -precision lowp samplerCubeShadow; +precision highp sampler2DShadow; +precision highp sampler2DArrayShadow; +precision highp samplerCubeShadow; `; /** From 054e34e2daa240765dd0b2f35caf51bb5ae29b15 Mon Sep 17 00:00:00 2001 From: Mugen87 Date: Sun, 11 Jan 2026 09:47:28 +0100 Subject: [PATCH 4/5] Updated builds. --- build/three.cjs | 2 +- build/three.module.js | 2 +- build/three.module.min.js | 2 +- build/three.webgpu.js | 97 ++++++++++++++------------------- build/three.webgpu.min.js | 2 +- build/three.webgpu.nodes.js | 97 ++++++++++++++------------------- build/three.webgpu.nodes.min.js | 2 +- 7 files changed, 89 insertions(+), 115 deletions(-) diff --git a/build/three.cjs b/build/three.cjs index c0129b2a2d896c..e97417adc7029b 100644 --- a/build/three.cjs +++ b/build/three.cjs @@ -59588,7 +59588,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 ) * 6.28318530718;\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\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\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\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\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\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\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 ) * 6.28318530718;\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 0, 5, phi ).x + bitangent * vogelDiskSample( 0, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 1, 5, phi ).x + bitangent * vogelDiskSample( 1, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 2, 5, phi ).x + bitangent * vogelDiskSample( 2, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 3, 5, phi ).x + bitangent * vogelDiskSample( 3, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 4, 5, phi ).x + bitangent * vogelDiskSample( 4, 5, phi ).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 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\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadow = step( depth, dp );\n\t\t\t#else\n\t\t\t\tshadow = step( dp, depth );\n\t\t\t#endif\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 ) * 6.28318530718;\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\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\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\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\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\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\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 ) * 6.28318530718;\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\tshadow = step( depth, dp );\n\t\t\t#else\n\t\t\t\tshadow = step( dp, depth );\n\t\t\t#endif\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"; diff --git a/build/three.module.js b/build/three.module.js index 8abdc64beb8582..c494ac38894c25 100644 --- a/build/three.module.js +++ b/build/three.module.js @@ -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 ) * 6.28318530718;\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\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\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\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\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\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\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 ) * 6.28318530718;\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 0, 5, phi ).x + bitangent * vogelDiskSample( 0, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 1, 5, phi ).x + bitangent * vogelDiskSample( 1, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 2, 5, phi ).x + bitangent * vogelDiskSample( 2, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 3, 5, phi ).x + bitangent * vogelDiskSample( 3, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 4, 5, phi ).x + bitangent * vogelDiskSample( 4, 5, phi ).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 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\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadow = step( depth, dp );\n\t\t\t#else\n\t\t\t\tshadow = step( dp, depth );\n\t\t\t#endif\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 ) * 6.28318530718;\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\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\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\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\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\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\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 ) * 6.28318530718;\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\tshadow = step( depth, dp );\n\t\t\t#else\n\t\t\t\tshadow = step( dp, depth );\n\t\t\t#endif\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"; diff --git a/build/three.module.min.js b/build/three.module.min.js index 08028dc2df73f6..f9ec21310f21cc 100644 --- a/build/three.module.min.js +++ b/build/three.module.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2025 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 O,WebGLRenderTarget as F,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 Oe,ConstantColorFactor as Fe,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 Ot,RGBFormat as Ft,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 On}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 Fn(){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 ) * 6.28318530718;\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\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\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\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\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\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\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 ) * 6.28318530718;\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 0, 5, phi ).x + bitangent * vogelDiskSample( 0, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 1, 5, phi ).x + bitangent * vogelDiskSample( 1, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 2, 5, phi ).x + bitangent * vogelDiskSample( 2, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 3, 5, phi ).x + bitangent * vogelDiskSample( 3, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 4, 5, phi ).x + bitangent * vogelDiskSample( 4, 5, phi ).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 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\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadow = step( depth, dp );\n\t\t\t#else\n\t\t\t\tshadow = step( dp, depth );\n\t\t\t#endif\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:O,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 3.2: Transform view direction to hemisphere configuration\n\t\t\t\tvec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z));\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tfloat lensq = Vh.x * Vh.x + Vh.y * Vh.y;\n\t\t\t\tvec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(Vh, 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 + Vh.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)) * Vh;\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:O,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 F(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:O,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:O,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 Or(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 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=Or(o,n),o=Fr(o,n),s=Gr(s),s=Or(s,n),s=Fr(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!==O&&!0!==O.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===O?e.outputColorSpace:!0===O.isXRRenderTarget?O.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:F,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\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 F(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 F(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 F(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,F={};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},O={[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},F={[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,O[i.magFilter]),e.texParameteri(t,e.TEXTURE_MIN_FILTER,O[i.minFilter]),i.compareFunction&&(e.texParameteri(t,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(t,e.TEXTURE_COMPARE_FUNC,F[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 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){M=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 F(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 F(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||Fe.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 Fn;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 F(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&&Oe.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&&Oe.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 On(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_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 ) * 6.28318530718;\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\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\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\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\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\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\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 ) * 6.28318530718;\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\tshadow = step( depth, dp );\n\t\t\t#else\n\t\t\t\tshadow = step( dp, depth );\n\t\t\t#endif\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},zn=new u,kn=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)),zn.copy(n.backgroundRotation),zn.x*=-1,zn.y*=-1,zn.z*=-1,i.isCubeTexture&&!1===i.isRenderTargetTexture&&(zn.y*=-1,zn.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(kn.makeRotationFromEuler(zn)),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:O,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 3.2: Transform view direction to hemisphere configuration\n\t\t\t\tvec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z));\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tfloat lensq = Vh.x * Vh.x + Vh.y * Vh.y;\n\t\t\t\tvec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(Vh, 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 + Vh.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)) * Vh;\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:O,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 F(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:O,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:O,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 Or(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 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 zr(e){return e.replace(Wr,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(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=Or(o,n),o=Fr(o,n),s=Gr(s),s=Or(s,n),s=Fr(s,n),o=zr(o),s=zr(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!==O&&!0!==O.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===O?e.outputColorSpace:!0===O.isXRRenderTarget?O.texture.colorSpace:G,alphaToCoverage:!!o.alphaToCoverage,map:V,matcap:W,envMap:z,envMapMode:z&&R.mapping,envMapCubeUVHeight:b,aoMap:k,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:k&&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:F,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\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 F(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 F(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 F(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,F={};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 z(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},O={[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},F={[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,O[i.magFilter]),e.texParameteri(t,e.TEXTURE_MIN_FILTER,O[i.minFilter]),i.compareFunction&&(e.texParameteri(t,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(t,e.TEXTURE_COMPARE_FUNC,F[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 z(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?z(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?z(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 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){M=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 F(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 F(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),k.setContext(a),k.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!==z&&!0!==z.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===k;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!==k&&(k=i.id,x=!0);if(M||Y!==e){ve.buffers.depth.getReversed()&&!0!==e.reversedDepth&&(e._reversedDepth=!0,e.updateProjectionMatrix()),R.setValue(ze,"projectionMatrix",e.projectionMatrix),R.setValue(ze,"viewMatrix",e.matrixWorldInverse);const t=R.map.cameraPosition;void 0!==t&&t.setValue(ze,de.setFromMatrixPosition(e.matrixWorld)),ge.logarithmicDepthBuffer&&R.setValue(ze,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&R.setValue(ze,"isOrthographic",!0===e.isOrthographicCamera),Y!==e&&(Y=e,x=!0,A=!0)}g.needsLights&&(v.state.directionalShadowMap.length>0&&R.setValue(ze,"directionalShadowMap",v.state.directionalShadowMap,xe),v.state.spotShadowMap.length>0&&R.setValue(ze,"spotShadowMap",v.state.spotShadowMap,xe),v.state.pointShadowMap.length>0&&R.setValue(ze,"pointShadowMap",v.state.pointShadowMap,xe));if(r.isSkinnedMesh){R.setOptional(ze,r,"bindMatrix"),R.setOptional(ze,r,"bindMatrixInverse");const e=r.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),R.setValue(ze,"boneTexture",e.boneTexture,xe))}r.isBatchedMesh&&(R.setOptional(ze,r,"batchingTexture"),R.setValue(ze,"batchingTexture",r._matricesTexture,xe),R.setOptional(ze,r,"batchingIdTexture"),R.setValue(ze,"batchingIdTexture",r._indirectTexture,xe),R.setOptional(ze,r,"batchingColorTexture"),null!==r._colorsTexture&&R.setValue(ze,"batchingColorTexture",r._colorsTexture,xe));const C=n.morphAttributes;void 0===C.position&&void 0===C.normal&&void 0===C.color||Fe.update(r,n,T);(x||g.receiveShadow!==r.receiveShadow)&&(g.receiveShadow=r.receiveShadow,R.setValue(ze,"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(ze,"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(ze,lt(g),b,xe));var P,U;i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(Rr.upload(ze,lt(g),b,xe),i.uniformsNeedUpdate=!1);i.isSpriteMaterial&&R.setValue(ze,"center",r.center);if(R.setValue(ze,"modelViewMatrix",r.modelViewMatrix),R.setValue(ze,"normalMatrix",r.normalMatrix),R.setValue(ze,"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 Fn;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 F(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&&Oe.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&&Oe.render(e),it(P,e,t)}null!==z&&0===W&&(xe.updateMultisampleRenderTarget(z),xe.updateRenderTargetMipmap(z)),i&&w.end(N),!0===e.isScene&&e.onAfterRender(N,e,t),Ve.resetDefaultState(),k=-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 z},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=ze.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){z=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(ze.FRAMEBUFFER,o.__webglFramebuffer),K.copy(e.viewport),j.copy(e.scissor),q=e.scissorTest,ve.viewport(K),ve.scissor(j),ve.setScissorTest(q),void(k=-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(ze.FRAMEBUFFER,i)&&ve.drawBuffers(e,i),ve.viewport(K),ve.scissor(j),ve.setScissorTest(q),r){const i=Se.get(e.texture);ze.framebufferTexture2D(ze.FRAMEBUFFER,ze.COLOR_ATTACHMENT0,ze.TEXTURE_CUBE_MAP_POSITIVE_X+t,i.__webglTexture,n)}else if(a){const i=t;for(let t=0;t1&&ze.readBuffer(ze.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&&ze.readPixels(t,n,i,r,He.convert(l),He.convert(c),a)}finally{const e=null!==z?Se.get(z).__webglFramebuffer:null;ve.bindFramebuffer(ze.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(ze.FRAMEBUFFER,l);const o=e.textures[s],c=o.format,d=o.type;if(e.textures.length>1&&ze.readBuffer(ze.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=ze.createBuffer();ze.bindBuffer(ze.PIXEL_PACK_BUFFER,u),ze.bufferData(ze.PIXEL_PACK_BUFFER,a.byteLength,ze.STREAM_READ),ze.readPixels(t,n,i,r,He.convert(c),He.convert(d),0);const f=null!==z?Se.get(z).__webglFramebuffer:null;ve.bindFramebuffer(ze.FRAMEBUFFER,f);const p=ze.fenceSync(ze.SYNC_GPU_COMMANDS_COMPLETE,0);return ze.flush(),await On(ze,p,4),ze.bindBuffer(ze.PIXEL_PACK_BUFFER,u),ze.getBufferSubData(ze.PIXEL_PACK_BUFFER,0,a),ze.deleteBuffer(u),ze.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),ze.copyTexSubImage2D(ze.TEXTURE_2D,n,0,0,o,s,r,a),ve.unbindTexture()};const ut=ze.createFramebuffer(),pt=ze.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=ze.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(xe.setTexture2DArray(t,0),v=ze.TEXTURE_2D_ARRAY):(xe.setTexture2D(t,0),v=ze.TEXTURE_2D),ze.pixelStorei(ze.UNPACK_FLIP_Y_WEBGL,t.flipY),ze.pixelStorei(ze.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),ze.pixelStorei(ze.UNPACK_ALIGNMENT,t.unpackAlignment);const E=ze.getParameter(ze.UNPACK_ROW_LENGTH),S=ze.getParameter(ze.UNPACK_IMAGE_HEIGHT),T=ze.getParameter(ze.UNPACK_SKIP_PIXELS),M=ze.getParameter(ze.UNPACK_SKIP_ROWS),x=ze.getParameter(ze.UNPACK_SKIP_IMAGES);ze.pixelStorei(ze.UNPACK_ROW_LENGTH,h.width),ze.pixelStorei(ze.UNPACK_IMAGE_HEIGHT,h.height),ze.pixelStorei(ze.UNPACK_SKIP_PIXELS,c),ze.pixelStorei(ze.UNPACK_SKIP_ROWS,d),ze.pixelStorei(ze.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(ze.READ_FRAMEBUFFER,h.__webglFramebuffer),ve.bindFramebuffer(ze.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;n { - if ( builder.shaderStage === 'fragment' && builder.material.vertexNode ) { - - // reconstruct world position from view position - - return cameraWorldMatrix.mul( positionView ).xyz.toVar( 'positionWorld' ); - - } - return modelWorldMatrix.mul( positionLocal ).xyz.toVarying( builder.getSubBuildProperty( 'v_positionWorld' ) ); -}, 'vec3' ).once( [ 'POSITION', 'VERTEX' ] ) )(); +}, 'vec3' ).once( [ 'POSITION' ] ) )(); /** * TSL object that represents the position world direction of the current rendered object. @@ -43609,31 +43601,6 @@ const VSMShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, depthLa } ); -// - -const linearDistance = /*@__PURE__*/ Fn( ( [ position, cameraNear, cameraFar ] ) => { - - let dist = positionWorld.sub( position ).length(); - dist = dist.sub( cameraNear ).div( cameraFar.sub( cameraNear ) ); - dist = dist.saturate(); // clamp to [ 0, 1 ] - - return dist; - -} ); - -const linearShadowDistance = ( light ) => { - - const camera = light.shadow.camera; - - const nearDistance = reference( 'near', 'float', camera ).setGroup( renderGroup ); - const farDistance = reference( 'far', 'float', camera ).setGroup( renderGroup ); - - const referencePosition = objectPosition( light ); - - return linearDistance( referencePosition, nearDistance, farDistance ); - -}; - /** * Retrieves or creates a shadow material for the given light source. * @@ -43654,13 +43621,11 @@ const getShadowMaterial = ( light ) => { if ( material === undefined ) { - const depthNode = light.isPointLight ? linearShadowDistance( light ) : null; - material = new NodeMaterial(); material.colorNode = vec4( 0, 0, 0, 1 ); - material.depthNode = depthNode; material.isShadowPassMaterial = true; // Use to avoid other overrideMaterial override material.colorNode unintentionally when using material.shadowNode material.name = 'ShadowMaterial'; + material.blending = NoBlending; material.fog = false; shadowMaterialLib.set( light, material ); @@ -44067,7 +44032,7 @@ class ShadowNode extends ShadowBaseNode { const depthTexture = new DepthTexture( shadow.mapSize.width, shadow.mapSize.height ); depthTexture.name = 'ShadowDepthTexture'; - depthTexture.compareFunction = LessCompare; + depthTexture.compareFunction = LessEqualCompare; const shadowMap = builder.createRenderTarget( shadow.mapSize.width, shadow.mapSize.height ); shadowMap.texture.name = 'ShadowMap'; @@ -44090,9 +44055,21 @@ class ShadowNode extends ShadowBaseNode { const { light, shadow } = this; + const { depthTexture, shadowMap } = this.setupRenderTarget( shadow, builder ); + const shadowMapType = renderer.shadowMap.type; - const { depthTexture, shadowMap } = this.setupRenderTarget( shadow, builder ); + if ( shadowMapType === PCFShadowMap || shadowMapType === PCFSoftShadowMap ) { + + depthTexture.minFilter = LinearFilter; + depthTexture.magFilter = LinearFilter; + + } else { + + depthTexture.minFilter = NearestFilter; + depthTexture.magFilter = NearestFilter; + + } shadow.camera.coordinateSystem = camera.coordinateSystem; shadow.camera.updateProjectionMatrix(); @@ -44608,23 +44585,23 @@ const pointShadowFilter = /*@__PURE__*/ Fn( ( { filterFn, depthTexture, shadowCo // for point lights, the uniform @vShadowCoord is re-purposed to hold // the vector from the light to the world-space position of the fragment. - const lightToPosition = shadowCoord.xyz.toVar(); - const lightToPositionLength = lightToPosition.length(); + const shadowPosition = shadowCoord.xyz.toConst(); + const shadowPositionAbs = shadowPosition.abs().toConst(); + const viewZ = shadowPositionAbs.x.max( shadowPositionAbs.y ).max( shadowPositionAbs.z ); - const cameraNearLocal = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.near ); - const cameraFarLocal = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.far ); + const shadowCameraNear = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.near ); + const shadowCameraFar = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.far ); const bias = reference( 'bias', 'float', shadow ).setGroup( renderGroup ); const result = float( 1.0 ).toVar(); - If( lightToPositionLength.sub( cameraFarLocal ).lessThanEqual( 0.0 ).and( lightToPositionLength.sub( cameraNearLocal ).greaterThanEqual( 0.0 ) ), () => { + If( viewZ.sub( shadowCameraFar ).lessThanEqual( 0.0 ).and( viewZ.sub( shadowCameraNear ).greaterThanEqual( 0.0 ) ), () => { - // dp = normalized distance from light to fragment position - const dp = lightToPositionLength.sub( cameraNearLocal ).div( cameraFarLocal.sub( cameraNearLocal ) ).toVar(); // need to clamp? + const dp = viewZToPerspectiveDepth( viewZ.negate(), shadowCameraNear, shadowCameraFar ); dp.addAssign( bias ); // bd3D = base direction 3D (direction from light to fragment) - const bd3D = lightToPosition.normalize(); + const bd3D = shadowPosition.normalize(); // percentage-closer filtering using cube texture sampling result.assign( filterFn( { depthTexture, bd3D, dp, shadow } ) ); @@ -44716,7 +44693,7 @@ class PointShadowNode extends ShadowNode { const depthTexture = new CubeDepthTexture( shadow.mapSize.width ); depthTexture.name = 'PointShadowDepthTexture'; - depthTexture.compareFunction = LessCompare; + depthTexture.compareFunction = LessEqualCompare; const shadowMap = builder.createCubeRenderTarget( shadow.mapSize.width ); shadowMap.texture.name = 'PointShadowMap'; @@ -57261,6 +57238,8 @@ const _frustumArray = /*@__PURE__*/ new FrustumArray(); const _projScreenMatrix = /*@__PURE__*/ new Matrix4(); const _vector4 = /*@__PURE__*/ new Vector4(); +const _shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide }; + /** * Base class for renderers. */ @@ -60397,7 +60376,15 @@ class Renderer { const { colorNode, depthNode, positionNode } = this._getShadowNodes( material ); - overrideMaterial.side = material.shadowSide === null ? material.side : material.shadowSide; + if ( this.shadowMap.type === VSMShadowMap ) { + + overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side; + + } else { + + overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : _shadowSide[ material.side ]; + + } if ( colorNode !== null ) overrideMaterial.colorNode = colorNode; if ( depthNode !== null ) overrideMaterial.depthNode = depthNode; @@ -61923,9 +61910,9 @@ precision highp isampler3D; precision highp isamplerCube; precision highp isampler2DArray; -precision lowp sampler2DShadow; -precision lowp sampler2DArrayShadow; -precision lowp samplerCubeShadow; +precision highp sampler2DShadow; +precision highp sampler2DArrayShadow; +precision highp samplerCubeShadow; `; /** @@ -82356,4 +82343,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, 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, 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 }; diff --git a/build/three.webgpu.min.js b/build/three.webgpu.min.js index 47c1d97bbbce6c..7af56d8b757616 100644 --- a/build/three.webgpu.min.js +++ b/build/three.webgpu.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2025 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 P,CubeReflectionMapping as F,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 Pe,ShadowMaterial as Fe,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,BasicShadowMap as Je,CubeDepthTexture as et,SphereGeometry as tt,LinearMipmapNearestFilter as rt,NearestMipmapLinearFilter as st,Float16BufferAttribute as it,REVISION as nt,ArrayCamera as at,PlaneGeometry as ot,FrontSide as ut,CustomBlending as lt,ZeroFactor as dt,CylinderGeometry as ct,Quaternion as ht,WebXRController as pt,RAD2DEG as gt,PCFShadowMap as mt,FrustumArray as ft,Frustum as yt,RedIntegerFormat as bt,RedFormat as xt,ShortType as Tt,ByteType as _t,UnsignedShortType as vt,RGIntegerFormat as Nt,RGBIntegerFormat as St,RGBFormat as Rt,RGBAIntegerFormat as Et,TimestampQuery as At,createCanvasElement as wt,ReverseSubtractEquation as Ct,SubtractEquation as Mt,OneMinusDstAlphaFactor as Bt,OneMinusDstColorFactor as Lt,OneMinusSrcColorFactor as Pt,DstAlphaFactor as Ft,DstColorFactor as Dt,SrcAlphaSaturateFactor as Ut,SrcColorFactor as It,OneFactor as Ot,CullFaceNone as Vt,CullFaceBack as kt,CullFaceFront as Gt,MultiplyBlending as zt,SubtractiveBlending as $t,AdditiveBlending as Wt,NotEqualDepth as Ht,GreaterDepth as qt,GreaterEqualDepth as jt,EqualDepth as Xt,LessEqualDepth as Kt,LessDepth as Yt,AlwaysDepth as Qt,NeverDepth as Zt,UnsignedShort4444Type as Jt,UnsignedShort5551Type as er,UnsignedInt5999Type as tr,UnsignedInt101111Type as rr,AlphaFormat as sr,RGB_S3TC_DXT1_Format as ir,RGBA_S3TC_DXT1_Format as nr,RGBA_S3TC_DXT3_Format as ar,RGBA_S3TC_DXT5_Format as or,RGB_PVRTC_4BPPV1_Format as ur,RGB_PVRTC_2BPPV1_Format as lr,RGBA_PVRTC_4BPPV1_Format as dr,RGBA_PVRTC_2BPPV1_Format as cr,RGB_ETC1_Format as hr,RGB_ETC2_Format as pr,RGBA_ETC2_EAC_Format as gr,R11_EAC_Format as mr,SIGNED_R11_EAC_Format as fr,SIGNED_RG11_EAC_Format as yr,RGBA_ASTC_4x4_Format as br,RGBA_ASTC_5x4_Format as xr,RGBA_ASTC_5x5_Format as Tr,RGBA_ASTC_6x5_Format as _r,RGBA_ASTC_6x6_Format as vr,RGBA_ASTC_8x5_Format as Nr,RGBA_ASTC_8x6_Format as Sr,RGBA_ASTC_8x8_Format as Rr,RGBA_ASTC_10x5_Format as Er,RGBA_ASTC_10x6_Format as Ar,RGBA_ASTC_10x8_Format as wr,RGBA_ASTC_10x10_Format as Cr,RGBA_ASTC_12x10_Format as Mr,RGBA_ASTC_12x12_Format as Br,RGBA_BPTC_Format as Lr,RED_RGTC1_Format as Pr,SIGNED_RED_RGTC1_Format as Fr,SIGNED_RED_GREEN_RGTC2_Format as Dr,MirroredRepeatWrapping as Ur,RepeatWrapping as Ir,NearestMipmapNearestFilter as Or,NotEqualCompare as Vr,GreaterCompare as kr,GreaterEqualCompare as Gr,EqualCompare as zr,LessEqualCompare as $r,AlwaysCompare as Wr,NeverCompare as Hr,LinearTransfer as qr,getByteLength as jr,isTypedArray as Xr,NotEqualStencilFunc as Kr,GreaterStencilFunc as Yr,GreaterEqualStencilFunc as Qr,EqualStencilFunc as Zr,LessEqualStencilFunc as Jr,LessStencilFunc as es,AlwaysStencilFunc as ts,NeverStencilFunc as rs,DecrementWrapStencilOp as ss,IncrementWrapStencilOp as is,DecrementStencilOp as ns,IncrementStencilOp as as,InvertStencilOp as os,ReplaceStencilOp as us,ZeroStencilOp as ls,KeepStencilOp as ds,MaxEquation as cs,MinEquation as hs,SpotLight as ps,PointLight as gs,DirectionalLight as ms,RectAreaLight as fs,AmbientLight as ys,HemisphereLight as bs,LightProbe as xs,LinearToneMapping as Ts,ReinhardToneMapping as _s,CineonToneMapping as vs,ACESFilmicToneMapping as Ns,AgXToneMapping as Ss,NeutralToneMapping as Rs,Group as Es,Loader as As,FileLoader as ws,MaterialLoader as Cs,ObjectLoader as Ms}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,PCFSoftShadowMap,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 Bs=["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"],Ls=new WeakMap;class Ps{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=Bs,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 Ds=e=>Fs(e),Us=e=>Fs(e),Is=(...e)=>Fs(e),Os=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),Vs=new WeakMap;function ks(e){return Os.get(e)}function Gs(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 zs(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 $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)?12:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Ws(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 Hs(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 qs(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?Ks(u[0]):null}function js(e){let t=Vs.get(e);return void 0===t&&(t={},Vs.set(e,t)),t}function Xs(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Ys=Object.freeze({__proto__:null,arrayBufferToBase64:Xs,base64ToArrayBuffer:Ks,getAlignmentFromType:Ws,getDataFromObject:js,getLengthFromType:zs,getMemoryLengthFromType:$s,getTypeFromLength:ks,getTypedArrayFromType:Gs,getValueFromType:qs,getValueType:Hs,hash:Is,hashArray:Us,hashString:Ds});const Qs={VERTEX:"vertex",FRAGMENT:"fragment"},Zs={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Js={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ei={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ti=["fragment","vertex"],ri=["setup","analyze","generate"],si=[...ti,"compute"],ii=["x","y","z","w"],ni={analyze:"setup",generate:"analyze"};let ai=0;class oi extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Zs.NONE,this.updateBeforeType=Zs.NONE,this.updateAfterType=Zs.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:ai++})}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,Zs.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Zs.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Zs.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 ui extends oi{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 li extends oi{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 di extends oi{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 ci extends di{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 hi=ii.join("");class pi extends oi{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(ii.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===hi.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 gi extends di{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("");oi.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==Ti?Ti.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn()."),this;{const t=_i.get("assign");return this.addToStack(t(...e))}},oi.prototype.toVarIntent=function(){return this},oi.prototype.get=function(e){return new xi(this,e)};const Si={};function Ri(e,t,r){Si[e]=Si[t]=Si[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new pi(this,e),this._cache[e]=t),t},set(t){this[e].assign(Qi(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();oi.prototype["set"+s]=oi.prototype["set"+i]=oi.prototype["set"+n]=function(t){const r=Ni(e);return new gi(this,r,Qi(t))},oi.prototype["flip"+s]=oi.prototype["flip"+i]=oi.prototype["flip"+n]=function(){const t=Ni(e);return new mi(this,t)}}const Ei=["x","y","z","w"],Ai=["r","g","b","a"],wi=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ei[e],r=Ai[e],s=wi[e];Ri(t,r,s);for(let i=0;i<4;i++){t=Ei[e]+Ei[i],r=Ai[e]+Ai[i],s=wi[e]+wi[i],Ri(t,r,s);for(let n=0;n<4;n++){t=Ei[e]+Ei[i]+Ei[n],r=Ai[e]+Ai[i]+Ai[n],s=wi[e]+wi[i]+wi[n],Ri(t,r,s);for(let a=0;a<4;a++)t=Ei[e]+Ei[i]+Ei[n]+Ei[a],r=Ai[e]+Ai[i]+Ai[n]+Ai[a],s=wi[e]+wi[i]+wi[n]+wi[a],Ri(t,r,s)}}}for(let e=0;e<32;e++)Si[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new ui(this,new bi(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(Qi(t))}};Object.defineProperties(oi.prototype,Si);const Ci=new WeakMap,Mi=function(e,t=null){for(const r in e)e[r]=Qi(e[r],t);return e},Bi=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(...en(d(t)))):null!==r?(r=Qi(r),n=(...s)=>i(new e(t,...en(d(s)),r))):n=(...r)=>i(new e(t,...en(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(...en(t))};class Fi extends oi{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=Ci.get(e.constructor);void 0===s&&(s=new WeakMap,Ci.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Qi(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;Ji(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=Qi(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 Ji(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 Qi(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 oi&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=Qi(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=Qi(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 Di extends oi{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 Fi(this,e)}setup(){return this.call()}}const Ui=[!1,!0],Ii=[0,1,2,3],Oi=[-1,-2],Vi=[.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],ki=new Map;for(const e of Ui)ki.set(e,new bi(e));const Gi=new Map;for(const e of Ii)Gi.set(e,new bi(e,"uint"));const zi=new Map([...Gi].map(e=>new bi(e.value,"int")));for(const e of Oi)zi.set(e,new bi(e,"int"));const $i=new Map([...zi].map(e=>new bi(e.value)));for(const e of Vi)$i.set(e,new bi(e));for(const e of Vi)$i.set(-e,new bi(-e));const Wi={bool:ki,uint:Gi,ints:zi,float:$i},Hi=new Map([...ki,...$i]),qi=(e,t)=>Hi.has(e)?Hi.get(e):!0===e.isNode?e:new bi(e,t),ji=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 bi(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=[qs(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Zi(t.get(r[0]));if(1===r.length){const t=qi(r[0],e);return t.nodeType===e?Zi(t):Zi(new li(t,e))}const s=r.map(e=>qi(e));return Zi(new ci(s,e))}},Xi=e=>"object"==typeof e&&null!==e?e.value:e,Ki=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Yi(e,t){return new Di(e,t)}const Qi=(e,t=null)=>function(e,t=null){const r=Hs(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Qi(qi(e,t)):"shader"===r?e.isFn?e:on(e):e}(e,t),Zi=(e,t=null)=>Qi(e,t).toVarIntent(),Ji=(e,t=null)=>new Mi(e,t),en=(e,t=null)=>new Bi(e,t),tn=(e,t=null,r=null,s=null)=>new Li(e,t,r,s),rn=(e,...t)=>new Pi(e,...t),sn=(e,t=null,r=null,s={})=>new Li(e,t,r,{...s,intent:!0});let nn=0;class an extends oi{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 Yi(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"+nn++,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 on(e,t=null){const r=new an(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 un=e=>{Ti=e},ln=()=>Ti,dn=(...e)=>Ti.If(...e);function cn(e){return Ti&&Ti.addToStack(e),e}vi("toStack",cn);const hn=new ji("color"),pn=new ji("float",Wi.float),gn=new ji("int",Wi.ints),mn=new ji("uint",Wi.uint),fn=new ji("bool",Wi.bool),yn=new ji("vec2"),bn=new ji("ivec2"),xn=new ji("uvec2"),Tn=new ji("bvec2"),_n=new ji("vec3"),vn=new ji("ivec3"),Nn=new ji("uvec3"),Sn=new ji("bvec3"),Rn=new ji("vec4"),En=new ji("ivec4"),An=new ji("uvec4"),wn=new ji("bvec4"),Cn=new ji("mat2"),Mn=new ji("mat3"),Bn=new ji("mat4");vi("toColor",hn),vi("toFloat",pn),vi("toInt",gn),vi("toUint",mn),vi("toBool",fn),vi("toVec2",yn),vi("toIVec2",bn),vi("toUVec2",xn),vi("toBVec2",Tn),vi("toVec3",_n),vi("toIVec3",vn),vi("toUVec3",Nn),vi("toBVec3",Sn),vi("toVec4",Rn),vi("toIVec4",En),vi("toUVec4",An),vi("toBVec4",wn),vi("toMat2",Cn),vi("toMat3",Mn),vi("toMat4",Bn);const Ln=tn(ui).setParameterLength(2),Pn=(e,t)=>Qi(new li(Qi(e),t));vi("element",Ln),vi("convert",Pn);vi("append",e=>(d("TSL: .append() has been renamed to .toStack()."),cn(e)));class Fn extends oi{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 Ds(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 Dn=(e,t)=>new Fn(e,t),Un=(e,t)=>new Fn(e,t,!0),In=rn(Fn,"vec4","DiffuseColor"),On=rn(Fn,"vec3","DiffuseContribution"),Vn=rn(Fn,"vec3","EmissiveColor"),kn=rn(Fn,"float","Roughness"),Gn=rn(Fn,"float","Metalness"),zn=rn(Fn,"float","Clearcoat"),$n=rn(Fn,"float","ClearcoatRoughness"),Wn=rn(Fn,"vec3","Sheen"),Hn=rn(Fn,"float","SheenRoughness"),qn=rn(Fn,"float","Iridescence"),jn=rn(Fn,"float","IridescenceIOR"),Xn=rn(Fn,"float","IridescenceThickness"),Kn=rn(Fn,"float","AlphaT"),Yn=rn(Fn,"float","Anisotropy"),Qn=rn(Fn,"vec3","AnisotropyT"),Zn=rn(Fn,"vec3","AnisotropyB"),Jn=rn(Fn,"color","SpecularColor"),ea=rn(Fn,"color","SpecularColorBlended"),ta=rn(Fn,"float","SpecularF90"),ra=rn(Fn,"float","Shininess"),sa=rn(Fn,"vec4","Output"),ia=rn(Fn,"float","dashSize"),na=rn(Fn,"float","gapSize"),aa=rn(Fn,"float","pointWidth"),oa=rn(Fn,"float","IOR"),ua=rn(Fn,"float","Transmission"),la=rn(Fn,"float","Thickness"),da=rn(Fn,"float","AttenuationDistance"),ca=rn(Fn,"color","AttenuationColor"),ha=rn(Fn,"float","Dispersion");class pa extends oi{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 ga=e=>new pa(e),ma=(e,t=0)=>new pa(e,!0,t),fa=ma("frame"),ya=ma("render"),ba=ga("object");class xa extends fi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=ba}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 Ta=(e,t)=>{const r=Ki(t||e);if(r===e&&(e=qs(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new xa(e,r)};class _a extends di{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 va=(...e)=>{let t;if(1===e.length){const r=e[0];t=new _a(null,r.length,r)}else{const r=e[0],s=e[1];t=new _a(r,s)}return Qi(t)};vi("toArray",(e,t)=>va(Array(t).fill(e)));class Na extends di{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 ii.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?en(t):Ji(t[0]),new Ra(Qi(e),t));vi("call",Ea);const Aa={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class wa extends di{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new wa(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 Ca=sn(wa,"+").setParameterLength(2,1/0).setName("add"),Ma=sn(wa,"-").setParameterLength(2,1/0).setName("sub"),Ba=sn(wa,"*").setParameterLength(2,1/0).setName("mul"),La=sn(wa,"/").setParameterLength(2,1/0).setName("div"),Pa=sn(wa,"%").setParameterLength(2).setName("mod"),Fa=sn(wa,"==").setParameterLength(2).setName("equal"),Da=sn(wa,"!=").setParameterLength(2).setName("notEqual"),Ua=sn(wa,"<").setParameterLength(2).setName("lessThan"),Ia=sn(wa,">").setParameterLength(2).setName("greaterThan"),Oa=sn(wa,"<=").setParameterLength(2).setName("lessThanEqual"),Va=sn(wa,">=").setParameterLength(2).setName("greaterThanEqual"),ka=sn(wa,"&&").setParameterLength(2,1/0).setName("and"),Ga=sn(wa,"||").setParameterLength(2,1/0).setName("or"),za=sn(wa,"!").setParameterLength(1).setName("not"),$a=sn(wa,"^^").setParameterLength(2).setName("xor"),Wa=sn(wa,"&").setParameterLength(2).setName("bitAnd"),Ha=sn(wa,"~").setParameterLength(1).setName("bitNot"),qa=sn(wa,"|").setParameterLength(2).setName("bitOr"),ja=sn(wa,"^").setParameterLength(2).setName("bitXor"),Xa=sn(wa,"<<").setParameterLength(2).setName("shiftLeft"),Ka=sn(wa,">>").setParameterLength(2).setName("shiftRight"),Ya=on(([e])=>(e.addAssign(1),e)),Qa=on(([e])=>(e.subAssign(1),e)),Za=on(([e])=>{const t=gn(e).toConst();return e.addAssign(1),t}),Ja=on(([e])=>{const t=gn(e).toConst();return e.subAssign(1),t});vi("add",Ca),vi("sub",Ma),vi("mul",Ba),vi("div",La),vi("mod",Pa),vi("equal",Fa),vi("notEqual",Da),vi("lessThan",Ua),vi("greaterThan",Ia),vi("lessThanEqual",Oa),vi("greaterThanEqual",Va),vi("and",ka),vi("or",Ga),vi("not",za),vi("xor",$a),vi("bitAnd",Wa),vi("bitNot",Ha),vi("bitOr",qa),vi("bitXor",ja),vi("shiftLeft",Xa),vi("shiftRight",Ka),vi("incrementBefore",Ya),vi("decrementBefore",Qa),vi("increment",Za),vi("decrement",Ja);const eo=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),Pa(gn(e),gn(t)));vi("modInt",eo);class to extends di{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===to.MAX||e===to.MIN)&&arguments.length>3){let i=new to(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===to.LENGTH||t===to.DISTANCE||t===to.DOT?"float":t===to.CROSS?"vec3":t===to.ALL||t===to.ANY?"bool":t===to.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===to.ONE_MINUS)i=Ma(1,t);else if(s===to.RECIPROCAL)i=La(1,t);else if(s===to.DIFFERENCE)i=Co(Ma(t,r));else if(s===to.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=Rn(_n(n),0):s=Rn(_n(s),0);const a=Ba(s,n).xyz;i=_o(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===to.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===to.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===to.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==to.MIN&&r!==to.MAX?r===to.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===to.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===to.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==to.DFDX&&r!==to.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}}to.ALL="all",to.ANY="any",to.RADIANS="radians",to.DEGREES="degrees",to.EXP="exp",to.EXP2="exp2",to.LOG="log",to.LOG2="log2",to.SQRT="sqrt",to.INVERSE_SQRT="inversesqrt",to.FLOOR="floor",to.CEIL="ceil",to.NORMALIZE="normalize",to.FRACT="fract",to.SIN="sin",to.COS="cos",to.TAN="tan",to.ASIN="asin",to.ACOS="acos",to.ATAN="atan",to.ABS="abs",to.SIGN="sign",to.LENGTH="length",to.NEGATE="negate",to.ONE_MINUS="oneMinus",to.DFDX="dFdx",to.DFDY="dFdy",to.ROUND="round",to.RECIPROCAL="reciprocal",to.TRUNC="trunc",to.FWIDTH="fwidth",to.TRANSPOSE="transpose",to.DETERMINANT="determinant",to.INVERSE="inverse",to.EQUALS="equals",to.MIN="min",to.MAX="max",to.STEP="step",to.REFLECT="reflect",to.DISTANCE="distance",to.DIFFERENCE="difference",to.DOT="dot",to.CROSS="cross",to.POW="pow",to.TRANSFORM_DIRECTION="transformDirection",to.MIX="mix",to.CLAMP="clamp",to.REFRACT="refract",to.SMOOTHSTEP="smoothstep",to.FACEFORWARD="faceforward";const ro=pn(1e-6),so=pn(1e6),io=pn(Math.PI),no=pn(2*Math.PI),ao=pn(2*Math.PI),oo=pn(.5*Math.PI),uo=sn(to,to.ALL).setParameterLength(1),lo=sn(to,to.ANY).setParameterLength(1),co=sn(to,to.RADIANS).setParameterLength(1),ho=sn(to,to.DEGREES).setParameterLength(1),po=sn(to,to.EXP).setParameterLength(1),go=sn(to,to.EXP2).setParameterLength(1),mo=sn(to,to.LOG).setParameterLength(1),fo=sn(to,to.LOG2).setParameterLength(1),yo=sn(to,to.SQRT).setParameterLength(1),bo=sn(to,to.INVERSE_SQRT).setParameterLength(1),xo=sn(to,to.FLOOR).setParameterLength(1),To=sn(to,to.CEIL).setParameterLength(1),_o=sn(to,to.NORMALIZE).setParameterLength(1),vo=sn(to,to.FRACT).setParameterLength(1),No=sn(to,to.SIN).setParameterLength(1),So=sn(to,to.COS).setParameterLength(1),Ro=sn(to,to.TAN).setParameterLength(1),Eo=sn(to,to.ASIN).setParameterLength(1),Ao=sn(to,to.ACOS).setParameterLength(1),wo=sn(to,to.ATAN).setParameterLength(1,2),Co=sn(to,to.ABS).setParameterLength(1),Mo=sn(to,to.SIGN).setParameterLength(1),Bo=sn(to,to.LENGTH).setParameterLength(1),Lo=sn(to,to.NEGATE).setParameterLength(1),Po=sn(to,to.ONE_MINUS).setParameterLength(1),Fo=sn(to,to.DFDX).setParameterLength(1),Do=sn(to,to.DFDY).setParameterLength(1),Uo=sn(to,to.ROUND).setParameterLength(1),Io=sn(to,to.RECIPROCAL).setParameterLength(1),Oo=sn(to,to.TRUNC).setParameterLength(1),Vo=sn(to,to.FWIDTH).setParameterLength(1),ko=sn(to,to.TRANSPOSE).setParameterLength(1),Go=sn(to,to.DETERMINANT).setParameterLength(1),zo=sn(to,to.INVERSE).setParameterLength(1),$o=sn(to,to.MIN).setParameterLength(2,1/0),Wo=sn(to,to.MAX).setParameterLength(2,1/0),Ho=sn(to,to.STEP).setParameterLength(2),qo=sn(to,to.REFLECT).setParameterLength(2),jo=sn(to,to.DISTANCE).setParameterLength(2),Xo=sn(to,to.DIFFERENCE).setParameterLength(2),Ko=sn(to,to.DOT).setParameterLength(2),Yo=sn(to,to.CROSS).setParameterLength(2),Qo=sn(to,to.POW).setParameterLength(2),Zo=e=>Ba(e,e),Jo=e=>Ba(e,e,e),eu=e=>Ba(e,e,e,e),tu=sn(to,to.TRANSFORM_DIRECTION).setParameterLength(2),ru=e=>Ba(Mo(e),Qo(Co(e),1/3)),su=e=>Ko(e,e),iu=sn(to,to.MIX).setParameterLength(3),nu=(e,t=0,r=1)=>Qi(new to(to.CLAMP,Qi(e),Qi(t),Qi(r))),au=e=>nu(e),ou=sn(to,to.REFRACT).setParameterLength(3),uu=sn(to,to.SMOOTHSTEP).setParameterLength(3),lu=sn(to,to.FACEFORWARD).setParameterLength(3),du=on(([e])=>{const t=Ko(e.xy,yn(12.9898,78.233)),r=Pa(t,io);return vo(No(r).mul(43758.5453))}),cu=(e,t,r)=>iu(t,r,e),hu=(e,t,r)=>uu(t,r,e),pu=(e,t)=>Ho(t,e),gu=lu,mu=bo;vi("all",uo),vi("any",lo),vi("radians",co),vi("degrees",ho),vi("exp",po),vi("exp2",go),vi("log",mo),vi("log2",fo),vi("sqrt",yo),vi("inverseSqrt",bo),vi("floor",xo),vi("ceil",To),vi("normalize",_o),vi("fract",vo),vi("sin",No),vi("cos",So),vi("tan",Ro),vi("asin",Eo),vi("acos",Ao),vi("atan",wo),vi("abs",Co),vi("sign",Mo),vi("length",Bo),vi("lengthSq",su),vi("negate",Lo),vi("oneMinus",Po),vi("dFdx",Fo),vi("dFdy",Do),vi("round",Uo),vi("reciprocal",Io),vi("trunc",Oo),vi("fwidth",Vo),vi("min",$o),vi("max",Wo),vi("step",pu),vi("reflect",qo),vi("distance",jo),vi("dot",Ko),vi("cross",Yo),vi("pow",Qo),vi("pow2",Zo),vi("pow3",Jo),vi("pow4",eu),vi("transformDirection",tu),vi("mix",cu),vi("clamp",nu),vi("refract",ou),vi("smoothstep",hu),vi("faceForward",lu),vi("difference",Xo),vi("saturate",au),vi("cbrt",ru),vi("transpose",ko),vi("determinant",Go),vi("inverse",zo),vi("rand",du);class fu extends oi{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?Dn(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 yu=tn(fu).setParameterLength(2,3);vi("select",yu);class bu extends oi{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 xu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new bu(r,t)},Tu=e=>xu(e,{uniformFlow:!0}),_u=(e,t)=>xu(e,{nodeName:t});function vu(e,t,r=null){return xu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function Nu(e,t=null){return xu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Su(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),_u(e,t)}vi("context",xu),vi("label",Su),vi("uniformFlow",Tu),vi("setName",_u),vi("builtinShadowContext",(e,t,r)=>vu(t,r,e)),vi("builtinAOContext",(e,t)=>Nu(t,e));class Ru extends oi{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=tn(Ru),Au=(e,t=null)=>Eu(e,t).toStack(),wu=(e,t=null)=>Eu(e,t,!0).toStack(),Cu=e=>Eu(e).setIntent(!0).toStack();vi("toVar",Au),vi("toConst",wu),vi("toVarIntent",Cu);class Mu extends oi{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 Bu=(e,t,r=null)=>Qi(new Mu(Qi(e),t,r));class Lu extends oi{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=Bu(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=Bu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Qs.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Qs.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,Qs.VERTEX);e.flowNodeFromShaderStage(Qs.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Pu=tn(Lu).setParameterLength(1,2),Fu=e=>Pu(e);vi("toVarying",Pu),vi("toVertexStage",Fu);const Du=on(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return iu(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Uu=on(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return iu(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Iu="WorkingColorSpace";class Ou extends di{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===Iu?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=Rn(Du(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=Rn(Mn(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=Rn(Uu(i.rgb),i.a)),i):i}}const Vu=(e,t)=>Qi(new Ou(Qi(e),Iu,t)),ku=(e,t)=>Qi(new Ou(Qi(e),t,Iu));vi("workingToColorSpace",Vu),vi("colorSpaceToWorking",ku);let Gu=class extends ui{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 zu extends oi{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=Zs.OBJECT}setGroup(e){return this.group=e,this}element(e){return new Gu(this,Qi(e))}setNodeType(e){const t=Ta(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 $u(e,t,r);class Hu extends di{static get type(){return"ToneMappingNode"}constructor(e,t=ju,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Is(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=Rn(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const qu=(e,t,r)=>Qi(new Hu(e,Qi(t),Qi(r))),ju=Wu("toneMappingExposure","float");vi("toneMapping",(e,t,r)=>qu(t,r,e));const Xu=new WeakMap;function Ku(e,t){let r=Xu.get(e);return void 0===r&&(r=new b(e,t),Xu.set(e,r)),r}class Yu extends fi{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?Ku(s.array,i):Ku(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 Qu(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Mn(new Yu(e,"vec3",9,0).setUsage(i).setInstanced(n),new Yu(e,"vec3",9,3).setUsage(i).setInstanced(n),new Yu(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Bn(new Yu(e,"vec4",16,0).setUsage(i).setInstanced(n),new Yu(e,"vec4",16,4).setUsage(i).setInstanced(n),new Yu(e,"vec4",16,8).setUsage(i).setInstanced(n),new Yu(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Yu(e,t,r,s).setUsage(i)}const Zu=(e,t=null,r=0,s=0)=>Qu(e,t,r,s),Ju=(e,t=null,r=0,s=0)=>Qu(e,t,r,s,f,!0),el=(e,t=null,r=0,s=0)=>Qu(e,t,r,s,x,!0);vi("toAttribute",e=>Zu(e.value));class tl extends oi{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=Zs.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 rl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;erl(e,r).setCount(t);vi("compute",sl),vi("computeKernel",rl);class il extends oi{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 nl=e=>new il(Qi(e));function al(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),nl(e).setParent(t)}vi("cache",al),vi("isolate",nl);class ol extends oi{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 ul=tn(ol).setParameterLength(2);vi("bypass",ul);class ll extends oi{static get type(){return"RemapNode"}constructor(e,t,r,s=pn(0),i=pn(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 dl=tn(ll,null,null,{doClamp:!1}).setParameterLength(3,5),cl=tn(ll).setParameterLength(3,5);vi("remap",dl),vi("remapClamp",cl);class hl extends oi{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 pl=tn(hl).setParameterLength(1,2),gl=e=>(e?yu(e,pl("discard")):pl("discard")).toStack();vi("discard",gl);class ml extends di{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 fl=(e,t=null,r=null)=>Qi(new ml(Qi(e),t,r));vi("renderOutput",fl);class yl extends di{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 bl=(e,t=null)=>Qi(new yl(Qi(e),t)).toStack();vi("debug",bl);class xl{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 Tl extends oi{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=Zs.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!==xl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function _l(e,t="",r=null){return(e=Qi(e)).before(new Tl(e,t,r))}vi("toInspector",_l);class vl extends oi{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 Nl=(e,t=null)=>new vl(e,t),Sl=(e=0)=>Nl("uv"+(e>0?e:""),"vec2");class Rl extends oi{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=tn(Rl).setParameterLength(1,2);class Al extends xa{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Zs.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 wl=tn(Al).setParameterLength(1),Cl=new N;class Ml extends xa{static get type(){return"TextureNode"}constructor(e=Cl,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=Zs.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 Sl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=Ta(this.value.matrix)),this._matrixUniform.mul(_n(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=Ta(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(gn(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=on(()=>{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?Zs.OBJECT:Zs.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=Ho(pl(x,"float"),pl(N,a)).build(e,a)),e.addLineFlowCode(`${o} = ${N}`,this),n.snippet=N,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=ku(pl(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=Qi(e),t.referenceNode=this.getBase(),Qi(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Qi(e).mul(wl(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),Qi(t)}level(e){const t=this.clone();return t.levelNode=Qi(e),t.referenceNode=this.getBase(),Qi(t)}size(e){return El(this,e)}bias(e){const t=this.clone();return t.biasNode=Qi(e),t.referenceNode=this.getBase(),Qi(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=Qi(e),t.referenceNode=this.getBase(),Qi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Qi(e),Qi(t)],r.referenceNode=this.getBase(),Qi(r)}depth(e){const t=this.clone();return t.depthNode=Qi(e),t.referenceNode=this.getBase(),Qi(t)}offset(e){const t=this.clone();return t.offsetNode=Qi(e),t.referenceNode=this.getBase(),Qi(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 Bl=tn(Ml).setParameterLength(1,4).setName("texture"),Ll=(e=Cl,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Qi(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=Qi(t)),null!==r&&(i.levelNode=Qi(r)),null!==s&&(i.biasNode=Qi(s))):i=Bl(e,t,r,s),i},Pl=(...e)=>Ll(...e).setSampler(!1);class Fl extends xa{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 Dl=(e,t,r)=>new Fl(e,t,r);class Ul extends ui{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 Il extends Fl{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Hs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Zs.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 Il(e,t);const Vl=tn(class extends oi{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);let kl,Gl;class zl extends oi{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}getNodeType(){return this.scope===zl.DPR?"float":this.scope===zl.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Zs.NONE;return this.scope!==zl.SIZE&&this.scope!==zl.VIEWPORT&&this.scope!==zl.DPR||(e=Zs.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===zl.VIEWPORT?null!==t?Gl.copy(t.viewport):(e.getViewport(Gl),Gl.multiplyScalar(e.getPixelRatio())):this.scope===zl.DPR?this._output.value=e.getPixelRatio():null!==t?(kl.width=t.width,kl.height=t.height):e.getDrawingBufferSize(kl)}setup(){const e=this.scope;let r=null;return r=e===zl.SIZE?Ta(kl||(kl=new t)):e===zl.VIEWPORT?Ta(Gl||(Gl=new s)):e===zl.DPR?Ta(1):yn(ql.div(Hl)),this._output=r,r}generate(e){if(this.scope===zl.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Hl).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}zl.COORDINATE="coordinate",zl.VIEWPORT="viewport",zl.SIZE="size",zl.UV="uv",zl.DPR="dpr";const $l=rn(zl,zl.DPR),Wl=rn(zl,zl.UV),Hl=rn(zl,zl.SIZE),ql=rn(zl,zl.COORDINATE),jl=rn(zl,zl.VIEWPORT),Xl=jl.zw,Kl=ql.sub(jl.xy),Yl=Kl.div(Xl),Ql=on(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),Hl),"vec2").once()(),Zl=Ta(0,"uint").setName("u_cameraIndex").setGroup(ma("cameraIndex")).toVarying("v_cameraIndex"),Jl=Ta("float").setName("cameraNear").setGroup(ya).onRenderUpdate(({camera:e})=>e.near),ed=Ta("float").setName("cameraFar").setGroup(ya).onRenderUpdate(({camera:e})=>e.far),td=on(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Ol(r).setGroup(ya).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?Vl("gl_ViewID_OVR"):Zl).toConst("cameraProjectionMatrix")}else t=Ta("mat4").setName("cameraProjectionMatrix").setGroup(ya).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),rd=on(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=Ol(r).setGroup(ya).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?Vl("gl_ViewID_OVR"):Zl).toConst("cameraProjectionMatrixInverse")}else t=Ta("mat4").setName("cameraProjectionMatrixInverse").setGroup(ya).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),sd=on(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Ol(r).setGroup(ya).setName("cameraViewMatrices").element(e.isMultiViewCamera?Vl("gl_ViewID_OVR"):Zl).toConst("cameraViewMatrix")}else t=Ta("mat4").setName("cameraViewMatrix").setGroup(ya).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),id=on(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);t=Ol(r).setGroup(ya).setName("cameraWorldMatrices").element(e.isMultiViewCamera?Vl("gl_ViewID_OVR"):Zl).toConst("cameraWorldMatrix")}else t=Ta("mat4").setName("cameraWorldMatrix").setGroup(ya).onRenderUpdate(({camera:e})=>e.matrixWorld);return t}).once()(),nd=on(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);t=Ol(r).setGroup(ya).setName("cameraNormalMatrices").element(e.isMultiViewCamera?Vl("gl_ViewID_OVR"):Zl).toConst("cameraNormalMatrix")}else t=Ta("mat3").setName("cameraNormalMatrix").setGroup(ya).onRenderUpdate(({camera:e})=>e.normalMatrix);return t}).once()(),ad=on(({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()(),od=on(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);t=Ol(r,"vec4").setGroup(ya).setName("cameraViewports").element(Zl).toConst("cameraViewport")}else t=Rn(0,0,Hl.x,Hl.y).toConst("cameraViewport");return t}).once()(),ud=new C;class ld extends oi{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Zs.OBJECT,this.uniformNode=new xa(null)}getNodeType(){const e=this.scope;return e===ld.WORLD_MATRIX?"mat4":e===ld.POSITION||e===ld.VIEW_POSITION||e===ld.DIRECTION||e===ld.SCALE?"vec3":e===ld.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===ld.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===ld.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===ld.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===ld.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===ld.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===ld.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),ud.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=ud.radius}}generate(e){const t=this.scope;return t===ld.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===ld.POSITION||t===ld.VIEW_POSITION||t===ld.DIRECTION||t===ld.SCALE?this.uniformNode.nodeType="vec3":t===ld.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}}ld.WORLD_MATRIX="worldMatrix",ld.POSITION="position",ld.SCALE="scale",ld.VIEW_POSITION="viewPosition",ld.DIRECTION="direction",ld.RADIUS="radius";const dd=tn(ld,ld.DIRECTION).setParameterLength(1),cd=tn(ld,ld.WORLD_MATRIX).setParameterLength(1),hd=tn(ld,ld.POSITION).setParameterLength(1),pd=tn(ld,ld.SCALE).setParameterLength(1),gd=tn(ld,ld.VIEW_POSITION).setParameterLength(1),md=tn(ld,ld.RADIUS).setParameterLength(1);class fd extends ld{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const yd=rn(fd,fd.DIRECTION),bd=rn(fd,fd.WORLD_MATRIX),xd=rn(fd,fd.POSITION),Td=rn(fd,fd.SCALE),_d=rn(fd,fd.VIEW_POSITION),vd=rn(fd,fd.RADIUS),Nd=Ta(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Sd=Ta(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Rd=on(e=>e.context.modelViewMatrix||Ed).once()().toVar("modelViewMatrix"),Ed=sd.mul(bd),Ad=on(e=>(e.context.isHighPrecisionModelViewMatrix=!0,Ta("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),wd=on(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return Ta("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),Cd=on(e=>"fragment"!==e.shaderStage?(v("TSL: `clipSpace` is only available in fragment stage."),Rn()):e.context.clipSpace.toVarying("v_clipSpace")).once()(),Md=Nl("position","vec3"),Bd=Md.toVarying("positionLocal"),Ld=Md.toVarying("positionPrevious"),Pd=on(e=>"fragment"===e.shaderStage&&e.material.vertexNode?id.mul(Dd).xyz.toVar("positionWorld"):bd.mul(Bd).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION","VERTEX"])(),Fd=on(()=>Bd.transformDirection(bd).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Dd=on(e=>{if("fragment"===e.shaderStage&&e.material.vertexNode){const e=rd.mul(Cd);return e.xyz.div(e.w).toVar("positionView")}return e.context.setupPositionView().toVarying("v_positionView")},"vec3").once(["POSITION","VERTEX"])(),Ud=on(e=>{let t;return t=e.camera.isOrthographicCamera?_n(0,0,1):Dd.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class Id extends oi{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 Od=rn(Id),Vd=pn(Od).mul(2).sub(1),kd=on(([e],{material:t})=>{const r=t.side;return r===M?e=e.mul(-1):r===B&&(e=e.mul(Vd)),e}),Gd=Nl("normal","vec3"),zd=on(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),_n(0,1,0)):Gd,"vec3").once()().toVar("normalLocal"),$d=Dd.dFdx().cross(Dd.dFdy()).normalize().toVar("normalFlat"),Wd=on(e=>{let t;return t=!0===e.material.flatShading?$d:Yd(zd).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),Hd=on(e=>{let t=Wd.transformDirection(sd);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),qd=on(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=Wd,!0!==t.flatShading&&(s=kd(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),jd=qd.transformDirection(sd).toVar("normalWorld"),Xd=on(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?qd:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),Kd=on(([e,t=bd])=>{const r=Mn(t),s=e.div(_n(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),Yd=on(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=Nd.mul(e);return sd.transformDirection(s)}),Qd=on(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),qd)).once(["NORMAL","VERTEX"])(),Zd=on(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),jd)).once(["NORMAL","VERTEX"])(),Jd=on(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),Xd)).once(["NORMAL","VERTEX"])(),ec=new L,tc=new a,rc=Ta(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),sc=Ta(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),ic=Ta(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?(ec.copy(r),tc.makeRotationFromEuler(ec)):tc.identity(),tc}),nc=Ud.negate().reflect(qd),ac=Ud.negate().refract(qd,rc),oc=nc.transformDirection(sd).toVar("reflectVector"),uc=ac.transformDirection(sd).toVar("reflectVector"),lc=new P;class dc extends Ml{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===F?oc:e.mapping===D?uc:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),_n(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?_n(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=_n(t.x.negate(),t.yz)),ic.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const cc=tn(dc).setParameterLength(1,4).setName("cubeTexture"),hc=(e=lc,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Qi(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=Qi(t)),null!==r&&(i.levelNode=Qi(r)),null!==s&&(i.biasNode=Qi(s))):i=cc(e,t,r,s),i};class pc extends ui{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 gc extends oi{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=Zs.OBJECT}element(e){return new pc(this,Qi(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?Dl(null,e,this.count):Array.isArray(this.getValueFromReference())?Ol(null,e):"texture"===e?Ll(null):"cubeTexture"===e?hc(null):Ta(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 gc(e,t,r),fc=(e,t,r,s)=>new gc(e,t,s,r);class yc extends gc{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 bc=(e,t,r=null)=>new yc(e,t,r),xc=Sl(),Tc=Dd.dFdx(),_c=Dd.dFdy(),vc=xc.dFdx(),Nc=xc.dFdy(),Sc=qd,Rc=_c.cross(Sc),Ec=Sc.cross(Tc),Ac=Rc.mul(vc.x).add(Ec.mul(Nc.x)),wc=Rc.mul(vc.y).add(Ec.mul(Nc.y)),Cc=Ac.dot(Ac).max(wc.dot(wc)),Mc=Cc.equal(0).select(0,Cc.inverseSqrt()),Bc=Ac.mul(Mc).toVar("tangentViewFrame"),Lc=wc.mul(Mc).toVar("bitangentViewFrame"),Pc=Nl("tangent","vec4"),Fc=Pc.xyz.toVar("tangentLocal"),Dc=on(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Rd.mul(Rn(Fc,0)).xyz.toVarying("v_tangentView").normalize():Bc,!0!==r.flatShading&&(s=kd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Uc=Dc.transformDirection(sd).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Ic=on(([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"]),Oc=Ic(Gd.cross(Pc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Vc=Ic(zd.cross(Fc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),kc=on(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Ic(qd.cross(Dc),"v_bitangentView").normalize():Lc,!0!==r.flatShading&&(s=kd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),Gc=Ic(jd.cross(Uc),"v_bitangentWorld").normalize().toVar("bitangentWorld"),zc=Mn(Dc,kc,qd).toVar("TBNViewMatrix"),$c=Ud.mul(zc),Wc=on(()=>{let e=Zn.cross(Ud);return e=e.cross(Zn).normalize(),e=iu(e,qd,Yn.mul(kn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),Hc=e=>Qi(e).mul(.5).add(.5),qc=e=>_n(e,yo(au(pn(1).sub(Ko(e,e)))));class jc extends di{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=qc(i.xy):s===V?i=qc(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=kd(t)),i=_n(i.xy.mul(t),i.z)}let n=null;return t===k?n=Yd(i):t===U?n=zc.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=qd),n}}const Xc=tn(jc).setParameterLength(1,2),Kc=on(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Sl()),forceUVContext:!0}),s=pn(r(e=>e));return yn(pn(r(e=>e.add(e.dFdx()))).sub(s),pn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),Yc=on(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(Vd),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class Qc extends di{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=Kc({textureNode:this.textureNode,bumpScale:e});return Yc({surf_pos:Dd,surf_norm:qd,dHdxy:t})}}const Zc=tn(Qc).setParameterLength(1,2),Jc=new Map;class eh extends oi{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=Jc.get(e);return void 0===r&&(r=bc(e,t),Jc.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===eh.COLOR){const e=void 0!==t.color?this.getColor(r):_n();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===eh.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===eh.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:pn(1);else if(r===eh.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===eh.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===eh.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===eh.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===eh.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===eh.NORMAL)t.normalMap?(s=Xc(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?Zc(this.getTexture("bump").r,this.getFloat("bumpScale")):qd;else if(r===eh.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===eh.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===eh.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Xc(this.getTexture(r),this.getCache(r+"Scale","vec2")):qd;else if(r===eh.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===eh.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===eh.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Cn(Oh.x,Oh.y,Oh.y.negate(),Oh.x).mul(e.rg.mul(2).sub(yn(1)).normalize().mul(e.b))}else s=Oh;else if(r===eh.IRIDESCENCE_THICKNESS){const e=mc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=mc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===eh.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===eh.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===eh.IOR)s=this.getFloat(r);else if(r===eh.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===eh.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===eh.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):pn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}eh.ALPHA_TEST="alphaTest",eh.COLOR="color",eh.OPACITY="opacity",eh.SHININESS="shininess",eh.SPECULAR="specular",eh.SPECULAR_STRENGTH="specularStrength",eh.SPECULAR_INTENSITY="specularIntensity",eh.SPECULAR_COLOR="specularColor",eh.REFLECTIVITY="reflectivity",eh.ROUGHNESS="roughness",eh.METALNESS="metalness",eh.NORMAL="normal",eh.CLEARCOAT="clearcoat",eh.CLEARCOAT_ROUGHNESS="clearcoatRoughness",eh.CLEARCOAT_NORMAL="clearcoatNormal",eh.EMISSIVE="emissive",eh.ROTATION="rotation",eh.SHEEN="sheen",eh.SHEEN_ROUGHNESS="sheenRoughness",eh.ANISOTROPY="anisotropy",eh.IRIDESCENCE="iridescence",eh.IRIDESCENCE_IOR="iridescenceIOR",eh.IRIDESCENCE_THICKNESS="iridescenceThickness",eh.IOR="ior",eh.TRANSMISSION="transmission",eh.THICKNESS="thickness",eh.ATTENUATION_DISTANCE="attenuationDistance",eh.ATTENUATION_COLOR="attenuationColor",eh.LINE_SCALE="scale",eh.LINE_DASH_SIZE="dashSize",eh.LINE_GAP_SIZE="gapSize",eh.LINE_WIDTH="linewidth",eh.LINE_DASH_OFFSET="dashOffset",eh.POINT_SIZE="size",eh.DISPERSION="dispersion",eh.LIGHT_MAP="light",eh.AO="ao";const th=rn(eh,eh.ALPHA_TEST),rh=rn(eh,eh.COLOR),sh=rn(eh,eh.SHININESS),ih=rn(eh,eh.EMISSIVE),nh=rn(eh,eh.OPACITY),ah=rn(eh,eh.SPECULAR),oh=rn(eh,eh.SPECULAR_INTENSITY),uh=rn(eh,eh.SPECULAR_COLOR),lh=rn(eh,eh.SPECULAR_STRENGTH),dh=rn(eh,eh.REFLECTIVITY),ch=rn(eh,eh.ROUGHNESS),hh=rn(eh,eh.METALNESS),ph=rn(eh,eh.NORMAL),gh=rn(eh,eh.CLEARCOAT),mh=rn(eh,eh.CLEARCOAT_ROUGHNESS),fh=rn(eh,eh.CLEARCOAT_NORMAL),yh=rn(eh,eh.ROTATION),bh=rn(eh,eh.SHEEN),xh=rn(eh,eh.SHEEN_ROUGHNESS),Th=rn(eh,eh.ANISOTROPY),_h=rn(eh,eh.IRIDESCENCE),vh=rn(eh,eh.IRIDESCENCE_IOR),Nh=rn(eh,eh.IRIDESCENCE_THICKNESS),Sh=rn(eh,eh.TRANSMISSION),Rh=rn(eh,eh.THICKNESS),Eh=rn(eh,eh.IOR),Ah=rn(eh,eh.ATTENUATION_DISTANCE),wh=rn(eh,eh.ATTENUATION_COLOR),Ch=rn(eh,eh.LINE_SCALE),Mh=rn(eh,eh.LINE_DASH_SIZE),Bh=rn(eh,eh.LINE_GAP_SIZE),Lh=rn(eh,eh.LINE_WIDTH),Ph=rn(eh,eh.LINE_DASH_OFFSET),Fh=rn(eh,eh.POINT_SIZE),Dh=rn(eh,eh.DISPERSION),Uh=rn(eh,eh.LIGHT_MAP),Ih=rn(eh,eh.AO),Oh=Ta(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))}),Vh=on(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class kh extends ui{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 Gh=tn(kh).setParameterLength(2);class zh extends Fl{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=ks(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ei.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 Gh(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ei.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Zu(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 $h=(e,t=null,r=0)=>new zh(e,t,r);class Wh extends oi{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===Wh.VERTEX)s=e.getVertexIndex();else if(r===Wh.INSTANCE)s=e.getInstanceIndex();else if(r===Wh.DRAW)s=e.getDrawIndex();else if(r===Wh.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Wh.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Wh.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}}Wh.VERTEX="vertex",Wh.INSTANCE="instance",Wh.SUBGROUP="subgroup",Wh.INVOCATION_LOCAL="invocationLocal",Wh.INVOCATION_SUBGROUP="invocationSubgroup",Wh.DRAW="draw";const Hh=rn(Wh,Wh.VERTEX),qh=rn(Wh,Wh.INSTANCE),jh=rn(Wh,Wh.SUBGROUP),Xh=rn(Wh,Wh.INVOCATION_SUBGROUP),Kh=rn(Wh,Wh.INVOCATION_LOCAL),Yh=rn(Wh,Wh.DRAW);class Qh extends oi{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=Zs.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=$h(s,"vec3",Math.max(s.count,1)).element(qh);else{const e=new W(s.array,3),t=s.usage===x?el:Ju;this.bufferColor=e,r=_n(t(e,"vec3",3,0))}this.instanceColorNode=r}const n=t.mul(Bd).xyz;if(Bd.assign(n),e.needsPreviousData()&&Ld.assign(this.getPreviousInstancedPosition(e)),e.hasGeometryAttribute("normal")){const e=Kd(zd,t);zd.assign(e)}null!==this.instanceColorNode&&Un("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(Ld).xyz}_createInstanceMatrixNode(e,t){let r;const{instanceMatrix:s}=this,{count:i}=s;if(this.isStorageMatrix)r=$h(s,"mat4",Math.max(i,1)).element(qh);else{if(i<=(!0===t.renderer.backend.isWebGPUBackend?1e3:250))r=Dl(s.array,"mat4",Math.max(i,1)).element(qh);else{const t=new H(s.array,16,1);!0===e&&(this.buffer=t);const i=s.usage===x?el:Ju,n=[i(t,"vec4",16,0),i(t,"vec4",16,4),i(t,"vec4",16,8),i(t,"vec4",16,12)];r=Bn(...n)}}return r}}const Zh=tn(Qh).setParameterLength(2,3);class Jh extends Qh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const ep=tn(Jh).setParameterLength(1);class tp extends oi{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=qh:this.batchingIdNode=Yh);const t=on(([e])=>{const t=gn(El(Pl(this.batchMesh._indirectTexture),0).x).toConst(),r=gn(e).mod(t).toConst(),s=gn(e).div(t).toConst();return Pl(this.batchMesh._indirectTexture,bn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(gn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=gn(El(Pl(s),0).x).toConst(),n=pn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Bn(Pl(s,bn(a,o)),Pl(s,bn(a.add(1),o)),Pl(s,bn(a.add(2),o)),Pl(s,bn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=on(([e])=>{const t=gn(El(Pl(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Pl(l,bn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Un("vec3","vBatchColor").assign(t)}const d=Mn(u);Bd.assign(u.mul(Bd));const c=zd.div(_n(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;zd.assign(h),e.hasGeometryAttribute("tangent")&&Fc.mulAssign(d)}}const rp=tn(tp).setParameterLength(1),sp=new WeakMap;class ip extends oi{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Zs.OBJECT,this.skinIndexNode=Nl("skinIndex","uvec4"),this.skinWeightNode=Nl("skinWeight","vec4"),this.bindMatrixNode=mc("bindMatrix","mat4"),this.bindMatrixInverseNode=mc("bindMatrixInverse","mat4"),this.boneMatricesNode=fc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Bd,this.toPositionNode=Bd,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=Ca(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}getSkinnedNormal(e=this.boneMatricesNode,t=zd){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);let d=Ca(s.x.mul(a),s.y.mul(o),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).xyz}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=fc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Ld)}setup(e){e.needsPreviousData()&&Ld.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();zd.assign(t),e.hasGeometryAttribute("tangent")&&Fc.assign(t)}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;sp.get(t)!==e.frameId&&(sp.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const np=e=>new ip(e);class ap extends oi{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 ap(en(e,"int")).toStack(),up=()=>pl("break").toStack(),lp=new WeakMap,dp=new s,cp=on(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=gn(Hh).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Pl(e,bn(u,o)).depth(i).xyz.mul(t)});class hp extends oi{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=Ta(1),this.updateType=Zs.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=lp.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=pn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Pl(this.mesh.morphTexture,bn(gn(e).add(1),gn(qh))).r):t.assign(mc("morphTargetInfluences","float").element(e).toVar()),dn(t.notEqual(0),()=>{!0===s&&Bd.addAssign(cp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:gn(0)})),!0===i&&zd.addAssign(cp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:gn(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 pp=tn(hp).setParameterLength(1);class gp extends oi{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class mp extends gp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class fp extends bu{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:_n().toVar("directDiffuse"),directSpecular:_n().toVar("directSpecular"),indirectDiffuse:_n().toVar("indirectDiffuse"),indirectSpecular:_n().toVar("indirectSpecular")};return{radiance:_n().toVar("radiance"),irradiance:_n().toVar("irradiance"),iblIrradiance:_n().toVar("iblIrradiance"),ambientOcclusion:pn(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 yp=tn(fp);class bp extends gp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const xp=new t;class Tp extends Ml{static get type(){return"ViewportTextureNode"}constructor(e=Wl,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=Zs.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(xp):xp.set(r.width,r.height);const s=this.getTextureForReference(r);s.image.width===xp.width&&s.image.height===xp.height||(s.image.width=xp.width,s.image.height=xp.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 _p=tn(Tp).setParameterLength(0,3),vp=tn(Tp,null,null,{generateMipmaps:!0}).setParameterLength(0,3),Np=vp(),Sp=(e=Wl,t=null)=>Np.sample(e,t);let Rp=null;class Ep extends Tp{static get type(){return"ViewportDepthTextureNode"}constructor(e=Wl,t=null){null===Rp&&(Rp=new Y),super(e,t,Rp)}getTextureForReference(){return Rp}}const Ap=tn(Ep).setParameterLength(0,2);class wp extends oi{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===wp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===wp.DEPTH_BASE)null!==r&&(s=Pp().assign(r));else if(t===wp.DEPTH)s=e.isPerspectiveCamera?Mp(Dd.z,Jl,ed):Cp(Dd.z,Jl,ed);else if(t===wp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Bp(r,Jl,ed);s=Cp(e,Jl,ed)}else s=r;else s=Cp(Dd.z,Jl,ed);return s}}wp.DEPTH_BASE="depthBase",wp.DEPTH="depth",wp.LINEAR_DEPTH="linearDepth";const Cp=(e,t,r)=>e.add(t).div(t.sub(r)),Mp=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Bp=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Lp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=fo(e.negate().div(t)),i=fo(r.div(t));return s.div(i)},Pp=tn(wp,wp.DEPTH_BASE),Fp=rn(wp,wp.DEPTH),Dp=tn(wp,wp.LINEAR_DEPTH).setParameterLength(0,1),Up=Dp(Ap());Fp.assign=e=>Pp(e);class Ip extends oi{static get type(){return"ClippingNode"}constructor(e=Ip.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===Ip.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Ip.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return on(()=>{const r=pn().toVar("distanceToPlane"),s=pn().toVar("distanceToGradient"),i=pn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Ol(t).setGroup(ya);op(n,({i:t})=>{const n=e.element(t);r.assign(Dd.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(uu(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Ol(e).setGroup(ya),n=pn(1).toVar("intersectionClipOpacity");op(a,({i:e})=>{const i=t.element(e);r.assign(Dd.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(uu(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}In.a.mulAssign(i),In.a.equal(0).discard()})()}setupDefault(e,t){return on(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Ol(t).setGroup(ya);op(r,({i:t})=>{const r=e.element(t);Dd.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Ol(e).setGroup(ya),r=fn(!0).toVar("clipped");op(s,({i:e})=>{const s=t.element(e);r.assign(Dd.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),on(()=>{const s=Ol(e).setGroup(ya),i=Vl(t.getClipDistance());op(r,({i:e})=>{const t=s.element(e),r=Dd.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}Ip.ALPHA_TO_COVERAGE="alphaToCoverage",Ip.DEFAULT="default",Ip.HARDWARE="hardware";const Op=on(([e])=>vo(Ba(1e4,No(Ba(17,e.x).add(Ba(.1,e.y)))).mul(Ca(.1,Co(No(Ba(13,e.y).add(e.x))))))),Vp=on(([e])=>Op(yn(Op(e.xy),e.z))),kp=on(([e])=>{const t=Wo(Bo(Fo(e.xyz)),Bo(Do(e.xyz))),r=pn(1).div(pn(.05).mul(t)).toVar("pixScale"),s=yn(go(xo(fo(r))),go(To(fo(r)))),i=yn(Vp(xo(s.x.mul(e.xyz))),Vp(xo(s.y.mul(e.xyz)))),n=vo(fo(r)),a=Ca(Ba(n.oneMinus(),i.x),Ba(n,i.y)),o=$o(n,n.oneMinus()),u=_n(a.mul(a).div(Ba(2,o).mul(Ma(1,o))),a.sub(Ba(.5,o)).div(Ma(1,o)),Ma(1,Ma(1,a).mul(Ma(1,a)).div(Ba(2,o).mul(Ma(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return nu(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Gp extends vl{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 zp=(e=0)=>new Gp(e),$p=on(([e,t])=>$o(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Wp=on(([e,t])=>$o(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Hp=on(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),qp=on(([e,t])=>iu(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Ho(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),jp=on(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return Rn(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"}]}),Xp=on(([e])=>Rn(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),Kp=on(([e])=>(dn(e.a.equal(0),()=>Rn(0)),Rn(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class Yp 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(Ds(t.slice(0,-4)),r.getCacheKey());return this.type+Us(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Bu(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=Bu(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=Rn(s,In.a).max(0);n=this.setupOutput(e,i),sa.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&&sa.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=Rn(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 Ip(Ip.ALPHA_TO_COVERAGE):e.stack.addToStack(new Ip)}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 Ip(Ip.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?Lp(Dd.z,Jl,ed):Cp(Dd.z,Jl,ed))}null!==s&&Fp.assign(s).toStack()}setupPositionView(){return Rd.mul(Bd).xyz}setupModelViewProjection(){return td.mul(Dd)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.position=e.removeStack(),Vh}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&pp(t).toStack(),!0===t.isSkinnedMesh&&np(t).toStack(),this.displacementMap){const e=bc("displacementMap","texture"),t=bc("displacementScale","float"),r=bc("displacementBias","float");Bd.addAssign(zd.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&rp(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&ep(t).toStack(),null!==this.positionNode&&Bd.assign(Bu(this.positionNode,"POSITION","vec3")),Bd}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&fn(this.maskNode).not().discard();let s=this.colorNode?Rn(this.colorNode):rh;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul(zp())),t.instanceColor){s=Un("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=Un("vec3","vBatchColor").mul(s)}In.assign(s);const i=this.opacityNode?pn(this.opacityNode):nh;In.a.assign(In.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?pn(this.alphaTestNode):th,!0===this.alphaToCoverage?(In.a=uu(n,n.add(Vo(In.a)),In.a),In.a.lessThanEqual(0).discard()):In.a.lessThanEqual(n).discard()),!0===this.alphaHash&&In.a.lessThan(kp(Bd)).discard(),e.isOpaque()&&In.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?_n(0):In.rgb}setupNormal(){return this.normalNode?_n(this.normalNode):ph}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?bc("envMap","cubeTexture"):bc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new bp(Uh)),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=Ih),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new mp(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=yp(n,t,r,s)}else null!==r&&(a=_n(null!==s?iu(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(Vn.assign(_n(i||ih)),a=a.add(Vn)),a}setupFog(e,t){const r=e.fogNode;return r&&(sa.assign(t),t=Rn(r.toVar())),t}setupPremultipliedAlpha(e,t){return Xp(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 Qp=new Z;class Zp extends Yp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(Qp),this.setValues(e)}}const Jp=new J;class eg extends Yp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(Jp),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?pn(this.offsetNode):Ph,t=this.dashScaleNode?pn(this.dashScaleNode):Ch,r=this.dashSizeNode?pn(this.dashSizeNode):Mh,s=this.gapSizeNode?pn(this.gapSizeNode):Bh;ia.assign(r),na.assign(s);const i=Pu(Nl("lineDistance").mul(t));(e?i.add(e):i).mod(ia.add(na)).greaterThan(ia).discard()}}const tg=new J;class rg extends Yp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(tg),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=on(({start:e,end:t})=>{const r=td.element(2).element(2),s=td.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return Rn(iu(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=on(()=>{const e=Nl("instanceStart"),t=Nl("instanceEnd"),r=Rn(Rd.mul(Rn(e,1))).toVar("start"),s=Rn(Rd.mul(Rn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?pn(this.dashScaleNode):Ch,t=this.offsetNode?pn(this.offsetNode):Ph,r=Nl("instanceDistanceStart"),s=Nl("instanceDistanceEnd");let i=Md.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Un("float","lineDistance").assign(i)}n&&(Un("vec3","worldStart").assign(r.xyz),Un("vec3","worldEnd").assign(s.xyz));const o=jl.z.div(jl.w),u=td.element(2).element(3).equal(-1);dn(u,()=>{dn(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=td.mul(r),d=td.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=Rn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=iu(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Un("vec4","worldPos");o.assign(Md.y.lessThan(.5).select(r,s));const u=Lh.mul(.5);o.addAssign(Rn(Md.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(Rn(Md.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(Rn(a.mul(u),0)),dn(Md.y.greaterThan(1).or(Md.y.lessThan(0)),()=>{o.subAssign(Rn(a.mul(2).mul(u),0))})),g.assign(td.mul(o));const l=_n().toVar();l.assign(Md.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=yn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Md.x.lessThan(0).select(e.negate(),e)),dn(Md.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(Md.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Lh)),e.assign(e.div(jl.w.div($l))),g.assign(Md.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(Rn(e,0,0)))}return g})();const o=on(({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 yn(h,p)});if(this.colorNode=on(()=>{const e=Sl();if(i){const t=this.dashSizeNode?pn(this.dashSizeNode):Mh,r=this.gapSizeNode?pn(this.gapSizeNode):Bh;ia.assign(t),na.assign(r);const s=Un("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(ia.add(na)).greaterThan(ia).discard()}const a=pn(1).toVar("alpha");if(n){const e=Un("vec3","worldStart"),s=Un("vec3","worldEnd"),n=Un("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:_n(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Lh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(uu(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=pn(s.fwidth()).toVar("dlen");dn(e.y.abs().greaterThan(1),()=>{a.assign(uu(i.oneMinus(),i.add(1),s).oneMinus())})}else dn(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=Nl("instanceColorStart"),t=Nl("instanceColorEnd");u=Md.y.lessThan(.5).select(e,t).mul(rh)}else u=rh;return Rn(u,a)})(),this.transparent){const e=this.opacityNode?pn(this.opacityNode):nh;this.outputNode=Rn(this.colorNode.rgb.mul(e).add(Sp().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 sg=new te;class ig extends Yp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(sg),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?pn(this.opacityNode):nh;In.assign(ku(Rn(Hc(qd),e),re))}}const ng=on(([e=Fd])=>{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 yn(t,r)});class ag 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=ng(Fd),a=new Yp;a.colorNode=Ll(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 og=new WeakMap;class ug extends di{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=hc(null);const t=new P;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Zs.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(og.has(e)){const t=og.get(e);dg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new ag(r.height);s.fromEquirectangularTexture(t,e),dg(s.texture,e.mapping),this._cubeTexture=s.texture,og.set(e,s.texture),e.addEventListener("dispose",lg)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function lg(e){const t=e.target;t.removeEventListener("dispose",lg);const r=og.get(t);void 0!==r&&(og.delete(t),r.dispose())}function dg(e,t){t===le?e.mapping=F:t===de&&(e.mapping=D)}const cg=tn(ug).setParameterLength(1);class hg extends gp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=cg(this.envNode)}}class pg extends gp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=pn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class gg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class mg extends gg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(Rn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(Rn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(In.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(iu(s.rgb,s.rgb.mul(i.rgb),lh.mul(dh)));break;case he:s.rgb.assign(iu(s.rgb,i.rgb,lh.mul(dh)));break;case ce:s.rgb.addAssign(i.rgb.mul(lh.mul(dh)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const fg=new ge;class yg extends Yp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(fg),this.setValues(e)}setupNormal(){return kd(Wd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new hg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new pg(Uh)),t}setupOutgoingLight(){return In.rgb}setupLightingModel(){return new mg}}const bg=on(({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))}),xg=on(e=>e.diffuseColor.mul(1/Math.PI)),Tg=on(({dotNH:e})=>ra.mul(pn(.5)).add(1).mul(pn(1/Math.PI)).mul(e.pow(ra))),_g=on(({lightDirection:e})=>{const t=e.add(Ud).normalize(),r=qd.dot(t).clamp(),s=Ud.dot(t).clamp(),i=bg({f0:Jn,f90:1,dotVH:s}),n=pn(.25),a=Tg({dotNH:r});return i.mul(n).mul(a)});class vg extends mg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=qd.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(xg({diffuseColor:In.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(_g({lightDirection:e})).mul(lh))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(xg({diffuseColor:In}))),s.indirectDiffuse.mulAssign(t)}}const Ng=new me;class Sg extends Yp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Ng),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new hg(t):null}setupLightingModel(){return new vg(!1)}}const Rg=new fe;class Eg extends Yp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Rg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new hg(t):null}setupLightingModel(){return new vg}setupVariants(){const e=(this.shininessNode?pn(this.shininessNode):sh).max(1e-4);ra.assign(e);const t=this.specularNode||ah;Jn.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Ag=on(e=>{if(!1===e.geometry.hasAttribute("normal"))return pn(0);const t=Wd.dFdx().abs().max(Wd.dFdy().abs());return t.x.max(t.y).max(t.z)}),wg=on(e=>{const{roughness:t}=e,r=Ag();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),Cg=on(({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 La(.5,i.add(n).max(ro))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Mg=on(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(_n(e.mul(r),t.mul(s),a).length()),l=a.mul(_n(e.mul(i),t.mul(n),o).length());return La(.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"}]}),Bg=on(({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"}]}),Lg=pn(1/Math.PI),Pg=on(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=_n(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Lg.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"}]}),Fg=on(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=qd,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Ud).normalize(),d=n.dot(e).clamp(),c=n.dot(Ud).clamp(),h=n.dot(l).clamp(),p=Ud.dot(l).clamp();let g,m,f=bg({f0:t,f90:r,dotVH:p});if(Xi(a)&&(f=qn.mix(f,i)),Xi(o)){const t=Qn.dot(e),r=Qn.dot(Ud),s=Qn.dot(l),i=Zn.dot(e),n=Zn.dot(Ud),a=Zn.dot(l);g=Mg({alphaT:Kn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Pg({alphaT:Kn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=Cg({alpha:u,dotNL:d,dotNV:c}),m=Bg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),Dg=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 Ug=null;const Ig=on(({roughness:e,dotNV:t})=>{null===Ug&&(Ug=new ye(Dg,16,16,G,be),Ug.name="DFG_LUT",Ug.minFilter=oe,Ug.magFilter=oe,Ug.wrapS=xe,Ug.wrapT=xe,Ug.generateMipmaps=!1,Ug.needsUpdate=!0);const r=yn(e,t);return Ll(Ug,r).rg}),Og=on(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Fg({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=qd.dot(e).clamp(),l=qd.dot(Ud).clamp(),d=Ig({roughness:s,dotNV:l}),c=Ig({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=pn(1).sub(g),y=pn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(pn(1).sub(f.mul(y).mul(b).mul(b)).add(ro)),T=f.mul(y),_=x.mul(T);return o.add(_)}),Vg=on(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Ig({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),kg=on(({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(_n(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"}]}),Gg=on(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=pn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return pn(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"}]}),zg=on(({dotNV:e,dotNL:t})=>pn(1).div(pn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),$g=on(({lightDirection:e})=>{const t=e.add(Ud).normalize(),r=qd.dot(e).clamp(),s=qd.dot(Ud).clamp(),i=qd.dot(t).clamp(),n=Gg({roughness:Hn,dotNH:i}),a=zg({dotNV:s,dotNL:r});return Wn.mul(n).mul(a)}),Wg=on(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=yn(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"}]}),Hg=on(({f:e})=>{const t=e.length();return Wo(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),qg=on(({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,Wo(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"}]}),jg=on(({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=_n().toVar();return dn(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(Mn(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=_n(0).toVar();f.addAssign(qg({v1:h,v2:p})),f.addAssign(qg({v1:p,v2:g})),f.addAssign(qg({v1:g,v2:m})),f.addAssign(qg({v1:m,v2:h})),c.assign(_n(Hg({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"}]}),Xg=on(({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=_n().toVar();return dn(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=_n(0).toVar();d.addAssign(qg({v1:n,v2:a})),d.addAssign(qg({v1:a,v2:o})),d.addAssign(qg({v1:o,v2:l})),d.addAssign(qg({v1:l,v2:n})),u.assign(_n(Hg({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"}]}),Kg=1/6,Yg=e=>Ba(Kg,Ba(e,Ba(e,e.negate().add(3)).sub(3)).add(1)),Qg=e=>Ba(Kg,Ba(e,Ba(e,Ba(3,e).sub(6))).add(4)),Zg=e=>Ba(Kg,Ba(e,Ba(e,Ba(-3,e).add(3)).add(3)).add(1)),Jg=e=>Ba(Kg,Qo(e,3)),em=e=>Yg(e).add(Qg(e)),tm=e=>Zg(e).add(Jg(e)),rm=e=>Ca(-1,Qg(e).div(Yg(e).add(Qg(e)))),sm=e=>Ca(1,Jg(e).div(Zg(e).add(Jg(e)))),im=(e,t,r)=>{const s=e.uvNode,i=Ba(s,t.zw).add(.5),n=xo(i),a=vo(i),o=em(a.x),u=tm(a.x),l=rm(a.x),d=sm(a.x),c=rm(a.y),h=sm(a.y),p=yn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=yn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=yn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=yn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=em(a.y).mul(Ca(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=tm(a.y).mul(Ca(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},nm=on(([e,t])=>{const r=yn(e.size(gn(t))),s=yn(e.size(gn(t.add(1)))),i=La(1,r),n=La(1,s),a=im(e,Rn(i,r),xo(t)),o=im(e,Rn(n,s),To(t));return vo(t).mix(a,o)}),am=on(([e,t])=>{const r=t.mul(wl(e));return nm(e,r)}),om=on(([e,t,r,s,i])=>{const n=_n(ou(t.negate(),_o(e),La(1,s))),a=_n(Bo(i[0].xyz),Bo(i[1].xyz),Bo(i[2].xyz));return _o(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"}]}),um=on(([e,t])=>e.mul(nu(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),lm=vp(),dm=Sp(),cm=on(([e,t,r],{material:s})=>{const i=(s.side===M?lm:dm).sample(e),n=fo(Hl.x).mul(um(t,r));return nm(i,n)}),hm=on(([e,t,r])=>(dn(r.notEqual(0),()=>{const s=mo(t).negate().div(r);return po(s.negate().mul(e))}),_n(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),pm=on(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=Rn().toVar(),f=_n().toVar();const i=d.sub(1).mul(g.mul(.025)),n=_n(d.sub(i),d,d.add(i));op({start:0,end:3},({i:i})=>{const d=n.element(i),g=om(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(Rn(y,1))),x=yn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(yn(x.x,x.y.oneMinus()));const T=cm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(hm(Bo(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=om(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(Rn(n,1))),y=yn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(yn(y.x,y.y.oneMinus())),m=cm(y,r,d),f=s.mul(hm(Bo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=_n(Vg({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return Rn(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),gm=Mn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),mm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),fm=on(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=iu(e,t,uu(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();dn(a.lessThan(0),()=>_n(1));const o=a.sqrt(),u=mm(n,e),l=bg({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=pn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return _n(1).add(t).div(_n(1).sub(t))})(i.clamp(0,.9999)),g=mm(p,n.toVec3()),m=bg({f0:g,f90:1,dotVH:o}),f=_n(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=_n(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(_n(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return op({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=_n(54856e-17,44201e-17,52481e-17),i=_n(1681e3,1795300,2208400),n=_n(43278e5,93046e5,66121e5),a=pn(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=_n(o.x.add(a),o.y,o.z).div(1.0685e-7),gm.mul(o)})(pn(e).mul(y),pn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(_n(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"}]}),ym=on(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=pn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=pn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),bm=_n(.04),xm=pn(1);class Tm extends gg{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=_n().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=_n().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=_n().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=_n().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=_n().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=qd.dot(Ud).clamp(),t=fm({outsideIOR:pn(1),eta2:jn,cosTheta1:e,thinFilmThickness:Xn,baseF0:Jn}),r=fm({outsideIOR:pn(1),eta2:jn,cosTheta1:e,thinFilmThickness:Xn,baseF0:In.rgb});this.iridescenceFresnel=iu(t,r,Gn),this.iridescenceF0Dielectric=kg({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=kg({f:r,f90:1,dotVH:e}),this.iridescenceF0=iu(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,Gn)}if(!0===this.transmission){const t=Pd,r=ad.sub(Pd).normalize(),s=jd,i=e.context;i.backdrop=pm(s,r,kn,On,ea,ta,t,bd,sd,td,oa,la,ca,da,this.dispersion?ha:null),i.backdropAlpha=ua,In.a.mulAssign(iu(1,i.backdrop.a,ua))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=qd.dot(Ud).clamp(),a=Ig({roughness:kn,dotNV:n}),o=i?qn.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=qd.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul($g({lightDirection:e})));const t=ym({normal:qd,viewDir:Ud,roughness:Hn}),r=ym({normal:qd,viewDir:e,roughness:Hn}),i=Wn.r.max(Wn.g).max(Wn.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=Xd.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Fg({lightDirection:e,f0:bm,f90:xm,roughness:$n,normalView:Xd})))}r.directDiffuse.addAssign(s.mul(xg({diffuseColor:On}))),r.directSpecular.addAssign(s.mul(Og({lightDirection:e,f0:ea,f90:1,roughness:kn,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=qd,h=Ud,p=Dd.toVar(),g=Wg({N:c,V:h,roughness:kn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Mn(_n(m.x,0,m.y),_n(0,1,0),_n(m.z,0,m.w)).toVar(),b=ea.mul(f.x).add(ea.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(jg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(On).mul(jg({N:c,V:h,P:p,mInv:Mn(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(xg({diffuseColor:On})).toVar();if(!0===this.sheen){const e=ym({normal:qd,viewDir:Ud,roughness:Hn}),t=Wn.r.max(Wn.g).max(Wn.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(Wn,ym({normal:qd,viewDir:Ud,roughness:Hn}))),!0===this.clearcoat){const e=Xd.dot(Ud).clamp(),t=Vg({dotNV:e,specularColor:bm,specularF90:xm,roughness:$n});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=_n().toVar("singleScatteringDielectric"),n=_n().toVar("multiScatteringDielectric"),a=_n().toVar("singleScatteringMetallic"),o=_n().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ta,Jn,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ta,In.rgb,this.iridescenceF0Metallic);const u=iu(i,a,Gn),l=iu(n,o,Gn),d=i.add(n),c=On.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=ym({normal:qd,viewDir:Ud,roughness:Hn}),t=Wn.r.max(Wn.g).max(Wn.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=qd.dot(Ud).clamp().add(t),i=kn.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=Xd.dot(Ud).clamp(),r=bg({dotVH:e,f0:bm,f90:xm}),s=t.mul(zn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(zn));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const _m=pn(1),vm=pn(-2),Nm=pn(.8),Sm=pn(-1),Rm=pn(.4),Em=pn(2),Am=pn(.305),wm=pn(3),Cm=pn(.21),Mm=pn(4),Bm=pn(4),Lm=pn(16),Pm=on(([e])=>{const t=_n(Co(e)).toVar(),r=pn(-1).toVar();return dn(t.x.greaterThan(t.z),()=>{dn(t.x.greaterThan(t.y),()=>{r.assign(yu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(yu(e.y.greaterThan(0),1,4))})}).Else(()=>{dn(t.z.greaterThan(t.y),()=>{r.assign(yu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(yu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Fm=on(([e,t])=>{const r=yn().toVar();return dn(t.equal(0),()=>{r.assign(yn(e.z,e.y).div(Co(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(yn(e.x.negate(),e.z.negate()).div(Co(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(yn(e.x.negate(),e.y).div(Co(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(yn(e.z.negate(),e.y).div(Co(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(yn(e.x.negate(),e.z).div(Co(e.y)))}).Else(()=>{r.assign(yn(e.x,e.y).div(Co(e.z)))}),Ba(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Dm=on(([e])=>{const t=pn(0).toVar();return dn(e.greaterThanEqual(Nm),()=>{t.assign(_m.sub(e).mul(Sm.sub(vm)).div(_m.sub(Nm)).add(vm))}).ElseIf(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))}).Else(()=>{t.assign(pn(-2).mul(fo(Ba(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Um=on(([e,t])=>{const r=e.toVar();r.assign(Ba(2,r).sub(1));const s=_n(r,1).toVar();return dn(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"}]}),Im=on(([e,t,r,s,i,n])=>{const a=pn(r),o=_n(t),u=nu(Dm(a),vm,n),l=vo(u),d=xo(u),c=_n(Om(e,o,d,s,i,n)).toVar();return dn(l.notEqual(0),()=>{const t=_n(Om(e,o,d.add(1),s,i,n)).toVar();c.assign(iu(c,t,l))}),c}),Om=on(([e,t,r,s,i,n])=>{const a=pn(r).toVar(),o=_n(t),u=pn(Pm(o)).toVar(),l=pn(Wo(Bm.sub(a),0)).toVar();a.assign(Wo(a,Bm));const d=pn(go(a)).toVar(),c=yn(Fm(o,u).mul(d.sub(2)).add(1)).toVar();return dn(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(Ba(3,Lm))),c.y.addAssign(Ba(4,go(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(yn(),yn())}),Vm=on(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=So(s),l=r.mul(u).add(i.cross(r).mul(No(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Om(e,l,t,n,a,o)}),km=on(({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=_n(yu(t,r,Yo(r,s))).toVar();dn(h.equal(_n(0)),()=>{h.assign(_n(s.z,0,s.x.negate()))}),h.assign(_o(h));const p=_n().toVar();return p.addAssign(i.element(0).mul(Vm({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),op({start:gn(1),end:e},({i:e})=>{dn(e.greaterThanEqual(n),()=>{up()});const t=pn(a.mul(pn(e))).toVar();p.addAssign(i.element(e).mul(Vm({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(Vm({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),Rn(p,1)}),Gm=on(([e])=>{const t=mn(e).toVar();return t.assign(t.shiftLeft(mn(16)).bitOr(t.shiftRight(mn(16)))),t.assign(t.bitAnd(mn(1431655765)).shiftLeft(mn(1)).bitOr(t.bitAnd(mn(2863311530)).shiftRight(mn(1)))),t.assign(t.bitAnd(mn(858993459)).shiftLeft(mn(2)).bitOr(t.bitAnd(mn(3435973836)).shiftRight(mn(2)))),t.assign(t.bitAnd(mn(252645135)).shiftLeft(mn(4)).bitOr(t.bitAnd(mn(4042322160)).shiftRight(mn(4)))),t.assign(t.bitAnd(mn(16711935)).shiftLeft(mn(8)).bitOr(t.bitAnd(mn(4278255360)).shiftRight(mn(8)))),pn(t).mul(2.3283064365386963e-10)}),zm=on(([e,t])=>yn(pn(e).div(pn(t)),Gm(e))),$m=on(([e,t,r])=>{const s=_n(t).toVar(),i=pn(r),n=i.mul(i).toVar(),a=_o(_n(n.mul(s.x),n.mul(s.y),s.z)).toVar(),o=a.x.mul(a.x).add(a.y.mul(a.y)),u=yu(o.greaterThan(0),_n(a.y.negate(),a.x,0).div(yo(o)),_n(1,0,0)).toVar(),l=Yo(a,u).toVar(),d=yo(e.x),c=Ba(2,3.14159265359).mul(e.y),h=d.mul(So(c)).toVar(),p=d.mul(No(c)).toVar(),g=Ba(.5,a.z.add(1));p.assign(g.oneMinus().mul(yo(h.mul(h).oneMinus())).add(g.mul(p)));const m=u.mul(h).add(l.mul(p)).add(a.mul(yo(Wo(0,h.mul(h).add(p.mul(p)).oneMinus()))));return _o(_n(n.mul(m.x),n.mul(m.y),Wo(0,m.z)))}),Wm=on(({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=_n(s).toVar(),l=_n(0).toVar(),d=pn(0).toVar();return dn(e.lessThan(.001),()=>{l.assign(Om(r,u,t,n,a,o))}).Else(()=>{const s=yu(Co(u.z).lessThan(.999),_n(0,0,1),_n(1,0,0)),c=_o(Yo(s,u)).toVar(),h=Yo(u,c).toVar();op({start:mn(0),end:i},({i:s})=>{const p=zm(s,i),g=$m(p,_n(0,0,1),e),m=_o(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=_o(m.mul(Ko(u,m).mul(2)).sub(u)),y=Wo(Ko(u,f),0);dn(y.greaterThan(0),()=>{const e=Om(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),dn(d.greaterThan(0),()=>{l.assign(l.div(d))})}),Rn(l,1)}),Hm=[.125,.215,.35,.446,.526,.582],qm=20,jm=new _e(-1,1,1,-1,0,1),Xm=new ve(90,1),Km=new e;let Ym=null,Qm=0,Zm=0;const Jm=new r,ef=new WeakMap,tf=[3,1,5,0,4,2],rf=Um(Sl(),Nl("faceIndex")).normalize(),sf=_n(rf.x,rf.y,rf.z);class nf{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=Jm,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}Ym=this._renderer.getRenderTarget(),Qm=this._renderer.getActiveCubeFace(),Zm=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=lf(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=df(),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===F||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=Hm[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=tf[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=Ol(new Array(qm).fill(0)),n=Ta(new r(0,1,0)),a=Ta(0),o=pn(qm),u=Ta(0),l=Ta(1),d=Ll(),c=Ta(0),h=pn(1/t),p=pn(1/s),g=pn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:sf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=uf("blur");return f.fragmentNode=km({...m,latitudinal:u.equal(1)}),ef.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Ll(),i=Ta(0),n=Ta(0),a=pn(1/t),o=pn(1/r),u=pn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=uf("ggx");return d.fragmentNode=Wm({...l,N_immutable:sf,GGX_SAMPLES:mn(512)}),ef.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ne(new Te,e);await this._renderer.compile(t,jm)}_sceneToCubeUV(e,t,r,s,i){const n=Xm;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(Km),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(Km),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;of(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===F||e.mapping===D;s?null===this._cubemapMaterial&&(this._cubemapMaterial=lf(e)):null===this._equirectMaterial&&(this._equirectMaterial=df(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;of(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,jm)}_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,of(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,jm),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,of(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,jm)}_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=ef.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):qm;f>qm&&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,jm)}}function af(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 of(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function uf(e){const t=new Yp;return t.depthTest=!1,t.depthWrite=!1,t.blending=ee,t.name=`PMREM_${e}`,t}function lf(e){const t=uf("cubemap");return t.fragmentNode=hc(e,sf),t}function df(e){const t=uf("equirect");return t.fragmentNode=Ll(e,ng(sf),0),t}const cf=new WeakMap;function hf(e,t,r){const s=function(e){let t=cf.get(e);void 0===t&&(t=new WeakMap,cf.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 pf extends di{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=Ll(s),this._width=Ta(0),this._height=Ta(0),this._maxMip=Ta(0),this.updateBeforeType=Zs.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:hf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new nf(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=ic.mul(_n(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Im(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const gf=tn(pf).setParameterLength(1,3),mf=new WeakMap;class ff extends gp{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=mf.get(e);void 0===s&&(s=gf(e),mf.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Wc:qd,i=r.context(yf(kn,s)).mul(sc),n=r.context(bf(jd)).mul(Math.PI).mul(sc),a=nl(i),o=nl(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(yf($n,Xd)).mul(sc),t=nl(e);u.addAssign(t)}}}const yf=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Ud.negate().reflect(t),r=eu(e).mix(r,t).normalize(),r=r.transformDirection(sd)),r),getTextureLevel:()=>e}},bf=e=>({getUV:()=>e,getTextureLevel:()=>pn(1)}),xf=new we;class Tf extends Yp{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(xf),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new ff(t):null}setupLightingModel(){return new Tm}setupSpecular(){const e=iu(_n(.04),In.rgb,Gn);Jn.assign(_n(.04)),ea.assign(e),ta.assign(1)}setupVariants(){const e=this.metalnessNode?pn(this.metalnessNode):hh;Gn.assign(e);let t=this.roughnessNode?pn(this.roughnessNode):ch;t=wg({roughness:t}),kn.assign(t),this.setupSpecular(),On.assign(In.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const _f=new Ce;class vf extends Tf{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(_f),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?pn(this.iorNode):Eh;oa.assign(e),Jn.assign($o(Zo(oa.sub(1).div(oa.add(1))).mul(uh),_n(1)).mul(oh)),ea.assign(iu(Jn,In.rgb,Gn)),ta.assign(iu(oh,1,Gn))}setupLightingModel(){return new Tm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?pn(this.clearcoatNode):gh,t=this.clearcoatRoughnessNode?pn(this.clearcoatRoughnessNode):mh;zn.assign(e),$n.assign(wg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?_n(this.sheenNode):bh,t=this.sheenRoughnessNode?pn(this.sheenRoughnessNode):xh;Wn.assign(e),Hn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?pn(this.iridescenceNode):_h,t=this.iridescenceIORNode?pn(this.iridescenceIORNode):vh,r=this.iridescenceThicknessNode?pn(this.iridescenceThicknessNode):Nh;qn.assign(e),jn.assign(t),Xn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?yn(this.anisotropyNode):Th).toVar();Yn.assign(e.length()),dn(Yn.equal(0),()=>{e.assign(yn(1,0))}).Else(()=>{e.divAssign(yn(Yn)),Yn.assign(Yn.saturate())}),Kn.assign(Yn.pow2().mix(kn.pow2(),1)),Qn.assign(zc[0].mul(e.x).add(zc[1].mul(e.y))),Zn.assign(zc[1].mul(e.x).sub(zc[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?pn(this.transmissionNode):Sh,t=this.thicknessNode?pn(this.thicknessNode):Rh,r=this.attenuationDistanceNode?pn(this.attenuationDistanceNode):Ah,s=this.attenuationColorNode?_n(this.attenuationColorNode):wh;if(ua.assign(e),la.assign(t),da.assign(r),ca.assign(s),this.useDispersion){const e=this.dispersionNode?pn(this.dispersionNode):Dh;ha.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?_n(this.clearcoatNormalNode):fh}setup(e){e.context.setupClearcoatNormal=()=>Bu(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 Nf extends Tm{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(qd.mul(a)).normalize(),h=pn(Ud.dot(c.negate()).saturate().pow(l).mul(d)),p=_n(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Sf extends vf{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=pn(.1),this.thicknessAmbientNode=pn(0),this.thicknessAttenuationNode=pn(.1),this.thicknessPowerNode=pn(2),this.thicknessScaleNode=pn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new Nf(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 Rf=on(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=yn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=bc("gradientMap","texture").context({getUV:()=>i});return _n(e.r)}{const e=i.fwidth().mul(.5);return iu(_n(.7),_n(1),uu(pn(.7).sub(e.x),pn(.7).add(e.x),i.x))}});class Ef extends gg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Rf({normal:Gd,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(xg({diffuseColor:In.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(xg({diffuseColor:In}))),s.indirectDiffuse.mulAssign(t)}}const Af=new Me;class wf extends Yp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Af),this.setValues(e)}setupLightingModel(){return new Ef}}const Cf=on(()=>{const e=_n(Ud.z,0,Ud.x.negate()).normalize(),t=Ud.cross(e);return yn(e.dot(qd),t.dot(qd)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Mf=new Be;class Bf extends Yp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Mf),this.setValues(e)}setupVariants(e){const t=Cf;let r;r=e.material.matcap?bc("matcap","texture").context({getUV:()=>t}):_n(iu(.2,.8,t.y)),In.rgb.mulAssign(r.rgb)}}class Lf extends di{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 Cn(e,s,s.negate(),e).mul(r)}{const e=t,s=Bn(Rn(1,0,0,0),Rn(0,So(e.x),No(e.x).negate(),0),Rn(0,No(e.x),So(e.x),0),Rn(0,0,0,1)),i=Bn(Rn(So(e.y),0,No(e.y),0),Rn(0,1,0,0),Rn(No(e.y).negate(),0,So(e.y),0),Rn(0,0,0,1)),n=Bn(Rn(So(e.z),No(e.z).negate(),0,0),Rn(No(e.z),So(e.z),0,0),Rn(0,0,1,0),Rn(0,0,0,1));return s.mul(i).mul(n).mul(Rn(r,1)).xyz}}}const Pf=tn(Lf).setParameterLength(2),Ff=new Le;class Df extends Yp{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(Ff),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=Rd.mul(_n(s||0));let u=yn(bd[0].xyz.length(),bd[1].xyz.length());null!==n&&(u=u.mul(yn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=Md.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new zu(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=pn(i||yh),c=Pf(l,d);return Rn(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 Uf=new Pe,If=new t;class Of extends Df{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Uf),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Rd.mul(_n(e||Bd)).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?yn(n):Fh;u=u.mul($l),r.isPerspectiveCamera&&!0===a&&(u=u.mul(Vf.div(Dd.z.negate()))),i&&i.isNode&&(u=u.mul(yn(i)));let l=Md.xy;if(s&&s.isNode){const e=pn(s);l=Pf(l,e)}return l=l.mul(u),l=l.div(Xl.div(2)),l=l.mul(o.w),o=o.add(Rn(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 Vf=Ta(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(If);this.value=.5*t.y});class kf extends gg{constructor(){super(),this.shadowNode=pn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){In.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(In.rgb)}}const Gf=new Fe;class zf extends Yp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(Gf),this.setValues(e)}setupLightingModel(){return new kf}}const $f=Dn("vec3"),Wf=Dn("vec3"),Hf=Dn("vec3");class qf extends gg{constructor(){super()}start(e){const{material:t}=e,r=Dn("vec3"),s=Dn("vec3");dn(ad.sub(Pd).length().greaterThan(vd.mul(2)),()=>{r.assign(ad),s.assign(Pd)}).Else(()=>{r.assign(Pd),s.assign(ad)});const i=s.sub(r),n=Ta("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=pn(0).toVar(),l=_n(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),op(n,()=>{const s=r.add(o.mul(u)),i=sd.mul(Rn(s,1)).xyz;let n;null!==t.depthNode&&(Wf.assign(Dp(Mp(i.z,Jl,ed))),e.context.sceneDepthNode=Dp(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,$f.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&$f.mulAssign(n);const d=$f.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),Hf.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?dn(r.greaterThanEqual(Wf),()=>{$f.addAssign(e)}):$f.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(Xg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(Hf)}}class jf extends Yp{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 qf}}class Xf{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 Kf{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+",",Ds(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=Is(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Is(e,1)),e=Is(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 Zf=[];class Jf{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);Zf[0]=e,Zf[1]=t,Zf[2]=n,Zf[3]=i;let l=u.get(Zf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Zf,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)),Zf[0]=null,Zf[1]=null,Zf[2]=null,Zf[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Kf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Qf(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 ey{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 ty=1,ry=2,sy=3,iy=4,ny=16;class ay extends ey{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===ty?this.backend.createAttribute(e):t===ry?this.backend.createIndexAttribute(e):t===sy?this.backend.createStorageAttribute(e):t===iy&&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,sy):this.updateAttribute(e,ty);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,ry);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,iy)}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=uy(t),e.set(t,r)):r.version!==oy(t)&&(this.attributes.delete(r),r=uy(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 dy{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 cy{constructor(e){this.cacheKey=e,this.usedTimes=0}}class hy extends cy{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class py extends cy{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let gy=0;class my{constructor(e,t,r,s=null,i=null){this.id=gy++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class fy extends ey{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 my(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 my(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 my(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 py(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 hy(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 yy extends ey{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?iy:sy;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?iy:sy;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 by(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 xy(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 Ty(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===B&&!1===e.forceSinglePass}class _y{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?(Ty(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?(Ty(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||by),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||xy),this.transparent.length>1&&this.transparent.sort(t||xy)}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=wy){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),un(r),e.removeActiveStack(this),o}}const Py=tn(Ly).setParameterLength(0,1);class Fy extends oi{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=$s(i),a=Ws(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 Dy extends oi{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)}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 Uy extends oi{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 Wy(e,"uint","float"),jy={};class Xy extends to{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(Hy(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return mn;case"int":return gn;case"uvec2":return xn;case"uvec3":return Nn;case"uvec4":return An;case"ivec2":return bn;case"ivec3":return vn;case"ivec4":return En}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return on(([e])=>{const s=mn(0);this._resolveElementType(e,s,t);const i=pn(s.bitAnd(Lo(s))),n=qy(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 on(([e])=>{dn(e.equal(mn(0)),()=>mn(32));const s=mn(0),i=mn(0);return this._resolveElementType(e,s,t),dn(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),dn(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),dn(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),dn(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),dn(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 on(([e])=>{const s=mn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(mn(1)).bitAnd(mn(1431655765)))),s.assign(s.bitAnd(mn(858993459)).add(s.shiftRight(mn(2)).bitAnd(mn(858993459))));const i=s.add(s.shiftRight(mn(4))).bitAnd(mn(252645135)).mul(mn(16843009)).shiftRight(mn(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 on(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}Xy.COUNT_TRAILING_ZEROS="countTrailingZeros",Xy.COUNT_LEADING_ZEROS="countLeadingZeros",Xy.COUNT_ONE_BITS="countOneBits";const Ky=sn(Xy,Xy.COUNT_TRAILING_ZEROS).setParameterLength(1),Yy=sn(Xy,Xy.COUNT_LEADING_ZEROS).setParameterLength(1),Qy=sn(Xy,Xy.COUNT_ONE_BITS).setParameterLength(1),Zy=on(([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)}),Jy=(e,t)=>Qo(Ba(4,e.mul(Ma(1,e))),t);class eb extends di{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 tb=sn(eb,"snorm").setParameterLength(1),rb=sn(eb,"unorm").setParameterLength(1),sb=sn(eb,"float16").setParameterLength(1);class ib extends di{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 nb=sn(ib,"snorm").setParameterLength(1),ab=sn(ib,"unorm").setParameterLength(1),ob=sn(ib,"float16").setParameterLength(1),ub=on(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),lb=on(([e])=>_n(ub(e.z.add(ub(e.y.mul(1)))),ub(e.z.add(ub(e.x.mul(1)))),ub(e.y.add(ub(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),db=on(([e,t,r])=>{const s=_n(e).toVar(),i=pn(1.4).toVar(),n=pn(0).toVar(),a=_n(s).toVar();return op({start:pn(0),end:pn(3),type:"float",condition:"<="},()=>{const e=_n(lb(a.mul(2))).toVar();s.addAssign(e.add(r.mul(pn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=pn(ub(s.z.add(ub(s.x.add(ub(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 cb extends oi{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 hb=tn(cb),pb=e=>(...t)=>hb(e,...t),gb=Ta(0).setGroup(ya).onRenderUpdate(e=>e.time),mb=Ta(0).setGroup(ya).onRenderUpdate(e=>e.deltaTime),fb=Ta(0,"uint").setGroup(ya).onRenderUpdate(e=>e.frameId);const yb=on(([e,t,r=yn(.5)])=>Pf(e.sub(r),t).add(r)),bb=on(([e,t,r=yn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),xb=on(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=bd.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=bd;const i=sd.mul(s);return Xi(t)&&(i[0][0]=bd[0].length(),i[0][1]=0,i[0][2]=0),Xi(r)&&(i[1][0]=0,i[1][1]=bd[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,td.mul(i).mul(Bd)}),Tb=on(([e=null])=>{const t=Dp();return Dp(Ap(e)).sub(t).lessThan(0).select(Wl,e)}),_b=on(([e,t=Sl(),r=pn(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=yn(a,o);return t.add(l).mul(u)}),vb=on(([e,t=null,r=null,s=pn(1),i=Bd,n=zd])=>{let a=n.abs().normalize();a=a.div(a.dot(_n(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=Ll(d,o).mul(a.x),g=Ll(c,u).mul(a.y),m=Ll(h,l).mul(a.z);return Ca(p,g,m)}),Nb=new je,Sb=new r,Rb=new r,Eb=new r,Ab=new a,wb=new r(0,0,-1),Cb=new s,Mb=new r,Bb=new r,Lb=new s,Pb=new t,Fb=new Ne,Db=Wl.flipX();Fb.depthTexture=new Y(1,1);let Ub=!1;class Ib extends Ml{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Fb.texture,Db),this._reflectorBaseNode=e.reflector||new Ob(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=Qi(new Ib({defaultTexture:Fb.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 Ob extends oi{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?Zs.RENDER:Zs.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(Fb,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&&Ub)return!1;Ub=!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),Rb.setFromMatrixPosition(n.matrixWorld),Eb.setFromMatrixPosition(r.matrixWorld),Ab.extractRotation(n.matrixWorld),Sb.set(0,0,1),Sb.applyMatrix4(Ab),Mb.subVectors(Rb,Eb);let u=!1;if(!0===Mb.dot(Sb)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Ub=!1);u=!0}Mb.reflect(Sb).negate(),Mb.add(Rb),Ab.extractRotation(r.matrixWorld),wb.set(0,0,-1),wb.applyMatrix4(Ab),wb.add(Eb),Bb.subVectors(Rb,wb),Bb.reflect(Sb).negate(),Bb.add(Rb),a.coordinateSystem=r.coordinateSystem,a.position.copy(Mb),a.up.set(0,1,0),a.up.applyMatrix4(Ab),a.up.reflect(Sb),a.lookAt(Bb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Nb.setFromNormalAndCoplanarPoint(Sb,Rb),Nb.applyMatrix4(a.matrixWorldInverse),Cb.set(Nb.normal.x,Nb.normal.y,Nb.normal.z,Nb.constant);const l=a.projectionMatrix;Lb.x=(Math.sign(Cb.x)+l.elements[8])/l.elements[0],Lb.y=(Math.sign(Cb.y)+l.elements[9])/l.elements[5],Lb.z=-1,Lb.w=(1+l.elements[10])/l.elements[14],Cb.multiplyScalar(1/Cb.dot(Lb));l.elements[2]=Cb.x,l.elements[6]=Cb.y,l.elements[10]=s.coordinateSystem===h?Cb.z-0:Cb.z+1-0,l.elements[14]=Cb.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,Ub=!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 Vb=new _e(-1,1,1,-1,0,1);class kb 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 Gb=new kb;class zb extends ne{constructor(e=null){super(Gb,e),this.camera=Vb,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,Vb)}render(e){e.render(this,Vb)}}const $b=new t;class Wb extends Ml{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new Ne(t,r,s);super(i.texture,Sl()),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 zb(new Yp),this.updateBeforeType=Zs.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($b),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 Ml(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const Hb=(e,...t)=>Qi(new Wb(Qi(e),...t)),qb=on(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=yn(e.x,e.y.oneMinus()).mul(2).sub(1),i=Rn(_n(e,t),1)):i=Rn(_n(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=Rn(r.mul(i));return n.xyz.div(n.w)}),jb=on(([e,t])=>{const r=t.mul(Rn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return yn(s.x,s.y.oneMinus())}),Xb=on(([e,t,r])=>{const s=El(Pl(t)),i=bn(e.mul(s)).toVar(),n=Pl(t,i).toVar(),a=Pl(t,i.sub(bn(2,0))).toVar(),o=Pl(t,i.sub(bn(1,0))).toVar(),u=Pl(t,i.add(bn(1,0))).toVar(),l=Pl(t,i.add(bn(2,0))).toVar(),d=Pl(t,i.add(bn(0,2))).toVar(),c=Pl(t,i.add(bn(0,1))).toVar(),h=Pl(t,i.sub(bn(0,1))).toVar(),p=Pl(t,i.sub(bn(0,2))).toVar(),g=Co(Ma(pn(2).mul(o).sub(a),n)).toVar(),m=Co(Ma(pn(2).mul(u).sub(l),n)).toVar(),f=Co(Ma(pn(2).mul(c).sub(d),n)).toVar(),y=Co(Ma(pn(2).mul(h).sub(p),n)).toVar(),b=qb(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(qb(e.sub(yn(pn(1).div(s.x),0)),o,r)),b.negate().add(qb(e.add(yn(pn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(qb(e.add(yn(0,pn(1).div(s.y))),c,r)),b.negate().add(qb(e.sub(yn(0,pn(1).div(s.y))),h,r)));return _o(Yo(x,T))}),Kb=on(([e])=>vo(pn(52.9829189).mul(vo(Ko(e,yn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),Yb=on(([e,t,r])=>{const s=pn(2.399963229728653),i=yo(pn(e).add(.5).div(pn(t))),n=pn(e).mul(s).add(r);return yn(So(n),No(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class Qb extends oi{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Sl())}sample(e){return this.callback(e)}}class Zb extends oi{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===Zb.OBJECT?this.updateType=Zs.OBJECT:e===Zb.MATERIAL?this.updateType=Zs.RENDER:e===Zb.BEFORE_OBJECT?this.updateBeforeType=Zs.OBJECT:e===Zb.BEFORE_MATERIAL&&(this.updateBeforeType=Zs.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}Zb.OBJECT="object",Zb.MATERIAL="material",Zb.BEFORE_OBJECT="beforeObject",Zb.BEFORE_MATERIAL="beforeMaterial";const Jb=(e,t)=>new Zb(e,t).toStack();class ex extends W{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class tx extends Ae{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class rx extends oi{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const sx=rn(rx),ix=new L,nx=new a;class ax extends oi{static get type(){return"SceneNode"}constructor(e=ax.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===ax.BACKGROUND_BLURRINESS?s=mc("backgroundBlurriness","float",r):t===ax.BACKGROUND_INTENSITY?s=mc("backgroundIntensity","float",r):t===ax.BACKGROUND_ROTATION?s=Ta("mat4").setName("backgroundRotation").setGroup(ya).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Qe?(ix.copy(r.backgroundRotation),ix.x*=-1,ix.y*=-1,ix.z*=-1,nx.makeRotationFromEuler(ix)):nx.identity(),nx}):o("SceneNode: Unknown scope:",t),s}}ax.BACKGROUND_BLURRINESS="backgroundBlurriness",ax.BACKGROUND_INTENSITY="backgroundIntensity",ax.BACKGROUND_ROTATION="backgroundRotation";const ox=rn(ax,ax.BACKGROUND_BLURRINESS),ux=rn(ax,ax.BACKGROUND_INTENSITY),lx=rn(ax,ax.BACKGROUND_ROTATION);class dx extends Ml{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=ei.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(ei.READ_WRITE)}toReadOnly(){return this.setAccess(ei.READ_ONLY)}toWriteOnly(){return this.setAccess(ei.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 cx=tn(dx).setParameterLength(1,3),hx=on(({texture:e,uv:t})=>{const r=1e-4,s=_n().toVar();return dn(t.x.lessThan(r),()=>{s.assign(_n(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(_n(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(_n(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(_n(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(_n(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(_n(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(_n(-.01,0,0))).r.sub(e.sample(t.add(_n(r,0,0))).r),n=e.sample(t.add(_n(0,-.01,0))).r.sub(e.sample(t.add(_n(0,r,0))).r),a=e.sample(t.add(_n(0,0,-.01))).r.sub(e.sample(t.add(_n(0,0,r))).r);s.assign(_n(i,n,a))}),s.normalize()});class px extends Ml{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return _n(.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 hx({texture:this,uv:e})}}const gx=tn(px).setParameterLength(1,3);class mx extends gc{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 fx=new WeakMap;class yx extends di{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Zs.OBJECT,this.updateAfterType=Zs.OBJECT,this.previousModelWorldMatrix=Ta(new a),this.previousProjectionMatrix=Ta(new a).setGroup(ya),this.previousCameraViewMatrix=Ta(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=xx(r);this.previousModelWorldMatrix.value.copy(s);const i=bx(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}){xx(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?td:Ta(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Rd).mul(Bd),s=this.previousProjectionMatrix.mul(t).mul(Ld),i=r.xy.div(r.w),n=s.xy.div(s.w);return Ma(i,n)}}function bx(e){let t=fx.get(e);return void 0===t&&(t={},fx.set(e,t)),t}function xx(e,t=0){const r=bx(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const Tx=rn(yx),_x=on(([e])=>Rx(e.rgb)),vx=on(([e,t=pn(1)])=>t.mix(Rx(e.rgb),e.rgb)),Nx=on(([e,t=pn(1)])=>{const r=Ca(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 iu(e.rgb,s,i)}),Sx=on(([e,t=pn(1)])=>{const r=_n(.57735,.57735,.57735),s=t.cos();return _n(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Ko(r,e.rgb).mul(s.oneMinus())))))}),Rx=(e,t=_n(p.getLuminanceCoefficients(new r)))=>Ko(e,t),Ex=on(([e,t=_n(1),s=_n(0),i=_n(1),n=pn(1),a=_n(p.getLuminanceCoefficients(new r,Se))])=>{const o=e.rgb.dot(_n(a)),u=Wo(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return dn(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),dn(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),dn(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),Rn(u.rgb,e.a)});class Ax extends di{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 wx=tn(Ax).setParameterLength(2);let Cx=null;class Mx extends Tp{static get type(){return"ViewportSharedTextureNode"}constructor(e=Wl,t=null){null===Cx&&(Cx=new X),super(e,t,Cx)}getTextureForReference(){return Cx}updateReference(){return this}}const Bx=tn(Mx).setParameterLength(0,2),Lx=new t;class Px extends Ml{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 Fx 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 Dx extends di{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=Ta(0),this._cameraFar=Ta(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Zs.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 Fx(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 Fx(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=Bp(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=Cp(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===Dx.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),Lx.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Lx)),this._pixelRatio=i,this.setSize(Lx.width,Lx.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:xu({...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()}}Dx.COLOR="color",Dx.DEPTH="depth";class Ux extends Dx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Dx.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 Yp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=M;const t=zd.negate(),r=td.mul(Rd),s=pn(1),i=r.mul(Rn(Bd,1)),n=r.mul(Rn(Bd.add(t),1)),a=_o(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=Rn(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 Ix=on(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Ox=on(([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"}]}),Vx=on(([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"}]}),kx=on(([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)}),Gx=on(([e,t])=>{const r=Mn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Mn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=kx(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),zx=Mn(_n(1.6605,-.1246,-.0182),_n(-.5876,1.1329,-.1006),_n(-.0728,-.0083,1.1187)),$x=Mn(_n(.6274,.0691,.0164),_n(.3293,.9195,.088),_n(.0433,.0113,.8956)),Wx=on(([e])=>{const t=_n(e).toVar(),r=_n(t.mul(t)).toVar(),s=_n(r.mul(r)).toVar();return pn(15.5).mul(s.mul(r)).sub(Ba(40.14,s.mul(t))).add(Ba(31.96,s).sub(Ba(6.868,r.mul(t))).add(Ba(.4298,r).add(Ba(.1191,t).sub(.00232))))}),Hx=on(([e,t])=>{const r=_n(e).toVar(),s=Mn(_n(.856627153315983,.137318972929847,.11189821299995),_n(.0951212405381588,.761241990602591,.0767994186031903),_n(.0482516061458583,.101439036467562,.811302368396859)),i=Mn(_n(1.1271005818144368,-.1413297634984383,-.14132976349843826),_n(-.11060664309660323,1.157823702216272,-.11060664309660294),_n(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=pn(-12.47393),a=pn(4.026069);return r.mulAssign(t),r.assign($x.mul(r)),r.assign(s.mul(r)),r.assign(Wo(r,1e-10)),r.assign(fo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(nu(r,0,1)),r.assign(Wx(r)),r.assign(i.mul(r)),r.assign(Qo(Wo(_n(0),r),_n(2.2))),r.assign(zx.mul(r)),r.assign(nu(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),qx=on(([e,t])=>{const r=pn(.76),s=pn(.15);e=e.mul(t);const i=$o(e.r,$o(e.g,e.b)),n=yu(i.lessThan(.08),i.sub(Ba(6.25,i.mul(i))),.04);e.subAssign(n);const a=Wo(e.r,Wo(e.g,e.b));dn(a.lessThan(r),()=>e);const o=Ma(1,r),u=Ma(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=Ma(1,La(1,s.mul(a.sub(u)).add(1)));return iu(e,_n(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class jx extends oi{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 Xx=tn(jx).setParameterLength(1,3);class Kx extends jx{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 Yx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Qx extends oi{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:pn()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Xs(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?Ks(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 Zx=tn(Qx).setParameterLength(1);class Jx 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 eT{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 tT=new Jx;class rT extends oi{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new Jx,this._output=Zx(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]=Zx(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]=Zx(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 eT(this),t=tT.get("THREE"),r=tT.get("TSL"),s=this.getMethod(),i=[e,this._local,tT,()=>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:pn()}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=[Ds(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Us(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 sT=tn(rT).setParameterLength(1,2);function iT(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Dd.z).negate()}const nT=on(([e,t],r)=>{const s=iT(r);return uu(e,t,s)}),aT=on(([e],t)=>{const r=iT(t);return e.mul(e,r,r).negate().exp().oneMinus()}),oT=on(([e,t],r)=>{const s=iT(r),i=t.sub(Pd.y).max(0).toConst().mul(s).toConst();return e.mul(e,i,i).negate().exp().oneMinus()}),uT=on(([e,t])=>Rn(t.toFloat().mix(sa.rgb,e.toVec3()),sa.a));let lT=null,dT=null;class cT extends oi{static get type(){return"RangeNode"}constructor(e=pn(),t=pn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(Hs(t.value)),i=e.getTypeLength(Hs(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(Hs(a)),d=e.getTypeLength(Hs(o));lT=lT||new s,dT=dT||new s,lT.setScalar(0),dT.setScalar(0),1===u?lT.setScalar(a):a.isColor?lT.set(a.r,a.g,a.b,1):lT.set(a.x,a.y,a.z||0,a.w||0),1===d?dT.setScalar(o):o.isColor?dT.set(o.r,o.g,o.b,1):dT.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 pT(e,t),mT=gT("numWorkgroups","uvec3"),fT=gT("workgroupId","uvec3"),yT=gT("globalId","uvec3"),bT=gT("localId","uvec3"),xT=gT("subgroupSize","uint");const TT=tn(class extends oi{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 _T extends ui{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 vT extends oi{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 _T(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 NT extends oi{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=pl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}NT.ATOMIC_LOAD="atomicLoad",NT.ATOMIC_STORE="atomicStore",NT.ATOMIC_ADD="atomicAdd",NT.ATOMIC_SUB="atomicSub",NT.ATOMIC_MAX="atomicMax",NT.ATOMIC_MIN="atomicMin",NT.ATOMIC_AND="atomicAnd",NT.ATOMIC_OR="atomicOr",NT.ATOMIC_XOR="atomicXor";const ST=tn(NT),RT=(e,t,r)=>ST(e,t,r).toStack();class ET extends di{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 AT=sn(ET,ET.SUBGROUP_ELECT).setParameterLength(0),wT=sn(ET,ET.SUBGROUP_BALLOT).setParameterLength(1),CT=sn(ET,ET.SUBGROUP_ADD).setParameterLength(1),MT=sn(ET,ET.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),BT=sn(ET,ET.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),LT=sn(ET,ET.SUBGROUP_MUL).setParameterLength(1),PT=sn(ET,ET.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),FT=sn(ET,ET.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),DT=sn(ET,ET.SUBGROUP_AND).setParameterLength(1),UT=sn(ET,ET.SUBGROUP_OR).setParameterLength(1),IT=sn(ET,ET.SUBGROUP_XOR).setParameterLength(1),OT=sn(ET,ET.SUBGROUP_MIN).setParameterLength(1),VT=sn(ET,ET.SUBGROUP_MAX).setParameterLength(1),kT=sn(ET,ET.SUBGROUP_ALL).setParameterLength(0),GT=sn(ET,ET.SUBGROUP_ANY).setParameterLength(0),zT=sn(ET,ET.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),$T=sn(ET,ET.QUAD_SWAP_X).setParameterLength(1),WT=sn(ET,ET.QUAD_SWAP_Y).setParameterLength(1),HT=sn(ET,ET.QUAD_SWAP_DIAGONAL).setParameterLength(1),qT=sn(ET,ET.SUBGROUP_BROADCAST).setParameterLength(2),jT=sn(ET,ET.SUBGROUP_SHUFFLE).setParameterLength(2),XT=sn(ET,ET.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),KT=sn(ET,ET.SUBGROUP_SHUFFLE_UP).setParameterLength(2),YT=sn(ET,ET.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),QT=sn(ET,ET.QUAD_BROADCAST).setParameterLength(1);let ZT;function JT(e){ZT=ZT||new WeakMap;let t=ZT.get(e);return void 0===t&&ZT.set(e,t={}),t}function e_(e){const t=JT(e);return t.shadowMatrix||(t.shadowMatrix=Ta("mat4").setGroup(ya).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 t_(e,t=Pd){const r=e_(e).mul(t);return r.xyz.div(r.w)}function r_(e){const t=JT(e);return t.position||(t.position=Ta(new r).setGroup(ya).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function s_(e){const t=JT(e);return t.targetPosition||(t.targetPosition=Ta(new r).setGroup(ya).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function i_(e){const t=JT(e);return t.viewPosition||(t.viewPosition=Ta(new r).setGroup(ya).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const n_=e=>sd.transformDirection(r_(e).sub(s_(e))),a_=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},o_=new WeakMap,u_=[];class l_ extends oi{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Dn("vec3","totalDiffuse"),this.totalSpecularNode=Dn("vec3","totalSpecular"),this.outgoingLightNode=Dn("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(Qi(e));else{let s=null;if(null!==r&&(s=a_(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;o_.has(e)?s=o_.get(e):(s=new r(e),o_.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=_n(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 d_ extends oi{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Zs.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){c_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Pd)}}const c_=Dn("vec3","shadowPositionWorld");function h_(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 p_(e,t){return t=h_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function g_(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 m_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function f_(e,t){return t=m_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function y_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function b_(e,t,r){return r=f_(t,r=p_(e,r))}function x_(e,t,r){g_(e,r),y_(t,r)}var T_=Object.freeze({__proto__:null,resetRendererAndSceneState:b_,resetRendererState:p_,resetSceneState:f_,restoreRendererAndSceneState:x_,restoreRendererState:g_,restoreSceneState:y_,saveRendererAndSceneState:function(e,t,r={}){return r=m_(t,r=h_(e,r))},saveRendererState:h_,saveSceneState:m_});const __=new WeakMap,v_=on(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Ll(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),N_=on(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Ll(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=mc("mapSize","vec2",r).setGroup(ya),a=mc("radius","float",r).setGroup(ya),o=yn(1).div(n),u=a.mul(o.x),l=Kb(ql.xy).mul(6.28318530718);return Ca(i(t.xy.add(Yb(0,5,l).mul(u)),t.z),i(t.xy.add(Yb(1,5,l).mul(u)),t.z),i(t.xy.add(Yb(2,5,l).mul(u)),t.z),i(t.xy.add(Yb(3,5,l).mul(u)),t.z),i(t.xy.add(Yb(4,5,l).mul(u)),t.z)).mul(.2)}),S_=on(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Ll(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=mc("mapSize","vec2",r).setGroup(ya),a=yn(1).div(n),o=a.x,u=a.y,l=t.xy,d=vo(l.mul(n).add(.5));return l.subAssign(d.mul(a)),Ca(i(l,t.z),i(l.add(yn(o,0)),t.z),i(l.add(yn(0,u)),t.z),i(l.add(a),t.z),iu(i(l.add(yn(o.negate(),0)),t.z),i(l.add(yn(o.mul(2),0)),t.z),d.x),iu(i(l.add(yn(o.negate(),u)),t.z),i(l.add(yn(o.mul(2),u)),t.z),d.x),iu(i(l.add(yn(0,u.negate())),t.z),i(l.add(yn(0,u.mul(2))),t.z),d.y),iu(i(l.add(yn(o,u.negate())),t.z),i(l.add(yn(o,u.mul(2))),t.z),d.y),iu(iu(i(l.add(yn(o.negate(),u.negate())),t.z),i(l.add(yn(o.mul(2),u.negate())),t.z),d.x),iu(i(l.add(yn(o.negate(),u.mul(2))),t.z),i(l.add(yn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),R_=on(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Ll(e).sample(t.xy);e.isArrayTexture&&(s=s.depth(r)),s=s.rg;const i=s.x,n=Wo(1e-7,s.y.mul(s.y)),a=Ho(t.z,i);dn(a.equal(1),()=>pn(1));const o=t.z.sub(i);let u=n.div(n.add(o.mul(o)));return u=nu(Ma(u,.3).div(.65)),Wo(a,u)}),E_=on(([e,t,r])=>{let s=Pd.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s}),A_=e=>{let t=__.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=mc("near","float",t).setGroup(ya),s=mc("far","float",t).setGroup(ya),i=hd(e);return E_(i,r,s)})(e):null;t=new Yp,t.colorNode=Rn(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,__.set(e,t)}return t},w_=e=>{const t=__.get(e);void 0!==t&&(t.dispose(),__.delete(e))},C_=new Kf,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&&(js(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_=on(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=pn(0).toVar("meanVertical"),a=pn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(pn(1)).select(pn(0),pn(2).div(e.sub(1))),u=e.lessThanEqual(pn(1)).select(pn(0),pn(-1));op({start:gn(0),end:gn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(pn(e).mul(o));let d=s.sample(Ca(ql.xy,yn(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=yo(a.sub(n.mul(n)).max(0));return yn(n,l)}),P_=on(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=pn(0).toVar("meanHorizontal"),a=pn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(pn(1)).select(pn(0),pn(2).div(e.sub(1))),u=e.lessThanEqual(pn(1)).select(pn(0),pn(-1));op({start:gn(0),end:gn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(pn(e).mul(o));let d=s.sample(Ca(ql.xy,yn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(Ca(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=yo(a.sub(n.mul(n)).max(0));return yn(n,l)}),F_=[v_,N_,S_,R_];let D_;const U_=new zb;class I_ extends d_{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,pn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=mc("bias","float",r).setGroup(ya);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=mc("near","float",r.camera).setGroup(ya),s=mc("far","float",r.camera).setGroup(ya);n=Lp(e.negate(),t,s)}return a=_n(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return F_[e]}setupRenderTarget(e,t){const r=new Y(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=A;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,n=t.shadowMap.type,{depthTexture:a,shadowMap:o}=this.setupRenderTarget(i,e);if(i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),n===Ze&&!0!==i.isPointLightShadow){a.compareFunction=null,o.depth>1?(o._vsmShadowMapVertical||(o._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:o.depth,depthBuffer:!1}),o._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=o._vsmShadowMapVertical,o._vsmShadowMapHorizontal||(o._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:o.depth,depthBuffer:!1}),o._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=o._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=Ll(a);a.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Ll(this.vsmShadowMapVertical.texture);a.isArrayTexture&&(r=r.depth(this.depthLayer));const s=mc("blurSamples","float",i).setGroup(ya),n=mc("radius","float",i).setGroup(ya),u=mc("mapSize","vec2",i).setGroup(ya);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Yp);l.fragmentNode=L_({samples:s,radius:n,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Yp),l.fragmentNode=P_({samples:s,radius:n,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const u=mc("intensity","float",i).setGroup(ya),l=mc("normalBias","float",i).setGroup(ya),d=e_(s).mul(c_.add(jd.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=n===Ze&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:a,g=this.setupShadowFilter(e,{filterFn:h,shadowTexture:o.texture,depthTexture:p,shadowCoord:c,shadow:i,depthLayer:this.depthLayer});let m,f;!0===t.shadowMap.transmitted&&(o.texture.isCubeTexture?m=hc(o.texture,c.xyz):(m=Ll(o.texture,c),a.isArrayTexture&&(m=m.depth(this.depthLayer)))),f=m?iu(1,g.rgb.mix(m,1),u.mul(m.a)).toVar():iu(1,g,u).toVar(),this.shadowMap=o,this.shadow.map=o;const y=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return m&&f.toInspector(`${y} / Color`,()=>this.shadowMap.texture.isCubeTexture?hc(this.shadowMap.texture):Ll(this.shadowMap.texture)),f.toInspector(`${y} / Depth`,()=>this.shadowMap.texture.isCubeTexture?hc(this.shadowMap.texture).r.oneMinus():Pl(this.shadowMap.depthTexture,Sl().mul(El(Ll(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return on(()=>{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_=b_(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,x_(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_=on(({depthTexture:e,bd3D:t,dp:r})=>hc(e,t).compare(r)),X_=on(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=mc("radius","float",s).setGroup(ya),n=mc("mapSize","vec2",s).setGroup(ya),a=i.div(n.x),o=Co(t),u=_o(Yo(t,o.x.greaterThan(o.z).select(_n(0,1,0),_n(1,0,0)))),l=Yo(t,u),d=Kb(ql.xy).mul(6.28318530718),c=Yb(0,5,d),h=Yb(1,5,d),p=Yb(2,5,d),g=Yb(3,5,d),m=Yb(4,5,d);return hc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(hc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(hc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(hc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(hc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),K_=on(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=Ta("float").setGroup(ya).onRenderUpdate(()=>s.camera.near),o=Ta("float").setGroup(ya).onRenderUpdate(()=>s.camera.far),u=mc("bias","float",s).setGroup(ya),l=pn(1).toVar();return dn(n.sub(o).lessThanEqual(0).and(n.sub(a).greaterThanEqual(0)),()=>{const r=n.sub(a).div(o.sub(a)).toVar();r.addAssign(u);const d=i.normalize();l.assign(e({depthTexture:t,bd3D:d,dp:r,shadow:s}))}),l});class Y_ extends I_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Je?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 et(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=A;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 gp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||Ta(this.color).setGroup(ya),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Zs.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 i_(this.light).sub(e.context.positionView||Dd)}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?Qi(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_=on(({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=Ta(0).setGroup(ya),this.decayExponentNode=Ta(2).setGroup(ya)}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=on(([e=Sl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),sv=on(([e=Sl()],{renderer:t,material:r})=>{const s=su(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=pn(s.fwidth()).toVar();i=uu(e.oneMinus(),e.add(1),s).oneMinus()}else i=yu(s.greaterThan(1),0,1);return i}),iv=on(([e,t,r])=>{const s=pn(r).toVar(),i=pn(t).toVar(),n=fn(e).toVar();return yu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),nv=on(([e,t])=>{const r=fn(t).toVar(),s=pn(e).toVar();return yu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),av=on(([e])=>{const t=pn(e).toVar();return gn(xo(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),ov=on(([e,t])=>{const r=pn(e).toVar();return t.assign(av(r)),r.sub(pn(t))}),uv=pb([on(([e,t,r,s,i,n])=>{const a=pn(n).toVar(),o=pn(i).toVar(),u=pn(s).toVar(),l=pn(r).toVar(),d=pn(t).toVar(),c=pn(e).toVar(),h=pn(Ma(1,o)).toVar();return Ma(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"}]}),on(([e,t,r,s,i,n])=>{const a=pn(n).toVar(),o=pn(i).toVar(),u=_n(s).toVar(),l=_n(r).toVar(),d=_n(t).toVar(),c=_n(e).toVar(),h=pn(Ma(1,o)).toVar();return Ma(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=pb([on(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=pn(d).toVar(),h=pn(l).toVar(),p=pn(u).toVar(),g=pn(o).toVar(),m=pn(a).toVar(),f=pn(n).toVar(),y=pn(i).toVar(),b=pn(s).toVar(),x=pn(r).toVar(),T=pn(t).toVar(),_=pn(e).toVar(),v=pn(Ma(1,p)).toVar(),N=pn(Ma(1,h)).toVar();return pn(Ma(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"}]}),on(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=pn(d).toVar(),h=pn(l).toVar(),p=pn(u).toVar(),g=_n(o).toVar(),m=_n(a).toVar(),f=_n(n).toVar(),y=_n(i).toVar(),b=_n(s).toVar(),x=_n(r).toVar(),T=_n(t).toVar(),_=_n(e).toVar(),v=pn(Ma(1,p)).toVar(),N=pn(Ma(1,h)).toVar();return pn(Ma(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=on(([e,t,r])=>{const s=pn(r).toVar(),i=pn(t).toVar(),n=mn(e).toVar(),a=mn(n.bitAnd(mn(7))).toVar(),o=pn(iv(a.lessThan(mn(4)),i,s)).toVar(),u=pn(Ba(2,iv(a.lessThan(mn(4)),s,i))).toVar();return nv(o,fn(a.bitAnd(mn(1)))).add(nv(u,fn(a.bitAnd(mn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),cv=on(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=pn(t).toVar(),o=mn(e).toVar(),u=mn(o.bitAnd(mn(15))).toVar(),l=pn(iv(u.lessThan(mn(8)),a,n)).toVar(),d=pn(iv(u.lessThan(mn(4)),n,iv(u.equal(mn(12)).or(u.equal(mn(14))),a,i))).toVar();return nv(l,fn(u.bitAnd(mn(1)))).add(nv(d,fn(u.bitAnd(mn(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=pb([dv,cv]),pv=on(([e,t,r])=>{const s=pn(r).toVar(),i=pn(t).toVar(),n=Nn(e).toVar();return _n(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=on(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=pn(t).toVar(),o=Nn(e).toVar();return _n(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=pb([pv,gv]),fv=on(([e])=>{const t=pn(e).toVar();return Ba(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),yv=on(([e])=>{const t=pn(e).toVar();return Ba(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),bv=pb([fv,on(([e])=>{const t=_n(e).toVar();return Ba(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),xv=pb([yv,on(([e])=>{const t=_n(e).toVar();return Ba(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Tv=on(([e,t])=>{const r=gn(t).toVar(),s=mn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(gn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),_v=on(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Tv(r,gn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,gn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,gn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Tv(r,gn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,gn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,gn(4))),t.addAssign(e)}),vv=on(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar();return s.bitXorAssign(i),s.subAssign(Tv(i,gn(14))),n.bitXorAssign(s),n.subAssign(Tv(s,gn(11))),i.bitXorAssign(n),i.subAssign(Tv(n,gn(25))),s.bitXorAssign(i),s.subAssign(Tv(i,gn(16))),n.bitXorAssign(s),n.subAssign(Tv(s,gn(4))),i.bitXorAssign(n),i.subAssign(Tv(n,gn(14))),s.bitXorAssign(i),s.subAssign(Tv(i,gn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),Nv=on(([e])=>{const t=mn(e).toVar();return pn(t).div(pn(mn(gn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Sv=on(([e])=>{const t=pn(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=pb([on(([e])=>{const t=gn(e).toVar(),r=mn(mn(1)).toVar(),s=mn(mn(gn(3735928559)).add(r.shiftLeft(mn(2))).add(mn(13))).toVar();return vv(s.add(mn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),on(([e,t])=>{const r=gn(t).toVar(),s=gn(e).toVar(),i=mn(mn(2)).toVar(),n=mn().toVar(),a=mn().toVar(),o=mn().toVar();return n.assign(a.assign(o.assign(mn(gn(3735928559)).add(i.shiftLeft(mn(2))).add(mn(13))))),n.addAssign(mn(s)),a.addAssign(mn(r)),vv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),on(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=gn(e).toVar(),a=mn(mn(3)).toVar(),o=mn().toVar(),u=mn().toVar(),l=mn().toVar();return o.assign(u.assign(l.assign(mn(gn(3735928559)).add(a.shiftLeft(mn(2))).add(mn(13))))),o.addAssign(mn(n)),u.addAssign(mn(i)),l.addAssign(mn(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"}]}),on(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=gn(e).toVar(),u=mn(mn(4)).toVar(),l=mn().toVar(),d=mn().toVar(),c=mn().toVar();return l.assign(d.assign(c.assign(mn(gn(3735928559)).add(u.shiftLeft(mn(2))).add(mn(13))))),l.addAssign(mn(o)),d.addAssign(mn(a)),c.addAssign(mn(n)),_v(l,d,c),l.addAssign(mn(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"}]}),on(([e,t,r,s,i])=>{const n=gn(i).toVar(),a=gn(s).toVar(),o=gn(r).toVar(),u=gn(t).toVar(),l=gn(e).toVar(),d=mn(mn(5)).toVar(),c=mn().toVar(),h=mn().toVar(),p=mn().toVar();return c.assign(h.assign(p.assign(mn(gn(3735928559)).add(d.shiftLeft(mn(2))).add(mn(13))))),c.addAssign(mn(l)),h.addAssign(mn(u)),p.addAssign(mn(o)),_v(c,h,p),c.addAssign(mn(a)),h.addAssign(mn(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=pb([on(([e,t])=>{const r=gn(t).toVar(),s=gn(e).toVar(),i=mn(Rv(s,r)).toVar(),n=Nn().toVar();return n.x.assign(i.bitAnd(gn(255))),n.y.assign(i.shiftRight(gn(8)).bitAnd(gn(255))),n.z.assign(i.shiftRight(gn(16)).bitAnd(gn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),on(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=gn(e).toVar(),a=mn(Rv(n,i,s)).toVar(),o=Nn().toVar();return o.x.assign(a.bitAnd(gn(255))),o.y.assign(a.shiftRight(gn(8)).bitAnd(gn(255))),o.z.assign(a.shiftRight(gn(16)).bitAnd(gn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Av=pb([on(([e])=>{const t=yn(e).toVar(),r=gn().toVar(),s=gn().toVar(),i=pn(ov(t.x,r)).toVar(),n=pn(ov(t.y,s)).toVar(),a=pn(Sv(i)).toVar(),o=pn(Sv(n)).toVar(),u=pn(uv(hv(Rv(r,s),i,n),hv(Rv(r.add(gn(1)),s),i.sub(1),n),hv(Rv(r,s.add(gn(1))),i,n.sub(1)),hv(Rv(r.add(gn(1)),s.add(gn(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"}]}),on(([e])=>{const t=_n(e).toVar(),r=gn().toVar(),s=gn().toVar(),i=gn().toVar(),n=pn(ov(t.x,r)).toVar(),a=pn(ov(t.y,s)).toVar(),o=pn(ov(t.z,i)).toVar(),u=pn(Sv(n)).toVar(),l=pn(Sv(a)).toVar(),d=pn(Sv(o)).toVar(),c=pn(lv(hv(Rv(r,s,i),n,a,o),hv(Rv(r.add(gn(1)),s,i),n.sub(1),a,o),hv(Rv(r,s.add(gn(1)),i),n,a.sub(1),o),hv(Rv(r.add(gn(1)),s.add(gn(1)),i),n.sub(1),a.sub(1),o),hv(Rv(r,s,i.add(gn(1))),n,a,o.sub(1)),hv(Rv(r.add(gn(1)),s,i.add(gn(1))),n.sub(1),a,o.sub(1)),hv(Rv(r,s.add(gn(1)),i.add(gn(1))),n,a.sub(1),o.sub(1)),hv(Rv(r.add(gn(1)),s.add(gn(1)),i.add(gn(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=pb([on(([e])=>{const t=yn(e).toVar(),r=gn().toVar(),s=gn().toVar(),i=pn(ov(t.x,r)).toVar(),n=pn(ov(t.y,s)).toVar(),a=pn(Sv(i)).toVar(),o=pn(Sv(n)).toVar(),u=_n(uv(mv(Ev(r,s),i,n),mv(Ev(r.add(gn(1)),s),i.sub(1),n),mv(Ev(r,s.add(gn(1))),i,n.sub(1)),mv(Ev(r.add(gn(1)),s.add(gn(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"}]}),on(([e])=>{const t=_n(e).toVar(),r=gn().toVar(),s=gn().toVar(),i=gn().toVar(),n=pn(ov(t.x,r)).toVar(),a=pn(ov(t.y,s)).toVar(),o=pn(ov(t.z,i)).toVar(),u=pn(Sv(n)).toVar(),l=pn(Sv(a)).toVar(),d=pn(Sv(o)).toVar(),c=_n(lv(mv(Ev(r,s,i),n,a,o),mv(Ev(r.add(gn(1)),s,i),n.sub(1),a,o),mv(Ev(r,s.add(gn(1)),i),n,a.sub(1),o),mv(Ev(r.add(gn(1)),s.add(gn(1)),i),n.sub(1),a.sub(1),o),mv(Ev(r,s,i.add(gn(1))),n,a,o.sub(1)),mv(Ev(r.add(gn(1)),s,i.add(gn(1))),n.sub(1),a,o.sub(1)),mv(Ev(r,s.add(gn(1)),i.add(gn(1))),n,a.sub(1),o.sub(1)),mv(Ev(r.add(gn(1)),s.add(gn(1)),i.add(gn(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=pb([on(([e])=>{const t=pn(e).toVar(),r=gn(av(t)).toVar();return Nv(Rv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),on(([e])=>{const t=yn(e).toVar(),r=gn(av(t.x)).toVar(),s=gn(av(t.y)).toVar();return Nv(Rv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),on(([e])=>{const t=_n(e).toVar(),r=gn(av(t.x)).toVar(),s=gn(av(t.y)).toVar(),i=gn(av(t.z)).toVar();return Nv(Rv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),on(([e])=>{const t=Rn(e).toVar(),r=gn(av(t.x)).toVar(),s=gn(av(t.y)).toVar(),i=gn(av(t.z)).toVar(),n=gn(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=pb([on(([e])=>{const t=pn(e).toVar(),r=gn(av(t)).toVar();return _n(Nv(Rv(r,gn(0))),Nv(Rv(r,gn(1))),Nv(Rv(r,gn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),on(([e])=>{const t=yn(e).toVar(),r=gn(av(t.x)).toVar(),s=gn(av(t.y)).toVar();return _n(Nv(Rv(r,s,gn(0))),Nv(Rv(r,s,gn(1))),Nv(Rv(r,s,gn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),on(([e])=>{const t=_n(e).toVar(),r=gn(av(t.x)).toVar(),s=gn(av(t.y)).toVar(),i=gn(av(t.z)).toVar();return _n(Nv(Rv(r,s,i,gn(0))),Nv(Rv(r,s,i,gn(1))),Nv(Rv(r,s,i,gn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),on(([e])=>{const t=Rn(e).toVar(),r=gn(av(t.x)).toVar(),s=gn(av(t.y)).toVar(),i=gn(av(t.z)).toVar(),n=gn(av(t.w)).toVar();return _n(Nv(Rv(r,s,i,n,gn(0))),Nv(Rv(r,s,i,n,gn(1))),Nv(Rv(r,s,i,n,gn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Bv=on(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=gn(t).toVar(),o=_n(e).toVar(),u=pn(0).toVar(),l=pn(1).toVar();return op(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=on(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=gn(t).toVar(),o=_n(e).toVar(),u=_n(0).toVar(),l=pn(1).toVar();return op(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"}]}),Pv=on(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=gn(t).toVar(),o=_n(e).toVar();return yn(Bv(o,a,n,i),Bv(o.add(_n(gn(19),gn(193),gn(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"}]}),Fv=on(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=gn(t).toVar(),o=_n(e).toVar(),u=_n(Lv(o,a,n,i)).toVar(),l=pn(Bv(o.add(_n(gn(19),gn(193),gn(17))),a,n,i)).toVar();return Rn(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=pb([on(([e,t,r,s,i,n,a])=>{const o=gn(a).toVar(),u=pn(n).toVar(),l=gn(i).toVar(),d=gn(s).toVar(),c=gn(r).toVar(),h=gn(t).toVar(),p=yn(e).toVar(),g=_n(Mv(yn(h.add(d),c.add(l)))).toVar(),m=yn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=yn(yn(pn(h),pn(c)).add(m)).toVar(),y=yn(f.sub(p)).toVar();return dn(o.equal(gn(2)),()=>Co(y.x).add(Co(y.y))),dn(o.equal(gn(3)),()=>Wo(Co(y.x),Co(y.y))),Ko(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"}]}),on(([e,t,r,s,i,n,a,o,u])=>{const l=gn(u).toVar(),d=pn(o).toVar(),c=gn(a).toVar(),h=gn(n).toVar(),p=gn(i).toVar(),g=gn(s).toVar(),m=gn(r).toVar(),f=gn(t).toVar(),y=_n(e).toVar(),b=_n(Mv(_n(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=_n(_n(pn(f),pn(m),pn(g)).add(b)).toVar(),T=_n(x.sub(y)).toVar();return dn(l.equal(gn(2)),()=>Co(T.x).add(Co(T.y)).add(Co(T.z))),dn(l.equal(gn(3)),()=>Wo(Co(T.x),Co(T.y),Co(T.z))),Ko(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=on(([e,t,r])=>{const s=gn(r).toVar(),i=pn(t).toVar(),n=yn(e).toVar(),a=gn().toVar(),o=gn().toVar(),u=yn(ov(n.x,a),ov(n.y,o)).toVar(),l=pn(1e6).toVar();return op({start:-1,end:gn(1),name:"x",condition:"<="},({x:e})=>{op({start:-1,end:gn(1),name:"y",condition:"<="},({y:t})=>{const r=pn(Dv(u,e,t,a,o,i,s)).toVar();l.assign($o(l,r))})}),dn(s.equal(gn(0)),()=>{l.assign(yo(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=on(([e,t,r])=>{const s=gn(r).toVar(),i=pn(t).toVar(),n=yn(e).toVar(),a=gn().toVar(),o=gn().toVar(),u=yn(ov(n.x,a),ov(n.y,o)).toVar(),l=yn(1e6,1e6).toVar();return op({start:-1,end:gn(1),name:"x",condition:"<="},({x:e})=>{op({start:-1,end:gn(1),name:"y",condition:"<="},({y:t})=>{const r=pn(Dv(u,e,t,a,o,i,s)).toVar();dn(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),dn(s.equal(gn(0)),()=>{l.assign(yo(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=on(([e,t,r])=>{const s=gn(r).toVar(),i=pn(t).toVar(),n=yn(e).toVar(),a=gn().toVar(),o=gn().toVar(),u=yn(ov(n.x,a),ov(n.y,o)).toVar(),l=_n(1e6,1e6,1e6).toVar();return op({start:-1,end:gn(1),name:"x",condition:"<="},({x:e})=>{op({start:-1,end:gn(1),name:"y",condition:"<="},({y:t})=>{const r=pn(Dv(u,e,t,a,o,i,s)).toVar();dn(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)})})}),dn(s.equal(gn(0)),()=>{l.assign(yo(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=pb([Uv,on(([e,t,r])=>{const s=gn(r).toVar(),i=pn(t).toVar(),n=_n(e).toVar(),a=gn().toVar(),o=gn().toVar(),u=gn().toVar(),l=_n(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=pn(1e6).toVar();return op({start:-1,end:gn(1),name:"x",condition:"<="},({x:e})=>{op({start:-1,end:gn(1),name:"y",condition:"<="},({y:t})=>{op({start:-1,end:gn(1),name:"z",condition:"<="},({z:r})=>{const n=pn(Dv(l,e,t,r,a,o,u,i,s)).toVar();d.assign($o(d,n))})})}),dn(s.equal(gn(0)),()=>{d.assign(yo(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=pb([Iv,on(([e,t,r])=>{const s=gn(r).toVar(),i=pn(t).toVar(),n=_n(e).toVar(),a=gn().toVar(),o=gn().toVar(),u=gn().toVar(),l=_n(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=yn(1e6,1e6).toVar();return op({start:-1,end:gn(1),name:"x",condition:"<="},({x:e})=>{op({start:-1,end:gn(1),name:"y",condition:"<="},({y:t})=>{op({start:-1,end:gn(1),name:"z",condition:"<="},({z:r})=>{const n=pn(Dv(l,e,t,r,a,o,u,i,s)).toVar();dn(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),dn(s.equal(gn(0)),()=>{d.assign(yo(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=pb([Ov,on(([e,t,r])=>{const s=gn(r).toVar(),i=pn(t).toVar(),n=_n(e).toVar(),a=gn().toVar(),o=gn().toVar(),u=gn().toVar(),l=_n(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=_n(1e6,1e6,1e6).toVar();return op({start:-1,end:gn(1),name:"x",condition:"<="},({x:e})=>{op({start:-1,end:gn(1),name:"y",condition:"<="},({y:t})=>{op({start:-1,end:gn(1),name:"z",condition:"<="},({z:r})=>{const n=pn(Dv(l,e,t,r,a,o,u,i,s)).toVar();dn(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)})})})}),dn(s.equal(gn(0)),()=>{d.assign(yo(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=on(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(e).toVar(),h=yn(t).toVar(),p=yn(r).toVar(),g=yn(s).toVar(),m=pn(i).toVar(),f=pn(n).toVar(),y=pn(a).toVar(),b=fn(o).toVar(),x=gn(u).toVar(),T=pn(l).toVar(),_=pn(d).toVar(),v=h.mul(p).add(g),N=pn(0).toVar();return dn(c.equal(gn(0)),()=>{N.assign(wv(v))}),dn(c.equal(gn(1)),()=>{N.assign(Mv(v))}),dn(c.equal(gn(2)),()=>{N.assign(Gv(v,m,gn(0)))}),dn(c.equal(gn(3)),()=>{N.assign(Lv(_n(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),dn(b,()=>{N.assign(nu(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=on(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(e).toVar(),h=_n(t).toVar(),p=_n(r).toVar(),g=_n(s).toVar(),m=pn(i).toVar(),f=pn(n).toVar(),y=pn(a).toVar(),b=fn(o).toVar(),x=gn(u).toVar(),T=pn(l).toVar(),_=pn(d).toVar(),v=h.mul(p).add(g),N=pn(0).toVar();return dn(c.equal(gn(0)),()=>{N.assign(wv(v))}),dn(c.equal(gn(1)),()=>{N.assign(Mv(v))}),dn(c.equal(gn(2)),()=>{N.assign(Gv(v,m,gn(0)))}),dn(c.equal(gn(3)),()=>{N.assign(Lv(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),dn(b,()=>{N.assign(nu(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=on(([e])=>{const t=e.y,r=e.z,s=_n().toVar();return dn(t.lessThan(1e-4),()=>{s.assign(_n(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(xo(i)).mul(6).toVar();const n=gn(Oo(i)),a=i.sub(pn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());dn(n.equal(gn(0)),()=>{s.assign(_n(r,l,o))}).ElseIf(n.equal(gn(1)),()=>{s.assign(_n(u,r,o))}).ElseIf(n.equal(gn(2)),()=>{s.assign(_n(o,r,l))}).ElseIf(n.equal(gn(3)),()=>{s.assign(_n(o,u,r))}).ElseIf(n.equal(gn(4)),()=>{s.assign(_n(l,o,r))}).Else(()=>{s.assign(_n(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Hv=on(([e])=>{const t=_n(e).toVar(),r=pn(t.x).toVar(),s=pn(t.y).toVar(),i=pn(t.z).toVar(),n=pn($o(r,$o(s,i))).toVar(),a=pn(Wo(r,Wo(s,i))).toVar(),o=pn(a.sub(n)).toVar(),u=pn().toVar(),l=pn().toVar(),d=pn().toVar();return d.assign(a),dn(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),dn(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{dn(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(Ca(2,i.sub(r).div(o)))}).Else(()=>{u.assign(Ca(4,r.sub(s).div(o)))}),u.mulAssign(1/6),dn(u.lessThan(0),()=>{u.addAssign(1)})}),_n(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),qv=on(([e])=>{const t=_n(e).toVar(),r=Sn(Ia(t,_n(.04045))).toVar(),s=_n(t.div(12.92)).toVar(),i=_n(Qo(Wo(t.add(_n(.055)),_n(0)).div(1.055),_n(2.4))).toVar();return iu(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),jv=(e,t)=>{e=pn(e),t=pn(t);const r=yn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return uu(e.sub(r),e.add(r),t)},Xv=(e,t,r,s)=>iu(e,t,r[s].clamp()),Kv=(e,t,r,s,i)=>iu(e,t,jv(r,s[i])),Yv=on(([e,t,r])=>{const s=_o(e).toVar(),i=Ma(pn(.5).mul(t.sub(r)),Pd).div(s).toVar(),n=Ma(pn(-.5).mul(t.sub(r)),Pd).div(s).toVar(),a=_n().toVar();a.x=s.x.greaterThan(pn(0)).select(i.x,n.x),a.y=s.y.greaterThan(pn(0)).select(i.y,n.y),a.z=s.z.greaterThan(pn(0)).select(i.z,n.z);const o=$o(a.x,a.y,a.z).toVar();return Pd.add(s.mul(o)).toVar().sub(r)}),Qv=on(([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(Ba(r,r).sub(Ba(s,s)))),n});var Zv=Object.freeze({__proto__:null,BRDF_GGX:Fg,BRDF_Lambert:xg,BasicPointShadowFilter:j_,BasicShadowFilter:v_,Break:up,Const:wu,Continue:()=>pl("continue").toStack(),DFGLUT:Ig,D_GGX:Bg,Discard:gl,EPSILON:ro,F_Schlick:bg,Fn:on,HALF_PI:oo,INFINITY:so,If:dn,Loop:op,NodeAccess:ei,NodeShaderStage:Qs,NodeType:Js,NodeUpdateType:Zs,OnBeforeMaterialUpdate:e=>Jb(Zb.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>Jb(Zb.BEFORE_OBJECT,e),OnMaterialUpdate:e=>Jb(Zb.MATERIAL,e),OnObjectUpdate:e=>Jb(Zb.OBJECT,e),PCFShadowFilter:N_,PCFSoftShadowFilter:S_,PI:io,PI2:no,PointShadowFilter:X_,Return:()=>pl("return").toStack(),Schlick_to_F0:kg,ScriptableNodeResources:tT,ShaderNode:Yi,Stack:cn,Switch:(...e)=>Ti.Switch(...e),TBNViewMatrix:zc,TWO_PI:ao,VSMShadowFilter:R_,V_GGX_SmithCorrelated:Cg,Var:Au,VarIntent:Cu,abs:Co,acesFilmicToneMapping:Gx,acos:Ao,add:Ca,addMethodChaining:vi,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:Hx,all:uo,alphaT:Kn,and:ka,anisotropy:Yn,anisotropyB:Zn,anisotropyT:Qn,any:lo,append:e=>(d("TSL: append() has been renamed to Stack()."),cn(e)),array:va,arrayBuffer:e=>new bi(e,"ArrayBuffer"),asin:Eo,assign:Sa,atan:wo,atomicAdd:(e,t)=>RT(NT.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>RT(NT.ATOMIC_AND,e,t),atomicFunc:RT,atomicLoad:e=>RT(NT.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>RT(NT.ATOMIC_MAX,e,t),atomicMin:(e,t)=>RT(NT.ATOMIC_MIN,e,t),atomicOr:(e,t)=>RT(NT.ATOMIC_OR,e,t),atomicStore:(e,t)=>RT(NT.ATOMIC_STORE,e,t),atomicSub:(e,t)=>RT(NT.ATOMIC_SUB,e,t),atomicXor:(e,t)=>RT(NT.ATOMIC_XOR,e,t),attenuationColor:ca,attenuationDistance:da,attribute:Nl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Gs("float")):(r=zs(t),s=Gs(t));const i=new tx(e,r,s);return $h(i,t,e)},backgroundBlurriness:ox,backgroundIntensity:ux,backgroundRotation:lx,batch:rp,bentNormalView:Wc,billboarding:xb,bitAnd:Wa,bitNot:Ha,bitOr:qa,bitXor:ja,bitangentGeometry:Oc,bitangentLocal:Vc,bitangentView:kc,bitangentWorld:Gc,bitcast:Hy,blendBurn:$p,blendColor:jp,blendDodge:Wp,blendOverlay:qp,blendScreen:Hp,blur:km,bool:fn,buffer:Dl,bufferAttribute:Zu,builtin:Vl,builtinAOContext:Nu,builtinShadowContext:vu,bumpMap:Zc,bvec2:Tn,bvec3:Sn,bvec4:wn,bypass:ul,cache:al,call:Ea,cameraFar:ed,cameraIndex:Zl,cameraNear:Jl,cameraNormalMatrix:nd,cameraPosition:ad,cameraProjectionMatrix:td,cameraProjectionMatrixInverse:rd,cameraViewMatrix:sd,cameraViewport:od,cameraWorldMatrix:id,cbrt:ru,cdl:Ex,ceil:To,checker:rv,cineonToneMapping:Vx,clamp:nu,clearcoat:zn,clearcoatNormalView:Xd,clearcoatRoughness:$n,clipSpace:Cd,code:Xx,color:hn,colorSpaceToWorking:ku,colorToDirection:e=>Qi(e).mul(2).sub(1),compute:sl,computeKernel:rl,computeSkinning:(e,t=null)=>{const r=new ip(e);return r.positionNode=$h(new W(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(qh).toVar(),r.skinIndexNode=$h(new W(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(qh).toVar(),r.skinWeightNode=$h(new W(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(qh).toVar(),r.bindMatrixNode=Ta(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=Ta(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Dl(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Qi(r)},context:xu,convert:Pn,convertColorSpace:(e,t,r)=>Qi(new Ou(Qi(e),t,r)),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():Hb(e,...t),cos:So,countLeadingZeros:Yy,countOneBits:Qy,countTrailingZeros:Ky,cross:Yo,cubeTexture:hc,cubeTextureBase:cc,dFdx:Fo,dFdy:Do,dashSize:ia,debug:bl,decrement:Ja,decrementBefore:Qa,defaultBuildStages:ri,defaultShaderStages:ti,defined:Xi,degrees:ho,deltaTime:mb,densityFogFactor:aT,depth:Fp,depthPass:(e,t,r)=>new Dx(Dx.DEPTH,e,t,r),determinant:Go,difference:Xo,diffuseColor:In,diffuseContribution:On,directPointLight:ev,directionToColor:Hc,directionToFaceDirection:kd,dispersion:ha,disposeShadowMaterial:w_,distance:jo,div:La,dot:Ko,drawIndex:Yh,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>Qu(e,t,r,s,x),element:Ln,emissive:Vn,equal:Fa,equirectUV:ng,exp:po,exp2:go,exponentialHeightFogFactor:oT,expression:pl,faceDirection:Vd,faceForward:lu,faceforward:gu,float:pn,floatBitsToInt:e=>new Wy(e,"int","float"),floatBitsToUint:qy,floor:xo,fog:uT,fract:vo,frameGroup:fa,frameId:fb,frontFacing:Od,fwidth:Vo,gain:(e,t)=>e.lessThan(.5)?Jy(e.mul(2),t).div(2):Ma(1,Jy(Ba(Ma(1,e),2),t).div(2)),gapSize:na,getConstNodeType:Ki,getCurrentStack:ln,getDirection:Um,getDistanceAttenuation:J_,getGeometryRoughness:Ag,getNormalFromDepth:Xb,getParallaxCorrectNormal:Yv,getRoughness:wg,getScreenPosition:jb,getShIrradianceAt:Qv,getShadowMaterial:A_,getShadowRenderObjectFunction:B_,getTextureIndex:Gy,getViewPosition:qb,ggxConvolution:Wm,globalId:yT,glsl:(e,t)=>Xx(e,t,"glsl"),glslFn:(e,t)=>Yx(e,t,"glsl"),grayscale:_x,greaterThan:Ia,greaterThanEqual:Va,hash:Zy,highpModelNormalViewMatrix:wd,highpModelViewMatrix:Ad,hue:Sx,increment:Za,incrementBefore:Ya,inspector:_l,instance:Zh,instanceIndex:qh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Gs("float")):(r=zs(t),s=Gs(t));const i=new ex(e,r,s);return $h(i,t,e)},instancedBufferAttribute:Ju,instancedDynamicBufferAttribute:el,instancedMesh:ep,int:gn,intBitsToFloat:e=>new Wy(e,"float","int"),interleavedGradientNoise:Kb,inverse:zo,inverseSqrt:bo,inversesqrt:mu,invocationLocalIndex:Kh,invocationSubgroupIndex:Xh,ior:oa,iridescence:qn,iridescenceIOR:jn,iridescenceThickness:Xn,isolate:nl,ivec2:bn,ivec3:vn,ivec4:En,js:(e,t)=>Xx(e,t,"js"),label:Su,length:Bo,lengthSq:su,lessThan:Ua,lessThanEqual:Oa,lightPosition:r_,lightProjectionUV:t_,lightShadowMatrix:e_,lightTargetDirection:n_,lightTargetPosition:s_,lightViewPosition:i_,lightingContext:yp,lights:(e=[])=>(new l_).setLights(e),linearDepth:Dp,linearToneMapping:Ix,localId:bT,log:mo,log2:fo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(mo(r.div(t)));return pn(Math.E).pow(s).mul(t).negate()},luminance:Rx,mat2:Cn,mat3:Mn,mat4:Bn,matcapUV:Cf,materialAO:Ih,materialAlphaTest:th,materialAnisotropy:Th,materialAnisotropyVector:Oh,materialAttenuationColor:wh,materialAttenuationDistance:Ah,materialClearcoat:gh,materialClearcoatNormal:fh,materialClearcoatRoughness:mh,materialColor:rh,materialDispersion:Dh,materialEmissive:ih,materialEnvIntensity:sc,materialEnvRotation:ic,materialIOR:Eh,materialIridescence:_h,materialIridescenceIOR:vh,materialIridescenceThickness:Nh,materialLightMap:Uh,materialLineDashOffset:Ph,materialLineDashSize:Mh,materialLineGapSize:Bh,materialLineScale:Ch,materialLineWidth:Lh,materialMetalness:hh,materialNormal:ph,materialOpacity:nh,materialPointSize:Fh,materialReference:bc,materialReflectivity:dh,materialRefractionRatio:rc,materialRotation:yh,materialRoughness:ch,materialSheen:bh,materialSheenRoughness:xh,materialShininess:sh,materialSpecular:ah,materialSpecularColor:uh,materialSpecularIntensity:oh,materialSpecularStrength:lh,materialThickness:Rh,materialTransmission:Sh,max:Wo,maxMipLevel:wl,mediumpModelViewMatrix:Ed,metalness:Gn,min:$o,mix:iu,mixElement:cu,mod:Pa,modInt:eo,modelDirection:yd,modelNormalMatrix:Nd,modelPosition:xd,modelRadius:vd,modelScale:Td,modelViewMatrix:Rd,modelViewPosition:_d,modelViewProjection:Vh,modelWorldMatrix:bd,modelWorldMatrixInverse:Sd,morphReference:pp,mrt:$y,mul:Ba,mx_aastep:jv,mx_add:(e,t=pn(0))=>Ca(e,t),mx_atan2:(e=pn(0),t=pn(1))=>wo(e,t),mx_cell_noise_float:(e=Sl())=>Cv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>pn(e).sub(r).mul(t).add(r),mx_divide:(e,t=pn(1))=>La(e,t),mx_fractal_noise_float:(e=Sl(),t=3,r=2,s=.5,i=1)=>Bv(e,gn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Sl(),t=3,r=2,s=.5,i=1)=>Pv(e,gn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Sl(),t=3,r=2,s=.5,i=1)=>Lv(e,gn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Sl(),t=3,r=2,s=.5,i=1)=>Fv(e,gn(t),r,s).mul(i),mx_frame:()=>fb,mx_heighttonormal:(e,t)=>(e=_n(e),t=pn(t),Zc(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=pn(1))=>Ma(t,e),mx_modulo:(e,t=pn(1))=>Pa(e,t),mx_multiply:(e,t=pn(1))=>Ba(e,t),mx_noise_float:(e=Sl(),t=1,r=0)=>Av(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Sl(),t=1,r=0)=>wv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Sl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return Rn(wv(e),Av(e.add(yn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=yn(.5,.5),r=yn(1,1),s=pn(0),i=yn(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=yn(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=pn(1))=>Qo(e,t),mx_ramp4:(e,t,r,s,i=Sl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=iu(e,t,n),u=iu(r,s,n);return iu(o,u,a)},mx_ramplr:(e,t,r=Sl())=>Xv(e,t,r,"x"),mx_ramptb:(e,t,r=Sl())=>Xv(e,t,r,"y"),mx_rgbtohsv:Hv,mx_rotate2d:(e,t)=>{e=yn(e);const r=(t=pn(t)).mul(Math.PI/180);return Pf(e,r)},mx_rotate3d:(e,t,r)=>{e=_n(e),t=pn(t),r=_n(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=pn(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=pn(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=Sl())=>Kv(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Sl())=>Kv(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:qv,mx_subtract:(e,t=pn(0))=>Ma(e,t),mx_timer:()=>gb,mx_transform_uv:(e=1,t=0,r=Sl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Sl(),r=yn(1,1),s=yn(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=Sl(),r=yn(1,1),s=yn(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=Sl(),t=1)=>Vv(e.convert("vec2|vec3"),t,gn(1)),mx_worley_noise_vec2:(e=Sl(),t=1)=>kv(e.convert("vec2|vec3"),t,gn(1)),mx_worley_noise_vec3:(e=Sl(),t=1)=>Gv(e.convert("vec2|vec3"),t,gn(1)),negate:Lo,neutralToneMapping:qx,nodeArray:en,nodeImmutable:rn,nodeObject:Qi,nodeObjectIntent:Zi,nodeObjects:Ji,nodeProxy:tn,nodeProxyIntent:sn,normalFlat:$d,normalGeometry:Gd,normalLocal:zd,normalMap:Xc,normalView:qd,normalViewGeometry:Wd,normalWorld:jd,normalWorldGeometry:Hd,normalize:_o,not:za,notEqual:Da,numWorkgroups:mT,objectDirection:dd,objectGroup:ba,objectPosition:hd,objectRadius:md,objectScale:pd,objectViewPosition:gd,objectWorldMatrix:cd,oneMinus:Po,or:Ga,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=gb)=>e.fract(),oscSine:(e=gb)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=gb)=>e.fract().round(),oscTriangle:(e=gb)=>e.add(.5).fract().mul(2).sub(1).abs(),output:sa,outputStruct:Iy,overloadingFn:pb,packHalf2x16:sb,packSnorm2x16:tb,packUnorm2x16:rb,parabola:Jy,parallaxDirection:$c,parallaxUV:(e,t)=>e.sub($c.mul(t)),parameter:(e,t)=>new By(e,t),pass:(e,t,r)=>new Dx(Dx.COLOR,e,t,r),passTexture:(e,t)=>new Px(e,t),pcurve:(e,t,r)=>Qo(La(Qo(e,t),Ca(Qo(e,t),Qo(Ma(1,e),r))),1/t),perspectiveDepthToViewZ:Bp,pmremTexture:gf,pointShadow:Q_,pointUV:sx,pointWidth:aa,positionGeometry:Md,positionLocal:Bd,positionPrevious:Ld,positionView:Dd,positionViewDirection:Ud,positionWorld:Pd,positionWorldDirection:Fd,posterize:wx,pow:Qo,pow2:Zo,pow3:Jo,pow4:eu,premultiplyAlpha:Xp,property:Dn,quadBroadcast:QT,quadSwapDiagonal:HT,quadSwapX:$T,quadSwapY:WT,radians:co,rand:du,range:hT,rangeFogFactor:nT,reciprocal:Io,reference:mc,referenceBuffer:fc,reflect:qo,reflectVector:oc,reflectView:nc,reflector:e=>new Ib(e),refract:ou,refractVector:uc,refractView:ac,reinhardToneMapping:Ox,remap:dl,remapClamp:cl,renderGroup:ya,renderOutput:fl,rendererReference:Wu,replaceDefaultUV:function(e,t=null){return xu(t,{getUV:e})},rotate:Pf,rotateUV:yb,roughness:kn,round:Uo,rtt:Hb,sRGBTransferEOTF:Du,sRGBTransferOETF:Uu,sample:(e,t=null)=>new Qb(e,Qi(t)),sampler:e=>(!0===e.isNode?e:Ll(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Ll(e)).convert("samplerComparison"),saturate:au,saturation:vx,screenCoordinate:ql,screenDPR:$l,screenSize:Hl,screenUV:Wl,scriptable:sT,scriptableValue:Zx,select:yu,setCurrentStack:un,setName:_u,shaderStages:si,shadow:O_,shadowPositionWorld:c_,shapeCircle:sv,sharedUniformGroup:ma,sheen:Wn,sheenRoughness:Hn,shiftLeft:Xa,shiftRight:Ka,shininess:ra,sign:Mo,sin:No,sinc:(e,t)=>No(io.mul(t.mul(e).sub(1))).div(io.mul(t.mul(e).sub(1))),skinning:np,smoothstep:uu,smoothstepElement:hu,specularColor:Jn,specularColorBlended:ea,specularF90:ta,spherizeUV:bb,split:(e,t)=>Qi(new pi(Qi(e),t)),spritesheetUV:_b,sqrt:yo,stack:Py,step:Ho,stepElement:pu,storage:$h,storageBarrier:()=>TT("storage").toStack(),storageTexture:cx,string:(e="")=>new bi(e,"string"),struct:(e,t=null)=>{const r=new Fy(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;egx(e,t).level(r),texture3DLoad:(...e)=>gx(...e).setSampler(!1),textureBarrier:()=>TT("texture").toStack(),textureBicubic:am,textureBicubicLevel:nm,textureCubeUV:Im,textureLevel:(e,t,r)=>Ll(e,t).level(r),textureLoad:Pl,textureSize:El,textureStore:(e,t,r)=>{const s=cx(e,t,r);return null!==r&&s.toStack(),s},thickness:la,time:gb,toneMapping:qu,toneMappingExposure:ju,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Qi(new Ux(t,r,Qi(s),Qi(i),Qi(n))),transformDirection:tu,transformNormal:Kd,transformNormalToView:Yd,transformedClearcoatNormalView:Jd,transformedNormalView:Qd,transformedNormalWorld:Zd,transmission:ua,transpose:ko,triNoise3D:db,triplanarTexture:(...e)=>vb(...e),triplanarTextures:vb,trunc:Oo,uint:mn,uintBitsToFloat:e=>new Wy(e,"float","uint"),uniform:Ta,uniformArray:Ol,uniformCubeTexture:(e=lc)=>cc(e),uniformFlow:Tu,uniformGroup:ga,uniformTexture:(e=Cl)=>Ll(e),unpackHalf2x16:ob,unpackNormal:qc,unpackSnorm2x16:nb,unpackUnorm2x16:ab,unpremultiplyAlpha:Kp,userData:(e,t,r)=>new mx(e,t,r),uv:Sl,uvec2:xn,uvec3:Nn,uvec4:An,varying:Pu,varyingProperty:Un,vec2:yn,vec3:_n,vec4:Rn,vectorComponents:ii,velocity:Tx,vertexColor:zp,vertexIndex:Hh,vertexStage:Fu,vibrance:Nx,viewZToLogarithmicDepth:Lp,viewZToOrthographicDepth:Cp,viewZToPerspectiveDepth:Mp,viewport:jl,viewportCoordinate:Kl,viewportDepthTexture:Ap,viewportLinearDepth:Up,viewportMipTexture:vp,viewportOpaqueMipTexture:Sp,viewportResolution:Ql,viewportSafeUV:Tb,viewportSharedTexture:Bx,viewportSize:Xl,viewportTexture:_p,viewportUV:Yl,vogelDiskSample:Yb,wgsl:(e,t)=>Xx(e,t,"wgsl"),wgslFn:(e,t)=>Yx(e,t,"wgsl"),workgroupArray:(e,t)=>new vT("Workgroup",e,t),workgroupBarrier:()=>TT("workgroup").toStack(),workgroupId:fT,workingToColorSpace:Vu,xor:$a});const Jv=new My;class eN extends ey{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=Rn(l).mul(ux).context({getUV:()=>lx.mul(Hd),getTextureLevel:()=>ox}),p=td.element(3).element(3).equal(1),g=La(1,td.element(1).element(1)).mul(3),m=p.select(Bd.mul(g),Bd),f=Rd.mul(Rn(m,0));let y=td.mul(Rn(f.xyz,1));y=y.setZ(y.w);const b=new Yp;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 tt(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=Rn(l).mul(ux),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"]]),PN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class FN{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 Kf,BN.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new Ne(e,t,r)}createCubeRenderTarget(e,t){return new ag(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 si)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")}( ${PN(n.r)}, ${PN(n.g)}, ${PN(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=ks(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 it||!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=ln();return this.stacks.push(e),un(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,un(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 Kx,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 By(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 ri)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 Yp),e.build(this)}else this.addFlow("compute",e);for(const e of ri){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of si){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${nt} - Node System\n`}needsPreviousData(){const e=this.renderer.getMRT();return e&&e.has("velocity")||!0===js(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===Zs.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===Zs.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===Zs.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Zs.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===Zs.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===Zs.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Zs.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===Zs.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===Zs.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:n_(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=Ta(new r).setGroup(ya),this.halfWidth=Ta(new r).setGroup(ya),this.updateType=Zs.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=Ll(kN.LTC_FLOAT_1),r=Ll(kN.LTC_FLOAT_2)):(t=Ll(kN.LTC_HALF_1),r=Ll(kN.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:i_(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=Ta(0).setGroup(ya),this.penumbraCosNode=Ta(0).setGroup(ya),this.cutoffDistanceNode=Ta(0).setGroup(ya),this.decayExponentNode=Ta(0).setGroup(ya),this.colorNode=Ta(this.color).setGroup(ya)}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 uu(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=t_(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(n_(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=Ll(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=Ll(r,yn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const WN=on(([e,t])=>{const r=e.abs().sub(t);return Bo(Wo(r,0)).add($o(Wo(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=pn(0),r=this.penumbraCosNode,s=e_(this.light).mul(e.context.positionWorld||Pd);return dn(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=WN(e.xy.sub(yn(.5)),yn(.5)),n=La(-1,Ma(1,Ao(r)).sub(1));t.assign(au(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=r_(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=Ta(new e).setGroup(ya)}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=jd.dot(s).mul(.5).add(.5),n=iu(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=Ol(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(jd,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 Yp),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=Us(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 gf(r);{let e;return e=!0===r.isCubeTexture?hc(r):Ll(r),cg(e)}}if(!0===r.isTexture)return Ll(r,Wl.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=mc("color","color",r).setGroup(ya),t=mc("density","float",r).setGroup(ya);return uT(e,aT(t))}if(r.isFog){const e=mc("color","color",r).setGroup(ya),t=mc("near","float",r).setGroup(ya),s=mc("far","float",r).setGroup(ya);return uT(e,nT(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?hc(r):!0===r.isTexture?Ll(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?gx(e,_n(Wl,Vl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Ll(e,Wl).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 Xf(this,this._nodes,this.info),this._attributes=new ay(r),this._background=new eN(this,this._nodes),this._geometries=new ly(this._attributes,this.info),this._textures=new Cy(this,r,this.info),this._pipelines=new fy(r,this._nodes),this._bindings=new yy(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Jf(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Ny(this.lighting),this._bundles=new dS,this._renderContexts=new Ay,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=Ad,t.modelNormalViewMatrix=wd):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===Ad&&e.modelNormalViewMatrix===wd}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=ut;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);e.side=null===i.shadowSide?i.side:i.shadowSide,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=ut,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 FS{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 DS extends FS{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)+(ny-e%ny)%ny;var e}get buffer(){return this._buffer}update(){return!0}}class US extends DS{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let IS=0;class OS extends US{constructor(e,t){super("UniformBuffer_"+IS++,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 VS extends US{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 $S=0;class WS extends zS{constructor(e,t){super(e,t),this.id=$S++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class HS extends WS{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 qS extends HS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class jS extends HS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const XS={bitcast_int_uint:new jx("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new jx("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},KS={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"},YS={low:"lowp",medium:"mediump",high:"highp"},QS={swizzleAssign:!0,storageBuffer:!1},ZS={perspective:"smooth",linear:"noperspective"},JS={centroid:"centroid"},eR="\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 lowp sampler2DShadow;\nprecision lowp sampler2DArrayShadow;\nprecision lowp samplerCubeShadow;\n";class tR extends FN{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=XS[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==XS[e]&&this._include(e),KS[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?bt:xt;2===s?n=i?Nt:G:3===s?n=i?St:Rt:4===s&&(n=i?Et:Re);const a={Float32Array:j,Uint8Array:Ge,Uint16Array:vt,Uint32Array:S,Int8Array:_t,Int16Array:Tt,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=YS[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=YS[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+=`${ZS[s.interpolationType]||s.interpolationType} ${JS[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+=`${ZS[e.interpolationType]||e.interpolationType} ${JS[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=QS[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)}QS[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 HS(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new qS(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new jS(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 OS(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 GS(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 rR=null,sR=null;class iR{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[At.RENDER]:null,[At.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:")?At.COMPUTE:At.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 rR=rR||new t,this.renderer.getDrawingBufferSize(rR)}setScissorTest(){}getClearColor(){const e=this.renderer;return sR=sR||new My,e.getClearColor(sR),sR.getRGB(sR),sR}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:wt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${nt} 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 nR,aR,oR=0;class uR{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 lR{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:oR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new uR(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 hR,pR,gR,mR=!1;class fR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===mR&&(this._init(),mR=!0)}_init(){const e=this.gl;hR={[Ir]:e.REPEAT,[xe]:e.CLAMP_TO_EDGE,[Ur]:e.MIRRORED_REPEAT},pR={[w]:e.NEAREST,[Or]:e.NEAREST_MIPMAP_NEAREST,[st]:e.NEAREST_MIPMAP_LINEAR,[oe]:e.LINEAR,[rt]:e.LINEAR_MIPMAP_NEAREST,[K]:e.LINEAR_MIPMAP_LINEAR},gR={[Hr]:e.NEVER,[Wr]:e.ALWAYS,[A]:e.LESS,[$r]:e.LEQUAL,[zr]:e.EQUAL,[Gr]:e.GEQUAL,[kr]:e.GREATER,[Vr]: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?qr: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?qr: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,hR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,hR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,hR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,pR[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,pR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,gR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===w)return;if(t.minFilter!==st&&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=jr(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 yR(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 bR{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 xR{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 TR={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 _R{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 SR extends iR{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 bR(this),this.capabilities=new xR(this),this.attributeUtils=new lR(this),this.textureUtils=new fR(this),this.bufferRenderer=new _R(this),this.state=new dR(this),this.utils=new cR(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 NR(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(At.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;eTR[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 RR="point-list",ER="line-list",AR="line-strip",wR="triangle-list",CR="triangle-strip",MR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},BR="never",LR="less",PR="equal",FR="less-equal",DR="greater",UR="not-equal",IR="greater-equal",OR="always",VR="store",kR="load",GR="clear",zR="ccw",$R="cw",WR="none",HR="back",qR="uint16",jR="uint32",XR="r8unorm",KR="r8snorm",YR="r8uint",QR="r8sint",ZR="r16uint",JR="r16sint",eE="r16float",tE="rg8unorm",rE="rg8snorm",sE="rg8uint",iE="rg8sint",nE="r32uint",aE="r32sint",oE="r32float",uE="rg16uint",lE="rg16sint",dE="rg16float",cE="rgba8unorm",hE="rgba8unorm-srgb",pE="rgba8snorm",gE="rgba8uint",mE="rgba8sint",fE="bgra8unorm",yE="bgra8unorm-srgb",bE="rgb9e5ufloat",xE="rgb10a2unorm",TE="rg11b10ufloat",_E="rg32uint",vE="rg32sint",NE="rg32float",SE="rgba16uint",RE="rgba16sint",EE="rgba16float",AE="rgba32uint",wE="rgba32sint",CE="rgba32float",ME="depth16unorm",BE="depth24plus",LE="depth24plus-stencil8",PE="depth32float",FE="depth32float-stencil8",DE="bc1-rgba-unorm",UE="bc1-rgba-unorm-srgb",IE="bc2-rgba-unorm",OE="bc2-rgba-unorm-srgb",VE="bc3-rgba-unorm",kE="bc3-rgba-unorm-srgb",GE="bc4-r-unorm",zE="bc4-r-snorm",$E="bc5-rg-unorm",WE="bc5-rg-snorm",HE="bc6h-rgb-ufloat",qE="bc6h-rgb-float",jE="bc7-rgba-unorm",XE="bc7-rgba-unorm-srgb",KE="etc2-rgb8unorm",YE="etc2-rgb8unorm-srgb",QE="etc2-rgb8a1unorm",ZE="etc2-rgb8a1unorm-srgb",JE="etc2-rgba8unorm",eA="etc2-rgba8unorm-srgb",tA="eac-r11unorm",rA="eac-r11snorm",sA="eac-rg11unorm",iA="eac-rg11snorm",nA="astc-4x4-unorm",aA="astc-4x4-unorm-srgb",oA="astc-5x4-unorm",uA="astc-5x4-unorm-srgb",lA="astc-5x5-unorm",dA="astc-5x5-unorm-srgb",cA="astc-6x5-unorm",hA="astc-6x5-unorm-srgb",pA="astc-6x6-unorm",gA="astc-6x6-unorm-srgb",mA="astc-8x5-unorm",fA="astc-8x5-unorm-srgb",yA="astc-8x6-unorm",bA="astc-8x6-unorm-srgb",xA="astc-8x8-unorm",TA="astc-8x8-unorm-srgb",_A="astc-10x5-unorm",vA="astc-10x5-unorm-srgb",NA="astc-10x6-unorm",SA="astc-10x6-unorm-srgb",RA="astc-10x8-unorm",EA="astc-10x8-unorm-srgb",AA="astc-10x10-unorm",wA="astc-10x10-unorm-srgb",CA="astc-12x10-unorm",MA="astc-12x10-unorm-srgb",BA="astc-12x12-unorm",LA="astc-12x12-unorm-srgb",PA="clamp-to-edge",FA="repeat",DA="mirror-repeat",UA="linear",IA="nearest",OA="zero",VA="one",kA="src",GA="one-minus-src",zA="src-alpha",$A="one-minus-src-alpha",WA="dst",HA="one-minus-dst",qA="dst-alpha",jA="one-minus-dst-alpha",XA="src-alpha-saturated",KA="constant",YA="one-minus-constant",QA="add",ZA="subtract",JA="reverse-subtract",ew="min",tw="max",rw=0,sw=15,iw="keep",nw="zero",aw="replace",ow="invert",uw="increment-clamp",lw="decrement-clamp",dw="increment-wrap",cw="decrement-wrap",hw="storage",pw="read-only-storage",gw="write-only",mw="read-only",fw="read-write",yw="non-filtering",bw="comparison",xw="float",Tw="unfilterable-float",_w="depth",vw="sint",Nw="uint",Sw="2d",Rw="3d",Ew="2d",Aw="2d-array",ww="cube",Cw="3d",Mw="all",Bw="vertex",Lw="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"},Fw={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class Dw extends zS{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 Uw extends DS{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let Iw=0;class Ow extends Uw{constructor(e,t){super("StorageBuffer_"+Iw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ei.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class Vw extends ey{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:UA}),this.flipYSampler=e.createSampler({minFilter:IA}),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:CR,stripIndexFormat:jR},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:CR,stripIndexFormat:jR},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:GR,storeOp:VR,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 Vw(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,Hw=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,qw={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 jw extends YN{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(Ww);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=Hw.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 Xw extends KN{parseFunction(e){return new jw(e)}}const Kw={[ei.READ_ONLY]:"read",[ei.WRITE_ONLY]:"write",[ei.READ_WRITE]:"read_write"},Yw={[Ir]:"repeat",[xe]:"clamp",[Ur]:"mirror"},Qw={vertex:MR.VERTEX,fragment:MR.FRAGMENT,compute:MR.COMPUTE},Zw={instance:!0,swizzleAssign:!1,storageBuffer:!0},Jw={"^^":"tsl_xor"},eC={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"},tC={},rC={tsl_xor:new jx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new jx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new jx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new jx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new jx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new jx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new jx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new jx("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 jx("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 jx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new jx("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 jx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new jx("\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")},sC={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 iC="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(iC+="diagnostic( off, derivative_uniformity );\n");class nC extends FN{constructor(e,t){super(e,t,new Xw),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_${Yw[e.wrapS]}S_${Yw[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=tC[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===Ir?(s.push(rC.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===xe?(s.push(rC.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Ur?(s.push(rC.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",tC[t]=r=new jx(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 Ru(new hl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Ru(new hl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Ru(new hl("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=Jw[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."),ei.READ_WRITE):ei.READ_ONLY:e.access}getStorageAccess(e,t){return Kw[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 jS(i.name,i.node,o,n):new HS(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new qS(i.name,i.node,o,n):"texture3D"===t&&(s=new jS(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(Qw[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new Dw(`${i.name}_sampler`,i.node,o);e.setVisibility(Qw[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?OS:Ow)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|Qw[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e?(e=new GS(u,o),e.setVisibility(Qw[r]),this.uniformGroups[u]=e,l.push(e)):(e.setVisibility(e.getVisibility()|Qw[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=$w(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 eC[e]||e}isAvailable(e){let t=Zw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),Zw[e]=t),t}_getWGSLMethod(e){return void 0!==rC[e]&&this._include(e),sC[e]}_include(e){const t=rC[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${iC}\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 aC{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=LE:e.depth&&(t=BE),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?RR:e.isLineSegments||e.isMesh&&!0===t.wireframe?ER:e.isLine?AR:e.isMesh?wR: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 fE;if(e===be)return EE;throw new Error("Unsupported output buffer type.")}}const oC=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&&oC.set(Float16Array,["float16"]);const uC=new Map([[it,["float16"]]]),lC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class dC{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=Xr(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=Mw;let o;o=t.isSampledCubeTexture?ww:t.isSampledTexture3D?Cw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Aw: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&MR.COMPUTE&&(s.access===ei.READ_WRITE||s.access===ei.WRITE_ONLY)?e.type=hw:e.type=pw),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===ei.READ_WRITE?fw:t===ei.WRITE_ONLY?gw:mw,s.texture.isArrayTexture?e.viewDimension=Aw:s.texture.is3DTexture&&(e.viewDimension=Cw),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=Tw)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=Tw:t.sampleType=_w;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=vw:e===S?t.sampleType=Nw:e===j&&(this.backend.hasFeature("float32-filterable")?t.sampleType=xw:t.sampleType=Tw)}s.isSampledCubeTexture?t.viewDimension=ww:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=Aw:s.isSampledTexture3D&&(t.viewDimension=Cw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(E.TEXTURE_COMPARE)?t.type=bw:t.type=yw),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 pC{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===lt){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:QA},r={srcFactor:i,dstFactor:n,operation:QA}};if(e.premultipliedAlpha)switch(s){case ze:i(VA,$A,VA,$A);break;case Wt:i(VA,VA,VA,VA);break;case $t:i(OA,GA,OA,VA);break;case zt:i(WA,$A,OA,VA)}else switch(s){case ze:i(zA,$A,VA,$A);break;case Wt:i(zA,VA,VA,VA);break;case $t:o(`WebGPURenderer: "SubtractiveBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`);break;case zt: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 dt:t=OA;break;case Ot:t=VA;break;case It:t=kA;break;case Pt:t=GA;break;case $e:t=zA;break;case We:t=$A;break;case Dt:t=WA;break;case Lt:t=HA;break;case Ft:t=qA;break;case Bt:t=jA;break;case Ut:t=XA;break;case 211:t=KA;break;case 212:t=YA;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case rs:t=BR;break;case ts:t=OR;break;case es:t=LR;break;case Jr:t=FR;break;case Zr:t=PR;break;case Qr:t=IR;break;case Yr:t=DR;break;case Kr:t=UR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case ds:t=iw;break;case ls:t=nw;break;case us:t=aw;break;case os:t=ow;break;case as:t=uw;break;case ns:t=lw;break;case is:t=dw;break;case ss:t=cw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case He:t=QA;break;case Mt:t=ZA;break;case Ct:t=JA;break;case hs:t=ew;break;case cs:t=tw;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?qR:jR);let n=r.side===M;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?$R:zR,s.cullMode=r.side===B?WR:HR,s}_getColorWriteMask(e){return!0===e.colorWrite?sw:rw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=OR;else{const r=e.depthFunc;switch(r){case Zt:t=BR;break;case Qt:t=OR;break;case Yt:t=LR;break;case Kt:t=FR;break;case Xt:t=PR;break;case jt:t=IR;break;case qt:t=DR;break;case Ht:t=UR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class gC extends vR{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 mC extends iR{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 aC(this),this.attributeUtils=new dC(this),this.bindingUtils=new hC(this),this.pipelineUtils=new pC(this),this.textureUtils=new zw(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${nt} 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:kR}),this.initTimestampQuery(At.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 SR(e)));super(new t(e),e),this.library=new bC,this.isWebGPURenderer=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}}class TC extends Es{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class _C{constructor(e,t=Rn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Yp;r.name="PostProcessing",this._quadMesh=new zb(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=fl(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 vC 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 NC 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 SC 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 RC extends tx{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class EC extends As{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new ws(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),pn()):new this.nodes[e]}}class AC extends Cs{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 wC extends Ms{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 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 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}getSkinnedNormal(e=this.boneMatricesNode,t=$d){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);let d=Ma(s.x.mul(a),s.y.mul(o),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).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 t=this.getSkinnedNormal();$d.assign(t),e.hasGeometryAttribute("tangent")&&Dc.assign(t)}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=vn(t).toVar(),i=gn(r),n=i.mul(i).toVar(),a=vo(vn(n.mul(s.x),n.mul(s.y),s.z)).toVar(),o=a.x.mul(a.x).add(a.y.mul(a.y)),u=bu(o.greaterThan(0),vn(a.y.negate(),a.x,0).div(bo(o)),vn(1,0,0)).toVar(),l=Qo(a,u).toVar(),d=bo(e.x),c=La(2,3.14159265359).mul(e.y),h=d.mul(Ro(c)).toVar(),p=d.mul(So(c)).toVar(),g=La(.5,a.z.add(1));p.assign(g.oneMinus().mul(bo(h.mul(h).oneMinus())).add(g.mul(p)));const m=u.mul(h).add(l.mul(p)).add(a.mul(bo(Ho(0,h.mul(h).add(p.mul(p)).oneMinus()))));return vo(vn(n.mul(m.x),n.mul(m.y),Ho(0,m.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)}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 null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=FE:e.depth&&(t=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;t { - if ( builder.shaderStage === 'fragment' && builder.material.vertexNode ) { - - // reconstruct world position from view position - - return cameraWorldMatrix.mul( positionView ).xyz.toVar( 'positionWorld' ); - - } - return modelWorldMatrix.mul( positionLocal ).xyz.toVarying( builder.getSubBuildProperty( 'v_positionWorld' ) ); -}, 'vec3' ).once( [ 'POSITION', 'VERTEX' ] ) )(); +}, 'vec3' ).once( [ 'POSITION' ] ) )(); /** * TSL object that represents the position world direction of the current rendered object. @@ -43609,31 +43601,6 @@ const VSMShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, depthLa } ); -// - -const linearDistance = /*@__PURE__*/ Fn( ( [ position, cameraNear, cameraFar ] ) => { - - let dist = positionWorld.sub( position ).length(); - dist = dist.sub( cameraNear ).div( cameraFar.sub( cameraNear ) ); - dist = dist.saturate(); // clamp to [ 0, 1 ] - - return dist; - -} ); - -const linearShadowDistance = ( light ) => { - - const camera = light.shadow.camera; - - const nearDistance = reference( 'near', 'float', camera ).setGroup( renderGroup ); - const farDistance = reference( 'far', 'float', camera ).setGroup( renderGroup ); - - const referencePosition = objectPosition( light ); - - return linearDistance( referencePosition, nearDistance, farDistance ); - -}; - /** * Retrieves or creates a shadow material for the given light source. * @@ -43654,13 +43621,11 @@ const getShadowMaterial = ( light ) => { if ( material === undefined ) { - const depthNode = light.isPointLight ? linearShadowDistance( light ) : null; - material = new NodeMaterial(); material.colorNode = vec4( 0, 0, 0, 1 ); - material.depthNode = depthNode; material.isShadowPassMaterial = true; // Use to avoid other overrideMaterial override material.colorNode unintentionally when using material.shadowNode material.name = 'ShadowMaterial'; + material.blending = NoBlending; material.fog = false; shadowMaterialLib.set( light, material ); @@ -44067,7 +44032,7 @@ class ShadowNode extends ShadowBaseNode { const depthTexture = new DepthTexture( shadow.mapSize.width, shadow.mapSize.height ); depthTexture.name = 'ShadowDepthTexture'; - depthTexture.compareFunction = LessCompare; + depthTexture.compareFunction = LessEqualCompare; const shadowMap = builder.createRenderTarget( shadow.mapSize.width, shadow.mapSize.height ); shadowMap.texture.name = 'ShadowMap'; @@ -44090,9 +44055,21 @@ class ShadowNode extends ShadowBaseNode { const { light, shadow } = this; + const { depthTexture, shadowMap } = this.setupRenderTarget( shadow, builder ); + const shadowMapType = renderer.shadowMap.type; - const { depthTexture, shadowMap } = this.setupRenderTarget( shadow, builder ); + if ( shadowMapType === PCFShadowMap || shadowMapType === PCFSoftShadowMap ) { + + depthTexture.minFilter = LinearFilter; + depthTexture.magFilter = LinearFilter; + + } else { + + depthTexture.minFilter = NearestFilter; + depthTexture.magFilter = NearestFilter; + + } shadow.camera.coordinateSystem = camera.coordinateSystem; shadow.camera.updateProjectionMatrix(); @@ -44608,23 +44585,23 @@ const pointShadowFilter = /*@__PURE__*/ Fn( ( { filterFn, depthTexture, shadowCo // for point lights, the uniform @vShadowCoord is re-purposed to hold // the vector from the light to the world-space position of the fragment. - const lightToPosition = shadowCoord.xyz.toVar(); - const lightToPositionLength = lightToPosition.length(); + const shadowPosition = shadowCoord.xyz.toConst(); + const shadowPositionAbs = shadowPosition.abs().toConst(); + const viewZ = shadowPositionAbs.x.max( shadowPositionAbs.y ).max( shadowPositionAbs.z ); - const cameraNearLocal = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.near ); - const cameraFarLocal = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.far ); + const shadowCameraNear = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.near ); + const shadowCameraFar = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.far ); const bias = reference( 'bias', 'float', shadow ).setGroup( renderGroup ); const result = float( 1.0 ).toVar(); - If( lightToPositionLength.sub( cameraFarLocal ).lessThanEqual( 0.0 ).and( lightToPositionLength.sub( cameraNearLocal ).greaterThanEqual( 0.0 ) ), () => { + If( viewZ.sub( shadowCameraFar ).lessThanEqual( 0.0 ).and( viewZ.sub( shadowCameraNear ).greaterThanEqual( 0.0 ) ), () => { - // dp = normalized distance from light to fragment position - const dp = lightToPositionLength.sub( cameraNearLocal ).div( cameraFarLocal.sub( cameraNearLocal ) ).toVar(); // need to clamp? + const dp = viewZToPerspectiveDepth( viewZ.negate(), shadowCameraNear, shadowCameraFar ); dp.addAssign( bias ); // bd3D = base direction 3D (direction from light to fragment) - const bd3D = lightToPosition.normalize(); + const bd3D = shadowPosition.normalize(); // percentage-closer filtering using cube texture sampling result.assign( filterFn( { depthTexture, bd3D, dp, shadow } ) ); @@ -44716,7 +44693,7 @@ class PointShadowNode extends ShadowNode { const depthTexture = new CubeDepthTexture( shadow.mapSize.width ); depthTexture.name = 'PointShadowDepthTexture'; - depthTexture.compareFunction = LessCompare; + depthTexture.compareFunction = LessEqualCompare; const shadowMap = builder.createCubeRenderTarget( shadow.mapSize.width ); shadowMap.texture.name = 'PointShadowMap'; @@ -57261,6 +57238,8 @@ const _frustumArray = /*@__PURE__*/ new FrustumArray(); const _projScreenMatrix = /*@__PURE__*/ new Matrix4(); const _vector4 = /*@__PURE__*/ new Vector4(); +const _shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide }; + /** * Base class for renderers. */ @@ -60397,7 +60376,15 @@ class Renderer { const { colorNode, depthNode, positionNode } = this._getShadowNodes( material ); - overrideMaterial.side = material.shadowSide === null ? material.side : material.shadowSide; + if ( this.shadowMap.type === VSMShadowMap ) { + + overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side; + + } else { + + overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : _shadowSide[ material.side ]; + + } if ( colorNode !== null ) overrideMaterial.colorNode = colorNode; if ( depthNode !== null ) overrideMaterial.depthNode = depthNode; @@ -61923,9 +61910,9 @@ precision highp isampler3D; precision highp isamplerCube; precision highp isampler2DArray; -precision lowp sampler2DShadow; -precision lowp sampler2DArrayShadow; -precision lowp samplerCubeShadow; +precision highp sampler2DShadow; +precision highp sampler2DArrayShadow; +precision highp samplerCubeShadow; `; /** @@ -82127,4 +82114,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, 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, 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 }; diff --git a/build/three.webgpu.nodes.min.js b/build/three.webgpu.nodes.min.js index e97a5cc5e9bd19..30884b4bc89810 100644 --- a/build/three.webgpu.nodes.min.js +++ b/build/three.webgpu.nodes.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2025 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 P,CubeReflectionMapping as F,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 Pe,ShadowMaterial as Fe,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,BasicShadowMap as Je,CubeDepthTexture as et,SphereGeometry as tt,LinearMipmapNearestFilter as rt,NearestMipmapLinearFilter as st,Float16BufferAttribute as it,REVISION as nt,ArrayCamera as at,PlaneGeometry as ot,FrontSide as ut,CustomBlending as lt,ZeroFactor as dt,CylinderGeometry as ct,Quaternion as ht,WebXRController as pt,RAD2DEG as gt,PCFShadowMap as mt,FrustumArray as ft,Frustum as yt,RedIntegerFormat as bt,RedFormat as xt,ShortType as Tt,ByteType as _t,UnsignedShortType as vt,RGIntegerFormat as Nt,RGBIntegerFormat as St,RGBFormat as Rt,RGBAIntegerFormat as At,TimestampQuery as Et,createCanvasElement as wt,ReverseSubtractEquation as Ct,SubtractEquation as Mt,OneMinusDstAlphaFactor as Bt,OneMinusDstColorFactor as Lt,OneMinusSrcColorFactor as Pt,DstAlphaFactor as Ft,DstColorFactor as Dt,SrcAlphaSaturateFactor as Ut,SrcColorFactor as It,OneFactor as Ot,CullFaceNone as Vt,CullFaceBack as kt,CullFaceFront as Gt,MultiplyBlending as zt,SubtractiveBlending as $t,AdditiveBlending as Wt,NotEqualDepth as Ht,GreaterDepth as qt,GreaterEqualDepth as jt,EqualDepth as Xt,LessEqualDepth as Kt,LessDepth as Yt,AlwaysDepth as Qt,NeverDepth as Zt,UnsignedShort4444Type as Jt,UnsignedShort5551Type as er,UnsignedInt5999Type as tr,UnsignedInt101111Type as rr,AlphaFormat as sr,RGB_S3TC_DXT1_Format as ir,RGBA_S3TC_DXT1_Format as nr,RGBA_S3TC_DXT3_Format as ar,RGBA_S3TC_DXT5_Format as or,RGB_PVRTC_4BPPV1_Format as ur,RGB_PVRTC_2BPPV1_Format as lr,RGBA_PVRTC_4BPPV1_Format as dr,RGBA_PVRTC_2BPPV1_Format as cr,RGB_ETC1_Format as hr,RGB_ETC2_Format as pr,RGBA_ETC2_EAC_Format as gr,R11_EAC_Format as mr,SIGNED_R11_EAC_Format as fr,SIGNED_RG11_EAC_Format as yr,RGBA_ASTC_4x4_Format as br,RGBA_ASTC_5x4_Format as xr,RGBA_ASTC_5x5_Format as Tr,RGBA_ASTC_6x5_Format as _r,RGBA_ASTC_6x6_Format as vr,RGBA_ASTC_8x5_Format as Nr,RGBA_ASTC_8x6_Format as Sr,RGBA_ASTC_8x8_Format as Rr,RGBA_ASTC_10x5_Format as Ar,RGBA_ASTC_10x6_Format as Er,RGBA_ASTC_10x8_Format as wr,RGBA_ASTC_10x10_Format as Cr,RGBA_ASTC_12x10_Format as Mr,RGBA_ASTC_12x12_Format as Br,RGBA_BPTC_Format as Lr,RED_RGTC1_Format as Pr,SIGNED_RED_RGTC1_Format as Fr,SIGNED_RED_GREEN_RGTC2_Format as Dr,MirroredRepeatWrapping as Ur,RepeatWrapping as Ir,NearestMipmapNearestFilter as Or,NotEqualCompare as Vr,GreaterCompare as kr,GreaterEqualCompare as Gr,EqualCompare as zr,LessEqualCompare as $r,AlwaysCompare as Wr,NeverCompare as Hr,LinearTransfer as qr,getByteLength as jr,isTypedArray as Xr,NotEqualStencilFunc as Kr,GreaterStencilFunc as Yr,GreaterEqualStencilFunc as Qr,EqualStencilFunc as Zr,LessEqualStencilFunc as Jr,LessStencilFunc as es,AlwaysStencilFunc as ts,NeverStencilFunc as rs,DecrementWrapStencilOp as ss,IncrementWrapStencilOp as is,DecrementStencilOp as ns,IncrementStencilOp as as,InvertStencilOp as os,ReplaceStencilOp as us,ZeroStencilOp as ls,KeepStencilOp as ds,MaxEquation as cs,MinEquation as hs,SpotLight as ps,PointLight as gs,DirectionalLight as ms,RectAreaLight as fs,AmbientLight as ys,HemisphereLight as bs,LightProbe as xs,LinearToneMapping as Ts,ReinhardToneMapping as _s,CineonToneMapping as vs,ACESFilmicToneMapping as Ns,AgXToneMapping as Ss,NeutralToneMapping as Rs,Group as As,Loader as Es,FileLoader as ws,MaterialLoader as Cs,ObjectLoader as Ms}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,PCFSoftShadowMap,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 Bs=["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"],Ls=new WeakMap;class Ps{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=Bs,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 Ds=e=>Fs(e),Us=e=>Fs(e),Is=(...e)=>Fs(e),Os=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),Vs=new WeakMap;function ks(e){return Os.get(e)}function Gs(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 zs(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 $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)?12:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Ws(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 Hs(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 qs(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?Ks(u[0]):null}function js(e){let t=Vs.get(e);return void 0===t&&(t={},Vs.set(e,t)),t}function Xs(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Ys=Object.freeze({__proto__:null,arrayBufferToBase64:Xs,base64ToArrayBuffer:Ks,getAlignmentFromType:Ws,getDataFromObject:js,getLengthFromType:zs,getMemoryLengthFromType:$s,getTypeFromLength:ks,getTypedArrayFromType:Gs,getValueFromType:qs,getValueType:Hs,hash:Is,hashArray:Us,hashString:Ds});const Qs={VERTEX:"vertex",FRAGMENT:"fragment"},Zs={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Js={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ei={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ti=["fragment","vertex"],ri=["setup","analyze","generate"],si=[...ti,"compute"],ii=["x","y","z","w"],ni={analyze:"setup",generate:"analyze"};let ai=0;class oi extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Zs.NONE,this.updateBeforeType=Zs.NONE,this.updateAfterType=Zs.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:ai++})}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,Zs.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Zs.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Zs.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 ui extends oi{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 li extends oi{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 di extends oi{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 ci extends di{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 hi=ii.join("");class pi extends oi{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(ii.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===hi.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 gi extends di{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("");oi.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==Ti?Ti.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn()."),this;{const t=_i.get("assign");return this.addToStack(t(...e))}},oi.prototype.toVarIntent=function(){return this},oi.prototype.get=function(e){return new xi(this,e)};const Si={};function Ri(e,t,r){Si[e]=Si[t]=Si[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new pi(this,e),this._cache[e]=t),t},set(t){this[e].assign(Qi(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();oi.prototype["set"+s]=oi.prototype["set"+i]=oi.prototype["set"+n]=function(t){const r=Ni(e);return new gi(this,r,Qi(t))},oi.prototype["flip"+s]=oi.prototype["flip"+i]=oi.prototype["flip"+n]=function(){const t=Ni(e);return new mi(this,t)}}const Ai=["x","y","z","w"],Ei=["r","g","b","a"],wi=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ai[e],r=Ei[e],s=wi[e];Ri(t,r,s);for(let i=0;i<4;i++){t=Ai[e]+Ai[i],r=Ei[e]+Ei[i],s=wi[e]+wi[i],Ri(t,r,s);for(let n=0;n<4;n++){t=Ai[e]+Ai[i]+Ai[n],r=Ei[e]+Ei[i]+Ei[n],s=wi[e]+wi[i]+wi[n],Ri(t,r,s);for(let a=0;a<4;a++)t=Ai[e]+Ai[i]+Ai[n]+Ai[a],r=Ei[e]+Ei[i]+Ei[n]+Ei[a],s=wi[e]+wi[i]+wi[n]+wi[a],Ri(t,r,s)}}}for(let e=0;e<32;e++)Si[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new ui(this,new bi(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(Qi(t))}};Object.defineProperties(oi.prototype,Si);const Ci=new WeakMap,Mi=function(e,t=null){for(const r in e)e[r]=Qi(e[r],t);return e},Bi=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(...en(d(t)))):null!==r?(r=Qi(r),n=(...s)=>i(new e(t,...en(d(s)),r))):n=(...r)=>i(new e(t,...en(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(...en(t))};class Fi extends oi{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=Ci.get(e.constructor);void 0===s&&(s=new WeakMap,Ci.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Qi(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;Ji(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=Qi(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 Ji(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 Qi(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 oi&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=Qi(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=Qi(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 Di extends oi{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 Fi(this,e)}setup(){return this.call()}}const Ui=[!1,!0],Ii=[0,1,2,3],Oi=[-1,-2],Vi=[.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],ki=new Map;for(const e of Ui)ki.set(e,new bi(e));const Gi=new Map;for(const e of Ii)Gi.set(e,new bi(e,"uint"));const zi=new Map([...Gi].map(e=>new bi(e.value,"int")));for(const e of Oi)zi.set(e,new bi(e,"int"));const $i=new Map([...zi].map(e=>new bi(e.value)));for(const e of Vi)$i.set(e,new bi(e));for(const e of Vi)$i.set(-e,new bi(-e));const Wi={bool:ki,uint:Gi,ints:zi,float:$i},Hi=new Map([...ki,...$i]),qi=(e,t)=>Hi.has(e)?Hi.get(e):!0===e.isNode?e:new bi(e,t),ji=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 bi(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=[qs(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Zi(t.get(r[0]));if(1===r.length){const t=qi(r[0],e);return t.nodeType===e?Zi(t):Zi(new li(t,e))}const s=r.map(e=>qi(e));return Zi(new ci(s,e))}},Xi=e=>"object"==typeof e&&null!==e?e.value:e,Ki=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Yi(e,t){return new Di(e,t)}const Qi=(e,t=null)=>function(e,t=null){const r=Hs(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Qi(qi(e,t)):"shader"===r?e.isFn?e:on(e):e}(e,t),Zi=(e,t=null)=>Qi(e,t).toVarIntent(),Ji=(e,t=null)=>new Mi(e,t),en=(e,t=null)=>new Bi(e,t),tn=(e,t=null,r=null,s=null)=>new Li(e,t,r,s),rn=(e,...t)=>new Pi(e,...t),sn=(e,t=null,r=null,s={})=>new Li(e,t,r,{...s,intent:!0});let nn=0;class an extends oi{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 Yi(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"+nn++,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 on(e,t=null){const r=new an(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 un=e=>{Ti=e},ln=()=>Ti,dn=(...e)=>Ti.If(...e);function cn(e){return Ti&&Ti.addToStack(e),e}vi("toStack",cn);const hn=new ji("color"),pn=new ji("float",Wi.float),gn=new ji("int",Wi.ints),mn=new ji("uint",Wi.uint),fn=new ji("bool",Wi.bool),yn=new ji("vec2"),bn=new ji("ivec2"),xn=new ji("uvec2"),Tn=new ji("bvec2"),_n=new ji("vec3"),vn=new ji("ivec3"),Nn=new ji("uvec3"),Sn=new ji("bvec3"),Rn=new ji("vec4"),An=new ji("ivec4"),En=new ji("uvec4"),wn=new ji("bvec4"),Cn=new ji("mat2"),Mn=new ji("mat3"),Bn=new ji("mat4");vi("toColor",hn),vi("toFloat",pn),vi("toInt",gn),vi("toUint",mn),vi("toBool",fn),vi("toVec2",yn),vi("toIVec2",bn),vi("toUVec2",xn),vi("toBVec2",Tn),vi("toVec3",_n),vi("toIVec3",vn),vi("toUVec3",Nn),vi("toBVec3",Sn),vi("toVec4",Rn),vi("toIVec4",An),vi("toUVec4",En),vi("toBVec4",wn),vi("toMat2",Cn),vi("toMat3",Mn),vi("toMat4",Bn);const Ln=tn(ui).setParameterLength(2),Pn=(e,t)=>Qi(new li(Qi(e),t));vi("element",Ln),vi("convert",Pn);vi("append",e=>(d("TSL: .append() has been renamed to .toStack()."),cn(e)));class Fn extends oi{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 Ds(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 Dn=(e,t)=>new Fn(e,t),Un=(e,t)=>new Fn(e,t,!0),In=rn(Fn,"vec4","DiffuseColor"),On=rn(Fn,"vec3","DiffuseContribution"),Vn=rn(Fn,"vec3","EmissiveColor"),kn=rn(Fn,"float","Roughness"),Gn=rn(Fn,"float","Metalness"),zn=rn(Fn,"float","Clearcoat"),$n=rn(Fn,"float","ClearcoatRoughness"),Wn=rn(Fn,"vec3","Sheen"),Hn=rn(Fn,"float","SheenRoughness"),qn=rn(Fn,"float","Iridescence"),jn=rn(Fn,"float","IridescenceIOR"),Xn=rn(Fn,"float","IridescenceThickness"),Kn=rn(Fn,"float","AlphaT"),Yn=rn(Fn,"float","Anisotropy"),Qn=rn(Fn,"vec3","AnisotropyT"),Zn=rn(Fn,"vec3","AnisotropyB"),Jn=rn(Fn,"color","SpecularColor"),ea=rn(Fn,"color","SpecularColorBlended"),ta=rn(Fn,"float","SpecularF90"),ra=rn(Fn,"float","Shininess"),sa=rn(Fn,"vec4","Output"),ia=rn(Fn,"float","dashSize"),na=rn(Fn,"float","gapSize"),aa=rn(Fn,"float","pointWidth"),oa=rn(Fn,"float","IOR"),ua=rn(Fn,"float","Transmission"),la=rn(Fn,"float","Thickness"),da=rn(Fn,"float","AttenuationDistance"),ca=rn(Fn,"color","AttenuationColor"),ha=rn(Fn,"float","Dispersion");class pa extends oi{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 ga=e=>new pa(e),ma=(e,t=0)=>new pa(e,!0,t),fa=ma("frame"),ya=ma("render"),ba=ga("object");class xa extends fi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=ba}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 Ta=(e,t)=>{const r=Ki(t||e);if(r===e&&(e=qs(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new xa(e,r)};class _a extends di{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 va=(...e)=>{let t;if(1===e.length){const r=e[0];t=new _a(null,r.length,r)}else{const r=e[0],s=e[1];t=new _a(r,s)}return Qi(t)};vi("toArray",(e,t)=>va(Array(t).fill(e)));class Na extends di{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 ii.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?en(t):Ji(t[0]),new Ra(Qi(e),t));vi("call",Aa);const Ea={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class wa extends di{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new wa(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 Ca=sn(wa,"+").setParameterLength(2,1/0).setName("add"),Ma=sn(wa,"-").setParameterLength(2,1/0).setName("sub"),Ba=sn(wa,"*").setParameterLength(2,1/0).setName("mul"),La=sn(wa,"/").setParameterLength(2,1/0).setName("div"),Pa=sn(wa,"%").setParameterLength(2).setName("mod"),Fa=sn(wa,"==").setParameterLength(2).setName("equal"),Da=sn(wa,"!=").setParameterLength(2).setName("notEqual"),Ua=sn(wa,"<").setParameterLength(2).setName("lessThan"),Ia=sn(wa,">").setParameterLength(2).setName("greaterThan"),Oa=sn(wa,"<=").setParameterLength(2).setName("lessThanEqual"),Va=sn(wa,">=").setParameterLength(2).setName("greaterThanEqual"),ka=sn(wa,"&&").setParameterLength(2,1/0).setName("and"),Ga=sn(wa,"||").setParameterLength(2,1/0).setName("or"),za=sn(wa,"!").setParameterLength(1).setName("not"),$a=sn(wa,"^^").setParameterLength(2).setName("xor"),Wa=sn(wa,"&").setParameterLength(2).setName("bitAnd"),Ha=sn(wa,"~").setParameterLength(1).setName("bitNot"),qa=sn(wa,"|").setParameterLength(2).setName("bitOr"),ja=sn(wa,"^").setParameterLength(2).setName("bitXor"),Xa=sn(wa,"<<").setParameterLength(2).setName("shiftLeft"),Ka=sn(wa,">>").setParameterLength(2).setName("shiftRight"),Ya=on(([e])=>(e.addAssign(1),e)),Qa=on(([e])=>(e.subAssign(1),e)),Za=on(([e])=>{const t=gn(e).toConst();return e.addAssign(1),t}),Ja=on(([e])=>{const t=gn(e).toConst();return e.subAssign(1),t});vi("add",Ca),vi("sub",Ma),vi("mul",Ba),vi("div",La),vi("mod",Pa),vi("equal",Fa),vi("notEqual",Da),vi("lessThan",Ua),vi("greaterThan",Ia),vi("lessThanEqual",Oa),vi("greaterThanEqual",Va),vi("and",ka),vi("or",Ga),vi("not",za),vi("xor",$a),vi("bitAnd",Wa),vi("bitNot",Ha),vi("bitOr",qa),vi("bitXor",ja),vi("shiftLeft",Xa),vi("shiftRight",Ka),vi("incrementBefore",Ya),vi("decrementBefore",Qa),vi("increment",Za),vi("decrement",Ja);const eo=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),Pa(gn(e),gn(t)));vi("modInt",eo);class to extends di{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===to.MAX||e===to.MIN)&&arguments.length>3){let i=new to(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===to.LENGTH||t===to.DISTANCE||t===to.DOT?"float":t===to.CROSS?"vec3":t===to.ALL||t===to.ANY?"bool":t===to.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===to.ONE_MINUS)i=Ma(1,t);else if(s===to.RECIPROCAL)i=La(1,t);else if(s===to.DIFFERENCE)i=Co(Ma(t,r));else if(s===to.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=Rn(_n(n),0):s=Rn(_n(s),0);const a=Ba(s,n).xyz;i=_o(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===to.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===to.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===to.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==to.MIN&&r!==to.MAX?r===to.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===to.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===to.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==to.DFDX&&r!==to.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}}to.ALL="all",to.ANY="any",to.RADIANS="radians",to.DEGREES="degrees",to.EXP="exp",to.EXP2="exp2",to.LOG="log",to.LOG2="log2",to.SQRT="sqrt",to.INVERSE_SQRT="inversesqrt",to.FLOOR="floor",to.CEIL="ceil",to.NORMALIZE="normalize",to.FRACT="fract",to.SIN="sin",to.COS="cos",to.TAN="tan",to.ASIN="asin",to.ACOS="acos",to.ATAN="atan",to.ABS="abs",to.SIGN="sign",to.LENGTH="length",to.NEGATE="negate",to.ONE_MINUS="oneMinus",to.DFDX="dFdx",to.DFDY="dFdy",to.ROUND="round",to.RECIPROCAL="reciprocal",to.TRUNC="trunc",to.FWIDTH="fwidth",to.TRANSPOSE="transpose",to.DETERMINANT="determinant",to.INVERSE="inverse",to.EQUALS="equals",to.MIN="min",to.MAX="max",to.STEP="step",to.REFLECT="reflect",to.DISTANCE="distance",to.DIFFERENCE="difference",to.DOT="dot",to.CROSS="cross",to.POW="pow",to.TRANSFORM_DIRECTION="transformDirection",to.MIX="mix",to.CLAMP="clamp",to.REFRACT="refract",to.SMOOTHSTEP="smoothstep",to.FACEFORWARD="faceforward";const ro=pn(1e-6),so=pn(1e6),io=pn(Math.PI),no=pn(2*Math.PI),ao=pn(2*Math.PI),oo=pn(.5*Math.PI),uo=sn(to,to.ALL).setParameterLength(1),lo=sn(to,to.ANY).setParameterLength(1),co=sn(to,to.RADIANS).setParameterLength(1),ho=sn(to,to.DEGREES).setParameterLength(1),po=sn(to,to.EXP).setParameterLength(1),go=sn(to,to.EXP2).setParameterLength(1),mo=sn(to,to.LOG).setParameterLength(1),fo=sn(to,to.LOG2).setParameterLength(1),yo=sn(to,to.SQRT).setParameterLength(1),bo=sn(to,to.INVERSE_SQRT).setParameterLength(1),xo=sn(to,to.FLOOR).setParameterLength(1),To=sn(to,to.CEIL).setParameterLength(1),_o=sn(to,to.NORMALIZE).setParameterLength(1),vo=sn(to,to.FRACT).setParameterLength(1),No=sn(to,to.SIN).setParameterLength(1),So=sn(to,to.COS).setParameterLength(1),Ro=sn(to,to.TAN).setParameterLength(1),Ao=sn(to,to.ASIN).setParameterLength(1),Eo=sn(to,to.ACOS).setParameterLength(1),wo=sn(to,to.ATAN).setParameterLength(1,2),Co=sn(to,to.ABS).setParameterLength(1),Mo=sn(to,to.SIGN).setParameterLength(1),Bo=sn(to,to.LENGTH).setParameterLength(1),Lo=sn(to,to.NEGATE).setParameterLength(1),Po=sn(to,to.ONE_MINUS).setParameterLength(1),Fo=sn(to,to.DFDX).setParameterLength(1),Do=sn(to,to.DFDY).setParameterLength(1),Uo=sn(to,to.ROUND).setParameterLength(1),Io=sn(to,to.RECIPROCAL).setParameterLength(1),Oo=sn(to,to.TRUNC).setParameterLength(1),Vo=sn(to,to.FWIDTH).setParameterLength(1),ko=sn(to,to.TRANSPOSE).setParameterLength(1),Go=sn(to,to.DETERMINANT).setParameterLength(1),zo=sn(to,to.INVERSE).setParameterLength(1),$o=sn(to,to.MIN).setParameterLength(2,1/0),Wo=sn(to,to.MAX).setParameterLength(2,1/0),Ho=sn(to,to.STEP).setParameterLength(2),qo=sn(to,to.REFLECT).setParameterLength(2),jo=sn(to,to.DISTANCE).setParameterLength(2),Xo=sn(to,to.DIFFERENCE).setParameterLength(2),Ko=sn(to,to.DOT).setParameterLength(2),Yo=sn(to,to.CROSS).setParameterLength(2),Qo=sn(to,to.POW).setParameterLength(2),Zo=e=>Ba(e,e),Jo=e=>Ba(e,e,e),eu=e=>Ba(e,e,e,e),tu=sn(to,to.TRANSFORM_DIRECTION).setParameterLength(2),ru=e=>Ba(Mo(e),Qo(Co(e),1/3)),su=e=>Ko(e,e),iu=sn(to,to.MIX).setParameterLength(3),nu=(e,t=0,r=1)=>Qi(new to(to.CLAMP,Qi(e),Qi(t),Qi(r))),au=e=>nu(e),ou=sn(to,to.REFRACT).setParameterLength(3),uu=sn(to,to.SMOOTHSTEP).setParameterLength(3),lu=sn(to,to.FACEFORWARD).setParameterLength(3),du=on(([e])=>{const t=Ko(e.xy,yn(12.9898,78.233)),r=Pa(t,io);return vo(No(r).mul(43758.5453))}),cu=(e,t,r)=>iu(t,r,e),hu=(e,t,r)=>uu(t,r,e),pu=(e,t)=>Ho(t,e),gu=lu,mu=bo;vi("all",uo),vi("any",lo),vi("radians",co),vi("degrees",ho),vi("exp",po),vi("exp2",go),vi("log",mo),vi("log2",fo),vi("sqrt",yo),vi("inverseSqrt",bo),vi("floor",xo),vi("ceil",To),vi("normalize",_o),vi("fract",vo),vi("sin",No),vi("cos",So),vi("tan",Ro),vi("asin",Ao),vi("acos",Eo),vi("atan",wo),vi("abs",Co),vi("sign",Mo),vi("length",Bo),vi("lengthSq",su),vi("negate",Lo),vi("oneMinus",Po),vi("dFdx",Fo),vi("dFdy",Do),vi("round",Uo),vi("reciprocal",Io),vi("trunc",Oo),vi("fwidth",Vo),vi("min",$o),vi("max",Wo),vi("step",pu),vi("reflect",qo),vi("distance",jo),vi("dot",Ko),vi("cross",Yo),vi("pow",Qo),vi("pow2",Zo),vi("pow3",Jo),vi("pow4",eu),vi("transformDirection",tu),vi("mix",cu),vi("clamp",nu),vi("refract",ou),vi("smoothstep",hu),vi("faceForward",lu),vi("difference",Xo),vi("saturate",au),vi("cbrt",ru),vi("transpose",ko),vi("determinant",Go),vi("inverse",zo),vi("rand",du);class fu extends oi{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?Dn(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 yu=tn(fu).setParameterLength(2,3);vi("select",yu);class bu extends oi{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 xu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new bu(r,t)},Tu=e=>xu(e,{uniformFlow:!0}),_u=(e,t)=>xu(e,{nodeName:t});function vu(e,t,r=null){return xu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function Nu(e,t=null){return xu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Su(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),_u(e,t)}vi("context",xu),vi("label",Su),vi("uniformFlow",Tu),vi("setName",_u),vi("builtinShadowContext",(e,t,r)=>vu(t,r,e)),vi("builtinAOContext",(e,t)=>Nu(t,e));class Ru extends oi{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=tn(Ru),Eu=(e,t=null)=>Au(e,t).toStack(),wu=(e,t=null)=>Au(e,t,!0).toStack(),Cu=e=>Au(e).setIntent(!0).toStack();vi("toVar",Eu),vi("toConst",wu),vi("toVarIntent",Cu);class Mu extends oi{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 Bu=(e,t,r=null)=>Qi(new Mu(Qi(e),t,r));class Lu extends oi{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=Bu(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=Bu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Qs.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Qs.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,Qs.VERTEX);e.flowNodeFromShaderStage(Qs.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Pu=tn(Lu).setParameterLength(1,2),Fu=e=>Pu(e);vi("toVarying",Pu),vi("toVertexStage",Fu);const Du=on(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return iu(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Uu=on(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return iu(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Iu="WorkingColorSpace";class Ou extends di{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===Iu?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=Rn(Du(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=Rn(Mn(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=Rn(Uu(i.rgb),i.a)),i):i}}const Vu=(e,t)=>Qi(new Ou(Qi(e),Iu,t)),ku=(e,t)=>Qi(new Ou(Qi(e),t,Iu));vi("workingToColorSpace",Vu),vi("colorSpaceToWorking",ku);let Gu=class extends ui{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 zu extends oi{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=Zs.OBJECT}setGroup(e){return this.group=e,this}element(e){return new Gu(this,Qi(e))}setNodeType(e){const t=Ta(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 $u(e,t,r);class Hu extends di{static get type(){return"ToneMappingNode"}constructor(e,t=ju,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Is(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=Rn(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const qu=(e,t,r)=>Qi(new Hu(e,Qi(t),Qi(r))),ju=Wu("toneMappingExposure","float");vi("toneMapping",(e,t,r)=>qu(t,r,e));const Xu=new WeakMap;function Ku(e,t){let r=Xu.get(e);return void 0===r&&(r=new b(e,t),Xu.set(e,r)),r}class Yu extends fi{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?Ku(s.array,i):Ku(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 Qu(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Mn(new Yu(e,"vec3",9,0).setUsage(i).setInstanced(n),new Yu(e,"vec3",9,3).setUsage(i).setInstanced(n),new Yu(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Bn(new Yu(e,"vec4",16,0).setUsage(i).setInstanced(n),new Yu(e,"vec4",16,4).setUsage(i).setInstanced(n),new Yu(e,"vec4",16,8).setUsage(i).setInstanced(n),new Yu(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Yu(e,t,r,s).setUsage(i)}const Zu=(e,t=null,r=0,s=0)=>Qu(e,t,r,s),Ju=(e,t=null,r=0,s=0)=>Qu(e,t,r,s,f,!0),el=(e,t=null,r=0,s=0)=>Qu(e,t,r,s,x,!0);vi("toAttribute",e=>Zu(e.value));class tl extends oi{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=Zs.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 rl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;erl(e,r).setCount(t);vi("compute",sl),vi("computeKernel",rl);class il extends oi{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 nl=e=>new il(Qi(e));function al(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),nl(e).setParent(t)}vi("cache",al),vi("isolate",nl);class ol extends oi{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 ul=tn(ol).setParameterLength(2);vi("bypass",ul);class ll extends oi{static get type(){return"RemapNode"}constructor(e,t,r,s=pn(0),i=pn(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 dl=tn(ll,null,null,{doClamp:!1}).setParameterLength(3,5),cl=tn(ll).setParameterLength(3,5);vi("remap",dl),vi("remapClamp",cl);class hl extends oi{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 pl=tn(hl).setParameterLength(1,2),gl=e=>(e?yu(e,pl("discard")):pl("discard")).toStack();vi("discard",gl);class ml extends di{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 fl=(e,t=null,r=null)=>Qi(new ml(Qi(e),t,r));vi("renderOutput",fl);class yl extends di{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 bl=(e,t=null)=>Qi(new yl(Qi(e),t)).toStack();vi("debug",bl);class xl{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 Tl extends oi{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=Zs.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!==xl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function _l(e,t="",r=null){return(e=Qi(e)).before(new Tl(e,t,r))}vi("toInspector",_l);class vl extends oi{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 Nl=(e,t=null)=>new vl(e,t),Sl=(e=0)=>Nl("uv"+(e>0?e:""),"vec2");class Rl extends oi{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=tn(Rl).setParameterLength(1,2);class El extends xa{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Zs.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 wl=tn(El).setParameterLength(1),Cl=new N;class Ml extends xa{static get type(){return"TextureNode"}constructor(e=Cl,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=Zs.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 Sl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=Ta(this.value.matrix)),this._matrixUniform.mul(_n(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=Ta(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(gn(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=on(()=>{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?Zs.OBJECT:Zs.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=Ho(pl(x,"float"),pl(N,a)).build(e,a)),e.addLineFlowCode(`${o} = ${N}`,this),n.snippet=N,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=ku(pl(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=Qi(e),t.referenceNode=this.getBase(),Qi(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Qi(e).mul(wl(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),Qi(t)}level(e){const t=this.clone();return t.levelNode=Qi(e),t.referenceNode=this.getBase(),Qi(t)}size(e){return Al(this,e)}bias(e){const t=this.clone();return t.biasNode=Qi(e),t.referenceNode=this.getBase(),Qi(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=Qi(e),t.referenceNode=this.getBase(),Qi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Qi(e),Qi(t)],r.referenceNode=this.getBase(),Qi(r)}depth(e){const t=this.clone();return t.depthNode=Qi(e),t.referenceNode=this.getBase(),Qi(t)}offset(e){const t=this.clone();return t.offsetNode=Qi(e),t.referenceNode=this.getBase(),Qi(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 Bl=tn(Ml).setParameterLength(1,4).setName("texture"),Ll=(e=Cl,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Qi(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=Qi(t)),null!==r&&(i.levelNode=Qi(r)),null!==s&&(i.biasNode=Qi(s))):i=Bl(e,t,r,s),i},Pl=(...e)=>Ll(...e).setSampler(!1);class Fl extends xa{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 Dl=(e,t,r)=>new Fl(e,t,r);class Ul extends ui{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 Il extends Fl{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Hs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Zs.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 Il(e,t);const Vl=tn(class extends oi{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);let kl,Gl;class zl extends oi{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}getNodeType(){return this.scope===zl.DPR?"float":this.scope===zl.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Zs.NONE;return this.scope!==zl.SIZE&&this.scope!==zl.VIEWPORT&&this.scope!==zl.DPR||(e=Zs.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===zl.VIEWPORT?null!==t?Gl.copy(t.viewport):(e.getViewport(Gl),Gl.multiplyScalar(e.getPixelRatio())):this.scope===zl.DPR?this._output.value=e.getPixelRatio():null!==t?(kl.width=t.width,kl.height=t.height):e.getDrawingBufferSize(kl)}setup(){const e=this.scope;let r=null;return r=e===zl.SIZE?Ta(kl||(kl=new t)):e===zl.VIEWPORT?Ta(Gl||(Gl=new s)):e===zl.DPR?Ta(1):yn(ql.div(Hl)),this._output=r,r}generate(e){if(this.scope===zl.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Hl).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}zl.COORDINATE="coordinate",zl.VIEWPORT="viewport",zl.SIZE="size",zl.UV="uv",zl.DPR="dpr";const $l=rn(zl,zl.DPR),Wl=rn(zl,zl.UV),Hl=rn(zl,zl.SIZE),ql=rn(zl,zl.COORDINATE),jl=rn(zl,zl.VIEWPORT),Xl=jl.zw,Kl=ql.sub(jl.xy),Yl=Kl.div(Xl),Ql=on(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),Hl),"vec2").once()(),Zl=Ta(0,"uint").setName("u_cameraIndex").setGroup(ma("cameraIndex")).toVarying("v_cameraIndex"),Jl=Ta("float").setName("cameraNear").setGroup(ya).onRenderUpdate(({camera:e})=>e.near),ed=Ta("float").setName("cameraFar").setGroup(ya).onRenderUpdate(({camera:e})=>e.far),td=on(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Ol(r).setGroup(ya).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?Vl("gl_ViewID_OVR"):Zl).toConst("cameraProjectionMatrix")}else t=Ta("mat4").setName("cameraProjectionMatrix").setGroup(ya).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),rd=on(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=Ol(r).setGroup(ya).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?Vl("gl_ViewID_OVR"):Zl).toConst("cameraProjectionMatrixInverse")}else t=Ta("mat4").setName("cameraProjectionMatrixInverse").setGroup(ya).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),sd=on(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Ol(r).setGroup(ya).setName("cameraViewMatrices").element(e.isMultiViewCamera?Vl("gl_ViewID_OVR"):Zl).toConst("cameraViewMatrix")}else t=Ta("mat4").setName("cameraViewMatrix").setGroup(ya).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),id=on(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);t=Ol(r).setGroup(ya).setName("cameraWorldMatrices").element(e.isMultiViewCamera?Vl("gl_ViewID_OVR"):Zl).toConst("cameraWorldMatrix")}else t=Ta("mat4").setName("cameraWorldMatrix").setGroup(ya).onRenderUpdate(({camera:e})=>e.matrixWorld);return t}).once()(),nd=on(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);t=Ol(r).setGroup(ya).setName("cameraNormalMatrices").element(e.isMultiViewCamera?Vl("gl_ViewID_OVR"):Zl).toConst("cameraNormalMatrix")}else t=Ta("mat3").setName("cameraNormalMatrix").setGroup(ya).onRenderUpdate(({camera:e})=>e.normalMatrix);return t}).once()(),ad=on(({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()(),od=on(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);t=Ol(r,"vec4").setGroup(ya).setName("cameraViewports").element(Zl).toConst("cameraViewport")}else t=Rn(0,0,Hl.x,Hl.y).toConst("cameraViewport");return t}).once()(),ud=new C;class ld extends oi{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Zs.OBJECT,this.uniformNode=new xa(null)}getNodeType(){const e=this.scope;return e===ld.WORLD_MATRIX?"mat4":e===ld.POSITION||e===ld.VIEW_POSITION||e===ld.DIRECTION||e===ld.SCALE?"vec3":e===ld.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===ld.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===ld.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===ld.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===ld.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===ld.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===ld.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),ud.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=ud.radius}}generate(e){const t=this.scope;return t===ld.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===ld.POSITION||t===ld.VIEW_POSITION||t===ld.DIRECTION||t===ld.SCALE?this.uniformNode.nodeType="vec3":t===ld.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}}ld.WORLD_MATRIX="worldMatrix",ld.POSITION="position",ld.SCALE="scale",ld.VIEW_POSITION="viewPosition",ld.DIRECTION="direction",ld.RADIUS="radius";const dd=tn(ld,ld.DIRECTION).setParameterLength(1),cd=tn(ld,ld.WORLD_MATRIX).setParameterLength(1),hd=tn(ld,ld.POSITION).setParameterLength(1),pd=tn(ld,ld.SCALE).setParameterLength(1),gd=tn(ld,ld.VIEW_POSITION).setParameterLength(1),md=tn(ld,ld.RADIUS).setParameterLength(1);class fd extends ld{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const yd=rn(fd,fd.DIRECTION),bd=rn(fd,fd.WORLD_MATRIX),xd=rn(fd,fd.POSITION),Td=rn(fd,fd.SCALE),_d=rn(fd,fd.VIEW_POSITION),vd=rn(fd,fd.RADIUS),Nd=Ta(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Sd=Ta(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Rd=on(e=>e.context.modelViewMatrix||Ad).once()().toVar("modelViewMatrix"),Ad=sd.mul(bd),Ed=on(e=>(e.context.isHighPrecisionModelViewMatrix=!0,Ta("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),wd=on(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return Ta("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),Cd=on(e=>"fragment"!==e.shaderStage?(v("TSL: `clipSpace` is only available in fragment stage."),Rn()):e.context.clipSpace.toVarying("v_clipSpace")).once()(),Md=Nl("position","vec3"),Bd=Md.toVarying("positionLocal"),Ld=Md.toVarying("positionPrevious"),Pd=on(e=>"fragment"===e.shaderStage&&e.material.vertexNode?id.mul(Dd).xyz.toVar("positionWorld"):bd.mul(Bd).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION","VERTEX"])(),Fd=on(()=>Bd.transformDirection(bd).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Dd=on(e=>{if("fragment"===e.shaderStage&&e.material.vertexNode){const e=rd.mul(Cd);return e.xyz.div(e.w).toVar("positionView")}return e.context.setupPositionView().toVarying("v_positionView")},"vec3").once(["POSITION","VERTEX"])(),Ud=on(e=>{let t;return t=e.camera.isOrthographicCamera?_n(0,0,1):Dd.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class Id extends oi{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 Od=rn(Id),Vd=pn(Od).mul(2).sub(1),kd=on(([e],{material:t})=>{const r=t.side;return r===M?e=e.mul(-1):r===B&&(e=e.mul(Vd)),e}),Gd=Nl("normal","vec3"),zd=on(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),_n(0,1,0)):Gd,"vec3").once()().toVar("normalLocal"),$d=Dd.dFdx().cross(Dd.dFdy()).normalize().toVar("normalFlat"),Wd=on(e=>{let t;return t=!0===e.material.flatShading?$d:Yd(zd).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),Hd=on(e=>{let t=Wd.transformDirection(sd);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),qd=on(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=Wd,!0!==t.flatShading&&(s=kd(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),jd=qd.transformDirection(sd).toVar("normalWorld"),Xd=on(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?qd:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),Kd=on(([e,t=bd])=>{const r=Mn(t),s=e.div(_n(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),Yd=on(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=Nd.mul(e);return sd.transformDirection(s)}),Qd=on(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),qd)).once(["NORMAL","VERTEX"])(),Zd=on(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),jd)).once(["NORMAL","VERTEX"])(),Jd=on(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),Xd)).once(["NORMAL","VERTEX"])(),ec=new L,tc=new a,rc=Ta(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),sc=Ta(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),ic=Ta(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?(ec.copy(r),tc.makeRotationFromEuler(ec)):tc.identity(),tc}),nc=Ud.negate().reflect(qd),ac=Ud.negate().refract(qd,rc),oc=nc.transformDirection(sd).toVar("reflectVector"),uc=ac.transformDirection(sd).toVar("reflectVector"),lc=new P;class dc extends Ml{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===F?oc:e.mapping===D?uc:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),_n(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?_n(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=_n(t.x.negate(),t.yz)),ic.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const cc=tn(dc).setParameterLength(1,4).setName("cubeTexture"),hc=(e=lc,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Qi(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=Qi(t)),null!==r&&(i.levelNode=Qi(r)),null!==s&&(i.biasNode=Qi(s))):i=cc(e,t,r,s),i};class pc extends ui{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 gc extends oi{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=Zs.OBJECT}element(e){return new pc(this,Qi(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?Dl(null,e,this.count):Array.isArray(this.getValueFromReference())?Ol(null,e):"texture"===e?Ll(null):"cubeTexture"===e?hc(null):Ta(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 gc(e,t,r),fc=(e,t,r,s)=>new gc(e,t,s,r);class yc extends gc{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 bc=(e,t,r=null)=>new yc(e,t,r),xc=Sl(),Tc=Dd.dFdx(),_c=Dd.dFdy(),vc=xc.dFdx(),Nc=xc.dFdy(),Sc=qd,Rc=_c.cross(Sc),Ac=Sc.cross(Tc),Ec=Rc.mul(vc.x).add(Ac.mul(Nc.x)),wc=Rc.mul(vc.y).add(Ac.mul(Nc.y)),Cc=Ec.dot(Ec).max(wc.dot(wc)),Mc=Cc.equal(0).select(0,Cc.inverseSqrt()),Bc=Ec.mul(Mc).toVar("tangentViewFrame"),Lc=wc.mul(Mc).toVar("bitangentViewFrame"),Pc=Nl("tangent","vec4"),Fc=Pc.xyz.toVar("tangentLocal"),Dc=on(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Rd.mul(Rn(Fc,0)).xyz.toVarying("v_tangentView").normalize():Bc,!0!==r.flatShading&&(s=kd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Uc=Dc.transformDirection(sd).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Ic=on(([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"]),Oc=Ic(Gd.cross(Pc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Vc=Ic(zd.cross(Fc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),kc=on(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Ic(qd.cross(Dc),"v_bitangentView").normalize():Lc,!0!==r.flatShading&&(s=kd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),Gc=Ic(jd.cross(Uc),"v_bitangentWorld").normalize().toVar("bitangentWorld"),zc=Mn(Dc,kc,qd).toVar("TBNViewMatrix"),$c=Ud.mul(zc),Wc=on(()=>{let e=Zn.cross(Ud);return e=e.cross(Zn).normalize(),e=iu(e,qd,Yn.mul(kn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),Hc=e=>Qi(e).mul(.5).add(.5),qc=e=>_n(e,yo(au(pn(1).sub(Ko(e,e)))));class jc extends di{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=qc(i.xy):s===V?i=qc(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=kd(t)),i=_n(i.xy.mul(t),i.z)}let n=null;return t===k?n=Yd(i):t===U?n=zc.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=qd),n}}const Xc=tn(jc).setParameterLength(1,2),Kc=on(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Sl()),forceUVContext:!0}),s=pn(r(e=>e));return yn(pn(r(e=>e.add(e.dFdx()))).sub(s),pn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),Yc=on(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(Vd),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class Qc extends di{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=Kc({textureNode:this.textureNode,bumpScale:e});return Yc({surf_pos:Dd,surf_norm:qd,dHdxy:t})}}const Zc=tn(Qc).setParameterLength(1,2),Jc=new Map;class eh extends oi{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=Jc.get(e);return void 0===r&&(r=bc(e,t),Jc.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===eh.COLOR){const e=void 0!==t.color?this.getColor(r):_n();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===eh.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===eh.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:pn(1);else if(r===eh.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===eh.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===eh.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===eh.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===eh.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===eh.NORMAL)t.normalMap?(s=Xc(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?Zc(this.getTexture("bump").r,this.getFloat("bumpScale")):qd;else if(r===eh.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===eh.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===eh.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Xc(this.getTexture(r),this.getCache(r+"Scale","vec2")):qd;else if(r===eh.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===eh.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===eh.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Cn(Oh.x,Oh.y,Oh.y.negate(),Oh.x).mul(e.rg.mul(2).sub(yn(1)).normalize().mul(e.b))}else s=Oh;else if(r===eh.IRIDESCENCE_THICKNESS){const e=mc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=mc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===eh.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===eh.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===eh.IOR)s=this.getFloat(r);else if(r===eh.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===eh.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===eh.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):pn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}eh.ALPHA_TEST="alphaTest",eh.COLOR="color",eh.OPACITY="opacity",eh.SHININESS="shininess",eh.SPECULAR="specular",eh.SPECULAR_STRENGTH="specularStrength",eh.SPECULAR_INTENSITY="specularIntensity",eh.SPECULAR_COLOR="specularColor",eh.REFLECTIVITY="reflectivity",eh.ROUGHNESS="roughness",eh.METALNESS="metalness",eh.NORMAL="normal",eh.CLEARCOAT="clearcoat",eh.CLEARCOAT_ROUGHNESS="clearcoatRoughness",eh.CLEARCOAT_NORMAL="clearcoatNormal",eh.EMISSIVE="emissive",eh.ROTATION="rotation",eh.SHEEN="sheen",eh.SHEEN_ROUGHNESS="sheenRoughness",eh.ANISOTROPY="anisotropy",eh.IRIDESCENCE="iridescence",eh.IRIDESCENCE_IOR="iridescenceIOR",eh.IRIDESCENCE_THICKNESS="iridescenceThickness",eh.IOR="ior",eh.TRANSMISSION="transmission",eh.THICKNESS="thickness",eh.ATTENUATION_DISTANCE="attenuationDistance",eh.ATTENUATION_COLOR="attenuationColor",eh.LINE_SCALE="scale",eh.LINE_DASH_SIZE="dashSize",eh.LINE_GAP_SIZE="gapSize",eh.LINE_WIDTH="linewidth",eh.LINE_DASH_OFFSET="dashOffset",eh.POINT_SIZE="size",eh.DISPERSION="dispersion",eh.LIGHT_MAP="light",eh.AO="ao";const th=rn(eh,eh.ALPHA_TEST),rh=rn(eh,eh.COLOR),sh=rn(eh,eh.SHININESS),ih=rn(eh,eh.EMISSIVE),nh=rn(eh,eh.OPACITY),ah=rn(eh,eh.SPECULAR),oh=rn(eh,eh.SPECULAR_INTENSITY),uh=rn(eh,eh.SPECULAR_COLOR),lh=rn(eh,eh.SPECULAR_STRENGTH),dh=rn(eh,eh.REFLECTIVITY),ch=rn(eh,eh.ROUGHNESS),hh=rn(eh,eh.METALNESS),ph=rn(eh,eh.NORMAL),gh=rn(eh,eh.CLEARCOAT),mh=rn(eh,eh.CLEARCOAT_ROUGHNESS),fh=rn(eh,eh.CLEARCOAT_NORMAL),yh=rn(eh,eh.ROTATION),bh=rn(eh,eh.SHEEN),xh=rn(eh,eh.SHEEN_ROUGHNESS),Th=rn(eh,eh.ANISOTROPY),_h=rn(eh,eh.IRIDESCENCE),vh=rn(eh,eh.IRIDESCENCE_IOR),Nh=rn(eh,eh.IRIDESCENCE_THICKNESS),Sh=rn(eh,eh.TRANSMISSION),Rh=rn(eh,eh.THICKNESS),Ah=rn(eh,eh.IOR),Eh=rn(eh,eh.ATTENUATION_DISTANCE),wh=rn(eh,eh.ATTENUATION_COLOR),Ch=rn(eh,eh.LINE_SCALE),Mh=rn(eh,eh.LINE_DASH_SIZE),Bh=rn(eh,eh.LINE_GAP_SIZE),Lh=rn(eh,eh.LINE_WIDTH),Ph=rn(eh,eh.LINE_DASH_OFFSET),Fh=rn(eh,eh.POINT_SIZE),Dh=rn(eh,eh.DISPERSION),Uh=rn(eh,eh.LIGHT_MAP),Ih=rn(eh,eh.AO),Oh=Ta(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))}),Vh=on(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class kh extends ui{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 Gh=tn(kh).setParameterLength(2);class zh extends Fl{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=ks(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ei.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 Gh(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ei.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Zu(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 $h=(e,t=null,r=0)=>new zh(e,t,r);class Wh extends oi{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===Wh.VERTEX)s=e.getVertexIndex();else if(r===Wh.INSTANCE)s=e.getInstanceIndex();else if(r===Wh.DRAW)s=e.getDrawIndex();else if(r===Wh.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Wh.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Wh.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}}Wh.VERTEX="vertex",Wh.INSTANCE="instance",Wh.SUBGROUP="subgroup",Wh.INVOCATION_LOCAL="invocationLocal",Wh.INVOCATION_SUBGROUP="invocationSubgroup",Wh.DRAW="draw";const Hh=rn(Wh,Wh.VERTEX),qh=rn(Wh,Wh.INSTANCE),jh=rn(Wh,Wh.SUBGROUP),Xh=rn(Wh,Wh.INVOCATION_SUBGROUP),Kh=rn(Wh,Wh.INVOCATION_LOCAL),Yh=rn(Wh,Wh.DRAW);class Qh extends oi{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=Zs.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=$h(s,"vec3",Math.max(s.count,1)).element(qh);else{const e=new W(s.array,3),t=s.usage===x?el:Ju;this.bufferColor=e,r=_n(t(e,"vec3",3,0))}this.instanceColorNode=r}const n=t.mul(Bd).xyz;if(Bd.assign(n),e.needsPreviousData()&&Ld.assign(this.getPreviousInstancedPosition(e)),e.hasGeometryAttribute("normal")){const e=Kd(zd,t);zd.assign(e)}null!==this.instanceColorNode&&Un("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(Ld).xyz}_createInstanceMatrixNode(e,t){let r;const{instanceMatrix:s}=this,{count:i}=s;if(this.isStorageMatrix)r=$h(s,"mat4",Math.max(i,1)).element(qh);else{if(i<=(!0===t.renderer.backend.isWebGPUBackend?1e3:250))r=Dl(s.array,"mat4",Math.max(i,1)).element(qh);else{const t=new H(s.array,16,1);!0===e&&(this.buffer=t);const i=s.usage===x?el:Ju,n=[i(t,"vec4",16,0),i(t,"vec4",16,4),i(t,"vec4",16,8),i(t,"vec4",16,12)];r=Bn(...n)}}return r}}const Zh=tn(Qh).setParameterLength(2,3);class Jh extends Qh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const ep=tn(Jh).setParameterLength(1);class tp extends oi{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=qh:this.batchingIdNode=Yh);const t=on(([e])=>{const t=gn(Al(Pl(this.batchMesh._indirectTexture),0).x).toConst(),r=gn(e).mod(t).toConst(),s=gn(e).div(t).toConst();return Pl(this.batchMesh._indirectTexture,bn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(gn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=gn(Al(Pl(s),0).x).toConst(),n=pn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Bn(Pl(s,bn(a,o)),Pl(s,bn(a.add(1),o)),Pl(s,bn(a.add(2),o)),Pl(s,bn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=on(([e])=>{const t=gn(Al(Pl(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Pl(l,bn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Un("vec3","vBatchColor").assign(t)}const d=Mn(u);Bd.assign(u.mul(Bd));const c=zd.div(_n(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;zd.assign(h),e.hasGeometryAttribute("tangent")&&Fc.mulAssign(d)}}const rp=tn(tp).setParameterLength(1),sp=new WeakMap;class ip extends oi{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Zs.OBJECT,this.skinIndexNode=Nl("skinIndex","uvec4"),this.skinWeightNode=Nl("skinWeight","vec4"),this.bindMatrixNode=mc("bindMatrix","mat4"),this.bindMatrixInverseNode=mc("bindMatrixInverse","mat4"),this.boneMatricesNode=fc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Bd,this.toPositionNode=Bd,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=Ca(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}getSkinnedNormal(e=this.boneMatricesNode,t=zd){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);let d=Ca(s.x.mul(a),s.y.mul(o),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).xyz}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=fc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Ld)}setup(e){e.needsPreviousData()&&Ld.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();zd.assign(t),e.hasGeometryAttribute("tangent")&&Fc.assign(t)}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;sp.get(t)!==e.frameId&&(sp.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const np=e=>new ip(e);class ap extends oi{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 ap(en(e,"int")).toStack(),up=()=>pl("break").toStack(),lp=new WeakMap,dp=new s,cp=on(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=gn(Hh).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Pl(e,bn(u,o)).depth(i).xyz.mul(t)});class hp extends oi{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=Ta(1),this.updateType=Zs.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=lp.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=pn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Pl(this.mesh.morphTexture,bn(gn(e).add(1),gn(qh))).r):t.assign(mc("morphTargetInfluences","float").element(e).toVar()),dn(t.notEqual(0),()=>{!0===s&&Bd.addAssign(cp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:gn(0)})),!0===i&&zd.addAssign(cp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:gn(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 pp=tn(hp).setParameterLength(1);class gp extends oi{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class mp extends gp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class fp extends bu{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:_n().toVar("directDiffuse"),directSpecular:_n().toVar("directSpecular"),indirectDiffuse:_n().toVar("indirectDiffuse"),indirectSpecular:_n().toVar("indirectSpecular")};return{radiance:_n().toVar("radiance"),irradiance:_n().toVar("irradiance"),iblIrradiance:_n().toVar("iblIrradiance"),ambientOcclusion:pn(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 yp=tn(fp);class bp extends gp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const xp=new t;class Tp extends Ml{static get type(){return"ViewportTextureNode"}constructor(e=Wl,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=Zs.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(xp):xp.set(r.width,r.height);const s=this.getTextureForReference(r);s.image.width===xp.width&&s.image.height===xp.height||(s.image.width=xp.width,s.image.height=xp.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 _p=tn(Tp).setParameterLength(0,3),vp=tn(Tp,null,null,{generateMipmaps:!0}).setParameterLength(0,3),Np=vp(),Sp=(e=Wl,t=null)=>Np.sample(e,t);let Rp=null;class Ap extends Tp{static get type(){return"ViewportDepthTextureNode"}constructor(e=Wl,t=null){null===Rp&&(Rp=new Y),super(e,t,Rp)}getTextureForReference(){return Rp}}const Ep=tn(Ap).setParameterLength(0,2);class wp extends oi{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===wp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===wp.DEPTH_BASE)null!==r&&(s=Pp().assign(r));else if(t===wp.DEPTH)s=e.isPerspectiveCamera?Mp(Dd.z,Jl,ed):Cp(Dd.z,Jl,ed);else if(t===wp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Bp(r,Jl,ed);s=Cp(e,Jl,ed)}else s=r;else s=Cp(Dd.z,Jl,ed);return s}}wp.DEPTH_BASE="depthBase",wp.DEPTH="depth",wp.LINEAR_DEPTH="linearDepth";const Cp=(e,t,r)=>e.add(t).div(t.sub(r)),Mp=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Bp=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Lp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=fo(e.negate().div(t)),i=fo(r.div(t));return s.div(i)},Pp=tn(wp,wp.DEPTH_BASE),Fp=rn(wp,wp.DEPTH),Dp=tn(wp,wp.LINEAR_DEPTH).setParameterLength(0,1),Up=Dp(Ep());Fp.assign=e=>Pp(e);class Ip extends oi{static get type(){return"ClippingNode"}constructor(e=Ip.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===Ip.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Ip.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return on(()=>{const r=pn().toVar("distanceToPlane"),s=pn().toVar("distanceToGradient"),i=pn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Ol(t).setGroup(ya);op(n,({i:t})=>{const n=e.element(t);r.assign(Dd.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(uu(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Ol(e).setGroup(ya),n=pn(1).toVar("intersectionClipOpacity");op(a,({i:e})=>{const i=t.element(e);r.assign(Dd.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(uu(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}In.a.mulAssign(i),In.a.equal(0).discard()})()}setupDefault(e,t){return on(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Ol(t).setGroup(ya);op(r,({i:t})=>{const r=e.element(t);Dd.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Ol(e).setGroup(ya),r=fn(!0).toVar("clipped");op(s,({i:e})=>{const s=t.element(e);r.assign(Dd.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),on(()=>{const s=Ol(e).setGroup(ya),i=Vl(t.getClipDistance());op(r,({i:e})=>{const t=s.element(e),r=Dd.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}Ip.ALPHA_TO_COVERAGE="alphaToCoverage",Ip.DEFAULT="default",Ip.HARDWARE="hardware";const Op=on(([e])=>vo(Ba(1e4,No(Ba(17,e.x).add(Ba(.1,e.y)))).mul(Ca(.1,Co(No(Ba(13,e.y).add(e.x))))))),Vp=on(([e])=>Op(yn(Op(e.xy),e.z))),kp=on(([e])=>{const t=Wo(Bo(Fo(e.xyz)),Bo(Do(e.xyz))),r=pn(1).div(pn(.05).mul(t)).toVar("pixScale"),s=yn(go(xo(fo(r))),go(To(fo(r)))),i=yn(Vp(xo(s.x.mul(e.xyz))),Vp(xo(s.y.mul(e.xyz)))),n=vo(fo(r)),a=Ca(Ba(n.oneMinus(),i.x),Ba(n,i.y)),o=$o(n,n.oneMinus()),u=_n(a.mul(a).div(Ba(2,o).mul(Ma(1,o))),a.sub(Ba(.5,o)).div(Ma(1,o)),Ma(1,Ma(1,a).mul(Ma(1,a)).div(Ba(2,o).mul(Ma(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return nu(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Gp extends vl{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 zp=(e=0)=>new Gp(e),$p=on(([e,t])=>$o(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Wp=on(([e,t])=>$o(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Hp=on(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),qp=on(([e,t])=>iu(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Ho(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),jp=on(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return Rn(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"}]}),Xp=on(([e])=>Rn(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),Kp=on(([e])=>(dn(e.a.equal(0),()=>Rn(0)),Rn(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class Yp 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(Ds(t.slice(0,-4)),r.getCacheKey());return this.type+Us(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Bu(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=Bu(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=Rn(s,In.a).max(0);n=this.setupOutput(e,i),sa.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&&sa.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=Rn(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 Ip(Ip.ALPHA_TO_COVERAGE):e.stack.addToStack(new Ip)}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 Ip(Ip.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?Lp(Dd.z,Jl,ed):Cp(Dd.z,Jl,ed))}null!==s&&Fp.assign(s).toStack()}setupPositionView(){return Rd.mul(Bd).xyz}setupModelViewProjection(){return td.mul(Dd)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.position=e.removeStack(),Vh}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&pp(t).toStack(),!0===t.isSkinnedMesh&&np(t).toStack(),this.displacementMap){const e=bc("displacementMap","texture"),t=bc("displacementScale","float"),r=bc("displacementBias","float");Bd.addAssign(zd.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&rp(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&ep(t).toStack(),null!==this.positionNode&&Bd.assign(Bu(this.positionNode,"POSITION","vec3")),Bd}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&fn(this.maskNode).not().discard();let s=this.colorNode?Rn(this.colorNode):rh;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul(zp())),t.instanceColor){s=Un("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=Un("vec3","vBatchColor").mul(s)}In.assign(s);const i=this.opacityNode?pn(this.opacityNode):nh;In.a.assign(In.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?pn(this.alphaTestNode):th,!0===this.alphaToCoverage?(In.a=uu(n,n.add(Vo(In.a)),In.a),In.a.lessThanEqual(0).discard()):In.a.lessThanEqual(n).discard()),!0===this.alphaHash&&In.a.lessThan(kp(Bd)).discard(),e.isOpaque()&&In.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?_n(0):In.rgb}setupNormal(){return this.normalNode?_n(this.normalNode):ph}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?bc("envMap","cubeTexture"):bc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new bp(Uh)),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=Ih),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new mp(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=yp(n,t,r,s)}else null!==r&&(a=_n(null!==s?iu(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(Vn.assign(_n(i||ih)),a=a.add(Vn)),a}setupFog(e,t){const r=e.fogNode;return r&&(sa.assign(t),t=Rn(r.toVar())),t}setupPremultipliedAlpha(e,t){return Xp(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 Qp=new Z;class Zp extends Yp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(Qp),this.setValues(e)}}const Jp=new J;class eg extends Yp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(Jp),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?pn(this.offsetNode):Ph,t=this.dashScaleNode?pn(this.dashScaleNode):Ch,r=this.dashSizeNode?pn(this.dashSizeNode):Mh,s=this.gapSizeNode?pn(this.gapSizeNode):Bh;ia.assign(r),na.assign(s);const i=Pu(Nl("lineDistance").mul(t));(e?i.add(e):i).mod(ia.add(na)).greaterThan(ia).discard()}}const tg=new J;class rg extends Yp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(tg),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=on(({start:e,end:t})=>{const r=td.element(2).element(2),s=td.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return Rn(iu(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=on(()=>{const e=Nl("instanceStart"),t=Nl("instanceEnd"),r=Rn(Rd.mul(Rn(e,1))).toVar("start"),s=Rn(Rd.mul(Rn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?pn(this.dashScaleNode):Ch,t=this.offsetNode?pn(this.offsetNode):Ph,r=Nl("instanceDistanceStart"),s=Nl("instanceDistanceEnd");let i=Md.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Un("float","lineDistance").assign(i)}n&&(Un("vec3","worldStart").assign(r.xyz),Un("vec3","worldEnd").assign(s.xyz));const o=jl.z.div(jl.w),u=td.element(2).element(3).equal(-1);dn(u,()=>{dn(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=td.mul(r),d=td.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=Rn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=iu(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Un("vec4","worldPos");o.assign(Md.y.lessThan(.5).select(r,s));const u=Lh.mul(.5);o.addAssign(Rn(Md.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(Rn(Md.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(Rn(a.mul(u),0)),dn(Md.y.greaterThan(1).or(Md.y.lessThan(0)),()=>{o.subAssign(Rn(a.mul(2).mul(u),0))})),g.assign(td.mul(o));const l=_n().toVar();l.assign(Md.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=yn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Md.x.lessThan(0).select(e.negate(),e)),dn(Md.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(Md.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Lh)),e.assign(e.div(jl.w.div($l))),g.assign(Md.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(Rn(e,0,0)))}return g})();const o=on(({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 yn(h,p)});if(this.colorNode=on(()=>{const e=Sl();if(i){const t=this.dashSizeNode?pn(this.dashSizeNode):Mh,r=this.gapSizeNode?pn(this.gapSizeNode):Bh;ia.assign(t),na.assign(r);const s=Un("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(ia.add(na)).greaterThan(ia).discard()}const a=pn(1).toVar("alpha");if(n){const e=Un("vec3","worldStart"),s=Un("vec3","worldEnd"),n=Un("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:_n(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Lh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(uu(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=pn(s.fwidth()).toVar("dlen");dn(e.y.abs().greaterThan(1),()=>{a.assign(uu(i.oneMinus(),i.add(1),s).oneMinus())})}else dn(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=Nl("instanceColorStart"),t=Nl("instanceColorEnd");u=Md.y.lessThan(.5).select(e,t).mul(rh)}else u=rh;return Rn(u,a)})(),this.transparent){const e=this.opacityNode?pn(this.opacityNode):nh;this.outputNode=Rn(this.colorNode.rgb.mul(e).add(Sp().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 sg=new te;class ig extends Yp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(sg),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?pn(this.opacityNode):nh;In.assign(ku(Rn(Hc(qd),e),re))}}const ng=on(([e=Fd])=>{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 yn(t,r)});class ag 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=ng(Fd),a=new Yp;a.colorNode=Ll(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 og=new WeakMap;class ug extends di{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=hc(null);const t=new P;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Zs.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(og.has(e)){const t=og.get(e);dg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new ag(r.height);s.fromEquirectangularTexture(t,e),dg(s.texture,e.mapping),this._cubeTexture=s.texture,og.set(e,s.texture),e.addEventListener("dispose",lg)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function lg(e){const t=e.target;t.removeEventListener("dispose",lg);const r=og.get(t);void 0!==r&&(og.delete(t),r.dispose())}function dg(e,t){t===le?e.mapping=F:t===de&&(e.mapping=D)}const cg=tn(ug).setParameterLength(1);class hg extends gp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=cg(this.envNode)}}class pg extends gp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=pn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class gg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class mg extends gg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(Rn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(Rn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(In.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(iu(s.rgb,s.rgb.mul(i.rgb),lh.mul(dh)));break;case he:s.rgb.assign(iu(s.rgb,i.rgb,lh.mul(dh)));break;case ce:s.rgb.addAssign(i.rgb.mul(lh.mul(dh)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const fg=new ge;class yg extends Yp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(fg),this.setValues(e)}setupNormal(){return kd(Wd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new hg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new pg(Uh)),t}setupOutgoingLight(){return In.rgb}setupLightingModel(){return new mg}}const bg=on(({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))}),xg=on(e=>e.diffuseColor.mul(1/Math.PI)),Tg=on(({dotNH:e})=>ra.mul(pn(.5)).add(1).mul(pn(1/Math.PI)).mul(e.pow(ra))),_g=on(({lightDirection:e})=>{const t=e.add(Ud).normalize(),r=qd.dot(t).clamp(),s=Ud.dot(t).clamp(),i=bg({f0:Jn,f90:1,dotVH:s}),n=pn(.25),a=Tg({dotNH:r});return i.mul(n).mul(a)});class vg extends mg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=qd.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(xg({diffuseColor:In.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(_g({lightDirection:e})).mul(lh))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(xg({diffuseColor:In}))),s.indirectDiffuse.mulAssign(t)}}const Ng=new me;class Sg extends Yp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Ng),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new hg(t):null}setupLightingModel(){return new vg(!1)}}const Rg=new fe;class Ag extends Yp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Rg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new hg(t):null}setupLightingModel(){return new vg}setupVariants(){const e=(this.shininessNode?pn(this.shininessNode):sh).max(1e-4);ra.assign(e);const t=this.specularNode||ah;Jn.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Eg=on(e=>{if(!1===e.geometry.hasAttribute("normal"))return pn(0);const t=Wd.dFdx().abs().max(Wd.dFdy().abs());return t.x.max(t.y).max(t.z)}),wg=on(e=>{const{roughness:t}=e,r=Eg();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),Cg=on(({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 La(.5,i.add(n).max(ro))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Mg=on(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(_n(e.mul(r),t.mul(s),a).length()),l=a.mul(_n(e.mul(i),t.mul(n),o).length());return La(.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"}]}),Bg=on(({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"}]}),Lg=pn(1/Math.PI),Pg=on(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=_n(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Lg.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"}]}),Fg=on(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=qd,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Ud).normalize(),d=n.dot(e).clamp(),c=n.dot(Ud).clamp(),h=n.dot(l).clamp(),p=Ud.dot(l).clamp();let g,m,f=bg({f0:t,f90:r,dotVH:p});if(Xi(a)&&(f=qn.mix(f,i)),Xi(o)){const t=Qn.dot(e),r=Qn.dot(Ud),s=Qn.dot(l),i=Zn.dot(e),n=Zn.dot(Ud),a=Zn.dot(l);g=Mg({alphaT:Kn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Pg({alphaT:Kn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=Cg({alpha:u,dotNL:d,dotNV:c}),m=Bg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),Dg=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 Ug=null;const Ig=on(({roughness:e,dotNV:t})=>{null===Ug&&(Ug=new ye(Dg,16,16,G,be),Ug.name="DFG_LUT",Ug.minFilter=oe,Ug.magFilter=oe,Ug.wrapS=xe,Ug.wrapT=xe,Ug.generateMipmaps=!1,Ug.needsUpdate=!0);const r=yn(e,t);return Ll(Ug,r).rg}),Og=on(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Fg({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=qd.dot(e).clamp(),l=qd.dot(Ud).clamp(),d=Ig({roughness:s,dotNV:l}),c=Ig({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=pn(1).sub(g),y=pn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(pn(1).sub(f.mul(y).mul(b).mul(b)).add(ro)),T=f.mul(y),_=x.mul(T);return o.add(_)}),Vg=on(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Ig({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),kg=on(({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(_n(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"}]}),Gg=on(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=pn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return pn(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"}]}),zg=on(({dotNV:e,dotNL:t})=>pn(1).div(pn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),$g=on(({lightDirection:e})=>{const t=e.add(Ud).normalize(),r=qd.dot(e).clamp(),s=qd.dot(Ud).clamp(),i=qd.dot(t).clamp(),n=Gg({roughness:Hn,dotNH:i}),a=zg({dotNV:s,dotNL:r});return Wn.mul(n).mul(a)}),Wg=on(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=yn(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"}]}),Hg=on(({f:e})=>{const t=e.length();return Wo(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),qg=on(({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,Wo(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"}]}),jg=on(({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=_n().toVar();return dn(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(Mn(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=_n(0).toVar();f.addAssign(qg({v1:h,v2:p})),f.addAssign(qg({v1:p,v2:g})),f.addAssign(qg({v1:g,v2:m})),f.addAssign(qg({v1:m,v2:h})),c.assign(_n(Hg({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"}]}),Xg=on(({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=_n().toVar();return dn(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=_n(0).toVar();d.addAssign(qg({v1:n,v2:a})),d.addAssign(qg({v1:a,v2:o})),d.addAssign(qg({v1:o,v2:l})),d.addAssign(qg({v1:l,v2:n})),u.assign(_n(Hg({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"}]}),Kg=1/6,Yg=e=>Ba(Kg,Ba(e,Ba(e,e.negate().add(3)).sub(3)).add(1)),Qg=e=>Ba(Kg,Ba(e,Ba(e,Ba(3,e).sub(6))).add(4)),Zg=e=>Ba(Kg,Ba(e,Ba(e,Ba(-3,e).add(3)).add(3)).add(1)),Jg=e=>Ba(Kg,Qo(e,3)),em=e=>Yg(e).add(Qg(e)),tm=e=>Zg(e).add(Jg(e)),rm=e=>Ca(-1,Qg(e).div(Yg(e).add(Qg(e)))),sm=e=>Ca(1,Jg(e).div(Zg(e).add(Jg(e)))),im=(e,t,r)=>{const s=e.uvNode,i=Ba(s,t.zw).add(.5),n=xo(i),a=vo(i),o=em(a.x),u=tm(a.x),l=rm(a.x),d=sm(a.x),c=rm(a.y),h=sm(a.y),p=yn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=yn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=yn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=yn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=em(a.y).mul(Ca(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=tm(a.y).mul(Ca(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},nm=on(([e,t])=>{const r=yn(e.size(gn(t))),s=yn(e.size(gn(t.add(1)))),i=La(1,r),n=La(1,s),a=im(e,Rn(i,r),xo(t)),o=im(e,Rn(n,s),To(t));return vo(t).mix(a,o)}),am=on(([e,t])=>{const r=t.mul(wl(e));return nm(e,r)}),om=on(([e,t,r,s,i])=>{const n=_n(ou(t.negate(),_o(e),La(1,s))),a=_n(Bo(i[0].xyz),Bo(i[1].xyz),Bo(i[2].xyz));return _o(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"}]}),um=on(([e,t])=>e.mul(nu(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),lm=vp(),dm=Sp(),cm=on(([e,t,r],{material:s})=>{const i=(s.side===M?lm:dm).sample(e),n=fo(Hl.x).mul(um(t,r));return nm(i,n)}),hm=on(([e,t,r])=>(dn(r.notEqual(0),()=>{const s=mo(t).negate().div(r);return po(s.negate().mul(e))}),_n(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),pm=on(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=Rn().toVar(),f=_n().toVar();const i=d.sub(1).mul(g.mul(.025)),n=_n(d.sub(i),d,d.add(i));op({start:0,end:3},({i:i})=>{const d=n.element(i),g=om(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(Rn(y,1))),x=yn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(yn(x.x,x.y.oneMinus()));const T=cm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(hm(Bo(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=om(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(Rn(n,1))),y=yn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(yn(y.x,y.y.oneMinus())),m=cm(y,r,d),f=s.mul(hm(Bo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=_n(Vg({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return Rn(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),gm=Mn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),mm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),fm=on(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=iu(e,t,uu(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();dn(a.lessThan(0),()=>_n(1));const o=a.sqrt(),u=mm(n,e),l=bg({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=pn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return _n(1).add(t).div(_n(1).sub(t))})(i.clamp(0,.9999)),g=mm(p,n.toVec3()),m=bg({f0:g,f90:1,dotVH:o}),f=_n(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=_n(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(_n(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return op({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=_n(54856e-17,44201e-17,52481e-17),i=_n(1681e3,1795300,2208400),n=_n(43278e5,93046e5,66121e5),a=pn(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=_n(o.x.add(a),o.y,o.z).div(1.0685e-7),gm.mul(o)})(pn(e).mul(y),pn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(_n(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"}]}),ym=on(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=pn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=pn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),bm=_n(.04),xm=pn(1);class Tm extends gg{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=_n().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=_n().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=_n().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=_n().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=_n().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=qd.dot(Ud).clamp(),t=fm({outsideIOR:pn(1),eta2:jn,cosTheta1:e,thinFilmThickness:Xn,baseF0:Jn}),r=fm({outsideIOR:pn(1),eta2:jn,cosTheta1:e,thinFilmThickness:Xn,baseF0:In.rgb});this.iridescenceFresnel=iu(t,r,Gn),this.iridescenceF0Dielectric=kg({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=kg({f:r,f90:1,dotVH:e}),this.iridescenceF0=iu(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,Gn)}if(!0===this.transmission){const t=Pd,r=ad.sub(Pd).normalize(),s=jd,i=e.context;i.backdrop=pm(s,r,kn,On,ea,ta,t,bd,sd,td,oa,la,ca,da,this.dispersion?ha:null),i.backdropAlpha=ua,In.a.mulAssign(iu(1,i.backdrop.a,ua))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=qd.dot(Ud).clamp(),a=Ig({roughness:kn,dotNV:n}),o=i?qn.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=qd.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul($g({lightDirection:e})));const t=ym({normal:qd,viewDir:Ud,roughness:Hn}),r=ym({normal:qd,viewDir:e,roughness:Hn}),i=Wn.r.max(Wn.g).max(Wn.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=Xd.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Fg({lightDirection:e,f0:bm,f90:xm,roughness:$n,normalView:Xd})))}r.directDiffuse.addAssign(s.mul(xg({diffuseColor:On}))),r.directSpecular.addAssign(s.mul(Og({lightDirection:e,f0:ea,f90:1,roughness:kn,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=qd,h=Ud,p=Dd.toVar(),g=Wg({N:c,V:h,roughness:kn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Mn(_n(m.x,0,m.y),_n(0,1,0),_n(m.z,0,m.w)).toVar(),b=ea.mul(f.x).add(ea.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(jg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(On).mul(jg({N:c,V:h,P:p,mInv:Mn(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(xg({diffuseColor:On})).toVar();if(!0===this.sheen){const e=ym({normal:qd,viewDir:Ud,roughness:Hn}),t=Wn.r.max(Wn.g).max(Wn.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(Wn,ym({normal:qd,viewDir:Ud,roughness:Hn}))),!0===this.clearcoat){const e=Xd.dot(Ud).clamp(),t=Vg({dotNV:e,specularColor:bm,specularF90:xm,roughness:$n});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=_n().toVar("singleScatteringDielectric"),n=_n().toVar("multiScatteringDielectric"),a=_n().toVar("singleScatteringMetallic"),o=_n().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ta,Jn,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ta,In.rgb,this.iridescenceF0Metallic);const u=iu(i,a,Gn),l=iu(n,o,Gn),d=i.add(n),c=On.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=ym({normal:qd,viewDir:Ud,roughness:Hn}),t=Wn.r.max(Wn.g).max(Wn.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=qd.dot(Ud).clamp().add(t),i=kn.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=Xd.dot(Ud).clamp(),r=bg({dotVH:e,f0:bm,f90:xm}),s=t.mul(zn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(zn));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const _m=pn(1),vm=pn(-2),Nm=pn(.8),Sm=pn(-1),Rm=pn(.4),Am=pn(2),Em=pn(.305),wm=pn(3),Cm=pn(.21),Mm=pn(4),Bm=pn(4),Lm=pn(16),Pm=on(([e])=>{const t=_n(Co(e)).toVar(),r=pn(-1).toVar();return dn(t.x.greaterThan(t.z),()=>{dn(t.x.greaterThan(t.y),()=>{r.assign(yu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(yu(e.y.greaterThan(0),1,4))})}).Else(()=>{dn(t.z.greaterThan(t.y),()=>{r.assign(yu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(yu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Fm=on(([e,t])=>{const r=yn().toVar();return dn(t.equal(0),()=>{r.assign(yn(e.z,e.y).div(Co(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(yn(e.x.negate(),e.z.negate()).div(Co(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(yn(e.x.negate(),e.y).div(Co(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(yn(e.z.negate(),e.y).div(Co(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(yn(e.x.negate(),e.z).div(Co(e.y)))}).Else(()=>{r.assign(yn(e.x,e.y).div(Co(e.z)))}),Ba(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Dm=on(([e])=>{const t=pn(0).toVar();return dn(e.greaterThanEqual(Nm),()=>{t.assign(_m.sub(e).mul(Sm.sub(vm)).div(_m.sub(Nm)).add(vm))}).ElseIf(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))}).Else(()=>{t.assign(pn(-2).mul(fo(Ba(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Um=on(([e,t])=>{const r=e.toVar();r.assign(Ba(2,r).sub(1));const s=_n(r,1).toVar();return dn(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"}]}),Im=on(([e,t,r,s,i,n])=>{const a=pn(r),o=_n(t),u=nu(Dm(a),vm,n),l=vo(u),d=xo(u),c=_n(Om(e,o,d,s,i,n)).toVar();return dn(l.notEqual(0),()=>{const t=_n(Om(e,o,d.add(1),s,i,n)).toVar();c.assign(iu(c,t,l))}),c}),Om=on(([e,t,r,s,i,n])=>{const a=pn(r).toVar(),o=_n(t),u=pn(Pm(o)).toVar(),l=pn(Wo(Bm.sub(a),0)).toVar();a.assign(Wo(a,Bm));const d=pn(go(a)).toVar(),c=yn(Fm(o,u).mul(d.sub(2)).add(1)).toVar();return dn(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(Ba(3,Lm))),c.y.addAssign(Ba(4,go(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(yn(),yn())}),Vm=on(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=So(s),l=r.mul(u).add(i.cross(r).mul(No(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Om(e,l,t,n,a,o)}),km=on(({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=_n(yu(t,r,Yo(r,s))).toVar();dn(h.equal(_n(0)),()=>{h.assign(_n(s.z,0,s.x.negate()))}),h.assign(_o(h));const p=_n().toVar();return p.addAssign(i.element(0).mul(Vm({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),op({start:gn(1),end:e},({i:e})=>{dn(e.greaterThanEqual(n),()=>{up()});const t=pn(a.mul(pn(e))).toVar();p.addAssign(i.element(e).mul(Vm({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(Vm({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),Rn(p,1)}),Gm=on(([e])=>{const t=mn(e).toVar();return t.assign(t.shiftLeft(mn(16)).bitOr(t.shiftRight(mn(16)))),t.assign(t.bitAnd(mn(1431655765)).shiftLeft(mn(1)).bitOr(t.bitAnd(mn(2863311530)).shiftRight(mn(1)))),t.assign(t.bitAnd(mn(858993459)).shiftLeft(mn(2)).bitOr(t.bitAnd(mn(3435973836)).shiftRight(mn(2)))),t.assign(t.bitAnd(mn(252645135)).shiftLeft(mn(4)).bitOr(t.bitAnd(mn(4042322160)).shiftRight(mn(4)))),t.assign(t.bitAnd(mn(16711935)).shiftLeft(mn(8)).bitOr(t.bitAnd(mn(4278255360)).shiftRight(mn(8)))),pn(t).mul(2.3283064365386963e-10)}),zm=on(([e,t])=>yn(pn(e).div(pn(t)),Gm(e))),$m=on(([e,t,r])=>{const s=_n(t).toVar(),i=pn(r),n=i.mul(i).toVar(),a=_o(_n(n.mul(s.x),n.mul(s.y),s.z)).toVar(),o=a.x.mul(a.x).add(a.y.mul(a.y)),u=yu(o.greaterThan(0),_n(a.y.negate(),a.x,0).div(yo(o)),_n(1,0,0)).toVar(),l=Yo(a,u).toVar(),d=yo(e.x),c=Ba(2,3.14159265359).mul(e.y),h=d.mul(So(c)).toVar(),p=d.mul(No(c)).toVar(),g=Ba(.5,a.z.add(1));p.assign(g.oneMinus().mul(yo(h.mul(h).oneMinus())).add(g.mul(p)));const m=u.mul(h).add(l.mul(p)).add(a.mul(yo(Wo(0,h.mul(h).add(p.mul(p)).oneMinus()))));return _o(_n(n.mul(m.x),n.mul(m.y),Wo(0,m.z)))}),Wm=on(({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=_n(s).toVar(),l=_n(0).toVar(),d=pn(0).toVar();return dn(e.lessThan(.001),()=>{l.assign(Om(r,u,t,n,a,o))}).Else(()=>{const s=yu(Co(u.z).lessThan(.999),_n(0,0,1),_n(1,0,0)),c=_o(Yo(s,u)).toVar(),h=Yo(u,c).toVar();op({start:mn(0),end:i},({i:s})=>{const p=zm(s,i),g=$m(p,_n(0,0,1),e),m=_o(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=_o(m.mul(Ko(u,m).mul(2)).sub(u)),y=Wo(Ko(u,f),0);dn(y.greaterThan(0),()=>{const e=Om(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),dn(d.greaterThan(0),()=>{l.assign(l.div(d))})}),Rn(l,1)}),Hm=[.125,.215,.35,.446,.526,.582],qm=20,jm=new _e(-1,1,1,-1,0,1),Xm=new ve(90,1),Km=new e;let Ym=null,Qm=0,Zm=0;const Jm=new r,ef=new WeakMap,tf=[3,1,5,0,4,2],rf=Um(Sl(),Nl("faceIndex")).normalize(),sf=_n(rf.x,rf.y,rf.z);class nf{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=Jm,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}Ym=this._renderer.getRenderTarget(),Qm=this._renderer.getActiveCubeFace(),Zm=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=lf(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=df(),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===F||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=Hm[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=tf[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=Ol(new Array(qm).fill(0)),n=Ta(new r(0,1,0)),a=Ta(0),o=pn(qm),u=Ta(0),l=Ta(1),d=Ll(),c=Ta(0),h=pn(1/t),p=pn(1/s),g=pn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:sf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=uf("blur");return f.fragmentNode=km({...m,latitudinal:u.equal(1)}),ef.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Ll(),i=Ta(0),n=Ta(0),a=pn(1/t),o=pn(1/r),u=pn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=uf("ggx");return d.fragmentNode=Wm({...l,N_immutable:sf,GGX_SAMPLES:mn(512)}),ef.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ne(new Te,e);await this._renderer.compile(t,jm)}_sceneToCubeUV(e,t,r,s,i){const n=Xm;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(Km),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(Km),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;of(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===F||e.mapping===D;s?null===this._cubemapMaterial&&(this._cubemapMaterial=lf(e)):null===this._equirectMaterial&&(this._equirectMaterial=df(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;of(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,jm)}_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,of(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,jm),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,of(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,jm)}_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=ef.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):qm;f>qm&&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,jm)}}function af(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 of(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function uf(e){const t=new Yp;return t.depthTest=!1,t.depthWrite=!1,t.blending=ee,t.name=`PMREM_${e}`,t}function lf(e){const t=uf("cubemap");return t.fragmentNode=hc(e,sf),t}function df(e){const t=uf("equirect");return t.fragmentNode=Ll(e,ng(sf),0),t}const cf=new WeakMap;function hf(e,t,r){const s=function(e){let t=cf.get(e);void 0===t&&(t=new WeakMap,cf.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 pf extends di{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=Ll(s),this._width=Ta(0),this._height=Ta(0),this._maxMip=Ta(0),this.updateBeforeType=Zs.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:hf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new nf(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=ic.mul(_n(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Im(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const gf=tn(pf).setParameterLength(1,3),mf=new WeakMap;class ff extends gp{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=mf.get(e);void 0===s&&(s=gf(e),mf.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Wc:qd,i=r.context(yf(kn,s)).mul(sc),n=r.context(bf(jd)).mul(Math.PI).mul(sc),a=nl(i),o=nl(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(yf($n,Xd)).mul(sc),t=nl(e);u.addAssign(t)}}}const yf=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Ud.negate().reflect(t),r=eu(e).mix(r,t).normalize(),r=r.transformDirection(sd)),r),getTextureLevel:()=>e}},bf=e=>({getUV:()=>e,getTextureLevel:()=>pn(1)}),xf=new we;class Tf extends Yp{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(xf),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new ff(t):null}setupLightingModel(){return new Tm}setupSpecular(){const e=iu(_n(.04),In.rgb,Gn);Jn.assign(_n(.04)),ea.assign(e),ta.assign(1)}setupVariants(){const e=this.metalnessNode?pn(this.metalnessNode):hh;Gn.assign(e);let t=this.roughnessNode?pn(this.roughnessNode):ch;t=wg({roughness:t}),kn.assign(t),this.setupSpecular(),On.assign(In.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const _f=new Ce;class vf extends Tf{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(_f),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?pn(this.iorNode):Ah;oa.assign(e),Jn.assign($o(Zo(oa.sub(1).div(oa.add(1))).mul(uh),_n(1)).mul(oh)),ea.assign(iu(Jn,In.rgb,Gn)),ta.assign(iu(oh,1,Gn))}setupLightingModel(){return new Tm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?pn(this.clearcoatNode):gh,t=this.clearcoatRoughnessNode?pn(this.clearcoatRoughnessNode):mh;zn.assign(e),$n.assign(wg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?_n(this.sheenNode):bh,t=this.sheenRoughnessNode?pn(this.sheenRoughnessNode):xh;Wn.assign(e),Hn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?pn(this.iridescenceNode):_h,t=this.iridescenceIORNode?pn(this.iridescenceIORNode):vh,r=this.iridescenceThicknessNode?pn(this.iridescenceThicknessNode):Nh;qn.assign(e),jn.assign(t),Xn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?yn(this.anisotropyNode):Th).toVar();Yn.assign(e.length()),dn(Yn.equal(0),()=>{e.assign(yn(1,0))}).Else(()=>{e.divAssign(yn(Yn)),Yn.assign(Yn.saturate())}),Kn.assign(Yn.pow2().mix(kn.pow2(),1)),Qn.assign(zc[0].mul(e.x).add(zc[1].mul(e.y))),Zn.assign(zc[1].mul(e.x).sub(zc[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?pn(this.transmissionNode):Sh,t=this.thicknessNode?pn(this.thicknessNode):Rh,r=this.attenuationDistanceNode?pn(this.attenuationDistanceNode):Eh,s=this.attenuationColorNode?_n(this.attenuationColorNode):wh;if(ua.assign(e),la.assign(t),da.assign(r),ca.assign(s),this.useDispersion){const e=this.dispersionNode?pn(this.dispersionNode):Dh;ha.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?_n(this.clearcoatNormalNode):fh}setup(e){e.context.setupClearcoatNormal=()=>Bu(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 Nf extends Tm{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(qd.mul(a)).normalize(),h=pn(Ud.dot(c.negate()).saturate().pow(l).mul(d)),p=_n(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Sf extends vf{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=pn(.1),this.thicknessAmbientNode=pn(0),this.thicknessAttenuationNode=pn(.1),this.thicknessPowerNode=pn(2),this.thicknessScaleNode=pn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new Nf(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 Rf=on(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=yn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=bc("gradientMap","texture").context({getUV:()=>i});return _n(e.r)}{const e=i.fwidth().mul(.5);return iu(_n(.7),_n(1),uu(pn(.7).sub(e.x),pn(.7).add(e.x),i.x))}});class Af extends gg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Rf({normal:Gd,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(xg({diffuseColor:In.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(xg({diffuseColor:In}))),s.indirectDiffuse.mulAssign(t)}}const Ef=new Me;class wf extends Yp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Ef),this.setValues(e)}setupLightingModel(){return new Af}}const Cf=on(()=>{const e=_n(Ud.z,0,Ud.x.negate()).normalize(),t=Ud.cross(e);return yn(e.dot(qd),t.dot(qd)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Mf=new Be;class Bf extends Yp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Mf),this.setValues(e)}setupVariants(e){const t=Cf;let r;r=e.material.matcap?bc("matcap","texture").context({getUV:()=>t}):_n(iu(.2,.8,t.y)),In.rgb.mulAssign(r.rgb)}}class Lf extends di{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 Cn(e,s,s.negate(),e).mul(r)}{const e=t,s=Bn(Rn(1,0,0,0),Rn(0,So(e.x),No(e.x).negate(),0),Rn(0,No(e.x),So(e.x),0),Rn(0,0,0,1)),i=Bn(Rn(So(e.y),0,No(e.y),0),Rn(0,1,0,0),Rn(No(e.y).negate(),0,So(e.y),0),Rn(0,0,0,1)),n=Bn(Rn(So(e.z),No(e.z).negate(),0,0),Rn(No(e.z),So(e.z),0,0),Rn(0,0,1,0),Rn(0,0,0,1));return s.mul(i).mul(n).mul(Rn(r,1)).xyz}}}const Pf=tn(Lf).setParameterLength(2),Ff=new Le;class Df extends Yp{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(Ff),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=Rd.mul(_n(s||0));let u=yn(bd[0].xyz.length(),bd[1].xyz.length());null!==n&&(u=u.mul(yn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=Md.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new zu(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=pn(i||yh),c=Pf(l,d);return Rn(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 Uf=new Pe,If=new t;class Of extends Df{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Uf),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Rd.mul(_n(e||Bd)).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?yn(n):Fh;u=u.mul($l),r.isPerspectiveCamera&&!0===a&&(u=u.mul(Vf.div(Dd.z.negate()))),i&&i.isNode&&(u=u.mul(yn(i)));let l=Md.xy;if(s&&s.isNode){const e=pn(s);l=Pf(l,e)}return l=l.mul(u),l=l.div(Xl.div(2)),l=l.mul(o.w),o=o.add(Rn(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 Vf=Ta(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(If);this.value=.5*t.y});class kf extends gg{constructor(){super(),this.shadowNode=pn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){In.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(In.rgb)}}const Gf=new Fe;class zf extends Yp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(Gf),this.setValues(e)}setupLightingModel(){return new kf}}const $f=Dn("vec3"),Wf=Dn("vec3"),Hf=Dn("vec3");class qf extends gg{constructor(){super()}start(e){const{material:t}=e,r=Dn("vec3"),s=Dn("vec3");dn(ad.sub(Pd).length().greaterThan(vd.mul(2)),()=>{r.assign(ad),s.assign(Pd)}).Else(()=>{r.assign(Pd),s.assign(ad)});const i=s.sub(r),n=Ta("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=pn(0).toVar(),l=_n(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),op(n,()=>{const s=r.add(o.mul(u)),i=sd.mul(Rn(s,1)).xyz;let n;null!==t.depthNode&&(Wf.assign(Dp(Mp(i.z,Jl,ed))),e.context.sceneDepthNode=Dp(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,$f.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&$f.mulAssign(n);const d=$f.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),Hf.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?dn(r.greaterThanEqual(Wf),()=>{$f.addAssign(e)}):$f.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(Xg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(Hf)}}class jf extends Yp{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 qf}}class Xf{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 Kf{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+",",Ds(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=Is(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Is(e,1)),e=Is(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 Zf=[];class Jf{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);Zf[0]=e,Zf[1]=t,Zf[2]=n,Zf[3]=i;let l=u.get(Zf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Zf,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)),Zf[0]=null,Zf[1]=null,Zf[2]=null,Zf[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Kf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Qf(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 ey{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 ty=1,ry=2,sy=3,iy=4,ny=16;class ay extends ey{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===ty?this.backend.createAttribute(e):t===ry?this.backend.createIndexAttribute(e):t===sy?this.backend.createStorageAttribute(e):t===iy&&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,sy):this.updateAttribute(e,ty);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,ry);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,iy)}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=uy(t),e.set(t,r)):r.version!==oy(t)&&(this.attributes.delete(r),r=uy(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 dy{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 cy{constructor(e){this.cacheKey=e,this.usedTimes=0}}class hy extends cy{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class py extends cy{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let gy=0;class my{constructor(e,t,r,s=null,i=null){this.id=gy++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class fy extends ey{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 my(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 my(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 my(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 py(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 hy(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 yy extends ey{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?iy:sy;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?iy:sy;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 by(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 xy(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 Ty(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===B&&!1===e.forceSinglePass}class _y{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?(Ty(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?(Ty(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||by),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||xy),this.transparent.length>1&&this.transparent.sort(t||xy)}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=wy){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),un(r),e.removeActiveStack(this),o}}const Py=tn(Ly).setParameterLength(0,1);class Fy extends oi{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=$s(i),a=Ws(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 Dy extends oi{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)}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 Uy extends oi{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 Wy(e,"uint","float"),jy={};class Xy extends to{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(Hy(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return mn;case"int":return gn;case"uvec2":return xn;case"uvec3":return Nn;case"uvec4":return En;case"ivec2":return bn;case"ivec3":return vn;case"ivec4":return An}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return on(([e])=>{const s=mn(0);this._resolveElementType(e,s,t);const i=pn(s.bitAnd(Lo(s))),n=qy(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 on(([e])=>{dn(e.equal(mn(0)),()=>mn(32));const s=mn(0),i=mn(0);return this._resolveElementType(e,s,t),dn(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),dn(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),dn(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),dn(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),dn(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 on(([e])=>{const s=mn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(mn(1)).bitAnd(mn(1431655765)))),s.assign(s.bitAnd(mn(858993459)).add(s.shiftRight(mn(2)).bitAnd(mn(858993459))));const i=s.add(s.shiftRight(mn(4))).bitAnd(mn(252645135)).mul(mn(16843009)).shiftRight(mn(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 on(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}Xy.COUNT_TRAILING_ZEROS="countTrailingZeros",Xy.COUNT_LEADING_ZEROS="countLeadingZeros",Xy.COUNT_ONE_BITS="countOneBits";const Ky=sn(Xy,Xy.COUNT_TRAILING_ZEROS).setParameterLength(1),Yy=sn(Xy,Xy.COUNT_LEADING_ZEROS).setParameterLength(1),Qy=sn(Xy,Xy.COUNT_ONE_BITS).setParameterLength(1),Zy=on(([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)}),Jy=(e,t)=>Qo(Ba(4,e.mul(Ma(1,e))),t);class eb extends di{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 tb=sn(eb,"snorm").setParameterLength(1),rb=sn(eb,"unorm").setParameterLength(1),sb=sn(eb,"float16").setParameterLength(1);class ib extends di{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 nb=sn(ib,"snorm").setParameterLength(1),ab=sn(ib,"unorm").setParameterLength(1),ob=sn(ib,"float16").setParameterLength(1),ub=on(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),lb=on(([e])=>_n(ub(e.z.add(ub(e.y.mul(1)))),ub(e.z.add(ub(e.x.mul(1)))),ub(e.y.add(ub(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),db=on(([e,t,r])=>{const s=_n(e).toVar(),i=pn(1.4).toVar(),n=pn(0).toVar(),a=_n(s).toVar();return op({start:pn(0),end:pn(3),type:"float",condition:"<="},()=>{const e=_n(lb(a.mul(2))).toVar();s.addAssign(e.add(r.mul(pn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=pn(ub(s.z.add(ub(s.x.add(ub(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 cb extends oi{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 hb=tn(cb),pb=e=>(...t)=>hb(e,...t),gb=Ta(0).setGroup(ya).onRenderUpdate(e=>e.time),mb=Ta(0).setGroup(ya).onRenderUpdate(e=>e.deltaTime),fb=Ta(0,"uint").setGroup(ya).onRenderUpdate(e=>e.frameId);const yb=on(([e,t,r=yn(.5)])=>Pf(e.sub(r),t).add(r)),bb=on(([e,t,r=yn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),xb=on(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=bd.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=bd;const i=sd.mul(s);return Xi(t)&&(i[0][0]=bd[0].length(),i[0][1]=0,i[0][2]=0),Xi(r)&&(i[1][0]=0,i[1][1]=bd[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,td.mul(i).mul(Bd)}),Tb=on(([e=null])=>{const t=Dp();return Dp(Ep(e)).sub(t).lessThan(0).select(Wl,e)}),_b=on(([e,t=Sl(),r=pn(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=yn(a,o);return t.add(l).mul(u)}),vb=on(([e,t=null,r=null,s=pn(1),i=Bd,n=zd])=>{let a=n.abs().normalize();a=a.div(a.dot(_n(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=Ll(d,o).mul(a.x),g=Ll(c,u).mul(a.y),m=Ll(h,l).mul(a.z);return Ca(p,g,m)}),Nb=new je,Sb=new r,Rb=new r,Ab=new r,Eb=new a,wb=new r(0,0,-1),Cb=new s,Mb=new r,Bb=new r,Lb=new s,Pb=new t,Fb=new Ne,Db=Wl.flipX();Fb.depthTexture=new Y(1,1);let Ub=!1;class Ib extends Ml{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Fb.texture,Db),this._reflectorBaseNode=e.reflector||new Ob(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=Qi(new Ib({defaultTexture:Fb.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 Ob extends oi{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?Zs.RENDER:Zs.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(Fb,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&&Ub)return!1;Ub=!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),Rb.setFromMatrixPosition(n.matrixWorld),Ab.setFromMatrixPosition(r.matrixWorld),Eb.extractRotation(n.matrixWorld),Sb.set(0,0,1),Sb.applyMatrix4(Eb),Mb.subVectors(Rb,Ab);let u=!1;if(!0===Mb.dot(Sb)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Ub=!1);u=!0}Mb.reflect(Sb).negate(),Mb.add(Rb),Eb.extractRotation(r.matrixWorld),wb.set(0,0,-1),wb.applyMatrix4(Eb),wb.add(Ab),Bb.subVectors(Rb,wb),Bb.reflect(Sb).negate(),Bb.add(Rb),a.coordinateSystem=r.coordinateSystem,a.position.copy(Mb),a.up.set(0,1,0),a.up.applyMatrix4(Eb),a.up.reflect(Sb),a.lookAt(Bb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Nb.setFromNormalAndCoplanarPoint(Sb,Rb),Nb.applyMatrix4(a.matrixWorldInverse),Cb.set(Nb.normal.x,Nb.normal.y,Nb.normal.z,Nb.constant);const l=a.projectionMatrix;Lb.x=(Math.sign(Cb.x)+l.elements[8])/l.elements[0],Lb.y=(Math.sign(Cb.y)+l.elements[9])/l.elements[5],Lb.z=-1,Lb.w=(1+l.elements[10])/l.elements[14],Cb.multiplyScalar(1/Cb.dot(Lb));l.elements[2]=Cb.x,l.elements[6]=Cb.y,l.elements[10]=s.coordinateSystem===h?Cb.z-0:Cb.z+1-0,l.elements[14]=Cb.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,Ub=!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 Vb=new _e(-1,1,1,-1,0,1);class kb 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 Gb=new kb;class zb extends ne{constructor(e=null){super(Gb,e),this.camera=Vb,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,Vb)}render(e){e.render(this,Vb)}}const $b=new t;class Wb extends Ml{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new Ne(t,r,s);super(i.texture,Sl()),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 zb(new Yp),this.updateBeforeType=Zs.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($b),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 Ml(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const Hb=(e,...t)=>Qi(new Wb(Qi(e),...t)),qb=on(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=yn(e.x,e.y.oneMinus()).mul(2).sub(1),i=Rn(_n(e,t),1)):i=Rn(_n(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=Rn(r.mul(i));return n.xyz.div(n.w)}),jb=on(([e,t])=>{const r=t.mul(Rn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return yn(s.x,s.y.oneMinus())}),Xb=on(([e,t,r])=>{const s=Al(Pl(t)),i=bn(e.mul(s)).toVar(),n=Pl(t,i).toVar(),a=Pl(t,i.sub(bn(2,0))).toVar(),o=Pl(t,i.sub(bn(1,0))).toVar(),u=Pl(t,i.add(bn(1,0))).toVar(),l=Pl(t,i.add(bn(2,0))).toVar(),d=Pl(t,i.add(bn(0,2))).toVar(),c=Pl(t,i.add(bn(0,1))).toVar(),h=Pl(t,i.sub(bn(0,1))).toVar(),p=Pl(t,i.sub(bn(0,2))).toVar(),g=Co(Ma(pn(2).mul(o).sub(a),n)).toVar(),m=Co(Ma(pn(2).mul(u).sub(l),n)).toVar(),f=Co(Ma(pn(2).mul(c).sub(d),n)).toVar(),y=Co(Ma(pn(2).mul(h).sub(p),n)).toVar(),b=qb(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(qb(e.sub(yn(pn(1).div(s.x),0)),o,r)),b.negate().add(qb(e.add(yn(pn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(qb(e.add(yn(0,pn(1).div(s.y))),c,r)),b.negate().add(qb(e.sub(yn(0,pn(1).div(s.y))),h,r)));return _o(Yo(x,T))}),Kb=on(([e])=>vo(pn(52.9829189).mul(vo(Ko(e,yn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),Yb=on(([e,t,r])=>{const s=pn(2.399963229728653),i=yo(pn(e).add(.5).div(pn(t))),n=pn(e).mul(s).add(r);return yn(So(n),No(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class Qb extends oi{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Sl())}sample(e){return this.callback(e)}}class Zb extends oi{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===Zb.OBJECT?this.updateType=Zs.OBJECT:e===Zb.MATERIAL?this.updateType=Zs.RENDER:e===Zb.BEFORE_OBJECT?this.updateBeforeType=Zs.OBJECT:e===Zb.BEFORE_MATERIAL&&(this.updateBeforeType=Zs.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}Zb.OBJECT="object",Zb.MATERIAL="material",Zb.BEFORE_OBJECT="beforeObject",Zb.BEFORE_MATERIAL="beforeMaterial";const Jb=(e,t)=>new Zb(e,t).toStack();class ex extends W{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class tx extends Ee{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class rx extends oi{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const sx=rn(rx),ix=new L,nx=new a;class ax extends oi{static get type(){return"SceneNode"}constructor(e=ax.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===ax.BACKGROUND_BLURRINESS?s=mc("backgroundBlurriness","float",r):t===ax.BACKGROUND_INTENSITY?s=mc("backgroundIntensity","float",r):t===ax.BACKGROUND_ROTATION?s=Ta("mat4").setName("backgroundRotation").setGroup(ya).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Qe?(ix.copy(r.backgroundRotation),ix.x*=-1,ix.y*=-1,ix.z*=-1,nx.makeRotationFromEuler(ix)):nx.identity(),nx}):o("SceneNode: Unknown scope:",t),s}}ax.BACKGROUND_BLURRINESS="backgroundBlurriness",ax.BACKGROUND_INTENSITY="backgroundIntensity",ax.BACKGROUND_ROTATION="backgroundRotation";const ox=rn(ax,ax.BACKGROUND_BLURRINESS),ux=rn(ax,ax.BACKGROUND_INTENSITY),lx=rn(ax,ax.BACKGROUND_ROTATION);class dx extends Ml{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=ei.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(ei.READ_WRITE)}toReadOnly(){return this.setAccess(ei.READ_ONLY)}toWriteOnly(){return this.setAccess(ei.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 cx=tn(dx).setParameterLength(1,3),hx=on(({texture:e,uv:t})=>{const r=1e-4,s=_n().toVar();return dn(t.x.lessThan(r),()=>{s.assign(_n(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(_n(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(_n(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(_n(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(_n(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(_n(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(_n(-.01,0,0))).r.sub(e.sample(t.add(_n(r,0,0))).r),n=e.sample(t.add(_n(0,-.01,0))).r.sub(e.sample(t.add(_n(0,r,0))).r),a=e.sample(t.add(_n(0,0,-.01))).r.sub(e.sample(t.add(_n(0,0,r))).r);s.assign(_n(i,n,a))}),s.normalize()});class px extends Ml{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return _n(.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 hx({texture:this,uv:e})}}const gx=tn(px).setParameterLength(1,3);class mx extends gc{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 fx=new WeakMap;class yx extends di{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Zs.OBJECT,this.updateAfterType=Zs.OBJECT,this.previousModelWorldMatrix=Ta(new a),this.previousProjectionMatrix=Ta(new a).setGroup(ya),this.previousCameraViewMatrix=Ta(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=xx(r);this.previousModelWorldMatrix.value.copy(s);const i=bx(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}){xx(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?td:Ta(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Rd).mul(Bd),s=this.previousProjectionMatrix.mul(t).mul(Ld),i=r.xy.div(r.w),n=s.xy.div(s.w);return Ma(i,n)}}function bx(e){let t=fx.get(e);return void 0===t&&(t={},fx.set(e,t)),t}function xx(e,t=0){const r=bx(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const Tx=rn(yx),_x=on(([e])=>Rx(e.rgb)),vx=on(([e,t=pn(1)])=>t.mix(Rx(e.rgb),e.rgb)),Nx=on(([e,t=pn(1)])=>{const r=Ca(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 iu(e.rgb,s,i)}),Sx=on(([e,t=pn(1)])=>{const r=_n(.57735,.57735,.57735),s=t.cos();return _n(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Ko(r,e.rgb).mul(s.oneMinus())))))}),Rx=(e,t=_n(p.getLuminanceCoefficients(new r)))=>Ko(e,t),Ax=on(([e,t=_n(1),s=_n(0),i=_n(1),n=pn(1),a=_n(p.getLuminanceCoefficients(new r,Se))])=>{const o=e.rgb.dot(_n(a)),u=Wo(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return dn(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),dn(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),dn(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),Rn(u.rgb,e.a)});class Ex extends di{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 wx=tn(Ex).setParameterLength(2);let Cx=null;class Mx extends Tp{static get type(){return"ViewportSharedTextureNode"}constructor(e=Wl,t=null){null===Cx&&(Cx=new X),super(e,t,Cx)}getTextureForReference(){return Cx}updateReference(){return this}}const Bx=tn(Mx).setParameterLength(0,2),Lx=new t;class Px extends Ml{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 Fx 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 Dx extends di{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=Ta(0),this._cameraFar=Ta(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Zs.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 Fx(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 Fx(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=Bp(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=Cp(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===Dx.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),Lx.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Lx)),this._pixelRatio=i,this.setSize(Lx.width,Lx.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:xu({...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()}}Dx.COLOR="color",Dx.DEPTH="depth";class Ux extends Dx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Dx.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 Yp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=M;const t=zd.negate(),r=td.mul(Rd),s=pn(1),i=r.mul(Rn(Bd,1)),n=r.mul(Rn(Bd.add(t),1)),a=_o(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=Rn(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 Ix=on(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Ox=on(([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"}]}),Vx=on(([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"}]}),kx=on(([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)}),Gx=on(([e,t])=>{const r=Mn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Mn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=kx(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),zx=Mn(_n(1.6605,-.1246,-.0182),_n(-.5876,1.1329,-.1006),_n(-.0728,-.0083,1.1187)),$x=Mn(_n(.6274,.0691,.0164),_n(.3293,.9195,.088),_n(.0433,.0113,.8956)),Wx=on(([e])=>{const t=_n(e).toVar(),r=_n(t.mul(t)).toVar(),s=_n(r.mul(r)).toVar();return pn(15.5).mul(s.mul(r)).sub(Ba(40.14,s.mul(t))).add(Ba(31.96,s).sub(Ba(6.868,r.mul(t))).add(Ba(.4298,r).add(Ba(.1191,t).sub(.00232))))}),Hx=on(([e,t])=>{const r=_n(e).toVar(),s=Mn(_n(.856627153315983,.137318972929847,.11189821299995),_n(.0951212405381588,.761241990602591,.0767994186031903),_n(.0482516061458583,.101439036467562,.811302368396859)),i=Mn(_n(1.1271005818144368,-.1413297634984383,-.14132976349843826),_n(-.11060664309660323,1.157823702216272,-.11060664309660294),_n(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=pn(-12.47393),a=pn(4.026069);return r.mulAssign(t),r.assign($x.mul(r)),r.assign(s.mul(r)),r.assign(Wo(r,1e-10)),r.assign(fo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(nu(r,0,1)),r.assign(Wx(r)),r.assign(i.mul(r)),r.assign(Qo(Wo(_n(0),r),_n(2.2))),r.assign(zx.mul(r)),r.assign(nu(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),qx=on(([e,t])=>{const r=pn(.76),s=pn(.15);e=e.mul(t);const i=$o(e.r,$o(e.g,e.b)),n=yu(i.lessThan(.08),i.sub(Ba(6.25,i.mul(i))),.04);e.subAssign(n);const a=Wo(e.r,Wo(e.g,e.b));dn(a.lessThan(r),()=>e);const o=Ma(1,r),u=Ma(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=Ma(1,La(1,s.mul(a.sub(u)).add(1)));return iu(e,_n(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class jx extends oi{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 Xx=tn(jx).setParameterLength(1,3);class Kx extends jx{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 Yx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Qx extends oi{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:pn()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Xs(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?Ks(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 Zx=tn(Qx).setParameterLength(1);class Jx 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 eT{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 tT=new Jx;class rT extends oi{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new Jx,this._output=Zx(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]=Zx(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]=Zx(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 eT(this),t=tT.get("THREE"),r=tT.get("TSL"),s=this.getMethod(),i=[e,this._local,tT,()=>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:pn()}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=[Ds(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Us(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 sT=tn(rT).setParameterLength(1,2);function iT(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Dd.z).negate()}const nT=on(([e,t],r)=>{const s=iT(r);return uu(e,t,s)}),aT=on(([e],t)=>{const r=iT(t);return e.mul(e,r,r).negate().exp().oneMinus()}),oT=on(([e,t],r)=>{const s=iT(r),i=t.sub(Pd.y).max(0).toConst().mul(s).toConst();return e.mul(e,i,i).negate().exp().oneMinus()}),uT=on(([e,t])=>Rn(t.toFloat().mix(sa.rgb,e.toVec3()),sa.a));let lT=null,dT=null;class cT extends oi{static get type(){return"RangeNode"}constructor(e=pn(),t=pn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(Hs(t.value)),i=e.getTypeLength(Hs(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(Hs(a)),d=e.getTypeLength(Hs(o));lT=lT||new s,dT=dT||new s,lT.setScalar(0),dT.setScalar(0),1===u?lT.setScalar(a):a.isColor?lT.set(a.r,a.g,a.b,1):lT.set(a.x,a.y,a.z||0,a.w||0),1===d?dT.setScalar(o):o.isColor?dT.set(o.r,o.g,o.b,1):dT.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 pT(e,t),mT=gT("numWorkgroups","uvec3"),fT=gT("workgroupId","uvec3"),yT=gT("globalId","uvec3"),bT=gT("localId","uvec3"),xT=gT("subgroupSize","uint");const TT=tn(class extends oi{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 _T extends ui{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 vT extends oi{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 _T(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 NT extends oi{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=pl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}NT.ATOMIC_LOAD="atomicLoad",NT.ATOMIC_STORE="atomicStore",NT.ATOMIC_ADD="atomicAdd",NT.ATOMIC_SUB="atomicSub",NT.ATOMIC_MAX="atomicMax",NT.ATOMIC_MIN="atomicMin",NT.ATOMIC_AND="atomicAnd",NT.ATOMIC_OR="atomicOr",NT.ATOMIC_XOR="atomicXor";const ST=tn(NT),RT=(e,t,r)=>ST(e,t,r).toStack();class AT extends di{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 ET=sn(AT,AT.SUBGROUP_ELECT).setParameterLength(0),wT=sn(AT,AT.SUBGROUP_BALLOT).setParameterLength(1),CT=sn(AT,AT.SUBGROUP_ADD).setParameterLength(1),MT=sn(AT,AT.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),BT=sn(AT,AT.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),LT=sn(AT,AT.SUBGROUP_MUL).setParameterLength(1),PT=sn(AT,AT.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),FT=sn(AT,AT.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),DT=sn(AT,AT.SUBGROUP_AND).setParameterLength(1),UT=sn(AT,AT.SUBGROUP_OR).setParameterLength(1),IT=sn(AT,AT.SUBGROUP_XOR).setParameterLength(1),OT=sn(AT,AT.SUBGROUP_MIN).setParameterLength(1),VT=sn(AT,AT.SUBGROUP_MAX).setParameterLength(1),kT=sn(AT,AT.SUBGROUP_ALL).setParameterLength(0),GT=sn(AT,AT.SUBGROUP_ANY).setParameterLength(0),zT=sn(AT,AT.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),$T=sn(AT,AT.QUAD_SWAP_X).setParameterLength(1),WT=sn(AT,AT.QUAD_SWAP_Y).setParameterLength(1),HT=sn(AT,AT.QUAD_SWAP_DIAGONAL).setParameterLength(1),qT=sn(AT,AT.SUBGROUP_BROADCAST).setParameterLength(2),jT=sn(AT,AT.SUBGROUP_SHUFFLE).setParameterLength(2),XT=sn(AT,AT.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),KT=sn(AT,AT.SUBGROUP_SHUFFLE_UP).setParameterLength(2),YT=sn(AT,AT.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),QT=sn(AT,AT.QUAD_BROADCAST).setParameterLength(1);let ZT;function JT(e){ZT=ZT||new WeakMap;let t=ZT.get(e);return void 0===t&&ZT.set(e,t={}),t}function e_(e){const t=JT(e);return t.shadowMatrix||(t.shadowMatrix=Ta("mat4").setGroup(ya).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 t_(e,t=Pd){const r=e_(e).mul(t);return r.xyz.div(r.w)}function r_(e){const t=JT(e);return t.position||(t.position=Ta(new r).setGroup(ya).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function s_(e){const t=JT(e);return t.targetPosition||(t.targetPosition=Ta(new r).setGroup(ya).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function i_(e){const t=JT(e);return t.viewPosition||(t.viewPosition=Ta(new r).setGroup(ya).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const n_=e=>sd.transformDirection(r_(e).sub(s_(e))),a_=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},o_=new WeakMap,u_=[];class l_ extends oi{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Dn("vec3","totalDiffuse"),this.totalSpecularNode=Dn("vec3","totalSpecular"),this.outgoingLightNode=Dn("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(Qi(e));else{let s=null;if(null!==r&&(s=a_(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;o_.has(e)?s=o_.get(e):(s=new r(e),o_.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=_n(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 d_ extends oi{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Zs.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){c_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Pd)}}const c_=Dn("vec3","shadowPositionWorld");function h_(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 p_(e,t){return t=h_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function g_(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 m_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function f_(e,t){return t=m_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function y_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function b_(e,t,r){return r=f_(t,r=p_(e,r))}function x_(e,t,r){g_(e,r),y_(t,r)}var T_=Object.freeze({__proto__:null,resetRendererAndSceneState:b_,resetRendererState:p_,resetSceneState:f_,restoreRendererAndSceneState:x_,restoreRendererState:g_,restoreSceneState:y_,saveRendererAndSceneState:function(e,t,r={}){return r=m_(t,r=h_(e,r))},saveRendererState:h_,saveSceneState:m_});const __=new WeakMap,v_=on(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Ll(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),N_=on(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Ll(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=mc("mapSize","vec2",r).setGroup(ya),a=mc("radius","float",r).setGroup(ya),o=yn(1).div(n),u=a.mul(o.x),l=Kb(ql.xy).mul(6.28318530718);return Ca(i(t.xy.add(Yb(0,5,l).mul(u)),t.z),i(t.xy.add(Yb(1,5,l).mul(u)),t.z),i(t.xy.add(Yb(2,5,l).mul(u)),t.z),i(t.xy.add(Yb(3,5,l).mul(u)),t.z),i(t.xy.add(Yb(4,5,l).mul(u)),t.z)).mul(.2)}),S_=on(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Ll(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=mc("mapSize","vec2",r).setGroup(ya),a=yn(1).div(n),o=a.x,u=a.y,l=t.xy,d=vo(l.mul(n).add(.5));return l.subAssign(d.mul(a)),Ca(i(l,t.z),i(l.add(yn(o,0)),t.z),i(l.add(yn(0,u)),t.z),i(l.add(a),t.z),iu(i(l.add(yn(o.negate(),0)),t.z),i(l.add(yn(o.mul(2),0)),t.z),d.x),iu(i(l.add(yn(o.negate(),u)),t.z),i(l.add(yn(o.mul(2),u)),t.z),d.x),iu(i(l.add(yn(0,u.negate())),t.z),i(l.add(yn(0,u.mul(2))),t.z),d.y),iu(i(l.add(yn(o,u.negate())),t.z),i(l.add(yn(o,u.mul(2))),t.z),d.y),iu(iu(i(l.add(yn(o.negate(),u.negate())),t.z),i(l.add(yn(o.mul(2),u.negate())),t.z),d.x),iu(i(l.add(yn(o.negate(),u.mul(2))),t.z),i(l.add(yn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),R_=on(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Ll(e).sample(t.xy);e.isArrayTexture&&(s=s.depth(r)),s=s.rg;const i=s.x,n=Wo(1e-7,s.y.mul(s.y)),a=Ho(t.z,i);dn(a.equal(1),()=>pn(1));const o=t.z.sub(i);let u=n.div(n.add(o.mul(o)));return u=nu(Ma(u,.3).div(.65)),Wo(a,u)}),A_=on(([e,t,r])=>{let s=Pd.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s}),E_=e=>{let t=__.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=mc("near","float",t).setGroup(ya),s=mc("far","float",t).setGroup(ya),i=hd(e);return A_(i,r,s)})(e):null;t=new Yp,t.colorNode=Rn(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,__.set(e,t)}return t},w_=e=>{const t=__.get(e);void 0!==t&&(t.dispose(),__.delete(e))},C_=new Kf,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&&(js(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_=on(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=pn(0).toVar("meanVertical"),a=pn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(pn(1)).select(pn(0),pn(2).div(e.sub(1))),u=e.lessThanEqual(pn(1)).select(pn(0),pn(-1));op({start:gn(0),end:gn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(pn(e).mul(o));let d=s.sample(Ca(ql.xy,yn(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=yo(a.sub(n.mul(n)).max(0));return yn(n,l)}),P_=on(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=pn(0).toVar("meanHorizontal"),a=pn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(pn(1)).select(pn(0),pn(2).div(e.sub(1))),u=e.lessThanEqual(pn(1)).select(pn(0),pn(-1));op({start:gn(0),end:gn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(pn(e).mul(o));let d=s.sample(Ca(ql.xy,yn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(Ca(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=yo(a.sub(n.mul(n)).max(0));return yn(n,l)}),F_=[v_,N_,S_,R_];let D_;const U_=new zb;class I_ extends d_{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,pn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=mc("bias","float",r).setGroup(ya);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=mc("near","float",r.camera).setGroup(ya),s=mc("far","float",r.camera).setGroup(ya);n=Lp(e.negate(),t,s)}return a=_n(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return F_[e]}setupRenderTarget(e,t){const r=new Y(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=E;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,n=t.shadowMap.type,{depthTexture:a,shadowMap:o}=this.setupRenderTarget(i,e);if(i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),n===Ze&&!0!==i.isPointLightShadow){a.compareFunction=null,o.depth>1?(o._vsmShadowMapVertical||(o._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:o.depth,depthBuffer:!1}),o._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=o._vsmShadowMapVertical,o._vsmShadowMapHorizontal||(o._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:o.depth,depthBuffer:!1}),o._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=o._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=Ll(a);a.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Ll(this.vsmShadowMapVertical.texture);a.isArrayTexture&&(r=r.depth(this.depthLayer));const s=mc("blurSamples","float",i).setGroup(ya),n=mc("radius","float",i).setGroup(ya),u=mc("mapSize","vec2",i).setGroup(ya);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Yp);l.fragmentNode=L_({samples:s,radius:n,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Yp),l.fragmentNode=P_({samples:s,radius:n,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const u=mc("intensity","float",i).setGroup(ya),l=mc("normalBias","float",i).setGroup(ya),d=e_(s).mul(c_.add(jd.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=n===Ze&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:a,g=this.setupShadowFilter(e,{filterFn:h,shadowTexture:o.texture,depthTexture:p,shadowCoord:c,shadow:i,depthLayer:this.depthLayer});let m,f;!0===t.shadowMap.transmitted&&(o.texture.isCubeTexture?m=hc(o.texture,c.xyz):(m=Ll(o.texture,c),a.isArrayTexture&&(m=m.depth(this.depthLayer)))),f=m?iu(1,g.rgb.mix(m,1),u.mul(m.a)).toVar():iu(1,g,u).toVar(),this.shadowMap=o,this.shadow.map=o;const y=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return m&&f.toInspector(`${y} / Color`,()=>this.shadowMap.texture.isCubeTexture?hc(this.shadowMap.texture):Ll(this.shadowMap.texture)),f.toInspector(`${y} / Depth`,()=>this.shadowMap.texture.isCubeTexture?hc(this.shadowMap.texture).r.oneMinus():Pl(this.shadowMap.depthTexture,Sl().mul(Al(Ll(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return on(()=>{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_=b_(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,x_(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_=on(({depthTexture:e,bd3D:t,dp:r})=>hc(e,t).compare(r)),X_=on(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=mc("radius","float",s).setGroup(ya),n=mc("mapSize","vec2",s).setGroup(ya),a=i.div(n.x),o=Co(t),u=_o(Yo(t,o.x.greaterThan(o.z).select(_n(0,1,0),_n(1,0,0)))),l=Yo(t,u),d=Kb(ql.xy).mul(6.28318530718),c=Yb(0,5,d),h=Yb(1,5,d),p=Yb(2,5,d),g=Yb(3,5,d),m=Yb(4,5,d);return hc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(hc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(hc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(hc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(hc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),K_=on(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=Ta("float").setGroup(ya).onRenderUpdate(()=>s.camera.near),o=Ta("float").setGroup(ya).onRenderUpdate(()=>s.camera.far),u=mc("bias","float",s).setGroup(ya),l=pn(1).toVar();return dn(n.sub(o).lessThanEqual(0).and(n.sub(a).greaterThanEqual(0)),()=>{const r=n.sub(a).div(o.sub(a)).toVar();r.addAssign(u);const d=i.normalize();l.assign(e({depthTexture:t,bd3D:d,dp:r,shadow:s}))}),l});class Y_ extends I_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Je?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 et(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=E;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 gp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||Ta(this.color).setGroup(ya),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Zs.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 i_(this.light).sub(e.context.positionView||Dd)}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?Qi(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_=on(({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=Ta(0).setGroup(ya),this.decayExponentNode=Ta(2).setGroup(ya)}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=on(([e=Sl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),sv=on(([e=Sl()],{renderer:t,material:r})=>{const s=su(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=pn(s.fwidth()).toVar();i=uu(e.oneMinus(),e.add(1),s).oneMinus()}else i=yu(s.greaterThan(1),0,1);return i}),iv=on(([e,t,r])=>{const s=pn(r).toVar(),i=pn(t).toVar(),n=fn(e).toVar();return yu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),nv=on(([e,t])=>{const r=fn(t).toVar(),s=pn(e).toVar();return yu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),av=on(([e])=>{const t=pn(e).toVar();return gn(xo(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),ov=on(([e,t])=>{const r=pn(e).toVar();return t.assign(av(r)),r.sub(pn(t))}),uv=pb([on(([e,t,r,s,i,n])=>{const a=pn(n).toVar(),o=pn(i).toVar(),u=pn(s).toVar(),l=pn(r).toVar(),d=pn(t).toVar(),c=pn(e).toVar(),h=pn(Ma(1,o)).toVar();return Ma(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"}]}),on(([e,t,r,s,i,n])=>{const a=pn(n).toVar(),o=pn(i).toVar(),u=_n(s).toVar(),l=_n(r).toVar(),d=_n(t).toVar(),c=_n(e).toVar(),h=pn(Ma(1,o)).toVar();return Ma(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=pb([on(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=pn(d).toVar(),h=pn(l).toVar(),p=pn(u).toVar(),g=pn(o).toVar(),m=pn(a).toVar(),f=pn(n).toVar(),y=pn(i).toVar(),b=pn(s).toVar(),x=pn(r).toVar(),T=pn(t).toVar(),_=pn(e).toVar(),v=pn(Ma(1,p)).toVar(),N=pn(Ma(1,h)).toVar();return pn(Ma(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"}]}),on(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=pn(d).toVar(),h=pn(l).toVar(),p=pn(u).toVar(),g=_n(o).toVar(),m=_n(a).toVar(),f=_n(n).toVar(),y=_n(i).toVar(),b=_n(s).toVar(),x=_n(r).toVar(),T=_n(t).toVar(),_=_n(e).toVar(),v=pn(Ma(1,p)).toVar(),N=pn(Ma(1,h)).toVar();return pn(Ma(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=on(([e,t,r])=>{const s=pn(r).toVar(),i=pn(t).toVar(),n=mn(e).toVar(),a=mn(n.bitAnd(mn(7))).toVar(),o=pn(iv(a.lessThan(mn(4)),i,s)).toVar(),u=pn(Ba(2,iv(a.lessThan(mn(4)),s,i))).toVar();return nv(o,fn(a.bitAnd(mn(1)))).add(nv(u,fn(a.bitAnd(mn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),cv=on(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=pn(t).toVar(),o=mn(e).toVar(),u=mn(o.bitAnd(mn(15))).toVar(),l=pn(iv(u.lessThan(mn(8)),a,n)).toVar(),d=pn(iv(u.lessThan(mn(4)),n,iv(u.equal(mn(12)).or(u.equal(mn(14))),a,i))).toVar();return nv(l,fn(u.bitAnd(mn(1)))).add(nv(d,fn(u.bitAnd(mn(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=pb([dv,cv]),pv=on(([e,t,r])=>{const s=pn(r).toVar(),i=pn(t).toVar(),n=Nn(e).toVar();return _n(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=on(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=pn(t).toVar(),o=Nn(e).toVar();return _n(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=pb([pv,gv]),fv=on(([e])=>{const t=pn(e).toVar();return Ba(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),yv=on(([e])=>{const t=pn(e).toVar();return Ba(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),bv=pb([fv,on(([e])=>{const t=_n(e).toVar();return Ba(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),xv=pb([yv,on(([e])=>{const t=_n(e).toVar();return Ba(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Tv=on(([e,t])=>{const r=gn(t).toVar(),s=mn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(gn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),_v=on(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Tv(r,gn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,gn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,gn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Tv(r,gn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,gn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,gn(4))),t.addAssign(e)}),vv=on(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar();return s.bitXorAssign(i),s.subAssign(Tv(i,gn(14))),n.bitXorAssign(s),n.subAssign(Tv(s,gn(11))),i.bitXorAssign(n),i.subAssign(Tv(n,gn(25))),s.bitXorAssign(i),s.subAssign(Tv(i,gn(16))),n.bitXorAssign(s),n.subAssign(Tv(s,gn(4))),i.bitXorAssign(n),i.subAssign(Tv(n,gn(14))),s.bitXorAssign(i),s.subAssign(Tv(i,gn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),Nv=on(([e])=>{const t=mn(e).toVar();return pn(t).div(pn(mn(gn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Sv=on(([e])=>{const t=pn(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=pb([on(([e])=>{const t=gn(e).toVar(),r=mn(mn(1)).toVar(),s=mn(mn(gn(3735928559)).add(r.shiftLeft(mn(2))).add(mn(13))).toVar();return vv(s.add(mn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),on(([e,t])=>{const r=gn(t).toVar(),s=gn(e).toVar(),i=mn(mn(2)).toVar(),n=mn().toVar(),a=mn().toVar(),o=mn().toVar();return n.assign(a.assign(o.assign(mn(gn(3735928559)).add(i.shiftLeft(mn(2))).add(mn(13))))),n.addAssign(mn(s)),a.addAssign(mn(r)),vv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),on(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=gn(e).toVar(),a=mn(mn(3)).toVar(),o=mn().toVar(),u=mn().toVar(),l=mn().toVar();return o.assign(u.assign(l.assign(mn(gn(3735928559)).add(a.shiftLeft(mn(2))).add(mn(13))))),o.addAssign(mn(n)),u.addAssign(mn(i)),l.addAssign(mn(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"}]}),on(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=gn(e).toVar(),u=mn(mn(4)).toVar(),l=mn().toVar(),d=mn().toVar(),c=mn().toVar();return l.assign(d.assign(c.assign(mn(gn(3735928559)).add(u.shiftLeft(mn(2))).add(mn(13))))),l.addAssign(mn(o)),d.addAssign(mn(a)),c.addAssign(mn(n)),_v(l,d,c),l.addAssign(mn(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"}]}),on(([e,t,r,s,i])=>{const n=gn(i).toVar(),a=gn(s).toVar(),o=gn(r).toVar(),u=gn(t).toVar(),l=gn(e).toVar(),d=mn(mn(5)).toVar(),c=mn().toVar(),h=mn().toVar(),p=mn().toVar();return c.assign(h.assign(p.assign(mn(gn(3735928559)).add(d.shiftLeft(mn(2))).add(mn(13))))),c.addAssign(mn(l)),h.addAssign(mn(u)),p.addAssign(mn(o)),_v(c,h,p),c.addAssign(mn(a)),h.addAssign(mn(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=pb([on(([e,t])=>{const r=gn(t).toVar(),s=gn(e).toVar(),i=mn(Rv(s,r)).toVar(),n=Nn().toVar();return n.x.assign(i.bitAnd(gn(255))),n.y.assign(i.shiftRight(gn(8)).bitAnd(gn(255))),n.z.assign(i.shiftRight(gn(16)).bitAnd(gn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),on(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=gn(e).toVar(),a=mn(Rv(n,i,s)).toVar(),o=Nn().toVar();return o.x.assign(a.bitAnd(gn(255))),o.y.assign(a.shiftRight(gn(8)).bitAnd(gn(255))),o.z.assign(a.shiftRight(gn(16)).bitAnd(gn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Ev=pb([on(([e])=>{const t=yn(e).toVar(),r=gn().toVar(),s=gn().toVar(),i=pn(ov(t.x,r)).toVar(),n=pn(ov(t.y,s)).toVar(),a=pn(Sv(i)).toVar(),o=pn(Sv(n)).toVar(),u=pn(uv(hv(Rv(r,s),i,n),hv(Rv(r.add(gn(1)),s),i.sub(1),n),hv(Rv(r,s.add(gn(1))),i,n.sub(1)),hv(Rv(r.add(gn(1)),s.add(gn(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"}]}),on(([e])=>{const t=_n(e).toVar(),r=gn().toVar(),s=gn().toVar(),i=gn().toVar(),n=pn(ov(t.x,r)).toVar(),a=pn(ov(t.y,s)).toVar(),o=pn(ov(t.z,i)).toVar(),u=pn(Sv(n)).toVar(),l=pn(Sv(a)).toVar(),d=pn(Sv(o)).toVar(),c=pn(lv(hv(Rv(r,s,i),n,a,o),hv(Rv(r.add(gn(1)),s,i),n.sub(1),a,o),hv(Rv(r,s.add(gn(1)),i),n,a.sub(1),o),hv(Rv(r.add(gn(1)),s.add(gn(1)),i),n.sub(1),a.sub(1),o),hv(Rv(r,s,i.add(gn(1))),n,a,o.sub(1)),hv(Rv(r.add(gn(1)),s,i.add(gn(1))),n.sub(1),a,o.sub(1)),hv(Rv(r,s.add(gn(1)),i.add(gn(1))),n,a.sub(1),o.sub(1)),hv(Rv(r.add(gn(1)),s.add(gn(1)),i.add(gn(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=pb([on(([e])=>{const t=yn(e).toVar(),r=gn().toVar(),s=gn().toVar(),i=pn(ov(t.x,r)).toVar(),n=pn(ov(t.y,s)).toVar(),a=pn(Sv(i)).toVar(),o=pn(Sv(n)).toVar(),u=_n(uv(mv(Av(r,s),i,n),mv(Av(r.add(gn(1)),s),i.sub(1),n),mv(Av(r,s.add(gn(1))),i,n.sub(1)),mv(Av(r.add(gn(1)),s.add(gn(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"}]}),on(([e])=>{const t=_n(e).toVar(),r=gn().toVar(),s=gn().toVar(),i=gn().toVar(),n=pn(ov(t.x,r)).toVar(),a=pn(ov(t.y,s)).toVar(),o=pn(ov(t.z,i)).toVar(),u=pn(Sv(n)).toVar(),l=pn(Sv(a)).toVar(),d=pn(Sv(o)).toVar(),c=_n(lv(mv(Av(r,s,i),n,a,o),mv(Av(r.add(gn(1)),s,i),n.sub(1),a,o),mv(Av(r,s.add(gn(1)),i),n,a.sub(1),o),mv(Av(r.add(gn(1)),s.add(gn(1)),i),n.sub(1),a.sub(1),o),mv(Av(r,s,i.add(gn(1))),n,a,o.sub(1)),mv(Av(r.add(gn(1)),s,i.add(gn(1))),n.sub(1),a,o.sub(1)),mv(Av(r,s.add(gn(1)),i.add(gn(1))),n,a.sub(1),o.sub(1)),mv(Av(r.add(gn(1)),s.add(gn(1)),i.add(gn(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=pb([on(([e])=>{const t=pn(e).toVar(),r=gn(av(t)).toVar();return Nv(Rv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),on(([e])=>{const t=yn(e).toVar(),r=gn(av(t.x)).toVar(),s=gn(av(t.y)).toVar();return Nv(Rv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),on(([e])=>{const t=_n(e).toVar(),r=gn(av(t.x)).toVar(),s=gn(av(t.y)).toVar(),i=gn(av(t.z)).toVar();return Nv(Rv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),on(([e])=>{const t=Rn(e).toVar(),r=gn(av(t.x)).toVar(),s=gn(av(t.y)).toVar(),i=gn(av(t.z)).toVar(),n=gn(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=pb([on(([e])=>{const t=pn(e).toVar(),r=gn(av(t)).toVar();return _n(Nv(Rv(r,gn(0))),Nv(Rv(r,gn(1))),Nv(Rv(r,gn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),on(([e])=>{const t=yn(e).toVar(),r=gn(av(t.x)).toVar(),s=gn(av(t.y)).toVar();return _n(Nv(Rv(r,s,gn(0))),Nv(Rv(r,s,gn(1))),Nv(Rv(r,s,gn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),on(([e])=>{const t=_n(e).toVar(),r=gn(av(t.x)).toVar(),s=gn(av(t.y)).toVar(),i=gn(av(t.z)).toVar();return _n(Nv(Rv(r,s,i,gn(0))),Nv(Rv(r,s,i,gn(1))),Nv(Rv(r,s,i,gn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),on(([e])=>{const t=Rn(e).toVar(),r=gn(av(t.x)).toVar(),s=gn(av(t.y)).toVar(),i=gn(av(t.z)).toVar(),n=gn(av(t.w)).toVar();return _n(Nv(Rv(r,s,i,n,gn(0))),Nv(Rv(r,s,i,n,gn(1))),Nv(Rv(r,s,i,n,gn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Bv=on(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=gn(t).toVar(),o=_n(e).toVar(),u=pn(0).toVar(),l=pn(1).toVar();return op(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=on(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=gn(t).toVar(),o=_n(e).toVar(),u=_n(0).toVar(),l=pn(1).toVar();return op(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"}]}),Pv=on(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=gn(t).toVar(),o=_n(e).toVar();return yn(Bv(o,a,n,i),Bv(o.add(_n(gn(19),gn(193),gn(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"}]}),Fv=on(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=gn(t).toVar(),o=_n(e).toVar(),u=_n(Lv(o,a,n,i)).toVar(),l=pn(Bv(o.add(_n(gn(19),gn(193),gn(17))),a,n,i)).toVar();return Rn(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=pb([on(([e,t,r,s,i,n,a])=>{const o=gn(a).toVar(),u=pn(n).toVar(),l=gn(i).toVar(),d=gn(s).toVar(),c=gn(r).toVar(),h=gn(t).toVar(),p=yn(e).toVar(),g=_n(Mv(yn(h.add(d),c.add(l)))).toVar(),m=yn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=yn(yn(pn(h),pn(c)).add(m)).toVar(),y=yn(f.sub(p)).toVar();return dn(o.equal(gn(2)),()=>Co(y.x).add(Co(y.y))),dn(o.equal(gn(3)),()=>Wo(Co(y.x),Co(y.y))),Ko(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"}]}),on(([e,t,r,s,i,n,a,o,u])=>{const l=gn(u).toVar(),d=pn(o).toVar(),c=gn(a).toVar(),h=gn(n).toVar(),p=gn(i).toVar(),g=gn(s).toVar(),m=gn(r).toVar(),f=gn(t).toVar(),y=_n(e).toVar(),b=_n(Mv(_n(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=_n(_n(pn(f),pn(m),pn(g)).add(b)).toVar(),T=_n(x.sub(y)).toVar();return dn(l.equal(gn(2)),()=>Co(T.x).add(Co(T.y)).add(Co(T.z))),dn(l.equal(gn(3)),()=>Wo(Co(T.x),Co(T.y),Co(T.z))),Ko(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=on(([e,t,r])=>{const s=gn(r).toVar(),i=pn(t).toVar(),n=yn(e).toVar(),a=gn().toVar(),o=gn().toVar(),u=yn(ov(n.x,a),ov(n.y,o)).toVar(),l=pn(1e6).toVar();return op({start:-1,end:gn(1),name:"x",condition:"<="},({x:e})=>{op({start:-1,end:gn(1),name:"y",condition:"<="},({y:t})=>{const r=pn(Dv(u,e,t,a,o,i,s)).toVar();l.assign($o(l,r))})}),dn(s.equal(gn(0)),()=>{l.assign(yo(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=on(([e,t,r])=>{const s=gn(r).toVar(),i=pn(t).toVar(),n=yn(e).toVar(),a=gn().toVar(),o=gn().toVar(),u=yn(ov(n.x,a),ov(n.y,o)).toVar(),l=yn(1e6,1e6).toVar();return op({start:-1,end:gn(1),name:"x",condition:"<="},({x:e})=>{op({start:-1,end:gn(1),name:"y",condition:"<="},({y:t})=>{const r=pn(Dv(u,e,t,a,o,i,s)).toVar();dn(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),dn(s.equal(gn(0)),()=>{l.assign(yo(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=on(([e,t,r])=>{const s=gn(r).toVar(),i=pn(t).toVar(),n=yn(e).toVar(),a=gn().toVar(),o=gn().toVar(),u=yn(ov(n.x,a),ov(n.y,o)).toVar(),l=_n(1e6,1e6,1e6).toVar();return op({start:-1,end:gn(1),name:"x",condition:"<="},({x:e})=>{op({start:-1,end:gn(1),name:"y",condition:"<="},({y:t})=>{const r=pn(Dv(u,e,t,a,o,i,s)).toVar();dn(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)})})}),dn(s.equal(gn(0)),()=>{l.assign(yo(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=pb([Uv,on(([e,t,r])=>{const s=gn(r).toVar(),i=pn(t).toVar(),n=_n(e).toVar(),a=gn().toVar(),o=gn().toVar(),u=gn().toVar(),l=_n(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=pn(1e6).toVar();return op({start:-1,end:gn(1),name:"x",condition:"<="},({x:e})=>{op({start:-1,end:gn(1),name:"y",condition:"<="},({y:t})=>{op({start:-1,end:gn(1),name:"z",condition:"<="},({z:r})=>{const n=pn(Dv(l,e,t,r,a,o,u,i,s)).toVar();d.assign($o(d,n))})})}),dn(s.equal(gn(0)),()=>{d.assign(yo(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=pb([Iv,on(([e,t,r])=>{const s=gn(r).toVar(),i=pn(t).toVar(),n=_n(e).toVar(),a=gn().toVar(),o=gn().toVar(),u=gn().toVar(),l=_n(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=yn(1e6,1e6).toVar();return op({start:-1,end:gn(1),name:"x",condition:"<="},({x:e})=>{op({start:-1,end:gn(1),name:"y",condition:"<="},({y:t})=>{op({start:-1,end:gn(1),name:"z",condition:"<="},({z:r})=>{const n=pn(Dv(l,e,t,r,a,o,u,i,s)).toVar();dn(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),dn(s.equal(gn(0)),()=>{d.assign(yo(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=pb([Ov,on(([e,t,r])=>{const s=gn(r).toVar(),i=pn(t).toVar(),n=_n(e).toVar(),a=gn().toVar(),o=gn().toVar(),u=gn().toVar(),l=_n(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=_n(1e6,1e6,1e6).toVar();return op({start:-1,end:gn(1),name:"x",condition:"<="},({x:e})=>{op({start:-1,end:gn(1),name:"y",condition:"<="},({y:t})=>{op({start:-1,end:gn(1),name:"z",condition:"<="},({z:r})=>{const n=pn(Dv(l,e,t,r,a,o,u,i,s)).toVar();dn(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)})})})}),dn(s.equal(gn(0)),()=>{d.assign(yo(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=on(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(e).toVar(),h=yn(t).toVar(),p=yn(r).toVar(),g=yn(s).toVar(),m=pn(i).toVar(),f=pn(n).toVar(),y=pn(a).toVar(),b=fn(o).toVar(),x=gn(u).toVar(),T=pn(l).toVar(),_=pn(d).toVar(),v=h.mul(p).add(g),N=pn(0).toVar();return dn(c.equal(gn(0)),()=>{N.assign(wv(v))}),dn(c.equal(gn(1)),()=>{N.assign(Mv(v))}),dn(c.equal(gn(2)),()=>{N.assign(Gv(v,m,gn(0)))}),dn(c.equal(gn(3)),()=>{N.assign(Lv(_n(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),dn(b,()=>{N.assign(nu(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=on(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(e).toVar(),h=_n(t).toVar(),p=_n(r).toVar(),g=_n(s).toVar(),m=pn(i).toVar(),f=pn(n).toVar(),y=pn(a).toVar(),b=fn(o).toVar(),x=gn(u).toVar(),T=pn(l).toVar(),_=pn(d).toVar(),v=h.mul(p).add(g),N=pn(0).toVar();return dn(c.equal(gn(0)),()=>{N.assign(wv(v))}),dn(c.equal(gn(1)),()=>{N.assign(Mv(v))}),dn(c.equal(gn(2)),()=>{N.assign(Gv(v,m,gn(0)))}),dn(c.equal(gn(3)),()=>{N.assign(Lv(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),dn(b,()=>{N.assign(nu(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=on(([e])=>{const t=e.y,r=e.z,s=_n().toVar();return dn(t.lessThan(1e-4),()=>{s.assign(_n(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(xo(i)).mul(6).toVar();const n=gn(Oo(i)),a=i.sub(pn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());dn(n.equal(gn(0)),()=>{s.assign(_n(r,l,o))}).ElseIf(n.equal(gn(1)),()=>{s.assign(_n(u,r,o))}).ElseIf(n.equal(gn(2)),()=>{s.assign(_n(o,r,l))}).ElseIf(n.equal(gn(3)),()=>{s.assign(_n(o,u,r))}).ElseIf(n.equal(gn(4)),()=>{s.assign(_n(l,o,r))}).Else(()=>{s.assign(_n(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Hv=on(([e])=>{const t=_n(e).toVar(),r=pn(t.x).toVar(),s=pn(t.y).toVar(),i=pn(t.z).toVar(),n=pn($o(r,$o(s,i))).toVar(),a=pn(Wo(r,Wo(s,i))).toVar(),o=pn(a.sub(n)).toVar(),u=pn().toVar(),l=pn().toVar(),d=pn().toVar();return d.assign(a),dn(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),dn(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{dn(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(Ca(2,i.sub(r).div(o)))}).Else(()=>{u.assign(Ca(4,r.sub(s).div(o)))}),u.mulAssign(1/6),dn(u.lessThan(0),()=>{u.addAssign(1)})}),_n(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),qv=on(([e])=>{const t=_n(e).toVar(),r=Sn(Ia(t,_n(.04045))).toVar(),s=_n(t.div(12.92)).toVar(),i=_n(Qo(Wo(t.add(_n(.055)),_n(0)).div(1.055),_n(2.4))).toVar();return iu(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),jv=(e,t)=>{e=pn(e),t=pn(t);const r=yn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return uu(e.sub(r),e.add(r),t)},Xv=(e,t,r,s)=>iu(e,t,r[s].clamp()),Kv=(e,t,r,s,i)=>iu(e,t,jv(r,s[i])),Yv=on(([e,t,r])=>{const s=_o(e).toVar(),i=Ma(pn(.5).mul(t.sub(r)),Pd).div(s).toVar(),n=Ma(pn(-.5).mul(t.sub(r)),Pd).div(s).toVar(),a=_n().toVar();a.x=s.x.greaterThan(pn(0)).select(i.x,n.x),a.y=s.y.greaterThan(pn(0)).select(i.y,n.y),a.z=s.z.greaterThan(pn(0)).select(i.z,n.z);const o=$o(a.x,a.y,a.z).toVar();return Pd.add(s.mul(o)).toVar().sub(r)}),Qv=on(([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(Ba(r,r).sub(Ba(s,s)))),n});var Zv=Object.freeze({__proto__:null,BRDF_GGX:Fg,BRDF_Lambert:xg,BasicPointShadowFilter:j_,BasicShadowFilter:v_,Break:up,Const:wu,Continue:()=>pl("continue").toStack(),DFGLUT:Ig,D_GGX:Bg,Discard:gl,EPSILON:ro,F_Schlick:bg,Fn:on,HALF_PI:oo,INFINITY:so,If:dn,Loop:op,NodeAccess:ei,NodeShaderStage:Qs,NodeType:Js,NodeUpdateType:Zs,OnBeforeMaterialUpdate:e=>Jb(Zb.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>Jb(Zb.BEFORE_OBJECT,e),OnMaterialUpdate:e=>Jb(Zb.MATERIAL,e),OnObjectUpdate:e=>Jb(Zb.OBJECT,e),PCFShadowFilter:N_,PCFSoftShadowFilter:S_,PI:io,PI2:no,PointShadowFilter:X_,Return:()=>pl("return").toStack(),Schlick_to_F0:kg,ScriptableNodeResources:tT,ShaderNode:Yi,Stack:cn,Switch:(...e)=>Ti.Switch(...e),TBNViewMatrix:zc,TWO_PI:ao,VSMShadowFilter:R_,V_GGX_SmithCorrelated:Cg,Var:Eu,VarIntent:Cu,abs:Co,acesFilmicToneMapping:Gx,acos:Eo,add:Ca,addMethodChaining:vi,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:Hx,all:uo,alphaT:Kn,and:ka,anisotropy:Yn,anisotropyB:Zn,anisotropyT:Qn,any:lo,append:e=>(d("TSL: append() has been renamed to Stack()."),cn(e)),array:va,arrayBuffer:e=>new bi(e,"ArrayBuffer"),asin:Ao,assign:Sa,atan:wo,atomicAdd:(e,t)=>RT(NT.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>RT(NT.ATOMIC_AND,e,t),atomicFunc:RT,atomicLoad:e=>RT(NT.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>RT(NT.ATOMIC_MAX,e,t),atomicMin:(e,t)=>RT(NT.ATOMIC_MIN,e,t),atomicOr:(e,t)=>RT(NT.ATOMIC_OR,e,t),atomicStore:(e,t)=>RT(NT.ATOMIC_STORE,e,t),atomicSub:(e,t)=>RT(NT.ATOMIC_SUB,e,t),atomicXor:(e,t)=>RT(NT.ATOMIC_XOR,e,t),attenuationColor:ca,attenuationDistance:da,attribute:Nl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Gs("float")):(r=zs(t),s=Gs(t));const i=new tx(e,r,s);return $h(i,t,e)},backgroundBlurriness:ox,backgroundIntensity:ux,backgroundRotation:lx,batch:rp,bentNormalView:Wc,billboarding:xb,bitAnd:Wa,bitNot:Ha,bitOr:qa,bitXor:ja,bitangentGeometry:Oc,bitangentLocal:Vc,bitangentView:kc,bitangentWorld:Gc,bitcast:Hy,blendBurn:$p,blendColor:jp,blendDodge:Wp,blendOverlay:qp,blendScreen:Hp,blur:km,bool:fn,buffer:Dl,bufferAttribute:Zu,builtin:Vl,builtinAOContext:Nu,builtinShadowContext:vu,bumpMap:Zc,bvec2:Tn,bvec3:Sn,bvec4:wn,bypass:ul,cache:al,call:Aa,cameraFar:ed,cameraIndex:Zl,cameraNear:Jl,cameraNormalMatrix:nd,cameraPosition:ad,cameraProjectionMatrix:td,cameraProjectionMatrixInverse:rd,cameraViewMatrix:sd,cameraViewport:od,cameraWorldMatrix:id,cbrt:ru,cdl:Ax,ceil:To,checker:rv,cineonToneMapping:Vx,clamp:nu,clearcoat:zn,clearcoatNormalView:Xd,clearcoatRoughness:$n,clipSpace:Cd,code:Xx,color:hn,colorSpaceToWorking:ku,colorToDirection:e=>Qi(e).mul(2).sub(1),compute:sl,computeKernel:rl,computeSkinning:(e,t=null)=>{const r=new ip(e);return r.positionNode=$h(new W(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(qh).toVar(),r.skinIndexNode=$h(new W(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(qh).toVar(),r.skinWeightNode=$h(new W(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(qh).toVar(),r.bindMatrixNode=Ta(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=Ta(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Dl(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Qi(r)},context:xu,convert:Pn,convertColorSpace:(e,t,r)=>Qi(new Ou(Qi(e),t,r)),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():Hb(e,...t),cos:So,countLeadingZeros:Yy,countOneBits:Qy,countTrailingZeros:Ky,cross:Yo,cubeTexture:hc,cubeTextureBase:cc,dFdx:Fo,dFdy:Do,dashSize:ia,debug:bl,decrement:Ja,decrementBefore:Qa,defaultBuildStages:ri,defaultShaderStages:ti,defined:Xi,degrees:ho,deltaTime:mb,densityFogFactor:aT,depth:Fp,depthPass:(e,t,r)=>new Dx(Dx.DEPTH,e,t,r),determinant:Go,difference:Xo,diffuseColor:In,diffuseContribution:On,directPointLight:ev,directionToColor:Hc,directionToFaceDirection:kd,dispersion:ha,disposeShadowMaterial:w_,distance:jo,div:La,dot:Ko,drawIndex:Yh,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>Qu(e,t,r,s,x),element:Ln,emissive:Vn,equal:Fa,equirectUV:ng,exp:po,exp2:go,exponentialHeightFogFactor:oT,expression:pl,faceDirection:Vd,faceForward:lu,faceforward:gu,float:pn,floatBitsToInt:e=>new Wy(e,"int","float"),floatBitsToUint:qy,floor:xo,fog:uT,fract:vo,frameGroup:fa,frameId:fb,frontFacing:Od,fwidth:Vo,gain:(e,t)=>e.lessThan(.5)?Jy(e.mul(2),t).div(2):Ma(1,Jy(Ba(Ma(1,e),2),t).div(2)),gapSize:na,getConstNodeType:Ki,getCurrentStack:ln,getDirection:Um,getDistanceAttenuation:J_,getGeometryRoughness:Eg,getNormalFromDepth:Xb,getParallaxCorrectNormal:Yv,getRoughness:wg,getScreenPosition:jb,getShIrradianceAt:Qv,getShadowMaterial:E_,getShadowRenderObjectFunction:B_,getTextureIndex:Gy,getViewPosition:qb,ggxConvolution:Wm,globalId:yT,glsl:(e,t)=>Xx(e,t,"glsl"),glslFn:(e,t)=>Yx(e,t,"glsl"),grayscale:_x,greaterThan:Ia,greaterThanEqual:Va,hash:Zy,highpModelNormalViewMatrix:wd,highpModelViewMatrix:Ed,hue:Sx,increment:Za,incrementBefore:Ya,inspector:_l,instance:Zh,instanceIndex:qh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Gs("float")):(r=zs(t),s=Gs(t));const i=new ex(e,r,s);return $h(i,t,e)},instancedBufferAttribute:Ju,instancedDynamicBufferAttribute:el,instancedMesh:ep,int:gn,intBitsToFloat:e=>new Wy(e,"float","int"),interleavedGradientNoise:Kb,inverse:zo,inverseSqrt:bo,inversesqrt:mu,invocationLocalIndex:Kh,invocationSubgroupIndex:Xh,ior:oa,iridescence:qn,iridescenceIOR:jn,iridescenceThickness:Xn,isolate:nl,ivec2:bn,ivec3:vn,ivec4:An,js:(e,t)=>Xx(e,t,"js"),label:Su,length:Bo,lengthSq:su,lessThan:Ua,lessThanEqual:Oa,lightPosition:r_,lightProjectionUV:t_,lightShadowMatrix:e_,lightTargetDirection:n_,lightTargetPosition:s_,lightViewPosition:i_,lightingContext:yp,lights:(e=[])=>(new l_).setLights(e),linearDepth:Dp,linearToneMapping:Ix,localId:bT,log:mo,log2:fo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(mo(r.div(t)));return pn(Math.E).pow(s).mul(t).negate()},luminance:Rx,mat2:Cn,mat3:Mn,mat4:Bn,matcapUV:Cf,materialAO:Ih,materialAlphaTest:th,materialAnisotropy:Th,materialAnisotropyVector:Oh,materialAttenuationColor:wh,materialAttenuationDistance:Eh,materialClearcoat:gh,materialClearcoatNormal:fh,materialClearcoatRoughness:mh,materialColor:rh,materialDispersion:Dh,materialEmissive:ih,materialEnvIntensity:sc,materialEnvRotation:ic,materialIOR:Ah,materialIridescence:_h,materialIridescenceIOR:vh,materialIridescenceThickness:Nh,materialLightMap:Uh,materialLineDashOffset:Ph,materialLineDashSize:Mh,materialLineGapSize:Bh,materialLineScale:Ch,materialLineWidth:Lh,materialMetalness:hh,materialNormal:ph,materialOpacity:nh,materialPointSize:Fh,materialReference:bc,materialReflectivity:dh,materialRefractionRatio:rc,materialRotation:yh,materialRoughness:ch,materialSheen:bh,materialSheenRoughness:xh,materialShininess:sh,materialSpecular:ah,materialSpecularColor:uh,materialSpecularIntensity:oh,materialSpecularStrength:lh,materialThickness:Rh,materialTransmission:Sh,max:Wo,maxMipLevel:wl,mediumpModelViewMatrix:Ad,metalness:Gn,min:$o,mix:iu,mixElement:cu,mod:Pa,modInt:eo,modelDirection:yd,modelNormalMatrix:Nd,modelPosition:xd,modelRadius:vd,modelScale:Td,modelViewMatrix:Rd,modelViewPosition:_d,modelViewProjection:Vh,modelWorldMatrix:bd,modelWorldMatrixInverse:Sd,morphReference:pp,mrt:$y,mul:Ba,mx_aastep:jv,mx_add:(e,t=pn(0))=>Ca(e,t),mx_atan2:(e=pn(0),t=pn(1))=>wo(e,t),mx_cell_noise_float:(e=Sl())=>Cv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>pn(e).sub(r).mul(t).add(r),mx_divide:(e,t=pn(1))=>La(e,t),mx_fractal_noise_float:(e=Sl(),t=3,r=2,s=.5,i=1)=>Bv(e,gn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Sl(),t=3,r=2,s=.5,i=1)=>Pv(e,gn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Sl(),t=3,r=2,s=.5,i=1)=>Lv(e,gn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Sl(),t=3,r=2,s=.5,i=1)=>Fv(e,gn(t),r,s).mul(i),mx_frame:()=>fb,mx_heighttonormal:(e,t)=>(e=_n(e),t=pn(t),Zc(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=pn(1))=>Ma(t,e),mx_modulo:(e,t=pn(1))=>Pa(e,t),mx_multiply:(e,t=pn(1))=>Ba(e,t),mx_noise_float:(e=Sl(),t=1,r=0)=>Ev(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Sl(),t=1,r=0)=>wv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Sl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return Rn(wv(e),Ev(e.add(yn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=yn(.5,.5),r=yn(1,1),s=pn(0),i=yn(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=yn(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=pn(1))=>Qo(e,t),mx_ramp4:(e,t,r,s,i=Sl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=iu(e,t,n),u=iu(r,s,n);return iu(o,u,a)},mx_ramplr:(e,t,r=Sl())=>Xv(e,t,r,"x"),mx_ramptb:(e,t,r=Sl())=>Xv(e,t,r,"y"),mx_rgbtohsv:Hv,mx_rotate2d:(e,t)=>{e=yn(e);const r=(t=pn(t)).mul(Math.PI/180);return Pf(e,r)},mx_rotate3d:(e,t,r)=>{e=_n(e),t=pn(t),r=_n(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=pn(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=pn(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=Sl())=>Kv(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Sl())=>Kv(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:qv,mx_subtract:(e,t=pn(0))=>Ma(e,t),mx_timer:()=>gb,mx_transform_uv:(e=1,t=0,r=Sl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Sl(),r=yn(1,1),s=yn(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=Sl(),r=yn(1,1),s=yn(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=Sl(),t=1)=>Vv(e.convert("vec2|vec3"),t,gn(1)),mx_worley_noise_vec2:(e=Sl(),t=1)=>kv(e.convert("vec2|vec3"),t,gn(1)),mx_worley_noise_vec3:(e=Sl(),t=1)=>Gv(e.convert("vec2|vec3"),t,gn(1)),negate:Lo,neutralToneMapping:qx,nodeArray:en,nodeImmutable:rn,nodeObject:Qi,nodeObjectIntent:Zi,nodeObjects:Ji,nodeProxy:tn,nodeProxyIntent:sn,normalFlat:$d,normalGeometry:Gd,normalLocal:zd,normalMap:Xc,normalView:qd,normalViewGeometry:Wd,normalWorld:jd,normalWorldGeometry:Hd,normalize:_o,not:za,notEqual:Da,numWorkgroups:mT,objectDirection:dd,objectGroup:ba,objectPosition:hd,objectRadius:md,objectScale:pd,objectViewPosition:gd,objectWorldMatrix:cd,oneMinus:Po,or:Ga,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=gb)=>e.fract(),oscSine:(e=gb)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=gb)=>e.fract().round(),oscTriangle:(e=gb)=>e.add(.5).fract().mul(2).sub(1).abs(),output:sa,outputStruct:Iy,overloadingFn:pb,packHalf2x16:sb,packSnorm2x16:tb,packUnorm2x16:rb,parabola:Jy,parallaxDirection:$c,parallaxUV:(e,t)=>e.sub($c.mul(t)),parameter:(e,t)=>new By(e,t),pass:(e,t,r)=>new Dx(Dx.COLOR,e,t,r),passTexture:(e,t)=>new Px(e,t),pcurve:(e,t,r)=>Qo(La(Qo(e,t),Ca(Qo(e,t),Qo(Ma(1,e),r))),1/t),perspectiveDepthToViewZ:Bp,pmremTexture:gf,pointShadow:Q_,pointUV:sx,pointWidth:aa,positionGeometry:Md,positionLocal:Bd,positionPrevious:Ld,positionView:Dd,positionViewDirection:Ud,positionWorld:Pd,positionWorldDirection:Fd,posterize:wx,pow:Qo,pow2:Zo,pow3:Jo,pow4:eu,premultiplyAlpha:Xp,property:Dn,quadBroadcast:QT,quadSwapDiagonal:HT,quadSwapX:$T,quadSwapY:WT,radians:co,rand:du,range:hT,rangeFogFactor:nT,reciprocal:Io,reference:mc,referenceBuffer:fc,reflect:qo,reflectVector:oc,reflectView:nc,reflector:e=>new Ib(e),refract:ou,refractVector:uc,refractView:ac,reinhardToneMapping:Ox,remap:dl,remapClamp:cl,renderGroup:ya,renderOutput:fl,rendererReference:Wu,replaceDefaultUV:function(e,t=null){return xu(t,{getUV:e})},rotate:Pf,rotateUV:yb,roughness:kn,round:Uo,rtt:Hb,sRGBTransferEOTF:Du,sRGBTransferOETF:Uu,sample:(e,t=null)=>new Qb(e,Qi(t)),sampler:e=>(!0===e.isNode?e:Ll(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Ll(e)).convert("samplerComparison"),saturate:au,saturation:vx,screenCoordinate:ql,screenDPR:$l,screenSize:Hl,screenUV:Wl,scriptable:sT,scriptableValue:Zx,select:yu,setCurrentStack:un,setName:_u,shaderStages:si,shadow:O_,shadowPositionWorld:c_,shapeCircle:sv,sharedUniformGroup:ma,sheen:Wn,sheenRoughness:Hn,shiftLeft:Xa,shiftRight:Ka,shininess:ra,sign:Mo,sin:No,sinc:(e,t)=>No(io.mul(t.mul(e).sub(1))).div(io.mul(t.mul(e).sub(1))),skinning:np,smoothstep:uu,smoothstepElement:hu,specularColor:Jn,specularColorBlended:ea,specularF90:ta,spherizeUV:bb,split:(e,t)=>Qi(new pi(Qi(e),t)),spritesheetUV:_b,sqrt:yo,stack:Py,step:Ho,stepElement:pu,storage:$h,storageBarrier:()=>TT("storage").toStack(),storageTexture:cx,string:(e="")=>new bi(e,"string"),struct:(e,t=null)=>{const r=new Fy(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;egx(e,t).level(r),texture3DLoad:(...e)=>gx(...e).setSampler(!1),textureBarrier:()=>TT("texture").toStack(),textureBicubic:am,textureBicubicLevel:nm,textureCubeUV:Im,textureLevel:(e,t,r)=>Ll(e,t).level(r),textureLoad:Pl,textureSize:Al,textureStore:(e,t,r)=>{const s=cx(e,t,r);return null!==r&&s.toStack(),s},thickness:la,time:gb,toneMapping:qu,toneMappingExposure:ju,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Qi(new Ux(t,r,Qi(s),Qi(i),Qi(n))),transformDirection:tu,transformNormal:Kd,transformNormalToView:Yd,transformedClearcoatNormalView:Jd,transformedNormalView:Qd,transformedNormalWorld:Zd,transmission:ua,transpose:ko,triNoise3D:db,triplanarTexture:(...e)=>vb(...e),triplanarTextures:vb,trunc:Oo,uint:mn,uintBitsToFloat:e=>new Wy(e,"float","uint"),uniform:Ta,uniformArray:Ol,uniformCubeTexture:(e=lc)=>cc(e),uniformFlow:Tu,uniformGroup:ga,uniformTexture:(e=Cl)=>Ll(e),unpackHalf2x16:ob,unpackNormal:qc,unpackSnorm2x16:nb,unpackUnorm2x16:ab,unpremultiplyAlpha:Kp,userData:(e,t,r)=>new mx(e,t,r),uv:Sl,uvec2:xn,uvec3:Nn,uvec4:En,varying:Pu,varyingProperty:Un,vec2:yn,vec3:_n,vec4:Rn,vectorComponents:ii,velocity:Tx,vertexColor:zp,vertexIndex:Hh,vertexStage:Fu,vibrance:Nx,viewZToLogarithmicDepth:Lp,viewZToOrthographicDepth:Cp,viewZToPerspectiveDepth:Mp,viewport:jl,viewportCoordinate:Kl,viewportDepthTexture:Ep,viewportLinearDepth:Up,viewportMipTexture:vp,viewportOpaqueMipTexture:Sp,viewportResolution:Ql,viewportSafeUV:Tb,viewportSharedTexture:Bx,viewportSize:Xl,viewportTexture:_p,viewportUV:Yl,vogelDiskSample:Yb,wgsl:(e,t)=>Xx(e,t,"wgsl"),wgslFn:(e,t)=>Yx(e,t,"wgsl"),workgroupArray:(e,t)=>new vT("Workgroup",e,t),workgroupBarrier:()=>TT("workgroup").toStack(),workgroupId:fT,workingToColorSpace:Vu,xor:$a});const Jv=new My;class eN extends ey{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=Rn(l).mul(ux).context({getUV:()=>lx.mul(Hd),getTextureLevel:()=>ox}),p=td.element(3).element(3).equal(1),g=La(1,td.element(1).element(1)).mul(3),m=p.select(Bd.mul(g),Bd),f=Rd.mul(Rn(m,0));let y=td.mul(Rn(f.xyz,1));y=y.setZ(y.w);const b=new Yp;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 tt(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=Rn(l).mul(ux),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"]]),PN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class FN{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 Kf,BN.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new Ne(e,t,r)}createCubeRenderTarget(e,t){return new ag(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 si)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")}( ${PN(n.r)}, ${PN(n.g)}, ${PN(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=ks(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 it||!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=ln();return this.stacks.push(e),un(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,un(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 Kx,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 By(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 ri)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 Yp),e.build(this)}else this.addFlow("compute",e);for(const e of ri){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of si){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${nt} - Node System\n`}needsPreviousData(){const e=this.renderer.getMRT();return e&&e.has("velocity")||!0===js(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===Zs.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===Zs.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===Zs.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Zs.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===Zs.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===Zs.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Zs.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===Zs.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===Zs.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:n_(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=Ta(new r).setGroup(ya),this.halfWidth=Ta(new r).setGroup(ya),this.updateType=Zs.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=Ll(kN.LTC_FLOAT_1),r=Ll(kN.LTC_FLOAT_2)):(t=Ll(kN.LTC_HALF_1),r=Ll(kN.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:i_(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=Ta(0).setGroup(ya),this.penumbraCosNode=Ta(0).setGroup(ya),this.cutoffDistanceNode=Ta(0).setGroup(ya),this.decayExponentNode=Ta(0).setGroup(ya),this.colorNode=Ta(this.color).setGroup(ya)}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 uu(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=t_(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(n_(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=Ll(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=Ll(r,yn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const WN=on(([e,t])=>{const r=e.abs().sub(t);return Bo(Wo(r,0)).add($o(Wo(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=pn(0),r=this.penumbraCosNode,s=e_(this.light).mul(e.context.positionWorld||Pd);return dn(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=WN(e.xy.sub(yn(.5)),yn(.5)),n=La(-1,Ma(1,Eo(r)).sub(1));t.assign(au(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=r_(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=Ta(new e).setGroup(ya)}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=jd.dot(s).mul(.5).add(.5),n=iu(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=Ol(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(jd,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 Yp),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=Us(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 gf(r);{let e;return e=!0===r.isCubeTexture?hc(r):Ll(r),cg(e)}}if(!0===r.isTexture)return Ll(r,Wl.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=mc("color","color",r).setGroup(ya),t=mc("density","float",r).setGroup(ya);return uT(e,aT(t))}if(r.isFog){const e=mc("color","color",r).setGroup(ya),t=mc("near","float",r).setGroup(ya),s=mc("far","float",r).setGroup(ya);return uT(e,nT(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?hc(r):!0===r.isTexture?Ll(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?gx(e,_n(Wl,Vl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Ll(e,Wl).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 Xf(this,this._nodes,this.info),this._attributes=new ay(r),this._background=new eN(this,this._nodes),this._geometries=new ly(this._attributes,this.info),this._textures=new Cy(this,r,this.info),this._pipelines=new fy(r,this._nodes),this._bindings=new yy(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Jf(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Ny(this.lighting),this._bundles=new dS,this._renderContexts=new Ey,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=Ed,t.modelNormalViewMatrix=wd):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===Ed&&e.modelNormalViewMatrix===wd}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=ut;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);e.side=null===i.shadowSide?i.side:i.shadowSide,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=ut,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 FS{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 DS extends FS{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)+(ny-e%ny)%ny;var e}get buffer(){return this._buffer}update(){return!0}}class US extends DS{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let IS=0;class OS extends US{constructor(e,t){super("UniformBuffer_"+IS++,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 VS extends US{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 $S=0;class WS extends zS{constructor(e,t){super(e,t),this.id=$S++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class HS extends WS{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 qS extends HS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class jS extends HS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const XS={bitcast_int_uint:new jx("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new jx("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},KS={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"},YS={low:"lowp",medium:"mediump",high:"highp"},QS={swizzleAssign:!0,storageBuffer:!1},ZS={perspective:"smooth",linear:"noperspective"},JS={centroid:"centroid"},eR="\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 lowp sampler2DShadow;\nprecision lowp sampler2DArrayShadow;\nprecision lowp samplerCubeShadow;\n";class tR extends FN{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=XS[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==XS[e]&&this._include(e),KS[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?bt:xt;2===s?n=i?Nt:G:3===s?n=i?St:Rt:4===s&&(n=i?At:Re);const a={Float32Array:j,Uint8Array:Ge,Uint16Array:vt,Uint32Array:S,Int8Array:_t,Int16Array:Tt,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=YS[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=YS[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+=`${ZS[s.interpolationType]||s.interpolationType} ${JS[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+=`${ZS[e.interpolationType]||e.interpolationType} ${JS[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=QS[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)}QS[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 HS(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new qS(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new jS(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 OS(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 GS(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 rR=null,sR=null;class iR{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[Et.RENDER]:null,[Et.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:")?Et.COMPUTE:Et.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 rR=rR||new t,this.renderer.getDrawingBufferSize(rR)}setScissorTest(){}getClearColor(){const e=this.renderer;return sR=sR||new My,e.getClearColor(sR),sR.getRGB(sR),sR}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:wt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${nt} 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 nR,aR,oR=0;class uR{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 lR{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:oR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new uR(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 hR,pR,gR,mR=!1;class fR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===mR&&(this._init(),mR=!0)}_init(){const e=this.gl;hR={[Ir]:e.REPEAT,[xe]:e.CLAMP_TO_EDGE,[Ur]:e.MIRRORED_REPEAT},pR={[w]:e.NEAREST,[Or]:e.NEAREST_MIPMAP_NEAREST,[st]:e.NEAREST_MIPMAP_LINEAR,[oe]:e.LINEAR,[rt]:e.LINEAR_MIPMAP_NEAREST,[K]:e.LINEAR_MIPMAP_LINEAR},gR={[Hr]:e.NEVER,[Wr]:e.ALWAYS,[E]:e.LESS,[$r]:e.LEQUAL,[zr]:e.EQUAL,[Gr]:e.GEQUAL,[kr]:e.GREATER,[Vr]: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?qr: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?qr: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,hR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,hR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,hR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,pR[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,pR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,gR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===w)return;if(t.minFilter!==st&&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=jr(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 yR(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 bR{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 xR{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 TR={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 _R{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 SR extends iR{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 bR(this),this.capabilities=new xR(this),this.attributeUtils=new lR(this),this.textureUtils=new fR(this),this.bufferRenderer=new _R(this),this.state=new dR(this),this.utils=new cR(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 NR(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(Et.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;eTR[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 RR="point-list",AR="line-list",ER="line-strip",wR="triangle-list",CR="triangle-strip",MR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},BR="never",LR="less",PR="equal",FR="less-equal",DR="greater",UR="not-equal",IR="greater-equal",OR="always",VR="store",kR="load",GR="clear",zR="ccw",$R="cw",WR="none",HR="back",qR="uint16",jR="uint32",XR="r8unorm",KR="r8snorm",YR="r8uint",QR="r8sint",ZR="r16uint",JR="r16sint",eA="r16float",tA="rg8unorm",rA="rg8snorm",sA="rg8uint",iA="rg8sint",nA="r32uint",aA="r32sint",oA="r32float",uA="rg16uint",lA="rg16sint",dA="rg16float",cA="rgba8unorm",hA="rgba8unorm-srgb",pA="rgba8snorm",gA="rgba8uint",mA="rgba8sint",fA="bgra8unorm",yA="bgra8unorm-srgb",bA="rgb9e5ufloat",xA="rgb10a2unorm",TA="rg11b10ufloat",_A="rg32uint",vA="rg32sint",NA="rg32float",SA="rgba16uint",RA="rgba16sint",AA="rgba16float",EA="rgba32uint",wA="rgba32sint",CA="rgba32float",MA="depth16unorm",BA="depth24plus",LA="depth24plus-stencil8",PA="depth32float",FA="depth32float-stencil8",DA="bc1-rgba-unorm",UA="bc1-rgba-unorm-srgb",IA="bc2-rgba-unorm",OA="bc2-rgba-unorm-srgb",VA="bc3-rgba-unorm",kA="bc3-rgba-unorm-srgb",GA="bc4-r-unorm",zA="bc4-r-snorm",$A="bc5-rg-unorm",WA="bc5-rg-snorm",HA="bc6h-rgb-ufloat",qA="bc6h-rgb-float",jA="bc7-rgba-unorm",XA="bc7-rgba-unorm-srgb",KA="etc2-rgb8unorm",YA="etc2-rgb8unorm-srgb",QA="etc2-rgb8a1unorm",ZA="etc2-rgb8a1unorm-srgb",JA="etc2-rgba8unorm",eE="etc2-rgba8unorm-srgb",tE="eac-r11unorm",rE="eac-r11snorm",sE="eac-rg11unorm",iE="eac-rg11snorm",nE="astc-4x4-unorm",aE="astc-4x4-unorm-srgb",oE="astc-5x4-unorm",uE="astc-5x4-unorm-srgb",lE="astc-5x5-unorm",dE="astc-5x5-unorm-srgb",cE="astc-6x5-unorm",hE="astc-6x5-unorm-srgb",pE="astc-6x6-unorm",gE="astc-6x6-unorm-srgb",mE="astc-8x5-unorm",fE="astc-8x5-unorm-srgb",yE="astc-8x6-unorm",bE="astc-8x6-unorm-srgb",xE="astc-8x8-unorm",TE="astc-8x8-unorm-srgb",_E="astc-10x5-unorm",vE="astc-10x5-unorm-srgb",NE="astc-10x6-unorm",SE="astc-10x6-unorm-srgb",RE="astc-10x8-unorm",AE="astc-10x8-unorm-srgb",EE="astc-10x10-unorm",wE="astc-10x10-unorm-srgb",CE="astc-12x10-unorm",ME="astc-12x10-unorm-srgb",BE="astc-12x12-unorm",LE="astc-12x12-unorm-srgb",PE="clamp-to-edge",FE="repeat",DE="mirror-repeat",UE="linear",IE="nearest",OE="zero",VE="one",kE="src",GE="one-minus-src",zE="src-alpha",$E="one-minus-src-alpha",WE="dst",HE="one-minus-dst",qE="dst-alpha",jE="one-minus-dst-alpha",XE="src-alpha-saturated",KE="constant",YE="one-minus-constant",QE="add",ZE="subtract",JE="reverse-subtract",ew="min",tw="max",rw=0,sw=15,iw="keep",nw="zero",aw="replace",ow="invert",uw="increment-clamp",lw="decrement-clamp",dw="increment-wrap",cw="decrement-wrap",hw="storage",pw="read-only-storage",gw="write-only",mw="read-only",fw="read-write",yw="non-filtering",bw="comparison",xw="float",Tw="unfilterable-float",_w="depth",vw="sint",Nw="uint",Sw="2d",Rw="3d",Aw="2d",Ew="2d-array",ww="cube",Cw="3d",Mw="all",Bw="vertex",Lw="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"},Fw={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class Dw extends zS{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 Uw extends DS{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let Iw=0;class Ow extends Uw{constructor(e,t){super("StorageBuffer_"+Iw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ei.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class Vw extends ey{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:UE}),this.flipYSampler=e.createSampler({minFilter:IE}),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:CR,stripIndexFormat:jR},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:CR,stripIndexFormat:jR},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:GR,storeOp:VR,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 Vw(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,Hw=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,qw={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 jw extends YN{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(Ww);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=Hw.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 Xw extends KN{parseFunction(e){return new jw(e)}}const Kw={[ei.READ_ONLY]:"read",[ei.WRITE_ONLY]:"write",[ei.READ_WRITE]:"read_write"},Yw={[Ir]:"repeat",[xe]:"clamp",[Ur]:"mirror"},Qw={vertex:MR.VERTEX,fragment:MR.FRAGMENT,compute:MR.COMPUTE},Zw={instance:!0,swizzleAssign:!1,storageBuffer:!0},Jw={"^^":"tsl_xor"},eC={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"},tC={},rC={tsl_xor:new jx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new jx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new jx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new jx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new jx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new jx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new jx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new jx("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 jx("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 jx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new jx("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 jx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new jx("\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")},sC={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 iC="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(iC+="diagnostic( off, derivative_uniformity );\n");class nC extends FN{constructor(e,t){super(e,t,new Xw),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_${Yw[e.wrapS]}S_${Yw[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=tC[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===Ir?(s.push(rC.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===xe?(s.push(rC.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Ur?(s.push(rC.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",tC[t]=r=new jx(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 Ru(new hl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Ru(new hl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Ru(new hl("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=Jw[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."),ei.READ_WRITE):ei.READ_ONLY:e.access}getStorageAccess(e,t){return Kw[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 jS(i.name,i.node,o,n):new HS(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new qS(i.name,i.node,o,n):"texture3D"===t&&(s=new jS(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(Qw[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new Dw(`${i.name}_sampler`,i.node,o);e.setVisibility(Qw[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?OS:Ow)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|Qw[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e?(e=new GS(u,o),e.setVisibility(Qw[r]),this.uniformGroups[u]=e,l.push(e)):(e.setVisibility(e.getVisibility()|Qw[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=$w(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 eC[e]||e}isAvailable(e){let t=Zw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),Zw[e]=t),t}_getWGSLMethod(e){return void 0!==rC[e]&&this._include(e),sC[e]}_include(e){const t=rC[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${iC}\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 aC{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=LA:e.depth&&(t=BA),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?RR:e.isLineSegments||e.isMesh&&!0===t.wireframe?AR:e.isLine?ER:e.isMesh?wR: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 fA;if(e===be)return AA;throw new Error("Unsupported output buffer type.")}}const oC=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&&oC.set(Float16Array,["float16"]);const uC=new Map([[it,["float16"]]]),lC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class dC{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=Xr(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=Mw;let o;o=t.isSampledCubeTexture?ww:t.isSampledTexture3D?Cw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Ew: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&MR.COMPUTE&&(s.access===ei.READ_WRITE||s.access===ei.WRITE_ONLY)?e.type=hw:e.type=pw),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===ei.READ_WRITE?fw:t===ei.WRITE_ONLY?gw:mw,s.texture.isArrayTexture?e.viewDimension=Ew:s.texture.is3DTexture&&(e.viewDimension=Cw),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=Tw)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=Tw:t.sampleType=_w;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=vw:e===S?t.sampleType=Nw:e===j&&(this.backend.hasFeature("float32-filterable")?t.sampleType=xw:t.sampleType=Tw)}s.isSampledCubeTexture?t.viewDimension=ww:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=Ew:s.isSampledTexture3D&&(t.viewDimension=Cw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(A.TEXTURE_COMPARE)?t.type=bw:t.type=yw),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 pC{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===lt){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:QE},r={srcFactor:i,dstFactor:n,operation:QE}};if(e.premultipliedAlpha)switch(s){case ze:i(VE,$E,VE,$E);break;case Wt:i(VE,VE,VE,VE);break;case $t:i(OE,GE,OE,VE);break;case zt:i(WE,$E,OE,VE)}else switch(s){case ze:i(zE,$E,VE,$E);break;case Wt:i(zE,VE,VE,VE);break;case $t:o(`WebGPURenderer: "SubtractiveBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`);break;case zt: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 dt:t=OE;break;case Ot:t=VE;break;case It:t=kE;break;case Pt:t=GE;break;case $e:t=zE;break;case We:t=$E;break;case Dt:t=WE;break;case Lt:t=HE;break;case Ft:t=qE;break;case Bt:t=jE;break;case Ut:t=XE;break;case 211:t=KE;break;case 212:t=YE;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case rs:t=BR;break;case ts:t=OR;break;case es:t=LR;break;case Jr:t=FR;break;case Zr:t=PR;break;case Qr:t=IR;break;case Yr:t=DR;break;case Kr:t=UR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case ds:t=iw;break;case ls:t=nw;break;case us:t=aw;break;case os:t=ow;break;case as:t=uw;break;case ns:t=lw;break;case is:t=dw;break;case ss:t=cw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case He:t=QE;break;case Mt:t=ZE;break;case Ct:t=JE;break;case hs:t=ew;break;case cs:t=tw;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?qR:jR);let n=r.side===M;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?$R:zR,s.cullMode=r.side===B?WR:HR,s}_getColorWriteMask(e){return!0===e.colorWrite?sw:rw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=OR;else{const r=e.depthFunc;switch(r){case Zt:t=BR;break;case Qt:t=OR;break;case Yt:t=LR;break;case Kt:t=FR;break;case Xt:t=PR;break;case jt:t=IR;break;case qt:t=DR;break;case Ht:t=UR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class gC extends vR{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 mC extends iR{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 aC(this),this.attributeUtils=new dC(this),this.bindingUtils=new hC(this),this.pipelineUtils=new pC(this),this.textureUtils=new zw(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${nt} 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:kR}),this.initTimestampQuery(Et.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 SR(e)));super(new t(e),e),this.library=new bC,this.isWebGPURenderer=!0}}class TC extends As{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class _C{constructor(e,t=Rn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Yp;r.name="PostProcessing",this._quadMesh=new zb(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=fl(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 vC 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 NC extends tx{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class SC extends Es{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new ws(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),pn()):new this.nodes[e]}}class RC extends Cs{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 AC extends Ms{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 SC;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 RC;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);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}getSkinnedNormal(e=this.boneMatricesNode,t=$d){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);let d=Ma(s.x.mul(a),s.y.mul(o),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).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 t=this.getSkinnedNormal();$d.assign(t),e.hasGeometryAttribute("tangent")&&Dc.assign(t)}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=vn(t).toVar(),i=gn(r),n=i.mul(i).toVar(),a=vo(vn(n.mul(s.x),n.mul(s.y),s.z)).toVar(),o=a.x.mul(a.x).add(a.y.mul(a.y)),u=bu(o.greaterThan(0),vn(a.y.negate(),a.x,0).div(bo(o)),vn(1,0,0)).toVar(),l=Qo(a,u).toVar(),d=bo(e.x),c=La(2,3.14159265359).mul(e.y),h=d.mul(Ro(c)).toVar(),p=d.mul(So(c)).toVar(),g=La(.5,a.z.add(1));p.assign(g.oneMinus().mul(bo(h.mul(h).oneMinus())).add(g.mul(p)));const m=u.mul(h).add(l.mul(p)).add(a.mul(bo(Ho(0,h.mul(h).add(p.mul(p)).oneMinus()))));return vo(vn(n.mul(m.x),n.mul(m.y),Ho(0,m.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)}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 null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=FA:e.depth&&(t=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;t Date: Sun, 11 Jan 2026 10:25:39 +0100 Subject: [PATCH 5/5] Examples: Remove obsolete shadow bias from WebGPU demos. (#32715) --- examples/webgpu_backdrop_water.html | 11 ----------- examples/webgpu_camera_array.html | 1 - examples/webgpu_caustics.html | 1 - examples/webgpu_clipping.html | 1 - examples/webgpu_compute_particles_rain.html | 15 +-------------- examples/webgpu_compute_particles_snow.html | 13 ------------- examples/webgpu_instancing_morph.html | 2 -- examples/webgpu_lights_projector.html | 1 - examples/webgpu_lights_spotlight.html | 1 - examples/webgpu_postprocessing_motion_blur.html | 5 ++--- examples/webgpu_postprocessing_pixel.html | 2 -- examples/webgpu_postprocessing_ssgi.html | 1 - examples/webgpu_postprocessing_sss.html | 1 + examples/webgpu_reflection.html | 2 +- examples/webgpu_shadowmap_array.html | 1 - examples/webgpu_shadowmap_progressive.html | 1 - examples/webgpu_tsl_procedural_terrain.html | 1 - examples/webgpu_volume_caustics.html | 1 - examples/webgpu_volume_lighting.html | 1 - 19 files changed, 5 insertions(+), 57 deletions(-) diff --git a/examples/webgpu_backdrop_water.html b/examples/webgpu_backdrop_water.html index 1ed190d2bef31a..dfcfa8d1814b58 100644 --- a/examples/webgpu_backdrop_water.html +++ b/examples/webgpu_backdrop_water.html @@ -60,16 +60,6 @@ camera.lookAt( 0, 1, 0 ); const sunLight = new THREE.DirectionalLight( 0xFFE499, 5 ); - sunLight.castShadow = true; - sunLight.shadow.camera.near = .1; - sunLight.shadow.camera.far = 5; - sunLight.shadow.camera.right = 2; - sunLight.shadow.camera.left = - 2; - sunLight.shadow.camera.top = 1; - sunLight.shadow.camera.bottom = - 2; - sunLight.shadow.mapSize.width = 2048; - sunLight.shadow.mapSize.height = 2048; - sunLight.shadow.bias = - 0.001; sunLight.position.set( .5, 3, .5 ); const waterAmbientLight = new THREE.HemisphereLight( 0x333366, 0x74ccf4, 5 ); @@ -87,7 +77,6 @@ loader.load( 'models/gltf/Michelle.glb', function ( gltf ) { model = gltf.scene; - model.children[ 0 ].children[ 0 ].castShadow = true; mixer = new THREE.AnimationMixer( model ); diff --git a/examples/webgpu_camera_array.html b/examples/webgpu_camera_array.html index 81732701c72dca..cbf04b65e673a5 100644 --- a/examples/webgpu_camera_array.html +++ b/examples/webgpu_camera_array.html @@ -66,7 +66,6 @@ const light = new THREE.DirectionalLight( 0xffffff, 3 ); light.position.set( 0.5, 0.5, 1 ); light.castShadow = true; - light.shadow.bias = - 0.001; light.shadow.camera.zoom = 4; // tighter shadow map scene.add( light ); diff --git a/examples/webgpu_caustics.html b/examples/webgpu_caustics.html index 92b2c8bc987afa..01f7fd574293b7 100644 --- a/examples/webgpu_caustics.html +++ b/examples/webgpu_caustics.html @@ -67,7 +67,6 @@ spotLight.shadow.mapSize.height = 1024; spotLight.shadow.camera.near = .1; spotLight.shadow.camera.far = 1; - spotLight.shadow.bias = - .003; spotLight.shadow.intensity = .95; scene.add( spotLight ); diff --git a/examples/webgpu_clipping.html b/examples/webgpu_clipping.html index ea904d2a0a230e..5d90a29f54241e 100644 --- a/examples/webgpu_clipping.html +++ b/examples/webgpu_clipping.html @@ -61,7 +61,6 @@ spotLight.shadow.camera.far = 10; spotLight.shadow.mapSize.width = 2048; spotLight.shadow.mapSize.height = 2048; - spotLight.shadow.bias = - 0.002; spotLight.shadow.radius = 4; scene.add( spotLight ); diff --git a/examples/webgpu_compute_particles_rain.html b/examples/webgpu_compute_particles_rain.html index ed9153a7e60f35..308fb057aa274c 100644 --- a/examples/webgpu_compute_particles_rain.html +++ b/examples/webgpu_compute_particles_rain.html @@ -64,20 +64,9 @@ scene = new THREE.Scene(); const dirLight = new THREE.DirectionalLight( 0xffffff, .5 ); - dirLight.castShadow = true; dirLight.position.set( 3, 17, 17 ); - dirLight.castShadow = true; - dirLight.shadow.camera.near = 1; - dirLight.shadow.camera.far = 50; - dirLight.shadow.camera.right = 25; - dirLight.shadow.camera.left = - 25; - dirLight.shadow.camera.top = 25; - dirLight.shadow.camera.bottom = - 25; - dirLight.shadow.mapSize.width = 2048; - dirLight.shadow.mapSize.height = 2048; - dirLight.shadow.bias = - 0.01; - scene.add( dirLight ); + scene.add( new THREE.AmbientLight( 0x111111 ) ); // @@ -257,7 +246,6 @@ collisionBox.position.y = 12; collisionBox.scale.x = 3.5; collisionBox.layers.enable( 1 ); - collisionBox.castShadow = true; scene.add( collisionBox ); // @@ -268,7 +256,6 @@ geometry.computeVertexNormals(); monkey = new THREE.Mesh( geometry, new THREE.MeshStandardMaterial( { roughness: 1, metalness: 0 } ) ); - monkey.receiveShadow = true; monkey.scale.setScalar( 5 ); monkey.rotation.y = Math.PI / 2; monkey.position.y = 4.5; diff --git a/examples/webgpu_compute_particles_snow.html b/examples/webgpu_compute_particles_snow.html index dd0381845a9ec4..65dc3ec2bbf7fd 100644 --- a/examples/webgpu_compute_particles_snow.html +++ b/examples/webgpu_compute_particles_snow.html @@ -68,18 +68,7 @@ scene.fog = new THREE.Fog( 0x0f3c37, 5, 40 ); const dirLight = new THREE.DirectionalLight( 0xf9ff9b, 9 ); - dirLight.castShadow = true; dirLight.position.set( 10, 10, 0 ); - dirLight.castShadow = true; - dirLight.shadow.camera.near = 1; - dirLight.shadow.camera.far = 30; - dirLight.shadow.camera.right = 30; - dirLight.shadow.camera.left = - 30; - dirLight.shadow.camera.top = 30; - dirLight.shadow.camera.bottom = - 30; - dirLight.shadow.mapSize.width = 2048; - dirLight.shadow.mapSize.height = 2048; - dirLight.shadow.bias = - 0.009; scene.add( dirLight ); scene.add( new THREE.HemisphereLight( 0x0f3c37, 0x080d10, 100 ) ); @@ -200,7 +189,6 @@ const rainParticles = new THREE.Mesh( geometry, staticMaterial ); rainParticles.count = maxParticleCount; - rainParticles.castShadow = true; rainParticles.layers.disableAll(); rainParticles.layers.enable( layer ); @@ -249,7 +237,6 @@ const coneGeometry = new THREE.ConeGeometry( radius * 0.95, radius * 1.25, 32 ); const cone = new THREE.Mesh( coneGeometry, coneMaterial ); - cone.castShadow = true; cone.position.y = ( ( count - i ) * 1.5 ) + ( count * .6 ); object.add( cone ); diff --git a/examples/webgpu_instancing_morph.html b/examples/webgpu_instancing_morph.html index 259df95e2fc382..c535b4558ce53d 100644 --- a/examples/webgpu_instancing_morph.html +++ b/examples/webgpu_instancing_morph.html @@ -80,8 +80,6 @@ light.shadow.camera.bottom = - 5000; light.shadow.camera.far = 2000; - light.shadow.bias = - 0.01; - light.shadow.camera.updateProjectionMatrix(); scene.add( light ); diff --git a/examples/webgpu_lights_projector.html b/examples/webgpu_lights_projector.html index 9f3673397eaa78..e4e67aab5efc04 100644 --- a/examples/webgpu_lights_projector.html +++ b/examples/webgpu_lights_projector.html @@ -117,7 +117,6 @@ projectorLight.shadow.camera.near = 1; projectorLight.shadow.camera.far = 10; projectorLight.shadow.focus = 1; - projectorLight.shadow.bias = - .003; scene.add( projectorLight ); lightHelper = new THREE.SpotLightHelper( projectorLight ); diff --git a/examples/webgpu_lights_spotlight.html b/examples/webgpu_lights_spotlight.html index 71c01eac5aa032..ab919c860560fd 100644 --- a/examples/webgpu_lights_spotlight.html +++ b/examples/webgpu_lights_spotlight.html @@ -117,7 +117,6 @@ spotLight.shadow.camera.near = 2; spotLight.shadow.camera.far = 10; spotLight.shadow.focus = 1; - spotLight.shadow.bias = - .003; spotLight.shadow.intensity = 1; scene.add( spotLight ); diff --git a/examples/webgpu_postprocessing_motion_blur.html b/examples/webgpu_postprocessing_motion_blur.html index c8624148c3327e..2f4923578746fb 100644 --- a/examples/webgpu_postprocessing_motion_blur.html +++ b/examples/webgpu_postprocessing_motion_blur.html @@ -68,9 +68,8 @@ sunLight.shadow.camera.left = - 2; sunLight.shadow.camera.top = 2; sunLight.shadow.camera.bottom = - 2; - sunLight.shadow.mapSize.width = 2048; - sunLight.shadow.mapSize.height = 2048; - sunLight.shadow.bias = - 0.001; + sunLight.shadow.mapSize.width = 1024; + sunLight.shadow.mapSize.height = 1024; sunLight.position.set( 4, 4, 2 ); const waterAmbientLight = new THREE.HemisphereLight( 0x333366, 0x74ccf4, 5 ); diff --git a/examples/webgpu_postprocessing_pixel.html b/examples/webgpu_postprocessing_pixel.html index 5b12c68fa7f767..a2bc503596a92f 100644 --- a/examples/webgpu_postprocessing_pixel.html +++ b/examples/webgpu_postprocessing_pixel.html @@ -119,7 +119,6 @@ directionalLight.position.set( 100, 100, 100 ); directionalLight.castShadow = true; directionalLight.shadow.mapSize.set( 2048, 2048 ); - directionalLight.shadow.bias = - 0.0001; scene.add( directionalLight ); const spotLight = new THREE.SpotLight( 0xffc100, 10, 10, Math.PI / 16, .02, 2 ); @@ -128,7 +127,6 @@ scene.add( target ); target.position.set( 0, 0, 0 ); spotLight.castShadow = true; - spotLight.shadow.bias = - 0.001; scene.add( spotLight ); renderer = new THREE.WebGPURenderer(); diff --git a/examples/webgpu_postprocessing_ssgi.html b/examples/webgpu_postprocessing_ssgi.html index c0d9a76d80601c..5c1ad385b2627f 100644 --- a/examples/webgpu_postprocessing_ssgi.html +++ b/examples/webgpu_postprocessing_ssgi.html @@ -205,7 +205,6 @@ pointLight.castShadow = true; pointLight.shadow.mapSize.width = 1024; pointLight.shadow.mapSize.height = 1024; - pointLight.shadow.bias = - 0.0025; scene.add( pointLight ); // Ambient light diff --git a/examples/webgpu_postprocessing_sss.html b/examples/webgpu_postprocessing_sss.html index fd6ab9321188df..28338132841eb2 100644 --- a/examples/webgpu_postprocessing_sss.html +++ b/examples/webgpu_postprocessing_sss.html @@ -67,6 +67,7 @@ const dirLight = new THREE.DirectionalLight( 0xffffff, 3 ); dirLight.position.set( - 3, 10, - 10 ); dirLight.castShadow = true; + dirLight.shadow.bias = - 0.001; // remove self-shadowing artifacts dirLight.shadow.camera.top = 4; dirLight.shadow.camera.bottom = - 4; dirLight.shadow.camera.left = - 4; diff --git a/examples/webgpu_reflection.html b/examples/webgpu_reflection.html index 6edab4496380a8..02088fd26c0d52 100644 --- a/examples/webgpu_reflection.html +++ b/examples/webgpu_reflection.html @@ -71,7 +71,7 @@ sunLight.castShadow = true; sunLight.shadow.camera.zoom = 1.5; sunLight.shadow.mapSize.set( 1024, 1024 ); - sunLight.shadow.bias = - 0.0001; + sunLight.shadow.bias = - 0.0001; // remove self-shadowing artifacts scene.add( sunLight ); const backLight = new THREE.DirectionalLight( 0x0487e2, 0.5 ); diff --git a/examples/webgpu_shadowmap_array.html b/examples/webgpu_shadowmap_array.html index 0e3ceb7eb192fe..7554c9df8af0cf 100644 --- a/examples/webgpu_shadowmap_array.html +++ b/examples/webgpu_shadowmap_array.html @@ -93,7 +93,6 @@ dirLight.shadow.mapSize.width = 1024 * 4; dirLight.shadow.mapSize.height = 1024 * 4; dirLight.shadow.radius = 1; - dirLight.shadow.bias = - 0.005; // Set up the tile shadow mapping const tsm = new TileShadowNode( dirLight, { diff --git a/examples/webgpu_shadowmap_progressive.html b/examples/webgpu_shadowmap_progressive.html index bedb2f72ba561a..261c303982ca18 100644 --- a/examples/webgpu_shadowmap_progressive.html +++ b/examples/webgpu_shadowmap_progressive.html @@ -108,7 +108,6 @@ dirLight.shadow.camera.bottom = - 150; dirLight.shadow.mapSize.width = shadowMapRes; dirLight.shadow.mapSize.height = shadowMapRes; - dirLight.shadow.bias = - 0.001; lightmapObjects.push( dirLight ); dirLights.push( dirLight ); diff --git a/examples/webgpu_tsl_procedural_terrain.html b/examples/webgpu_tsl_procedural_terrain.html index a28710937040a7..34dd2ef9309117 100644 --- a/examples/webgpu_tsl_procedural_terrain.html +++ b/examples/webgpu_tsl_procedural_terrain.html @@ -79,7 +79,6 @@ directionalLight.shadow.camera.bottom = - 8; directionalLight.shadow.camera.left = - 8; directionalLight.shadow.normalBias = 0.05; - directionalLight.shadow.bias = 0; scene.add( directionalLight ); // terrain diff --git a/examples/webgpu_volume_caustics.html b/examples/webgpu_volume_caustics.html index 35e4578b96f6e3..ba4e5308897131 100644 --- a/examples/webgpu_volume_caustics.html +++ b/examples/webgpu_volume_caustics.html @@ -74,7 +74,6 @@ spotLight.shadow.mapSize.height = 1024; spotLight.shadow.camera.near = .1; spotLight.shadow.camera.far = 1; - spotLight.shadow.bias = - .003; spotLight.shadow.intensity = .95; spotLight.layers.enable( LAYER_VOLUMETRIC_LIGHTING ); scene.add( spotLight ); diff --git a/examples/webgpu_volume_lighting.html b/examples/webgpu_volume_lighting.html index f1d743fc50a035..f0b83439056e90 100644 --- a/examples/webgpu_volume_lighting.html +++ b/examples/webgpu_volume_lighting.html @@ -187,7 +187,6 @@ spotLight.shadow.camera.near = 1; spotLight.shadow.camera.far = 15; spotLight.shadow.focus = 1; - spotLight.shadow.bias = - .003; spotLight.layers.enable( LAYER_VOLUMETRIC_LIGHTING ); //sunLight.add( new THREE.Mesh( new THREE.SphereGeometry( 0.1, 16, 16 ), new THREE.MeshBasicMaterial( { color: 0xffffff } ) ) ); scene.add( spotLight );