From b55fc7309ba04f995524811c7ccb3dd431c007a2 Mon Sep 17 00:00:00 2001 From: Mugen87 Date: Thu, 23 Jan 2025 10:34:43 +0100 Subject: [PATCH 1/2] XRManager: Fix tone mapping and output color space. --- src/renderers/common/Renderer.js | 8 ++++++-- src/renderers/common/XRManager.js | 3 +-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/renderers/common/Renderer.js b/src/renderers/common/Renderer.js index 6463696ff0c625..47dce1a7a9ed8e 100644 --- a/src/renderers/common/Renderer.js +++ b/src/renderers/common/Renderer.js @@ -1394,7 +1394,11 @@ class Renderer { } + const currentXREnabled = this.xr.enabled; + + this.xr.enabled = false; this._renderScene( quad, quad.camera, false ); + this.xr.enabled = currentXREnabled; } @@ -1992,7 +1996,7 @@ class Renderer { */ get currentToneMapping() { - return this._renderTarget !== null ? NoToneMapping : this.toneMapping; + return ( this._renderTarget !== null && this._renderTarget.isXRRenderTarget !== true ) ? NoToneMapping : this.toneMapping; } @@ -2004,7 +2008,7 @@ class Renderer { */ get currentColorSpace() { - return this._renderTarget !== null ? LinearSRGBColorSpace : this.outputColorSpace; + return ( this._renderTarget !== null && this._renderTarget.isXRRenderTarget !== true ) ? LinearSRGBColorSpace : this.outputColorSpace; } diff --git a/src/renderers/common/XRManager.js b/src/renderers/common/XRManager.js index 7dc379d39ee939..a75efb24e2c888 100644 --- a/src/renderers/common/XRManager.js +++ b/src/renderers/common/XRManager.js @@ -632,8 +632,7 @@ class XRManager extends EventDispatcher { type: UnsignedByteType, colorSpace: renderer.outputColorSpace, depthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ), - stencilBuffer: attributes.stencil, - samples: attributes.antialias ? 4 : 0 + stencilBuffer: attributes.stencil } ); this._xrRenderTarget.hasExternalTextures = true; From bfca37ad9f55c546c708e297e798b9b5ac12de2b Mon Sep 17 00:00:00 2001 From: Mugen87 Date: Thu, 23 Jan 2025 10:42:42 +0100 Subject: [PATCH 2/2] Update builds. --- build/three.cjs | 8 + build/three.core.js | 9 +- build/three.core.min.js | 2 +- build/three.module.js | 2 +- build/three.module.min.js | 2 +- build/three.tsl.js | 4 +- build/three.tsl.min.js | 2 +- build/three.webgpu.js | 1600 +++++++++++++++++++++++++------ build/three.webgpu.min.js | 2 +- build/three.webgpu.nodes.js | 1600 +++++++++++++++++++++++++------ build/three.webgpu.nodes.min.js | 2 +- 11 files changed, 2665 insertions(+), 568 deletions(-) diff --git a/build/three.cjs b/build/three.cjs index bab896cc65368b..10b79204145bc6 100644 --- a/build/three.cjs +++ b/build/three.cjs @@ -217,6 +217,11 @@ const GLSL3 = '300 es'; const WebGLCoordinateSystem = 2000; const WebGPUCoordinateSystem = 2001; +const TimestampQuery = { + COMPUTE: 'compute', + RENDER: 'render' +}; + /** * https://github.com/mrdoob/eventdispatcher.js/ */ @@ -17863,6 +17868,8 @@ class VideoFrameTexture extends VideoTexture { super( {}, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + this.isVideoFrameTexture = true; + } update() { @@ -55073,6 +55080,7 @@ exports.TetrahedronGeometry = TetrahedronGeometry; exports.Texture = Texture; exports.TextureLoader = TextureLoader; exports.TextureUtils = TextureUtils; +exports.TimestampQuery = TimestampQuery; exports.TorusGeometry = TorusGeometry; exports.TorusKnotGeometry = TorusKnotGeometry; exports.Triangle = Triangle; diff --git a/build/three.core.js b/build/three.core.js index 66a6810d2f5d23..b537c2854428a8 100644 --- a/build/three.core.js +++ b/build/three.core.js @@ -215,6 +215,11 @@ const GLSL3 = '300 es'; const WebGLCoordinateSystem = 2000; const WebGPUCoordinateSystem = 2001; +const TimestampQuery = { + COMPUTE: 'compute', + RENDER: 'render' +}; + /** * https://github.com/mrdoob/eventdispatcher.js/ */ @@ -17861,6 +17866,8 @@ class VideoFrameTexture extends VideoTexture { super( {}, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + this.isVideoFrameTexture = true; + } update() { @@ -37411,4 +37418,4 @@ if ( typeof window !== 'undefined' ) { } -export { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, Controls, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, GLBufferAttribute, GLSL1, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, Path, PerspectiveCamera, Plane, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RAD2DEG, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, 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, RGBDepthPacking, RGBFormat, RGBIntegerFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGDepthPacking, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RenderTarget, RenderTarget3D, RenderTargetArray, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry, Texture, TextureLoader, TextureUtils, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGPUCoordinateSystem, WebXRController, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, arrayNeedsUint32, cloneUniforms, createCanvasElement, createElementNS, getByteLength, getUnlitUniformColorSpace, mergeUniforms, probeAsync, toNormalizedProjectionMatrix, toReversedProjectionMatrix, warnOnce }; +export { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, Controls, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, GLBufferAttribute, GLSL1, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, Path, PerspectiveCamera, Plane, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RAD2DEG, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, 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, RGBDepthPacking, RGBFormat, RGBIntegerFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGDepthPacking, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RenderTarget, RenderTarget3D, RenderTargetArray, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry, Texture, TextureLoader, TextureUtils, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGPUCoordinateSystem, WebXRController, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, arrayNeedsUint32, cloneUniforms, createCanvasElement, createElementNS, getByteLength, getUnlitUniformColorSpace, mergeUniforms, probeAsync, toNormalizedProjectionMatrix, toReversedProjectionMatrix, warnOnce }; diff --git a/build/three.core.min.js b/build/three.core.min.js index 3a279220ff6bde..6c04db47d47b58 100644 --- a/build/three.core.min.js +++ b/build/three.core.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2025 Three.js Authors * SPDX-License-Identifier: MIT */ -const t="173dev",e={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},i={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},s=0,r=1,n=2,a=3,o=0,h=1,l=2,c=3,u=0,d=1,p=2,m=0,y=1,g=2,f=3,x=4,b=5,v=100,w=101,M=102,S=103,_=104,A=200,T=201,z=202,C=203,I=204,B=205,k=206,R=207,E=208,P=209,O=210,F=211,N=212,L=213,V=214,j=0,W=1,U=2,D=3,H=4,q=5,J=6,X=7,Y=0,Z=1,G=2,$=0,Q=1,K=2,tt=3,et=4,it=5,st=6,rt=7,nt="attached",at="detached",ot=300,ht=301,lt=302,ct=303,ut=304,dt=306,pt=1e3,mt=1001,yt=1002,gt=1003,ft=1004,xt=1004,bt=1005,vt=1005,wt=1006,Mt=1007,St=1007,_t=1008,At=1008,Tt=1009,zt=1010,Ct=1011,It=1012,Bt=1013,kt=1014,Rt=1015,Et=1016,Pt=1017,Ot=1018,Ft=1020,Nt=35902,Lt=1021,Vt=1022,jt=1023,Wt=1024,Ut=1025,Dt=1026,Ht=1027,qt=1028,Jt=1029,Xt=1030,Yt=1031,Zt=1032,Gt=1033,$t=33776,Qt=33777,Kt=33778,te=33779,ee=35840,ie=35841,se=35842,re=35843,ne=36196,ae=37492,oe=37496,he=37808,le=37809,ce=37810,ue=37811,de=37812,pe=37813,me=37814,ye=37815,ge=37816,fe=37817,xe=37818,be=37819,ve=37820,we=37821,Me=36492,Se=36494,_e=36495,Ae=36283,Te=36284,ze=36285,Ce=36286,Ie=2200,Be=2201,ke=2202,Re=2300,Ee=2301,Pe=2302,Oe=2400,Fe=2401,Ne=2402,Le=2500,Ve=2501,je=0,We=1,Ue=2,De=3200,He=3201,qe=3202,Je=3203,Xe=0,Ye=1,Ze="",Ge="srgb",$e="srgb-linear",Qe="linear",Ke="srgb",ti=0,ei=7680,ii=7681,si=7682,ri=7683,ni=34055,ai=34056,oi=5386,hi=512,li=513,ci=514,ui=515,di=516,pi=517,mi=518,yi=519,gi=512,fi=513,xi=514,bi=515,vi=516,wi=517,Mi=518,Si=519,_i=35044,Ai=35048,Ti=35040,zi=35045,Ci=35049,Ii=35041,Bi=35046,ki=35050,Ri=35042,Ei="100",Pi="300 es",Oi=2e3,Fi=2001;class Ni{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)}hasEventListener(t,e){const i=this._listeners;return void 0!==i&&(void 0!==i[t]&&-1!==i[t].indexOf(e))}removeEventListener(t,e){const i=this._listeners;if(void 0===i)return;const s=i[t];if(void 0!==s){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}}dispatchEvent(t){const e=this._listeners;if(void 0===e)return;const i=e[t.type];if(void 0!==i){t.target=this;const e=i.slice(0);for(let i=0,s=e.length;i>8&255]+Li[t>>16&255]+Li[t>>24&255]+"-"+Li[255&e]+Li[e>>8&255]+"-"+Li[e>>16&15|64]+Li[e>>24&255]+"-"+Li[63&i|128]+Li[i>>8&255]+"-"+Li[i>>16&255]+Li[i>>24&255]+Li[255&s]+Li[s>>8&255]+Li[s>>16&255]+Li[s>>24&255]).toLowerCase()}function Di(t,e,i){return Math.max(e,Math.min(i,t))}function Hi(t,e){return(t%e+e)%e}function qi(t,e,i){return(1-i)*t+i*e}function Ji(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function Xi(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const Yi={DEG2RAD:ji,RAD2DEG:Wi,generateUUID:Ui,clamp:Di,euclideanModulo:Hi,mapLinear:function(t,e,i,s,r){return s+(t-e)*(r-s)/(i-e)},inverseLerp:function(t,e,i){return t!==e?(i-t)/(e-t):0},lerp:qi,damp:function(t,e,i,s){return qi(t,e,1-Math.exp(-i*s))},pingpong:function(t,e=1){return e-Math.abs(Hi(t,2*e)-e)},smoothstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){void 0!==t&&(Vi=t);let e=Vi+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296},degToRad:function(t){return t*ji},radToDeg:function(t){return t*Wi},isPowerOfTwo:function(t){return!(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,i,s,r){const n=Math.cos,a=Math.sin,o=n(i/2),h=a(i/2),l=n((e+s)/2),c=a((e+s)/2),u=n((e-s)/2),d=a((e-s)/2),p=n((s-e)/2),m=a((s-e)/2);switch(r){case"XYX":t.set(o*c,h*u,h*d,o*l);break;case"YZY":t.set(h*d,o*c,h*u,o*l);break;case"ZXZ":t.set(h*u,h*d,o*c,o*l);break;case"XZX":t.set(o*c,h*m,h*p,o*l);break;case"YXY":t.set(h*p,o*c,h*m,o*l);break;case"ZYZ":t.set(h*m,h*p,o*c,o*l);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:Xi,denormalize:Ji};class Zi{constructor(t=0,e=0){Zi.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,s=t.elements;return this.x=s[0]*e+s[3]*i+s[6],this.y=s[1]*e+s[4]*i+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Di(this.x,t.x,e.x),this.y=Di(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=Di(this.x,t,e),this.y=Di(this.y,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Di(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(Di(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),s=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*i-n*s+t.x,this.y=r*s+n*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Gi{constructor(t,e,i,s,r,n,a,o,h){Gi.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h)}set(t,e,i,s,r,n,a,o,h){const l=this.elements;return l[0]=t,l[1]=s,l[2]=a,l[3]=e,l[4]=r,l[5]=o,l[6]=i,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[3],o=i[6],h=i[1],l=i[4],c=i[7],u=i[2],d=i[5],p=i[8],m=s[0],y=s[3],g=s[6],f=s[1],x=s[4],b=s[7],v=s[2],w=s[5],M=s[8];return r[0]=n*m+a*f+o*v,r[3]=n*y+a*x+o*w,r[6]=n*g+a*b+o*M,r[1]=h*m+l*f+c*v,r[4]=h*y+l*x+c*w,r[7]=h*g+l*b+c*M,r[2]=u*m+d*f+p*v,r[5]=u*y+d*x+p*w,r[8]=u*g+d*b+p*M,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8];return e*n*l-e*a*h-i*r*l+i*a*o+s*r*h-s*n*o}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=l*n-a*h,u=a*o-l*r,d=h*r-n*o,p=e*c+i*u+s*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=c*m,t[1]=(s*h-l*i)*m,t[2]=(a*i-s*n)*m,t[3]=u*m,t[4]=(l*e-s*o)*m,t[5]=(s*r-a*e)*m,t[6]=d*m,t[7]=(i*o-h*e)*m,t[8]=(n*e-i*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,s,r,n,a){const o=Math.cos(r),h=Math.sin(r);return this.set(i*o,i*h,-i*(o*n+h*a)+n+t,-s*h,s*o,-s*(-h*n+o*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply($i.makeScale(t,e)),this}rotate(t){return this.premultiply($i.makeRotation(-t)),this}translate(t,e){return this.premultiply($i.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,i,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const $i=new Gi;function Qi(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}const Ki={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function ts(t,e){return new Ki[t](e)}function es(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function is(){const t=es("canvas");return t.style.display="block",t}const ss={};function rs(t){t in ss||(ss[t]=!0,console.warn(t))}function ns(t,e,i){return new Promise((function(s,r){setTimeout((function n(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:r();break;case t.TIMEOUT_EXPIRED:setTimeout(n,i);break;default:s()}}),i)}))}function as(t){const e=t.elements;e[2]=.5*e[2]+.5*e[3],e[6]=.5*e[6]+.5*e[7],e[10]=.5*e[10]+.5*e[11],e[14]=.5*e[14]+.5*e[15]}function os(t){const e=t.elements;-1===e[11]?(e[10]=-e[10]-1,e[14]=-e[14]):(e[10]=-e[10],e[14]=1-e[14])}const hs=(new Gi).set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),ls=(new Gi).set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function cs(){const t={enabled:!0,workingColorSpace:$e,spaces:{},convert:function(t,e,i){return!1!==this.enabled&&e!==i&&e&&i?(this.spaces[e].transfer===Ke&&(t.r=ds(t.r),t.g=ds(t.g),t.b=ds(t.b)),this.spaces[e].primaries!==this.spaces[i].primaries&&(t.applyMatrix3(this.spaces[e].toXYZ),t.applyMatrix3(this.spaces[i].fromXYZ)),this.spaces[i].transfer===Ke&&(t.r=ps(t.r),t.g=ps(t.g),t.b=ps(t.b)),t):t},fromWorkingColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},toWorkingColorSpace:function(t,e){return this.convert(t,e,this.workingColorSpace)},getPrimaries:function(t){return this.spaces[t].primaries},getTransfer:function(t){return""===t?Qe:this.spaces[t].transfer},getLuminanceCoefficients:function(t,e=this.workingColorSpace){return t.fromArray(this.spaces[e].luminanceCoefficients)},define:function(t){Object.assign(this.spaces,t)},_getMatrix:function(t,e,i){return t.copy(this.spaces[e].toXYZ).multiply(this.spaces[i].fromXYZ)},_getDrawingBufferColorSpace:function(t){return this.spaces[t].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(t=this.workingColorSpace){return this.spaces[t].workingColorSpaceConfig.unpackColorSpace}},e=[.64,.33,.3,.6,.15,.06],i=[.2126,.7152,.0722],s=[.3127,.329];return t.define({[$e]:{primaries:e,whitePoint:s,transfer:Qe,toXYZ:hs,fromXYZ:ls,luminanceCoefficients:i,workingColorSpaceConfig:{unpackColorSpace:Ge},outputColorSpaceConfig:{drawingBufferColorSpace:Ge}},[Ge]:{primaries:e,whitePoint:s,transfer:Ke,toXYZ:hs,fromXYZ:ls,luminanceCoefficients:i,outputColorSpaceConfig:{drawingBufferColorSpace:Ge}}}),t}const us=cs();function ds(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function ps(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}let ms;class ys{static getDataURL(t){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{void 0===ms&&(ms=es("canvas")),ms.width=t.width,ms.height=t.height;const i=ms.getContext("2d");t instanceof ImageData?i.putImageData(t,0,0):i.drawImage(t,0,0,t.width,t.height),e=ms}return e.toDataURL("image/png")}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=es("canvas");e.width=t.width,e.height=t.height;const i=e.getContext("2d");i.drawImage(t,0,0,t.width,t.height);const s=i.getImageData(0,0,t.width,t.height),r=s.data;for(let t=0;t0&&(i.userData=this.userData),e||(t.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==ot)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case pt:t.x=t.x-Math.floor(t.x);break;case mt:t.x=t.x<0?0:1;break;case yt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case pt:t.y=t.y-Math.floor(t.y);break;case mt:t.y=t.y<0?0:1;break;case yt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){!0===t&&this.pmremVersion++}}vs.DEFAULT_IMAGE=null,vs.DEFAULT_MAPPING=ot,vs.DEFAULT_ANISOTROPY=1;class ws{constructor(t=0,e=0,i=0,s=1){ws.prototype.isVector4=!0,this.x=t,this.y=e,this.z=i,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,s){return this.x=t,this.y=e,this.z=i,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*i+n[8]*s+n[12]*r,this.y=n[1]*e+n[5]*i+n[9]*s+n[13]*r,this.z=n[2]*e+n[6]*i+n[10]*s+n[14]*r,this.w=n[3]*e+n[7]*i+n[11]*s+n[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,s,r;const n=.01,a=.1,o=t.elements,h=o[0],l=o[4],c=o[8],u=o[1],d=o[5],p=o[9],m=o[2],y=o[6],g=o[10];if(Math.abs(l-u)o&&t>f?tf?o=0?1:-1,s=1-e*e;if(s>Number.EPSILON){const r=Math.sqrt(s),n=Math.atan2(r,e*i);t=Math.sin(t*n)/r,a=Math.sin(a*n)/r}const r=a*i;if(o=o*t+u*r,h=h*t+d*r,l=l*t+p*r,c=c*t+m*r,t===1-a){const t=1/Math.sqrt(o*o+h*h+l*l+c*c);o*=t,h*=t,l*=t,c*=t}}t[e]=o,t[e+1]=h,t[e+2]=l,t[e+3]=c}static multiplyQuaternionsFlat(t,e,i,s,r,n){const a=i[s],o=i[s+1],h=i[s+2],l=i[s+3],c=r[n],u=r[n+1],d=r[n+2],p=r[n+3];return t[e]=a*p+l*c+o*d-h*u,t[e+1]=o*p+l*u+h*c-a*d,t[e+2]=h*p+l*d+a*u-o*c,t[e+3]=l*p-a*c-o*u-h*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,s){return this._x=t,this._y=e,this._z=i,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const i=t._x,s=t._y,r=t._z,n=t._order,a=Math.cos,o=Math.sin,h=a(i/2),l=a(s/2),c=a(r/2),u=o(i/2),d=o(s/2),p=o(r/2);switch(n){case"XYZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"YXZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"ZXY":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"ZYX":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"YZX":this._x=u*l*c+h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c-u*d*p;break;case"XZY":this._x=u*l*c-h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,s=Math.sin(i);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],s=e[4],r=e[8],n=e[1],a=e[5],o=e[9],h=e[2],l=e[6],c=e[10],u=i+a+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-o)*t,this._y=(r-h)*t,this._z=(n-s)*t}else if(i>a&&i>c){const t=2*Math.sqrt(1+i-a-c);this._w=(l-o)/t,this._x=.25*t,this._y=(s+n)/t,this._z=(r+h)/t}else if(a>c){const t=2*Math.sqrt(1+a-i-c);this._w=(r-h)/t,this._x=(s+n)/t,this._y=.25*t,this._z=(o+l)/t}else{const t=2*Math.sqrt(1+c-i-a);this._w=(n-s)/t,this._x=(r+h)/t,this._y=(o+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return iMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(Di(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const s=Math.min(1,e/i);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,s=t._y,r=t._z,n=t._w,a=e._x,o=e._y,h=e._z,l=e._w;return this._x=i*l+n*a+s*h-r*o,this._y=s*l+n*o+r*a-i*h,this._z=r*l+n*h+i*o-s*a,this._w=n*l-i*a-s*o-r*h,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const i=this._x,s=this._y,r=this._z,n=this._w;let a=n*t._w+i*t._x+s*t._y+r*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),a>=1)return this._w=n,this._x=i,this._y=s,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const t=1-e;return this._w=t*n+e*this._w,this._x=t*i+e*this._x,this._y=t*s+e*this._y,this._z=t*r+e*this._z,this.normalize(),this}const h=Math.sqrt(o),l=Math.atan2(h,a),c=Math.sin((1-e)*l)/h,u=Math.sin(e*l)/h;return this._w=n*c+this._w*u,this._x=i*c+this._x*u,this._y=s*c+this._y*u,this._z=r*c+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,i){return this.copy(t).slerp(e,i)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),i=Math.random(),s=Math.sqrt(1-i),r=Math.sqrt(i);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class Is{constructor(t=0,e=0,i=0){Is.prototype.isVector3=!0,this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(ks.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(ks.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*s,this.y=r[1]*e+r[4]*i+r[7]*s,this.z=r[2]*e+r[5]*i+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=t.elements,n=1/(r[3]*e+r[7]*i+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*s+r[12])*n,this.y=(r[1]*e+r[5]*i+r[9]*s+r[13])*n,this.z=(r[2]*e+r[6]*i+r[10]*s+r[14])*n,this}applyQuaternion(t){const e=this.x,i=this.y,s=this.z,r=t.x,n=t.y,a=t.z,o=t.w,h=2*(n*s-a*i),l=2*(a*e-r*s),c=2*(r*i-n*e);return this.x=e+o*h+n*c-a*l,this.y=i+o*l+a*h-r*c,this.z=s+o*c+r*l-n*h,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*s,this.y=r[1]*e+r[5]*i+r[9]*s,this.z=r[2]*e+r[6]*i+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Di(this.x,t.x,e.x),this.y=Di(this.y,t.y,e.y),this.z=Di(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=Di(this.x,t,e),this.y=Di(this.y,t,e),this.z=Di(this.z,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Di(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,s=t.y,r=t.z,n=e.x,a=e.y,o=e.z;return this.x=s*o-r*a,this.y=r*n-i*o,this.z=i*a-s*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return Bs.copy(this).projectOnVector(t),this.sub(Bs)}reflect(t){return this.sub(Bs.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(Di(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,s=this.z-t.z;return e*e+i*i+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const s=Math.sin(e)*t;return this.x=s*Math.sin(i),this.y=Math.cos(e)*t,this.z=s*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=2*Math.random()-1,i=Math.sqrt(1-e*e);return this.x=i*Math.cos(t),this.y=e,this.z=i*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Bs=new Is,ks=new Cs;class Rs{constructor(t=new Is(1/0,1/0,1/0),e=new Is(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){this.makeEmpty();for(let e=0,i=t.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,Ps),Ps.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(Us),Ds.subVectors(this.max,Us),Fs.subVectors(t.a,Us),Ns.subVectors(t.b,Us),Ls.subVectors(t.c,Us),Vs.subVectors(Ns,Fs),js.subVectors(Ls,Ns),Ws.subVectors(Fs,Ls);let e=[0,-Vs.z,Vs.y,0,-js.z,js.y,0,-Ws.z,Ws.y,Vs.z,0,-Vs.x,js.z,0,-js.x,Ws.z,0,-Ws.x,-Vs.y,Vs.x,0,-js.y,js.x,0,-Ws.y,Ws.x,0];return!!Js(e,Fs,Ns,Ls,Ds)&&(e=[1,0,0,0,1,0,0,0,1],!!Js(e,Fs,Ns,Ls,Ds)&&(Hs.crossVectors(Vs,js),e=[Hs.x,Hs.y,Hs.z],Js(e,Fs,Ns,Ls,Ds)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Ps).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize(Ps).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(Es[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Es[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Es[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Es[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Es[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Es[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Es[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Es[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Es)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const Es=[new Is,new Is,new Is,new Is,new Is,new Is,new Is,new Is],Ps=new Is,Os=new Rs,Fs=new Is,Ns=new Is,Ls=new Is,Vs=new Is,js=new Is,Ws=new Is,Us=new Is,Ds=new Is,Hs=new Is,qs=new Is;function Js(t,e,i,s,r){for(let n=0,a=t.length-3;n<=a;n+=3){qs.fromArray(t,n);const a=r.x*Math.abs(qs.x)+r.y*Math.abs(qs.y)+r.z*Math.abs(qs.z),o=e.dot(qs),h=i.dot(qs),l=s.dot(qs);if(Math.max(-Math.max(o,h,l),Math.min(o,h,l))>a)return!1}return!0}const Xs=new Rs,Ys=new Is,Zs=new Is;class Gs{constructor(t=new Is,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const i=this.center;void 0!==e?i.copy(e):Xs.setFromPoints(t).getCenter(i);let s=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;Ys.subVectors(t,this.center);const e=Ys.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),i=.5*(t-this.radius);this.center.addScaledVector(Ys,i/t),this.radius+=i}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(Zs.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(Ys.copy(t.center).add(Zs)),this.expandByPoint(Ys.copy(t.center).sub(Zs))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const $s=new Is,Qs=new Is,Ks=new Is,tr=new Is,er=new Is,ir=new Is,sr=new Is;class rr{constructor(t=new Is,e=new Is(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,$s)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,i)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=$s.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):($s.copy(this.origin).addScaledVector(this.direction,e),$s.distanceToSquared(t))}distanceSqToSegment(t,e,i,s){Qs.copy(t).add(e).multiplyScalar(.5),Ks.copy(e).sub(t).normalize(),tr.copy(this.origin).sub(Qs);const r=.5*t.distanceTo(e),n=-this.direction.dot(Ks),a=tr.dot(this.direction),o=-tr.dot(Ks),h=tr.lengthSq(),l=Math.abs(1-n*n);let c,u,d,p;if(l>0)if(c=n*o-a,u=n*a-o,p=r*l,c>=0)if(u>=-p)if(u<=p){const t=1/l;c*=t,u*=t,d=c*(c+n*u+2*a)+u*(n*c+u+2*o)+h}else u=r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u=-r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u<=-p?(c=Math.max(0,-(-n*r+a)),u=c>0?-r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h):u<=p?(c=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+h):(c=Math.max(0,-(n*r+a)),u=c>0?r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h);else u=n>0?-r:r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;return i&&i.copy(this.origin).addScaledVector(this.direction,c),s&&s.copy(Qs).addScaledVector(Ks,u),d}intersectSphere(t,e){$s.subVectors(t.center,this.origin);const i=$s.dot(this.direction),s=$s.dot($s)-i*i,r=t.radius*t.radius;if(s>r)return null;const n=Math.sqrt(r-s),a=i-n,o=i+n;return o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,s,r,n,a,o;const h=1/this.direction.x,l=1/this.direction.y,c=1/this.direction.z,u=this.origin;return h>=0?(i=(t.min.x-u.x)*h,s=(t.max.x-u.x)*h):(i=(t.max.x-u.x)*h,s=(t.min.x-u.x)*h),l>=0?(r=(t.min.y-u.y)*l,n=(t.max.y-u.y)*l):(r=(t.max.y-u.y)*l,n=(t.min.y-u.y)*l),i>n||r>s?null:((r>i||isNaN(i))&&(i=r),(n=0?(a=(t.min.z-u.z)*c,o=(t.max.z-u.z)*c):(a=(t.max.z-u.z)*c,o=(t.min.z-u.z)*c),i>o||a>s?null:((a>i||i!=i)&&(i=a),(o=0?i:s,e)))}intersectsBox(t){return null!==this.intersectBox(t,$s)}intersectTriangle(t,e,i,s,r){er.subVectors(e,t),ir.subVectors(i,t),sr.crossVectors(er,ir);let n,a=this.direction.dot(sr);if(a>0){if(s)return null;n=1}else{if(!(a<0))return null;n=-1,a=-a}tr.subVectors(this.origin,t);const o=n*this.direction.dot(ir.crossVectors(tr,ir));if(o<0)return null;const h=n*this.direction.dot(er.cross(tr));if(h<0)return null;if(o+h>a)return null;const l=-n*tr.dot(sr);return l<0?null:this.at(l/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class nr{constructor(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){nr.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y)}set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){const g=this.elements;return g[0]=t,g[4]=e,g[8]=i,g[12]=s,g[1]=r,g[5]=n,g[9]=a,g[13]=o,g[2]=h,g[6]=l,g[10]=c,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=y,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new nr).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,i=t.elements,s=1/ar.setFromMatrixColumn(t,0).length(),r=1/ar.setFromMatrixColumn(t,1).length(),n=1/ar.setFromMatrixColumn(t,2).length();return e[0]=i[0]*s,e[1]=i[1]*s,e[2]=i[2]*s,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*n,e[9]=i[9]*n,e[10]=i[10]*n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,i=t.x,s=t.y,r=t.z,n=Math.cos(i),a=Math.sin(i),o=Math.cos(s),h=Math.sin(s),l=Math.cos(r),c=Math.sin(r);if("XYZ"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=-o*c,e[8]=h,e[1]=i+s*h,e[5]=t-r*h,e[9]=-a*o,e[2]=r-t*h,e[6]=s+i*h,e[10]=n*o}else if("YXZ"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t+r*a,e[4]=s*a-i,e[8]=n*h,e[1]=n*c,e[5]=n*l,e[9]=-a,e[2]=i*a-s,e[6]=r+t*a,e[10]=n*o}else if("ZXY"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t-r*a,e[4]=-n*c,e[8]=s+i*a,e[1]=i+s*a,e[5]=n*l,e[9]=r-t*a,e[2]=-n*h,e[6]=a,e[10]=n*o}else if("ZYX"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=s*h-i,e[8]=t*h+r,e[1]=o*c,e[5]=r*h+t,e[9]=i*h-s,e[2]=-h,e[6]=a*o,e[10]=n*o}else if("YZX"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=r-t*c,e[8]=s*c+i,e[1]=c,e[5]=n*l,e[9]=-a*l,e[2]=-h*l,e[6]=i*c+s,e[10]=t-r*c}else if("XZY"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=-c,e[8]=h*l,e[1]=t*c+r,e[5]=n*l,e[9]=i*c-s,e[2]=s*c-i,e[6]=a*l,e[10]=r*c+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(hr,t,lr)}lookAt(t,e,i){const s=this.elements;return dr.subVectors(t,e),0===dr.lengthSq()&&(dr.z=1),dr.normalize(),cr.crossVectors(i,dr),0===cr.lengthSq()&&(1===Math.abs(i.z)?dr.x+=1e-4:dr.z+=1e-4,dr.normalize(),cr.crossVectors(i,dr)),cr.normalize(),ur.crossVectors(dr,cr),s[0]=cr.x,s[4]=ur.x,s[8]=dr.x,s[1]=cr.y,s[5]=ur.y,s[9]=dr.y,s[2]=cr.z,s[6]=ur.z,s[10]=dr.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[4],o=i[8],h=i[12],l=i[1],c=i[5],u=i[9],d=i[13],p=i[2],m=i[6],y=i[10],g=i[14],f=i[3],x=i[7],b=i[11],v=i[15],w=s[0],M=s[4],S=s[8],_=s[12],A=s[1],T=s[5],z=s[9],C=s[13],I=s[2],B=s[6],k=s[10],R=s[14],E=s[3],P=s[7],O=s[11],F=s[15];return r[0]=n*w+a*A+o*I+h*E,r[4]=n*M+a*T+o*B+h*P,r[8]=n*S+a*z+o*k+h*O,r[12]=n*_+a*C+o*R+h*F,r[1]=l*w+c*A+u*I+d*E,r[5]=l*M+c*T+u*B+d*P,r[9]=l*S+c*z+u*k+d*O,r[13]=l*_+c*C+u*R+d*F,r[2]=p*w+m*A+y*I+g*E,r[6]=p*M+m*T+y*B+g*P,r[10]=p*S+m*z+y*k+g*O,r[14]=p*_+m*C+y*R+g*F,r[3]=f*w+x*A+b*I+v*E,r[7]=f*M+x*T+b*B+v*P,r[11]=f*S+x*z+b*k+v*O,r[15]=f*_+x*C+b*R+v*F,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],s=t[8],r=t[12],n=t[1],a=t[5],o=t[9],h=t[13],l=t[2],c=t[6],u=t[10],d=t[14];return t[3]*(+r*o*c-s*h*c-r*a*u+i*h*u+s*a*d-i*o*d)+t[7]*(+e*o*d-e*h*u+r*n*u-s*n*d+s*h*l-r*o*l)+t[11]*(+e*h*c-e*a*d-r*n*c+i*n*d+r*a*l-i*h*l)+t[15]*(-s*a*l-e*o*c+e*a*u+s*n*c-i*n*u+i*o*l)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=t[9],u=t[10],d=t[11],p=t[12],m=t[13],y=t[14],g=t[15],f=c*y*h-m*u*h+m*o*d-a*y*d-c*o*g+a*u*g,x=p*u*h-l*y*h-p*o*d+n*y*d+l*o*g-n*u*g,b=l*m*h-p*c*h+p*a*d-n*m*d-l*a*g+n*c*g,v=p*c*o-l*m*o-p*a*u+n*m*u+l*a*y-n*c*y,w=e*f+i*x+s*b+r*v;if(0===w)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const M=1/w;return t[0]=f*M,t[1]=(m*u*r-c*y*r-m*s*d+i*y*d+c*s*g-i*u*g)*M,t[2]=(a*y*r-m*o*r+m*s*h-i*y*h-a*s*g+i*o*g)*M,t[3]=(c*o*r-a*u*r-c*s*h+i*u*h+a*s*d-i*o*d)*M,t[4]=x*M,t[5]=(l*y*r-p*u*r+p*s*d-e*y*d-l*s*g+e*u*g)*M,t[6]=(p*o*r-n*y*r-p*s*h+e*y*h+n*s*g-e*o*g)*M,t[7]=(n*u*r-l*o*r+l*s*h-e*u*h-n*s*d+e*o*d)*M,t[8]=b*M,t[9]=(p*c*r-l*m*r-p*i*d+e*m*d+l*i*g-e*c*g)*M,t[10]=(n*m*r-p*a*r+p*i*h-e*m*h-n*i*g+e*a*g)*M,t[11]=(l*a*r-n*c*r-l*i*h+e*c*h+n*i*d-e*a*d)*M,t[12]=v*M,t[13]=(l*m*s-p*c*s+p*i*u-e*m*u-l*i*y+e*c*y)*M,t[14]=(p*a*s-n*m*s-p*i*o+e*m*o+n*i*y-e*a*y)*M,t[15]=(n*c*s-l*a*s+l*i*o-e*c*o-n*i*u+e*a*u)*M,this}scale(t){const e=this.elements,i=t.x,s=t.y,r=t.z;return e[0]*=i,e[4]*=s,e[8]*=r,e[1]*=i,e[5]*=s,e[9]*=r,e[2]*=i,e[6]*=s,e[10]*=r,e[3]*=i,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,s))}makeTranslation(t,e,i){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),s=Math.sin(e),r=1-i,n=t.x,a=t.y,o=t.z,h=r*n,l=r*a;return this.set(h*n+i,h*a-s*o,h*o+s*a,0,h*a+s*o,l*a+i,l*o-s*n,0,h*o-s*a,l*o+s*n,r*o*o+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i,s,r,n){return this.set(1,i,r,0,t,1,n,0,e,s,1,0,0,0,0,1),this}compose(t,e,i){const s=this.elements,r=e._x,n=e._y,a=e._z,o=e._w,h=r+r,l=n+n,c=a+a,u=r*h,d=r*l,p=r*c,m=n*l,y=n*c,g=a*c,f=o*h,x=o*l,b=o*c,v=i.x,w=i.y,M=i.z;return s[0]=(1-(m+g))*v,s[1]=(d+b)*v,s[2]=(p-x)*v,s[3]=0,s[4]=(d-b)*w,s[5]=(1-(u+g))*w,s[6]=(y+f)*w,s[7]=0,s[8]=(p+x)*M,s[9]=(y-f)*M,s[10]=(1-(u+m))*M,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,i){const s=this.elements;let r=ar.set(s[0],s[1],s[2]).length();const n=ar.set(s[4],s[5],s[6]).length(),a=ar.set(s[8],s[9],s[10]).length();this.determinant()<0&&(r=-r),t.x=s[12],t.y=s[13],t.z=s[14],or.copy(this);const o=1/r,h=1/n,l=1/a;return or.elements[0]*=o,or.elements[1]*=o,or.elements[2]*=o,or.elements[4]*=h,or.elements[5]*=h,or.elements[6]*=h,or.elements[8]*=l,or.elements[9]*=l,or.elements[10]*=l,e.setFromRotationMatrix(or),i.x=r,i.y=n,i.z=a,this}makePerspective(t,e,i,s,r,n,a=2e3){const o=this.elements,h=2*r/(e-t),l=2*r/(i-s),c=(e+t)/(e-t),u=(i+s)/(i-s);let d,p;if(a===Oi)d=-(n+r)/(n-r),p=-2*n*r/(n-r);else{if(a!==Fi)throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+a);d=-n/(n-r),p=-n*r/(n-r)}return o[0]=h,o[4]=0,o[8]=c,o[12]=0,o[1]=0,o[5]=l,o[9]=u,o[13]=0,o[2]=0,o[6]=0,o[10]=d,o[14]=p,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this}makeOrthographic(t,e,i,s,r,n,a=2e3){const o=this.elements,h=1/(e-t),l=1/(i-s),c=1/(n-r),u=(e+t)*h,d=(i+s)*l;let p,m;if(a===Oi)p=(n+r)*c,m=-2*c;else{if(a!==Fi)throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+a);p=r*c,m=-1*c}return o[0]=2*h,o[4]=0,o[8]=0,o[12]=-u,o[1]=0,o[5]=2*l,o[9]=0,o[13]=-d,o[2]=0,o[6]=0,o[10]=m,o[14]=-p,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}const ar=new Is,or=new nr,hr=new Is(0,0,0),lr=new Is(1,1,1),cr=new Is,ur=new Is,dr=new Is,pr=new nr,mr=new Cs;class yr{constructor(t=0,e=0,i=0,s=yr.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=i,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,s=this._order){return this._x=t,this._y=e,this._z=i,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,i=!0){const s=t.elements,r=s[0],n=s[4],a=s[8],o=s[1],h=s[5],l=s[9],c=s[2],u=s[6],d=s[10];switch(e){case"XYZ":this._y=Math.asin(Di(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,d),this._z=Math.atan2(-n,r)):(this._x=Math.atan2(u,h),this._z=0);break;case"YXZ":this._x=Math.asin(-Di(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,h)):(this._y=Math.atan2(-c,r),this._z=0);break;case"ZXY":this._x=Math.asin(Di(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-c,d),this._z=Math.atan2(-n,h)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-Di(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-n,h));break;case"YZX":this._z=Math.asin(Di(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,h),this._y=Math.atan2(-c,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-Di(n,-1,1)),Math.abs(n)<.9999999?(this._x=Math.atan2(u,h),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-l,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return pr.makeRotationFromQuaternion(t),this.setFromRotationMatrix(pr,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return mr.setFromEuler(this),this.setFromQuaternion(mr,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}yr.DEFAULT_ORDER="XYZ";class gr{constructor(){this.mask=1}set(t){this.mask=1<>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),!1===this.matrixAutoUpdate&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.visibility=this._visibility,s.active=this._active,s.bounds=this._bounds.map((t=>({boxInitialized:t.boxInitialized,boxMin:t.box.min.toArray(),boxMax:t.box.max.toArray(),sphereInitialized:t.sphereInitialized,sphereRadius:t.sphere.radius,sphereCenter:t.sphere.center.toArray()}))),s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.geometryCount=this._geometryCount,s.matricesTexture=this._matricesTexture.toJSON(t),null!==this._colorsTexture&&(s.colorsTexture=this._colorsTexture.toJSON(t)),null!==this.boundingSphere&&(s.boundingSphere={center:s.boundingSphere.center.toArray(),radius:s.boundingSphere.radius}),null!==this.boundingBox&&(s.boundingBox={min:s.boundingBox.min.toArray(),max:s.boundingBox.max.toArray()})),this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const i=e.shapes;if(Array.isArray(i))for(let e=0,s=i.length;e0){s.children=[];for(let e=0;e0){s.animations=[];for(let e=0;e0&&(i.geometries=e),s.length>0&&(i.materials=s),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),h.length>0&&(i.skeletons=h),l.length>0&&(i.animations=l),c.length>0&&(i.nodes=c)}return i.object=s,i;function n(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,i,s,r){Er.subVectors(s,e),Pr.subVectors(i,e),Or.subVectors(t,e);const n=Er.dot(Er),a=Er.dot(Pr),o=Er.dot(Or),h=Pr.dot(Pr),l=Pr.dot(Or),c=n*h-a*a;if(0===c)return r.set(0,0,0),null;const u=1/c,d=(h*o-a*l)*u,p=(n*l-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,s){return null!==this.getBarycoord(t,e,i,s,Fr)&&(Fr.x>=0&&Fr.y>=0&&Fr.x+Fr.y<=1)}static getInterpolation(t,e,i,s,r,n,a,o){return null===this.getBarycoord(t,e,i,s,Fr)?(o.x=0,o.y=0,"z"in o&&(o.z=0),"w"in o&&(o.w=0),null):(o.setScalar(0),o.addScaledVector(r,Fr.x),o.addScaledVector(n,Fr.y),o.addScaledVector(a,Fr.z),o)}static getInterpolatedAttribute(t,e,i,s,r,n){return Dr.setScalar(0),Hr.setScalar(0),qr.setScalar(0),Dr.fromBufferAttribute(t,e),Hr.fromBufferAttribute(t,i),qr.fromBufferAttribute(t,s),n.setScalar(0),n.addScaledVector(Dr,r.x),n.addScaledVector(Hr,r.y),n.addScaledVector(qr,r.z),n}static isFrontFacing(t,e,i,s){return Er.subVectors(i,e),Pr.subVectors(t,e),Er.cross(Pr).dot(s)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,s){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,i,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,i),this.c.fromBufferAttribute(t,s),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Er.subVectors(this.c,this.b),Pr.subVectors(this.a,this.b),.5*Er.cross(Pr).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return Jr.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return Jr.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,i,s,r){return Jr.getInterpolation(t,this.a,this.b,this.c,e,i,s,r)}containsPoint(t){return Jr.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return Jr.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const i=this.a,s=this.b,r=this.c;let n,a;Nr.subVectors(s,i),Lr.subVectors(r,i),jr.subVectors(t,i);const o=Nr.dot(jr),h=Lr.dot(jr);if(o<=0&&h<=0)return e.copy(i);Wr.subVectors(t,s);const l=Nr.dot(Wr),c=Lr.dot(Wr);if(l>=0&&c<=l)return e.copy(s);const u=o*c-l*h;if(u<=0&&o>=0&&l<=0)return n=o/(o-l),e.copy(i).addScaledVector(Nr,n);Ur.subVectors(t,r);const d=Nr.dot(Ur),p=Lr.dot(Ur);if(p>=0&&d<=p)return e.copy(r);const m=d*h-o*p;if(m<=0&&h>=0&&p<=0)return a=h/(h-p),e.copy(i).addScaledVector(Lr,a);const y=l*p-d*c;if(y<=0&&c-l>=0&&d-p>=0)return Vr.subVectors(r,s),a=(c-l)/(c-l+(d-p)),e.copy(s).addScaledVector(Vr,a);const g=1/(y+m+u);return n=m*g,a=u*g,e.copy(i).addScaledVector(Nr,n).addScaledVector(Lr,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const Xr={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Yr={h:0,s:0,l:0},Zr={h:0,s:0,l:0};function Gr(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}class $r{constructor(t,e,i){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,i)}set(t,e,i){if(void 0===e&&void 0===i){const e=t;e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e)}else this.setRGB(t,e,i);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=Ge){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,us.toWorkingColorSpace(this,e),this}setRGB(t,e,i,s=us.workingColorSpace){return this.r=t,this.g=e,this.b=i,us.toWorkingColorSpace(this,s),this}setHSL(t,e,i,s=us.workingColorSpace){if(t=Hi(t,1),e=Di(e,0,1),i=Di(i,0,1),0===e)this.r=this.g=this.b=i;else{const s=i<=.5?i*(1+e):i+e-i*e,r=2*i-s;this.r=Gr(r,s,t+1/3),this.g=Gr(r,s,t),this.b=Gr(r,s,t-1/3)}return us.toWorkingColorSpace(this,s),this}setStyle(t,e=Ge){function i(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const n=s[1],a=s[2];switch(n){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:console.warn("THREE.Color: Unknown color model "+t)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(t)){const i=s[1],r=i.length;if(3===r)return this.setRGB(parseInt(i.charAt(0),16)/15,parseInt(i.charAt(1),16)/15,parseInt(i.charAt(2),16)/15,e);if(6===r)return this.setHex(parseInt(i,16),e);console.warn("THREE.Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=Ge){const i=Xr[t.toLowerCase()];return void 0!==i?this.setHex(i,e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=ds(t.r),this.g=ds(t.g),this.b=ds(t.b),this}copyLinearToSRGB(t){return this.r=ps(t.r),this.g=ps(t.g),this.b=ps(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=Ge){return us.fromWorkingColorSpace(Qr.copy(this),t),65536*Math.round(Di(255*Qr.r,0,255))+256*Math.round(Di(255*Qr.g,0,255))+Math.round(Di(255*Qr.b,0,255))}getHexString(t=Ge){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=us.workingColorSpace){us.fromWorkingColorSpace(Qr.copy(this),e);const i=Qr.r,s=Qr.g,r=Qr.b,n=Math.max(i,s,r),a=Math.min(i,s,r);let o,h;const l=(a+n)/2;if(a===n)o=0,h=0;else{const t=n-a;switch(h=l<=.5?t/(n+a):t/(2-n-a),n){case i:o=(s-r)/t+(s0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){console.warn(`THREE.Material: parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&s.isColor?s.set(i):s&&s.isVector3&&i&&i.isVector3?s.copy(i):this[e]=i:console.warn(`THREE.Material: '${e}' is not a property of THREE.${this.type}.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.6,type:"Material",generator:"Material.toJSON"}};function s(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),void 0!==this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),void 0!==this.dispersion&&(i.dispersion=this.dispersion),void 0!==this.iridescence&&(i.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(i.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(i.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(i.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(i.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),void 0!==this.anisotropy&&(i.anisotropy=this.anisotropy),void 0!==this.anisotropyRotation&&(i.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(i.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapRotation&&(i.envMapRotation=this.envMapRotation.toArray()),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),0!==this.side&&(i.side=this.side),!0===this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=!0),204!==this.blendSrc&&(i.blendSrc=this.blendSrc),205!==this.blendDst&&(i.blendDst=this.blendDst),100!==this.blendEquation&&(i.blendEquation=this.blendEquation),null!==this.blendSrcAlpha&&(i.blendSrcAlpha=this.blendSrcAlpha),null!==this.blendDstAlpha&&(i.blendDstAlpha=this.blendDstAlpha),null!==this.blendEquationAlpha&&(i.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(i.blendColor=this.blendColor.getHex()),0!==this.blendAlpha&&(i.blendAlpha=this.blendAlpha),3!==this.depthFunc&&(i.depthFunc=this.depthFunc),!1===this.depthTest&&(i.depthTest=this.depthTest),!1===this.depthWrite&&(i.depthWrite=this.depthWrite),!1===this.colorWrite&&(i.colorWrite=this.colorWrite),255!==this.stencilWriteMask&&(i.stencilWriteMask=this.stencilWriteMask),519!==this.stencilFunc&&(i.stencilFunc=this.stencilFunc),0!==this.stencilRef&&(i.stencilRef=this.stencilRef),255!==this.stencilFuncMask&&(i.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==ei&&(i.stencilFail=this.stencilFail),this.stencilZFail!==ei&&(i.stencilZFail=this.stencilZFail),this.stencilZPass!==ei&&(i.stencilZPass=this.stencilZPass),!0===this.stencilWrite&&(i.stencilWrite=this.stencilWrite),void 0!==this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaHash&&(i.alphaHash=!0),!0===this.alphaToCoverage&&(i.alphaToCoverage=!0),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=!0),!0===this.forceSinglePass&&(i.forceSinglePass=!0),!0===this.wireframe&&(i.wireframe=!0),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=!0),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),!1===this.fog&&(i.fog=!1),Object.keys(this.userData).length>0&&(i.userData=this.userData),e){const e=s(t.textures),r=s(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let s=0;s!==t;++s)i[s]=e[s].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}onBuild(){console.warn("Material: onBuild() has been removed.")}}class en extends tn{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new $r(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new yr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const sn=rn();function rn(){const t=new ArrayBuffer(4),e=new Float32Array(t),i=new Uint32Array(t),s=new Uint32Array(512),r=new Uint32Array(512);for(let t=0;t<256;++t){const e=t-127;e<-27?(s[t]=0,s[256|t]=32768,r[t]=24,r[256|t]=24):e<-14?(s[t]=1024>>-e-14,s[256|t]=1024>>-e-14|32768,r[t]=-e-1,r[256|t]=-e-1):e<=15?(s[t]=e+15<<10,s[256|t]=e+15<<10|32768,r[t]=13,r[256|t]=13):e<128?(s[t]=31744,s[256|t]=64512,r[t]=24,r[256|t]=24):(s[t]=31744,s[256|t]=64512,r[t]=13,r[256|t]=13)}const n=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,i=0;for(;!(8388608&e);)e<<=1,i-=8388608;e&=-8388609,i+=947912704,n[t]=e|i}for(let t=1024;t<2048;++t)n[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)a[t]=t<<23;a[31]=1199570944,a[32]=2147483648;for(let t=33;t<63;++t)a[t]=2147483648+(t-32<<23);a[63]=3347054592;for(let t=1;t<64;++t)32!==t&&(o[t]=1024);return{floatView:e,uint32View:i,baseTable:s,shiftTable:r,mantissaTable:n,exponentTable:a,offsetTable:o}}function nn(t){Math.abs(t)>65504&&console.warn("THREE.DataUtils.toHalfFloat(): Value out of range."),t=Di(t,-65504,65504),sn.floatView[0]=t;const e=sn.uint32View[0],i=e>>23&511;return sn.baseTable[i]+((8388607&e)>>sn.shiftTable[i])}function an(t){const e=t>>10;return sn.uint32View[0]=sn.mantissaTable[sn.offsetTable[e]+(1023&t)]+sn.exponentTable[e],sn.floatView[0]}const on={toHalfFloat:nn,fromHalfFloat:an},hn=new Is,ln=new Zi;let cn=0;class un{constructor(t,e,i=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:cn++}),this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=i,this.usage=_i,this.updateRanges=[],this.gpuType=Rt,this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,i){t*=this.itemSize,i*=e.itemSize;for(let s=0,r=this.itemSize;se.count&&console.warn("THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Rs);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return console.error("THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),void this.boundingBox.set(new Is(-1/0,-1/0,-1/0),new Is(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(let t=0,i=e.length;t0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const s=i[e];t.data.attributes[e]=s.toJSON(t.data)}const s={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],n=[];for(let e=0,s=i.length;e0&&(s[e]=n,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);const n=this.groups;n.length>0&&(t.data.groups=JSON.parse(JSON.stringify(n)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone(e));const s=t.attributes;for(const t in s){const i=s[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],s=r[t];for(let t=0,r=s.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;t(t.far-t.near)**2)return}In.copy(r).invert(),Bn.copy(t.ray).applyMatrix4(In),null!==i.boundingBox&&!1===Bn.intersectsBox(i.boundingBox)||this._computeIntersections(t,e,Bn)}}_computeIntersections(t,e,i){let s;const r=this.geometry,n=this.material,a=r.index,o=r.attributes.position,h=r.attributes.uv,l=r.attributes.uv1,c=r.attributes.normal,u=r.groups,d=r.drawRange;if(null!==a)if(Array.isArray(n))for(let r=0,o=u.length;ri.far?null:{distance:l,point:Vn.clone(),object:t}}(t,e,i,s,En,Pn,On,Ln);if(c){const t=new Is;Jr.getBarycoord(Ln,En,Pn,On,t),r&&(c.uv=Jr.getInterpolatedAttribute(r,o,h,l,t,new Zi)),n&&(c.uv1=Jr.getInterpolatedAttribute(n,o,h,l,t,new Zi)),a&&(c.normal=Jr.getInterpolatedAttribute(a,o,h,l,t,new Is),c.normal.dot(s.direction)>0&&c.normal.multiplyScalar(-1));const e={a:o,b:h,c:l,normal:new Is,materialIndex:0};Jr.getNormal(En,Pn,On,e.normal),c.face=e,c.barycoord=t}return c}class Un extends Cn{constructor(t=1,e=1,i=1,s=1,r=1,n=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:s,heightSegments:r,depthSegments:n};const a=this;s=Math.floor(s),r=Math.floor(r),n=Math.floor(n);const o=[],h=[],l=[],c=[];let u=0,d=0;function p(t,e,i,s,r,n,p,m,y,g,f){const x=n/y,b=p/g,v=n/2,w=p/2,M=m/2,S=y+1,_=g+1;let A=0,T=0;const z=new Is;for(let n=0;n<_;n++){const a=n*b-w;for(let o=0;o0?1:-1,l.push(z.x,z.y,z.z),c.push(o/y),c.push(1-n/g),A+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e}}class Yn extends Rr{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new nr,this.projectionMatrix=new nr,this.projectionMatrixInverse=new nr,this.coordinateSystem=Oi}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}const Zn=new Is,Gn=new Zi,$n=new Zi;class Qn extends Yn{constructor(t=50,e=1,i=.1,s=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=i,this.far=s,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*Wi*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*ji*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*Wi*Math.atan(Math.tan(.5*ji*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(t,e,i){Zn.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),e.set(Zn.x,Zn.y).multiplyScalar(-t/Zn.z),Zn.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),i.set(Zn.x,Zn.y).multiplyScalar(-t/Zn.z)}getViewSize(t,e){return this.getViewBounds(t,Gn,$n),e.subVectors($n,Gn)}setViewOffset(t,e,i,s,r,n){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=s,this.view.width=r,this.view.height=n,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*ji*this.fov)/this.zoom,i=2*e,s=this.aspect*i,r=-.5*s;const n=this.view;if(null!==this.view&&this.view.enabled){const t=n.fullWidth,a=n.fullHeight;r+=n.offsetX*s/t,e-=n.offsetY*i/a,s*=n.width/t,i*=n.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,e,e-i,t,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const Kn=-90;class ta extends Rr{constructor(t,e,i){super(),this.type="CubeCamera",this.renderTarget=i,this.coordinateSystem=null,this.activeMipmapLevel=0;const s=new Qn(Kn,1,t,e);s.layers=this.layers,this.add(s);const r=new Qn(Kn,1,t,e);r.layers=this.layers,this.add(r);const n=new Qn(Kn,1,t,e);n.layers=this.layers,this.add(n);const a=new Qn(Kn,1,t,e);a.layers=this.layers,this.add(a);const o=new Qn(Kn,1,t,e);o.layers=this.layers,this.add(o);const h=new Qn(Kn,1,t,e);h.layers=this.layers,this.add(h)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[i,s,r,n,a,o]=e;for(const t of e)this.remove(t);if(t===Oi)i.up.set(0,1,0),i.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),n.up.set(0,0,1),n.lookAt(0,-1,0),a.up.set(0,1,0),a.lookAt(0,0,1),o.up.set(0,1,0),o.lookAt(0,0,-1);else{if(t!==Fi)throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);i.up.set(0,-1,0),i.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),n.up.set(0,0,-1),n.lookAt(0,-1,0),a.up.set(0,-1,0),a.lookAt(0,0,1),o.up.set(0,-1,0),o.lookAt(0,0,-1)}for(const t of e)this.add(t),t.updateMatrixWorld()}update(t,e){null===this.parent&&this.updateMatrixWorld();const{renderTarget:i,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,n,a,o,h,l]=this.children,c=t.getRenderTarget(),u=t.getActiveCubeFace(),d=t.getActiveMipmapLevel(),p=t.xr.enabled;t.xr.enabled=!1;const m=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,t.setRenderTarget(i,0,s),t.render(e,r),t.setRenderTarget(i,1,s),t.render(e,n),t.setRenderTarget(i,2,s),t.render(e,a),t.setRenderTarget(i,3,s),t.render(e,o),t.setRenderTarget(i,4,s),t.render(e,h),i.texture.generateMipmaps=m,t.setRenderTarget(i,5,s),t.render(e,l),t.setRenderTarget(c,u,d),t.xr.enabled=p,i.texture.needsPMREMUpdate=!0}}class ea extends vs{constructor(t,e,i,s,r,n,a,o,h,l){super(t=void 0!==t?t:[],e=void 0!==e?e:ht,i,s,r,n,a,o,h,l),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class ia extends Ss{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const i={width:t,height:t,depth:1},s=[i,i,i,i,i,i];this.texture=new ea(s,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:wt}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const i={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},s=new Un(5,5,5),r=new Xn({name:"CubemapFromEquirect",uniforms:Dn(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const n=new jn(s,r),a=e.minFilter;e.minFilter===_t&&(e.minFilter=wt);return new ta(1,10,this).update(t,n),e.minFilter=a,n.geometry.dispose(),n.material.dispose(),this}clear(t,e,i,s){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,i,s);t.setRenderTarget(r)}}class sa extends Rr{constructor(){super(),this.isGroup=!0,this.type="Group"}}const ra={type:"move"};class na{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return null===this._hand&&(this._hand=new sa,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return null===this._targetRay&&(this._targetRay=new sa,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new Is,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new Is),this._targetRay}getGripSpace(){return null===this._grip&&(this._grip=new sa,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new Is,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new Is),this._grip}dispatchEvent(t){return null!==this._targetRay&&this._targetRay.dispatchEvent(t),null!==this._grip&&this._grip.dispatchEvent(t),null!==this._hand&&this._hand.dispatchEvent(t),this}connect(t){if(t&&t.hand){const e=this._hand;if(e)for(const i of t.hand.values())this._getHandJoint(e,i)}return this.dispatchEvent({type:"connected",data:t}),this}disconnect(t){return this.dispatchEvent({type:"disconnected",data:t}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this}update(t,e,i){let s=null,r=null,n=null;const a=this._targetRay,o=this._grip,h=this._hand;if(t&&"visible-blurred"!==e.session.visibilityState){if(h&&t.hand){n=!0;for(const s of t.hand.values()){const t=e.getJointPose(s,i),r=this._getHandJoint(h,s);null!==t&&(r.matrix.fromArray(t.transform.matrix),r.matrix.decompose(r.position,r.rotation,r.scale),r.matrixWorldNeedsUpdate=!0,r.jointRadius=t.radius),r.visible=null!==t}const s=h.joints["index-finger-tip"],r=h.joints["thumb-tip"],a=s.position.distanceTo(r.position),o=.02,l=.005;h.inputState.pinching&&a>o+l?(h.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!h.inputState.pinching&&a<=o-l&&(h.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));null!==a&&(s=e.getPose(t.targetRaySpace,i),null===s&&null!==r&&(s=r),null!==s&&(a.matrix.fromArray(s.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,s.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(s.linearVelocity)):a.hasLinearVelocity=!1,s.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(s.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(ra)))}return null!==a&&(a.visible=null!==s),null!==o&&(o.visible=null!==r),null!==h&&(h.visible=null!==n),this}_getHandJoint(t,e){if(void 0===t.joints[e.jointName]){const i=new sa;i.matrixAutoUpdate=!1,i.visible=!1,t.joints[e.jointName]=i,t.add(i)}return t.joints[e.jointName]}}class aa{constructor(t,e=25e-5){this.isFogExp2=!0,this.name="",this.color=new $r(t),this.density=e}clone(){return new aa(this.color,this.density)}toJSON(){return{type:"FogExp2",name:this.name,color:this.color.getHex(),density:this.density}}}class oa{constructor(t,e=1,i=1e3){this.isFog=!0,this.name="",this.color=new $r(t),this.near=e,this.far=i}clone(){return new oa(this.color,this.near,this.far)}toJSON(){return{type:"Fog",name:this.name,color:this.color.getHex(),near:this.near,far:this.far}}}class ha extends Rr{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new yr,this.environmentIntensity=1,this.environmentRotation=new yr,this.overrideMaterial=null,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,this.backgroundRotation.copy(t.backgroundRotation),this.environmentIntensity=t.environmentIntensity,this.environmentRotation.copy(t.environmentRotation),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.fog&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),1!==this.environmentIntensity&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}class la{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=_i,this.updateRanges=[],this.version=0,this.uuid=Ui()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,i){t*=this.stride,i*=e.stride;for(let s=0,r=this.stride;st.far||e.push({distance:o,point:ma.clone(),uv:Jr.getInterpolation(ma,va,wa,Ma,Sa,_a,Aa,new Zi),face:null,object:this})}copy(t,e){return super.copy(t,e),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function za(t,e,i,s,r,n){fa.subVectors(t,i).addScalar(.5).multiply(s),void 0!==r?(xa.x=n*fa.x-r*fa.y,xa.y=r*fa.x+n*fa.y):xa.copy(fa),t.copy(e),t.x+=xa.x,t.y+=xa.y,t.applyMatrix4(ba)}const Ca=new Is,Ia=new Is;class Ba extends Rr{constructor(){super(),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,i=e.length;t0){let i,s;for(i=1,s=e.length;i0){Ca.setFromMatrixPosition(this.matrixWorld);const i=t.ray.origin.distanceTo(Ca);this.getObjectForDistance(i).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){Ca.setFromMatrixPosition(t.matrixWorld),Ia.setFromMatrixPosition(this.matrixWorld);const i=Ca.distanceTo(Ia)/t.zoom;let s,r;for(e[0].object.visible=!0,s=1,r=e.length;s=t))break;e[s-1].object.visible=!1,e[s].object.visible=!0}for(this._currentLevel=s-1;s1?null:e.copy(t.start).addScaledVector(i,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||so.getNormalMatrix(t),s=this.coplanarPoint(eo).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const no=new Gs,ao=new Is;class oo{constructor(t=new ro,e=new ro,i=new ro,s=new ro,r=new ro,n=new ro){this.planes=[t,e,i,s,r,n]}set(t,e,i,s,r,n){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(s),a[4].copy(r),a[5].copy(n),this}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t,e=2e3){const i=this.planes,s=t.elements,r=s[0],n=s[1],a=s[2],o=s[3],h=s[4],l=s[5],c=s[6],u=s[7],d=s[8],p=s[9],m=s[10],y=s[11],g=s[12],f=s[13],x=s[14],b=s[15];if(i[0].setComponents(o-r,u-h,y-d,b-g).normalize(),i[1].setComponents(o+r,u+h,y+d,b+g).normalize(),i[2].setComponents(o+n,u+l,y+p,b+f).normalize(),i[3].setComponents(o-n,u-l,y-p,b-f).normalize(),i[4].setComponents(o-a,u-c,y-m,b-x).normalize(),e===Oi)i[5].setComponents(o+a,u+c,y+m,b+x).normalize();else{if(e!==Fi)throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);i[5].setComponents(a,c,m,x).normalize()}return this}intersectsObject(t){if(void 0!==t.boundingSphere)null===t.boundingSphere&&t.computeBoundingSphere(),no.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;null===e.boundingSphere&&e.computeBoundingSphere(),no.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(no)}intersectsSprite(t){return no.center.set(0,0,0),no.radius=.7071067811865476,no.applyMatrix4(t.matrixWorld),this.intersectsSphere(no)}intersectsSphere(t){const e=this.planes,i=t.center,s=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(i)0?t.max.x:t.min.x,ao.y=s.normal.y>0?t.max.y:t.min.y,ao.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(ao)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function ho(t,e){return t-e}function lo(t,e){return t.z-e.z}function co(t,e){return e.z-t.z}class uo{constructor(){this.index=0,this.pool=[],this.list=[]}push(t,e,i,s){const r=this.pool,n=this.list;this.index>=r.length&&r.push({start:-1,count:-1,z:-1,index:-1});const a=r[this.index];n.push(a),this.index++,a.start=t,a.count=e,a.z=i,a.index=s}reset(){this.list.length=0,this.index=0}}const po=new nr,mo=new $r(1,1,1),yo=new oo,go=new Rs,fo=new Gs,xo=new Is,bo=new Is,vo=new Is,wo=new uo,Mo=new jn,So=[];function _o(t,e,i=0){const s=e.itemSize;if(t.isInterleavedBufferAttribute||t.array.constructor!==e.array.constructor){const r=t.count;for(let n=0;n65535?new Uint32Array(s):new Uint16Array(s);e.setIndex(new un(t,1))}this._geometryInitialized=!0}}_validateGeometry(t){const e=this.geometry;if(Boolean(t.getIndex())!==Boolean(e.getIndex()))throw new Error('THREE.BatchedMesh: All geometries must consistently have "index".');for(const i in e.attributes){if(!t.hasAttribute(i))throw new Error(`THREE.BatchedMesh: Added geometry missing "${i}". All geometries must have consistent attributes.`);const s=t.getAttribute(i),r=e.getAttribute(i);if(s.itemSize!==r.itemSize||s.normalized!==r.normalized)throw new Error("THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.")}}validateInstanceId(t){const e=this._instanceInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid instanceId ${t}. Instance is either out of range or has been deleted.`)}validateGeometryId(t){const e=this._geometryInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid geometryId ${t}. Geometry is either out of range or has been deleted.`)}setCustomSort(t){return this.customSort=t,this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Rs);const t=this.boundingBox,e=this._instanceInfo;t.makeEmpty();for(let i=0,s=e.length;i=this.maxInstanceCount&&0===this._availableInstanceIds.length)throw new Error("THREE.BatchedMesh: Maximum item count reached.");const e={visible:!0,active:!0,geometryIndex:t};let i=null;this._availableInstanceIds.length>0?(this._availableInstanceIds.sort(ho),i=this._availableInstanceIds.shift(),this._instanceInfo[i]=e):(i=this._instanceInfo.length,this._instanceInfo.push(e));const s=this._matricesTexture;po.identity().toArray(s.image.data,16*i),s.needsUpdate=!0;const r=this._colorsTexture;return r&&(mo.toArray(r.image.data,4*i),r.needsUpdate=!0),this._visibilityChanged=!0,i}addGeometry(t,e=-1,i=-1){this._initializeGeometry(t),this._validateGeometry(t);const s={vertexStart:-1,vertexCount:-1,reservedVertexCount:-1,indexStart:-1,indexCount:-1,reservedIndexCount:-1,start:-1,count:-1,boundingBox:null,boundingSphere:null,active:!0},r=this._geometryInfo;s.vertexStart=this._nextVertexStart,s.reservedVertexCount=-1===e?t.getAttribute("position").count:e;const n=t.getIndex();if(null!==n&&(s.indexStart=this._nextIndexStart,s.reservedIndexCount=-1===i?n.count:i),-1!==s.indexStart&&s.indexStart+s.reservedIndexCount>this._maxIndexCount||s.vertexStart+s.reservedVertexCount>this._maxVertexCount)throw new Error("THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.");let a;return this._availableGeometryIds.length>0?(this._availableGeometryIds.sort(ho),a=this._availableGeometryIds.shift(),r[a]=s):(a=this._geometryCount,this._geometryCount++,r.push(s)),this.setGeometryAt(a,t),this._nextIndexStart=s.indexStart+s.reservedIndexCount,this._nextVertexStart=s.vertexStart+s.reservedVertexCount,a}setGeometryAt(t,e){if(t>=this._geometryCount)throw new Error("THREE.BatchedMesh: Maximum geometry count reached.");this._validateGeometry(e);const i=this.geometry,s=null!==i.getIndex(),r=i.getIndex(),n=e.getIndex(),a=this._geometryInfo[t];if(s&&n.count>a.reservedIndexCount||e.attributes.position.count>a.reservedVertexCount)throw new Error("THREE.BatchedMesh: Reserved space not large enough for provided geometry.");const o=a.vertexStart,h=a.reservedVertexCount;a.vertexCount=e.getAttribute("position").count;for(const t in i.attributes){const s=e.getAttribute(t),r=i.getAttribute(t);_o(s,r,o);const n=s.itemSize;for(let t=s.count,e=h;t=e.length||!1===e[t].active)return this;const i=this._instanceInfo;for(let e=0,s=i.length;ee)).sort(((t,e)=>i[t].vertexStart-i[e].vertexStart)),r=this.geometry;for(let n=0,a=i.length;n=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingBox){const t=new Rs,e=i.index,r=i.attributes.position;for(let i=s.start,n=s.start+s.count;i=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingSphere){const e=new Gs;this.getBoundingBoxAt(t,go),go.getCenter(e.center);const r=i.index,n=i.attributes.position;let a=0;for(let t=s.start,i=s.start+s.count;tt.active));if(Math.max(...i.map((t=>t.vertexStart+t.reservedVertexCount)))>t)throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${e}. Cannot shrink further.`);if(this.geometry.index){if(Math.max(...i.map((t=>t.indexStart+t.reservedIndexCount)))>e)throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${e}. Cannot shrink further.`)}const s=this.geometry;s.dispose(),this._maxVertexCount=t,this._maxIndexCount=e,this._geometryInitialized&&(this._geometryInitialized=!1,this.geometry=new Cn,this._initializeGeometry(s));const r=this.geometry;s.index&&Ao(s.index.array,r.index.array);for(const t in s.attributes)Ao(s.attributes[t].array,r.attributes[t].array)}raycast(t,e){const i=this._instanceInfo,s=this._geometryInfo,r=this.matrixWorld,n=this.geometry;Mo.material=this.material,Mo.geometry.index=n.index,Mo.geometry.attributes=n.attributes,null===Mo.geometry.boundingBox&&(Mo.geometry.boundingBox=new Rs),null===Mo.geometry.boundingSphere&&(Mo.geometry.boundingSphere=new Gs);for(let n=0,a=i.length;n({...t,boundingBox:null!==t.boundingBox?t.boundingBox.clone():null,boundingSphere:null!==t.boundingSphere?t.boundingSphere.clone():null}))),this._instanceInfo=t._instanceInfo.map((t=>({...t}))),this._maxInstanceCount=t._maxInstanceCount,this._maxVertexCount=t._maxVertexCount,this._maxIndexCount=t._maxIndexCount,this._geometryInitialized=t._geometryInitialized,this._geometryCount=t._geometryCount,this._multiDrawCounts=t._multiDrawCounts.slice(),this._multiDrawStarts=t._multiDrawStarts.slice(),this._matricesTexture=t._matricesTexture.clone(),this._matricesTexture.image.data=this._matricesTexture.image.data.slice(),null!==this._colorsTexture&&(this._colorsTexture=t._colorsTexture.clone(),this._colorsTexture.image.data=this._colorsTexture.image.data.slice()),this}dispose(){return this.geometry.dispose(),this._matricesTexture.dispose(),this._matricesTexture=null,this._indirectTexture.dispose(),this._indirectTexture=null,null!==this._colorsTexture&&(this._colorsTexture.dispose(),this._colorsTexture=null),this}onBeforeRender(t,e,i,s,r){if(!this._visibilityChanged&&!this.perObjectFrustumCulled&&!this.sortObjects)return;const n=s.getIndex(),a=null===n?1:n.array.BYTES_PER_ELEMENT,o=this._instanceInfo,h=this._multiDrawStarts,l=this._multiDrawCounts,c=this._geometryInfo,u=this.perObjectFrustumCulled,d=this._indirectTexture,p=d.image.data;u&&(po.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse).multiply(this.matrixWorld),yo.setFromProjectionMatrix(po,t.coordinateSystem));let m=0;if(this.sortObjects){po.copy(this.matrixWorld).invert(),xo.setFromMatrixPosition(i.matrixWorld).applyMatrix4(po),bo.set(0,0,-1).transformDirection(i.matrixWorld).transformDirection(po);for(let t=0,e=o.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;ts)return;Eo.applyMatrix4(t.matrixWorld);const o=e.ray.origin.distanceTo(Eo);return oe.far?void 0:{distance:o,point:Po.clone().applyMatrix4(t.matrixWorld),index:r,face:null,faceIndex:null,barycoord:null,object:t}}const No=new Is,Lo=new Is;class Vo extends Oo{constructor(t,e){super(t,e),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(null===t.index){const e=t.attributes.position,i=[];for(let t=0,s=e.count;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;tr.far)return;n.push({distance:h,distanceToRay:Math.sqrt(o),point:i,index:e,face:null,faceIndex:null,barycoord:null,object:a})}}class Yo extends vs{constructor(t,e,i,s,r,n,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isVideoTexture=!0,this.minFilter=void 0!==n?n:wt,this.magFilter=void 0!==r?r:wt,this.generateMipmaps=!1;const l=this;"requestVideoFrameCallback"in t&&t.requestVideoFrameCallback((function e(){l.needsUpdate=!0,t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}class Zo extends Yo{constructor(t,e,i,s,r,n,a,o){super({},t,e,i,s,r,n,a,o)}update(){}clone(){return(new this.constructor).copy(this)}setFrame(t){this.image=t,this.needsUpdate=!0}}class Go extends vs{constructor(t,e){super({width:t,height:e}),this.isFramebufferTexture=!0,this.magFilter=gt,this.minFilter=gt,this.generateMipmaps=!1,this.needsUpdate=!0}}class $o extends vs{constructor(t,e,i,s,r,n,a,o,h,l,c,u){super(null,n,a,o,h,l,s,r,c,u),this.isCompressedTexture=!0,this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}class Qo extends $o{constructor(t,e,i,s,r,n){super(t,e,i,r,n),this.isCompressedArrayTexture=!0,this.image.depth=s,this.wrapR=mt,this.layerUpdates=new Set}addLayerUpdate(t){this.layerUpdates.add(t)}clearLayerUpdates(){this.layerUpdates.clear()}}class Ko extends $o{constructor(t,e,i){super(void 0,t[0].width,t[0].height,e,i,ht),this.isCompressedCubeTexture=!0,this.isCubeTexture=!0,this.image=t}}class th extends vs{constructor(t,e,i,s,r,n,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isCanvasTexture=!0,this.needsUpdate=!0}}class eh extends vs{constructor(t,e,i,s,r,n,a,o,h,l=1026){if(l!==Dt&&l!==Ht)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===i&&l===Dt&&(i=kt),void 0===i&&l===Ht&&(i=1020),super(null,s,r,n,a,o,l,i,h),this.isDepthTexture=!0,this.image={width:t,height:e},this.magFilter=void 0!==a?a:gt,this.minFilter=void 0!==o?o:gt,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return null!==this.compareFunction&&(e.compareFunction=this.compareFunction),e}}class ih{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(t,e){const i=this.getUtoTmapping(t);return this.getPoint(i,e)}getPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPoint(i/t));return e}getSpacedPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPointAt(i/t));return e}getLength(){const t=this.getLengths();return t[t.length-1]}getLengths(t=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let i,s=this.getPoint(0),r=0;e.push(0);for(let n=1;n<=t;n++)i=this.getPoint(n/t),r+=i.distanceTo(s),e.push(r),s=i;return this.cacheArcLengths=e,e}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(t,e){const i=this.getLengths();let s=0;const r=i.length;let n;n=e||t*i[r-1];let a,o=0,h=r-1;for(;o<=h;)if(s=Math.floor(o+(h-o)/2),a=i[s]-n,a<0)o=s+1;else{if(!(a>0)){h=s;break}h=s-1}if(s=h,i[s]===n)return s/(r-1);const l=i[s];return(s+(n-l)/(i[s+1]-l))/(r-1)}getTangent(t,e){const i=1e-4;let s=t-i,r=t+i;s<0&&(s=0),r>1&&(r=1);const n=this.getPoint(s),a=this.getPoint(r),o=e||(n.isVector2?new Zi:new Is);return o.copy(a).sub(n).normalize(),o}getTangentAt(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)}computeFrenetFrames(t,e){const i=new Is,s=[],r=[],n=[],a=new Is,o=new nr;for(let e=0;e<=t;e++){const i=e/t;s[e]=this.getTangentAt(i,new Is)}r[0]=new Is,n[0]=new Is;let h=Number.MAX_VALUE;const l=Math.abs(s[0].x),c=Math.abs(s[0].y),u=Math.abs(s[0].z);l<=h&&(h=l,i.set(1,0,0)),c<=h&&(h=c,i.set(0,1,0)),u<=h&&i.set(0,0,1),a.crossVectors(s[0],i).normalize(),r[0].crossVectors(s[0],a),n[0].crossVectors(s[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),n[e]=n[e-1].clone(),a.crossVectors(s[e-1],s[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(Di(s[e-1].dot(s[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}n[e].crossVectors(s[e],r[e])}if(!0===e){let e=Math.acos(Di(r[0].dot(r[t]),-1,1));e/=t,s[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(o.makeRotationAxis(s[i],e*i)),n[i].crossVectors(s[i],r[i])}return{tangents:s,normals:r,binormals:n}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.6,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class sh extends ih{constructor(t=0,e=0,i=1,s=1,r=0,n=2*Math.PI,a=!1,o=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=i,this.yRadius=s,this.aStartAngle=r,this.aEndAngle=n,this.aClockwise=a,this.aRotation=o}getPoint(t,e=new Zi){const i=e,s=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const n=Math.abs(r)s;)r-=s;r0?0:(Math.floor(Math.abs(h)/r)+1)*r:0===l&&h===r-1&&(h=r-2,l=1),this.closed||h>0?a=s[(h-1)%r]:(ah.subVectors(s[0],s[1]).add(s[0]),a=ah);const c=s[h%r],u=s[(h+1)%r];if(this.closed||h+2s.length-2?s.length-1:n+1],c=s[n>s.length-3?s.length-1:n+2];return i.set(uh(a,o.x,h.x,l.x,c.x),uh(a,o.y,h.y,l.y,c.y)),i}copy(t){super.copy(t),this.points=[];for(let e=0,i=t.points.length;e=i){const t=s[r]-i,n=this.curves[r],a=n.getLength(),o=0===a?0:1-t/a;return n.getPointAt(o,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,s=this.curves.length;i1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,i=t.curves.length;e0){const t=h.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(h);const l=h.getPoint(1);return this.currentPoint.copy(l),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class _h extends Cn{constructor(t=[new Zi(0,-.5),new Zi(.5,0),new Zi(0,.5)],e=12,i=0,s=2*Math.PI){super(),this.type="LatheGeometry",this.parameters={points:t,segments:e,phiStart:i,phiLength:s},e=Math.floor(e),s=Di(s,0,2*Math.PI);const r=[],n=[],a=[],o=[],h=[],l=1/e,c=new Is,u=new Zi,d=new Is,p=new Is,m=new Is;let y=0,g=0;for(let e=0;e<=t.length-1;e++)switch(e){case 0:y=t[e+1].x-t[e].x,g=t[e+1].y-t[e].y,d.x=1*g,d.y=-y,d.z=0*g,m.copy(d),d.normalize(),o.push(d.x,d.y,d.z);break;case t.length-1:o.push(m.x,m.y,m.z);break;default:y=t[e+1].x-t[e].x,g=t[e+1].y-t[e].y,d.x=1*g,d.y=-y,d.z=0*g,p.copy(d),d.x+=m.x,d.y+=m.y,d.z+=m.z,d.normalize(),o.push(d.x,d.y,d.z),m.copy(p)}for(let r=0;r<=e;r++){const d=i+r*l*s,p=Math.sin(d),m=Math.cos(d);for(let i=0;i<=t.length-1;i++){c.x=t[i].x*p,c.y=t[i].y,c.z=t[i].x*m,n.push(c.x,c.y,c.z),u.x=r/e,u.y=i/(t.length-1),a.push(u.x,u.y);const s=o[3*i+0]*p,l=o[3*i+1],d=o[3*i+0]*m;h.push(s,l,d)}}for(let i=0;i0||0!==s)&&(l.push(n,a,h),x+=3),(e>0||s!==r-1)&&(l.push(a,o,h),x+=3)}h.addGroup(g,x,0),g+=x}(),!1===n&&(t>0&&f(!0),e>0&&f(!1)),this.setIndex(l),this.setAttribute("position",new vn(c,3)),this.setAttribute("normal",new vn(u,3)),this.setAttribute("uv",new vn(d,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new zh(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Ch extends zh{constructor(t=1,e=1,i=32,s=1,r=!1,n=0,a=2*Math.PI){super(0,t,e,i,s,r,n,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:s,openEnded:r,thetaStart:n,thetaLength:a}}static fromJSON(t){return new Ch(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Ih extends Cn{constructor(t=[],e=[],i=1,s=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:s};const r=[],n=[];function a(t,e,i,s){const r=s+1,n=[];for(let s=0;s<=r;s++){n[s]=[];const a=t.clone().lerp(i,s/r),o=e.clone().lerp(i,s/r),h=r-s;for(let t=0;t<=h;t++)n[s][t]=0===t&&s===r?a:a.clone().lerp(o,t/h)}for(let t=0;t.9&&a<.1&&(e<.2&&(n[t+0]+=1),i<.2&&(n[t+2]+=1),s<.2&&(n[t+4]+=1))}}()}(),this.setAttribute("position",new vn(r,3)),this.setAttribute("normal",new vn(r.slice(),3)),this.setAttribute("uv",new vn(n,2)),0===s?this.computeVertexNormals():this.normalizeNormals()}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Ih(t.vertices,t.indices,t.radius,t.details)}}class Bh extends Ih{constructor(t=1,e=0){const i=(1+Math.sqrt(5))/2,s=1/i;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-s,-i,0,-s,i,0,s,-i,0,s,i,-s,-i,0,-s,i,0,s,-i,0,s,i,0,-i,0,-s,i,0,-s,-i,0,s,i,0,s],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}static fromJSON(t){return new Bh(t.radius,t.detail)}}const kh=new Is,Rh=new Is,Eh=new Is,Ph=new Jr;class Oh extends Cn{constructor(t=null,e=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:t,thresholdAngle:e},null!==t){const i=4,s=Math.pow(10,i),r=Math.cos(ji*e),n=t.getIndex(),a=t.getAttribute("position"),o=n?n.count:a.count,h=[0,0,0],l=["a","b","c"],c=new Array(3),u={},d=[];for(let t=0;t80*i){o=l=t[0],h=c=t[1];for(let e=i;el&&(l=u),d>c&&(c=d);p=Math.max(l-o,c-h),p=0!==p?32767/p:0}return jh(n,a,i,o,h,p,0),a};function Lh(t,e,i,s,r){let n,a;if(r===function(t,e,i,s){let r=0;for(let n=e,a=i-s;n0)for(n=e;n=e;n-=s)a=nl(n,t[n],t[n+1],a);return a&&Kh(a,a.next)&&(al(a),a=a.next),a}function Vh(t,e){if(!t)return t;e||(e=t);let i,s=t;do{if(i=!1,s.steiner||!Kh(s,s.next)&&0!==Qh(s.prev,s,s.next))s=s.next;else{if(al(s),s=e=s.prev,s===s.next)break;i=!0}}while(i||s!==e);return e}function jh(t,e,i,s,r,n,a){if(!t)return;!a&&n&&function(t,e,i,s){let r=t;do{0===r.z&&(r.z=Yh(r.x,r.y,e,i,s)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i,s,r,n,a,o,h,l=1;do{for(i=t,t=null,n=null,a=0;i;){for(a++,s=i,o=0,e=0;e0||h>0&&s;)0!==o&&(0===h||!s||i.z<=s.z)?(r=i,i=i.nextZ,o--):(r=s,s=s.nextZ,h--),n?n.nextZ=r:t=r,r.prevZ=n,n=r;i=s}n.nextZ=null,l*=2}while(a>1)}(r)}(t,s,r,n);let o,h,l=t;for(;t.prev!==t.next;)if(o=t.prev,h=t.next,n?Uh(t,s,r,n):Wh(t))e.push(o.i/i|0),e.push(t.i/i|0),e.push(h.i/i|0),al(t),t=h.next,l=h.next;else if((t=h)===l){a?1===a?jh(t=Dh(Vh(t),e,i),e,i,s,r,n,2):2===a&&Hh(t,e,i,s,r,n):jh(Vh(t),e,i,s,r,n,1);break}}function Wh(t){const e=t.prev,i=t,s=t.next;if(Qh(e,i,s)>=0)return!1;const r=e.x,n=i.x,a=s.x,o=e.y,h=i.y,l=s.y,c=rn?r>a?r:a:n>a?n:a,p=o>h?o>l?o:l:h>l?h:l;let m=s.next;for(;m!==e;){if(m.x>=c&&m.x<=d&&m.y>=u&&m.y<=p&&Gh(r,o,n,h,a,l,m.x,m.y)&&Qh(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function Uh(t,e,i,s){const r=t.prev,n=t,a=t.next;if(Qh(r,n,a)>=0)return!1;const o=r.x,h=n.x,l=a.x,c=r.y,u=n.y,d=a.y,p=oh?o>l?o:l:h>l?h:l,g=c>u?c>d?c:d:u>d?u:d,f=Yh(p,m,e,i,s),x=Yh(y,g,e,i,s);let b=t.prevZ,v=t.nextZ;for(;b&&b.z>=f&&v&&v.z<=x;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&Gh(o,c,h,u,l,d,b.x,b.y)&&Qh(b.prev,b,b.next)>=0)return!1;if(b=b.prevZ,v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&Gh(o,c,h,u,l,d,v.x,v.y)&&Qh(v.prev,v,v.next)>=0)return!1;v=v.nextZ}for(;b&&b.z>=f;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&Gh(o,c,h,u,l,d,b.x,b.y)&&Qh(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;v&&v.z<=x;){if(v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&Gh(o,c,h,u,l,d,v.x,v.y)&&Qh(v.prev,v,v.next)>=0)return!1;v=v.nextZ}return!0}function Dh(t,e,i){let s=t;do{const r=s.prev,n=s.next.next;!Kh(r,n)&&tl(r,s,s.next,n)&&sl(r,n)&&sl(n,r)&&(e.push(r.i/i|0),e.push(s.i/i|0),e.push(n.i/i|0),al(s),al(s.next),s=t=n),s=s.next}while(s!==t);return Vh(s)}function Hh(t,e,i,s,r,n){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&$h(a,t)){let o=rl(a,t);return a=Vh(a,a.next),o=Vh(o,o.next),jh(a,e,i,s,r,n,0),void jh(o,e,i,s,r,n,0)}t=t.next}a=a.next}while(a!==t)}function qh(t,e){return t.x-e.x}function Jh(t,e){const i=function(t,e){let i,s=e,r=-1/0;const n=t.x,a=t.y;do{if(a<=s.y&&a>=s.next.y&&s.next.y!==s.y){const t=s.x+(a-s.y)*(s.next.x-s.x)/(s.next.y-s.y);if(t<=n&&t>r&&(r=t,i=s.x=s.x&&s.x>=h&&n!==s.x&&Gh(ai.x||s.x===i.x&&Xh(i,s)))&&(i=s,u=c)),s=s.next}while(s!==o);return i}(t,e);if(!i)return e;const s=rl(i,t);return Vh(s,s.next),Vh(i,i.next)}function Xh(t,e){return Qh(t.prev,t,e.prev)<0&&Qh(e.next,t,t.next)<0}function Yh(t,e,i,s,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-s)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Zh(t){let e=t,i=t;do{(e.x=(t-a)*(n-o)&&(t-a)*(s-o)>=(i-a)*(e-o)&&(i-a)*(n-o)>=(r-a)*(s-o)}function $h(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&tl(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(sl(t,e)&&sl(e,t)&&function(t,e){let i=t,s=!1;const r=(t.x+e.x)/2,n=(t.y+e.y)/2;do{i.y>n!=i.next.y>n&&i.next.y!==i.y&&r<(i.next.x-i.x)*(n-i.y)/(i.next.y-i.y)+i.x&&(s=!s),i=i.next}while(i!==t);return s}(t,e)&&(Qh(t.prev,t,e.prev)||Qh(t,e.prev,e))||Kh(t,e)&&Qh(t.prev,t,t.next)>0&&Qh(e.prev,e,e.next)>0)}function Qh(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function Kh(t,e){return t.x===e.x&&t.y===e.y}function tl(t,e,i,s){const r=il(Qh(t,e,i)),n=il(Qh(t,e,s)),a=il(Qh(i,s,t)),o=il(Qh(i,s,e));return r!==n&&a!==o||(!(0!==r||!el(t,i,e))||(!(0!==n||!el(t,s,e))||(!(0!==a||!el(i,t,s))||!(0!==o||!el(i,e,s)))))}function el(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function il(t){return t>0?1:t<0?-1:0}function sl(t,e){return Qh(t.prev,t,t.next)<0?Qh(t,e,t.next)>=0&&Qh(t,t.prev,e)>=0:Qh(t,e,t.prev)<0||Qh(t,t.next,e)<0}function rl(t,e){const i=new ol(t.i,t.x,t.y),s=new ol(e.i,e.x,e.y),r=t.next,n=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,s.next=i,i.prev=s,n.next=s,s.prev=n,s}function nl(t,e,i,s){const r=new ol(t,e,i);return s?(r.next=s.next,r.prev=s,s.next.prev=r,s.next=r):(r.prev=r,r.next=r),r}function al(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function ol(t,e,i){this.i=t,this.x=e,this.y=i,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}class hl{static area(t){const e=t.length;let i=0;for(let s=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function cl(t,e){for(let i=0;iNumber.EPSILON){const u=Math.sqrt(c),d=Math.sqrt(h*h+l*l),p=e.x-o/u,m=e.y+a/u,y=((i.x-l/d-p)*l-(i.y+h/d-m)*h)/(a*l-o*h);s=p+a*y-t.x,r=m+o*y-t.y;const g=s*s+r*r;if(g<=2)return new Zi(s,r);n=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?h>Number.EPSILON&&(t=!0):a<-Number.EPSILON?h<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(l)&&(t=!0),t?(s=-o,r=a,n=Math.sqrt(c)):(s=a,r=o,n=Math.sqrt(c/2))}return new Zi(s/n,r/n)}const k=[];for(let t=0,e=T.length,i=e-1,s=t+1;t=0;t--){const e=t/p,i=c*Math.cos(e*Math.PI/2),s=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=T.length;t=0;){const s=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=o+2*p;t0)&&d.push(e,r,h),(t!==i-1||o0!=t>0&&this.version++,this._anisotropy=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get dispersion(){return this._dispersion}set dispersion(t){this._dispersion>0!=t>0&&this.version++,this._dispersion=t}get sheen(){return this._sheen}set sheen(t){this._sheen>0!=t>0&&this.version++,this._sheen=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=t.anisotropy,this.anisotropyRotation=t.anisotropyRotation,this.anisotropyMap=t.anisotropyMap,this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.dispersion=t.dispersion,this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class Bl extends tn{constructor(t){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new $r(16777215),this.specular=new $r(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new $r(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Zi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new yr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class kl extends tn{constructor(t){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new $r(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new $r(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Zi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}class Rl extends tn{constructor(t){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Zi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}class El extends tn{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new $r(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new $r(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Zi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new yr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Pl extends tn{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class Ol extends tn{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}class Fl extends tn{constructor(t){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new $r(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Zi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Nl extends zo{constructor(t){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}function Ll(t,e,i){return!t||!i&&t.constructor===e?t:"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t)}function Vl(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function jl(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort((function(e,i){return t[e]-t[i]})),i}function Wl(t,e,i){const s=t.length,r=new t.constructor(s);for(let n=0,a=0;a!==s;++n){const s=i[n]*e;for(let i=0;i!==e;++i)r[a++]=t[s+i]}return r}function Ul(t,e,i,s){let r=1,n=t[0];for(;void 0!==n&&void 0===n[s];)n=t[r++];if(void 0===n)return;let a=n[s];if(void 0!==a)if(Array.isArray(a))do{a=n[s],void 0!==a&&(e.push(n.time),i.push.apply(i,a)),n=t[r++]}while(void 0!==n);else if(void 0!==a.toArray)do{a=n[s],void 0!==a&&(e.push(n.time),a.toArray(i,i.length)),n=t[r++]}while(void 0!==n);else do{a=n[s],void 0!==a&&(e.push(n.time),i.push(a)),n=t[r++]}while(void 0!==n)}const Dl={convertArray:Ll,isTypedArray:Vl,getKeyframeOrder:jl,sortedArray:Wl,flattenJSON:Ul,subclip:function(t,e,i,s,r=30){const n=t.clone();n.name=e;const a=[];for(let t=0;t=s)){h.push(e.times[t]);for(let i=0;in.tracks[t].times[0]&&(o=n.tracks[t].times[0]);for(let t=0;t=s.times[u]){const t=u*h+o,e=t+h-o;d=s.values.slice(t,e)}else{const t=s.createInterpolant(),e=o,i=h-o;t.evaluate(n),d=t.resultBuffer.slice(e,i)}if("quaternion"===r){(new Cs).fromArray(d).normalize().conjugate().toArray(d)}const p=a.times.length;for(let t=0;t=r)break t;{const a=e[1];t=r)break e}n=i,i=0}}for(;i>>1;te;)--n;if(++n,0!==r||n!==s){r>=n&&(n=Math.max(n,1),r=n-1);const t=this.getValueSize();this.times=i.slice(r,n),this.values=this.values.slice(r*t,n*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,s=this.values,r=i.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);let n=null;for(let e=0;e!==r;e++){const s=i[e];if("number"==typeof s&&isNaN(s)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,e,s),t=!1;break}if(null!==n&&n>s){console.error("THREE.KeyframeTrack: Out of order keys.",this,e,s,n),t=!1;break}n=s}if(void 0!==s&&Vl(s))for(let e=0,i=s.length;e!==i;++e){const i=s[e];if(isNaN(i)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t}optimize(){const t=this.times.slice(),e=this.values.slice(),i=this.getValueSize(),s=this.getInterpolation()===Pe,r=t.length-1;let n=1;for(let a=1;a0){t[n]=t[r];for(let t=r*i,s=n*i,a=0;a!==i;++a)e[s+a]=e[t+a];++n}return n!==t.length?(this.times=t.slice(0,n),this.values=e.slice(0,n*i)):(this.times=t,this.values=e),this}clone(){const t=this.times.slice(),e=this.values.slice(),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}Yl.prototype.TimeBufferType=Float32Array,Yl.prototype.ValueBufferType=Float32Array,Yl.prototype.DefaultInterpolation=Ee;class Zl extends Yl{constructor(t,e,i){super(t,e,i)}}Zl.prototype.ValueTypeName="bool",Zl.prototype.ValueBufferType=Array,Zl.prototype.DefaultInterpolation=Re,Zl.prototype.InterpolantFactoryMethodLinear=void 0,Zl.prototype.InterpolantFactoryMethodSmooth=void 0;class Gl extends Yl{}Gl.prototype.ValueTypeName="color";class $l extends Yl{}$l.prototype.ValueTypeName="number";class Ql extends Hl{constructor(t,e,i,s){super(t,e,i,s)}interpolate_(t,e,i,s){const r=this.resultBuffer,n=this.sampleValues,a=this.valueSize,o=(i-e)/(s-e);let h=t*a;for(let t=h+a;h!==t;h+=4)Cs.slerpFlat(r,0,n,h-a,n,h,o);return r}}class Kl extends Yl{InterpolantFactoryMethodLinear(t){return new Ql(this.times,this.values,this.getValueSize(),t)}}Kl.prototype.ValueTypeName="quaternion",Kl.prototype.InterpolantFactoryMethodSmooth=void 0;class tc extends Yl{constructor(t,e,i){super(t,e,i)}}tc.prototype.ValueTypeName="string",tc.prototype.ValueBufferType=Array,tc.prototype.DefaultInterpolation=Re,tc.prototype.InterpolantFactoryMethodLinear=void 0,tc.prototype.InterpolantFactoryMethodSmooth=void 0;class ec extends Yl{}ec.prototype.ValueTypeName="vector";class ic{constructor(t="",e=-1,i=[],s=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=s,this.uuid=Ui(),this.duration<0&&this.resetDuration()}static parse(t){const e=[],i=t.tracks,s=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(sc(i[t]).scale(s));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r}static toJSON(t){const e=[],i=t.tracks,s={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode};for(let t=0,s=i.length;t!==s;++t)e.push(Yl.toJSON(i[t]));return s}static CreateFromMorphTargetSequence(t,e,i,s){const r=e.length,n=[];for(let t=0;t1){const t=n[1];let e=s[t];e||(s[t]=e=[]),e.push(i)}}const n=[];for(const t in s)n.push(this.CreateFromMorphTargetSequence(t,s[t],e,i));return n}static parseAnimation(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,s,r){if(0!==i.length){const n=[],a=[];Ul(i,n,a,s),0!==n.length&&r.push(new t(e,n,a))}},s=[],r=t.name||"default",n=t.fps||30,a=t.blendMode;let o=t.length||-1;const h=t.hierarchy||[];for(let t=0;t{e&&e(r),this.manager.itemEnd(t)}),0),r;if(void 0!==hc[t])return void hc[t].push({onLoad:e,onProgress:i,onError:s});hc[t]=[],hc[t].push({onLoad:e,onProgress:i,onError:s});const n=new Request(t,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"}),a=this.mimeType,o=this.responseType;fetch(n).then((e=>{if(200===e.status||0===e.status){if(0===e.status&&console.warn("THREE.FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===e.body||void 0===e.body.getReader)return e;const i=hc[t],s=e.body.getReader(),r=e.headers.get("X-File-Size")||e.headers.get("Content-Length"),n=r?parseInt(r):0,a=0!==n;let o=0;const h=new ReadableStream({start(t){!function e(){s.read().then((({done:s,value:r})=>{if(s)t.close();else{o+=r.byteLength;const s=new ProgressEvent("progress",{lengthComputable:a,loaded:o,total:n});for(let t=0,e=i.length;t{t.error(e)}))}()}});return new Response(h)}throw new lc(`fetch for "${e.url}" responded with ${e.status}: ${e.statusText}`,e)})).then((t=>{switch(o){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then((t=>(new DOMParser).parseFromString(t,a)));case"json":return t.json();default:if(void 0===a)return t.text();{const e=/charset="?([^;"\s]*)"?/i.exec(a),i=e&&e[1]?e[1].toLowerCase():void 0,s=new TextDecoder(i);return t.arrayBuffer().then((t=>s.decode(t)))}}})).then((e=>{rc.add(t,e);const i=hc[t];delete hc[t];for(let t=0,s=i.length;t{const i=hc[t];if(void 0===i)throw this.manager.itemError(t),e;delete hc[t];for(let t=0,s=i.length;t{this.manager.itemEnd(t)})),this.manager.itemStart(t)}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}}class uc extends oc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new cc(this.manager);n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,(function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):console.error(e),r.manager.itemError(t)}}),i,s)}parse(t){const e=[];for(let i=0;i0:s.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(s.uniforms[e]={},r.type){case"t":s.uniforms[e].value=i(r.value);break;case"c":s.uniforms[e].value=(new $r).setHex(r.value);break;case"v2":s.uniforms[e].value=(new Zi).fromArray(r.value);break;case"v3":s.uniforms[e].value=(new Is).fromArray(r.value);break;case"v4":s.uniforms[e].value=(new ws).fromArray(r.value);break;case"m3":s.uniforms[e].value=(new Gi).fromArray(r.value);break;case"m4":s.uniforms[e].value=(new nr).fromArray(r.value);break;default:s.uniforms[e].value=r.value}}if(void 0!==t.defines&&(s.defines=t.defines),void 0!==t.vertexShader&&(s.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(s.fragmentShader=t.fragmentShader),void 0!==t.glslVersion&&(s.glslVersion=t.glslVersion),void 0!==t.extensions)for(const e in t.extensions)s.extensions[e]=t.extensions[e];if(void 0!==t.lights&&(s.lights=t.lights),void 0!==t.clipping&&(s.clipping=t.clipping),void 0!==t.size&&(s.size=t.size),void 0!==t.sizeAttenuation&&(s.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(s.map=i(t.map)),void 0!==t.matcap&&(s.matcap=i(t.matcap)),void 0!==t.alphaMap&&(s.alphaMap=i(t.alphaMap)),void 0!==t.bumpMap&&(s.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(s.bumpScale=t.bumpScale),void 0!==t.normalMap&&(s.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(s.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),s.normalScale=(new Zi).fromArray(e)}return void 0!==t.displacementMap&&(s.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(s.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(s.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(s.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(s.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(s.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(s.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(s.specularMap=i(t.specularMap)),void 0!==t.specularIntensityMap&&(s.specularIntensityMap=i(t.specularIntensityMap)),void 0!==t.specularColorMap&&(s.specularColorMap=i(t.specularColorMap)),void 0!==t.envMap&&(s.envMap=i(t.envMap)),void 0!==t.envMapRotation&&s.envMapRotation.fromArray(t.envMapRotation),void 0!==t.envMapIntensity&&(s.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(s.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(s.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(s.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(s.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(s.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(s.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(s.gradientMap=i(t.gradientMap)),void 0!==t.clearcoatMap&&(s.clearcoatMap=i(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(s.clearcoatRoughnessMap=i(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(s.clearcoatNormalMap=i(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(s.clearcoatNormalScale=(new Zi).fromArray(t.clearcoatNormalScale)),void 0!==t.iridescenceMap&&(s.iridescenceMap=i(t.iridescenceMap)),void 0!==t.iridescenceThicknessMap&&(s.iridescenceThicknessMap=i(t.iridescenceThicknessMap)),void 0!==t.transmissionMap&&(s.transmissionMap=i(t.transmissionMap)),void 0!==t.thicknessMap&&(s.thicknessMap=i(t.thicknessMap)),void 0!==t.anisotropyMap&&(s.anisotropyMap=i(t.anisotropyMap)),void 0!==t.sheenColorMap&&(s.sheenColorMap=i(t.sheenColorMap)),void 0!==t.sheenRoughnessMap&&(s.sheenRoughnessMap=i(t.sheenRoughnessMap)),s}setTextures(t){return this.textures=t,this}createMaterialFromType(t){return Nc.createMaterialFromType(t)}static createMaterialFromType(t){return new{ShadowMaterial:Tl,SpriteMaterial:da,RawShaderMaterial:zl,ShaderMaterial:Xn,PointsMaterial:Wo,MeshPhysicalMaterial:Il,MeshStandardMaterial:Cl,MeshPhongMaterial:Bl,MeshToonMaterial:kl,MeshNormalMaterial:Rl,MeshLambertMaterial:El,MeshDepthMaterial:Pl,MeshDistanceMaterial:Ol,MeshBasicMaterial:en,MeshMatcapMaterial:Fl,LineDashedMaterial:Nl,LineBasicMaterial:zo,Material:tn}[t]}}class Lc{static decodeText(t){if(console.warn("THREE.LoaderUtils: decodeText() has been deprecated with r165 and will be removed with r175. Use TextDecoder instead."),"undefined"!=typeof TextDecoder)return(new TextDecoder).decode(t);let e="";for(let i=0,s=t.length;i0){const i=new nc(e);r=new pc(i),r.setCrossOrigin(this.crossOrigin);for(let e=0,i=t.length;e0){s=new pc(this.manager),s.setCrossOrigin(this.crossOrigin);for(let e=0,s=t.length;e{const e=new Rs;e.min.fromArray(t.boxMin),e.max.fromArray(t.boxMax);const i=new Gs;return i.radius=t.sphereRadius,i.center.fromArray(t.sphereCenter),{boxInitialized:t.boxInitialized,box:e,sphereInitialized:t.sphereInitialized,sphere:i}})),n._maxInstanceCount=t.maxInstanceCount,n._maxVertexCount=t.maxVertexCount,n._maxIndexCount=t.maxIndexCount,n._geometryInitialized=t.geometryInitialized,n._geometryCount=t.geometryCount,n._matricesTexture=c(t.matricesTexture.uuid),void 0!==t.colorsTexture&&(n._colorsTexture=c(t.colorsTexture.uuid));break;case"LOD":n=new Ba;break;case"Line":n=new Oo(h(t.geometry),l(t.material));break;case"LineLoop":n=new jo(h(t.geometry),l(t.material));break;case"LineSegments":n=new Vo(h(t.geometry),l(t.material));break;case"PointCloud":case"Points":n=new Jo(h(t.geometry),l(t.material));break;case"Sprite":n=new Ta(l(t.material));break;case"Group":n=new sa;break;case"Bone":n=new Wa;break;default:n=new Rr}if(n.uuid=t.uuid,void 0!==t.name&&(n.name=t.name),void 0!==t.matrix?(n.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(n.matrixAutoUpdate=t.matrixAutoUpdate),n.matrixAutoUpdate&&n.matrix.decompose(n.position,n.quaternion,n.scale)):(void 0!==t.position&&n.position.fromArray(t.position),void 0!==t.rotation&&n.rotation.fromArray(t.rotation),void 0!==t.quaternion&&n.quaternion.fromArray(t.quaternion),void 0!==t.scale&&n.scale.fromArray(t.scale)),void 0!==t.up&&n.up.fromArray(t.up),void 0!==t.castShadow&&(n.castShadow=t.castShadow),void 0!==t.receiveShadow&&(n.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.intensity&&(n.shadow.intensity=t.shadow.intensity),void 0!==t.shadow.bias&&(n.shadow.bias=t.shadow.bias),void 0!==t.shadow.normalBias&&(n.shadow.normalBias=t.shadow.normalBias),void 0!==t.shadow.radius&&(n.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&n.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(n.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.frustumCulled&&(n.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(n.renderOrder=t.renderOrder),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.layers&&(n.layers.mask=t.layers),void 0!==t.children){const a=t.children;for(let t=0;t{e&&e(i),r.manager.itemEnd(t)})).catch((t=>{s&&s(t)})):(setTimeout((function(){e&&e(n),r.manager.itemEnd(t)}),0),n);const a={};a.credentials="anonymous"===this.crossOrigin?"same-origin":"include",a.headers=this.requestHeader;const o=fetch(t,a).then((function(t){return t.blob()})).then((function(t){return createImageBitmap(t,Object.assign(r.options,{colorSpaceConversion:"none"}))})).then((function(i){return rc.add(t,i),e&&e(i),r.manager.itemEnd(t),i})).catch((function(e){s&&s(e),rc.remove(t),r.manager.itemError(t),r.manager.itemEnd(t)}));rc.add(t,o),r.manager.itemStart(t)}}let Jc;class Xc{static getContext(){return void 0===Jc&&(Jc=new(window.AudioContext||window.webkitAudioContext)),Jc}static setContext(t){Jc=t}}class Yc extends oc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new cc(this.manager);function a(e){s?s(e):console.error(e),r.manager.itemError(t)}n.setResponseType("arraybuffer"),n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,(function(t){try{const i=t.slice(0);Xc.getContext().decodeAudioData(i,(function(t){e(t)})).catch(a)}catch(t){a(t)}}),i,s)}}const Zc=new nr,Gc=new nr,$c=new nr;class Qc{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new Qn,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new Qn,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(t){const e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep,$c.copy(t.projectionMatrix);const i=e.eyeSep/2,s=i*e.near/e.focus,r=e.near*Math.tan(ji*e.fov*.5)/e.zoom;let n,a;Gc.elements[12]=-i,Zc.elements[12]=i,n=-r*e.aspect+s,a=r*e.aspect+s,$c.elements[0]=2*e.near/(a-n),$c.elements[8]=(a+n)/(a-n),this.cameraL.projectionMatrix.copy($c),n=-r*e.aspect-s,a=r*e.aspect-s,$c.elements[0]=2*e.near/(a-n),$c.elements[8]=(a+n)/(a-n),this.cameraR.projectionMatrix.copy($c)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(Gc),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(Zc)}}class Kc extends Qn{constructor(t=[]){super(),this.isArrayCamera=!0,this.cameras=t,this.index=0}}class tu{constructor(t=!0){this.autoStart=t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=eu(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const e=eu();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}}function eu(){return performance.now()}const iu=new Is,su=new Cs,ru=new Is,nu=new Is;class au extends Rr{constructor(){super(),this.type="AudioListener",this.context=Xc.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new tu}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t);const e=this.context.listener,i=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(iu,su,ru),nu.set(0,0,-1).applyQuaternion(su),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(iu.x,t),e.positionY.linearRampToValueAtTime(iu.y,t),e.positionZ.linearRampToValueAtTime(iu.z,t),e.forwardX.linearRampToValueAtTime(nu.x,t),e.forwardY.linearRampToValueAtTime(nu.y,t),e.forwardZ.linearRampToValueAtTime(nu.z,t),e.upX.linearRampToValueAtTime(i.x,t),e.upY.linearRampToValueAtTime(i.y,t),e.upZ.linearRampToValueAtTime(i.z,t)}else e.setPosition(iu.x,iu.y,iu.z),e.setOrientation(nu.x,nu.y,nu.z,i.x,i.y,i.z)}}class ou extends Rr{constructor(t){super(),this.type="Audio",this.listener=t,this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this}setMediaElementSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this}setMediaStreamSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(t),this.connect(),this}setBuffer(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this}play(t=0){if(!0===this.isPlaying)return void console.warn("THREE.Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void console.warn("THREE.Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+t;const e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd,e.onended=this.onEnded.bind(this),e.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=e,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;console.warn("THREE.Audio: this Audio has no playback control.")}stop(t=0){if(!1!==this.hasPlaybackControl)return this._progress=0,null!==this.source&&(this.source.stop(this.context.currentTime+t),this.source.onended=null),this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(i,s,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){a.setValue(i,s);break}}saveOriginalState(){const t=this.binding,e=this.buffer,i=this.valueSize,s=i*this._origIndex;t.getValue(e,s);for(let t=i,r=s;t!==r;++t)e[t]=e[s+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i=.5)for(let s=0;s!==r;++s)t[e+s]=t[i+s]}_slerp(t,e,i,s){Cs.slerpFlat(t,e,t,e,t,i,s)}_slerpAdditive(t,e,i,s,r){const n=this._workIndex*r;Cs.multiplyQuaternionsFlat(t,n,t,e,t,i),Cs.slerpFlat(t,e,t,e,t,n,s)}_lerp(t,e,i,s,r){const n=1-s;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*n+t[i+a]*s}}_lerpAdditive(t,e,i,s,r){for(let n=0;n!==r;++n){const r=e+n;t[r]=t[r]+t[i+n]*s}}}const yu="\\[\\]\\.:\\/",gu=new RegExp("["+yu+"]","g"),fu="[^"+yu+"]",xu="[^"+yu.replace("\\.","")+"]",bu=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",fu)+/(WCOD+)?/.source.replace("WCOD",xu)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",fu)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",fu)+"$"),vu=["material","materials","bones","map"];class wu{constructor(t,e,i){this.path=e,this.parsedPath=i||wu.parseTrackName(e),this.node=wu.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,i){return t&&t.isAnimationObjectGroup?new wu.Composite(t,e,i):new wu(t,e,i)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(gu,"")}static parseTrackName(t){const e=bu.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},s=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==s&&-1!==s){const t=i.nodeName.substring(s+1);-1!==vu.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,s),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let s=0;s=r){const n=r++,l=t[n];e[l.uuid]=h,t[h]=l,e[o]=n,t[n]=a;for(let t=0,e=s;t!==e;++t){const e=i[t],s=e[n],r=e[h];e[h]=s,e[n]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,i=this._bindings,s=i.length;let r=this.nCachedObjects_,n=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,h=e[o];if(void 0!==h)if(delete e[o],h0&&(e[a.uuid]=h),t[h]=a,t.pop();for(let t=0,e=s;t!==e;++t){const e=i[t];e[h]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const i=this._bindingsIndicesByPath;let s=i[t];const r=this._bindings;if(void 0!==s)return r[s];const n=this._paths,a=this._parsedPaths,o=this._objects,h=o.length,l=this.nCachedObjects_,c=new Array(h);s=r.length,i[t]=s,n.push(t),a.push(e),r.push(c);for(let i=l,s=o.length;i!==s;++i){const s=o[i];c[i]=new wu(s,t,e)}return c}unsubscribe_(t){const e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){const s=this._paths,r=this._parsedPaths,n=this._bindings,a=n.length-1,o=n[a];e[t[a]]=i,n[i]=o,n.pop(),r[i]=r[a],r.pop(),s[i]=s[a],s.pop()}}}class Su{constructor(t,e,i=null,s=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=i,this.blendMode=s;const r=e.tracks,n=r.length,a=new Array(n),o={endingStart:Oe,endingEnd:Oe};for(let t=0;t!==n;++t){const e=r[t].createInterpolant(null);a[t]=e,e.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(n),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,i){if(t.fadeOut(e),this.fadeIn(e),i){const i=this._clip.duration,s=t._clip.duration,r=s/i,n=i/s;t.warp(1,r,e),this.warp(n,1,e)}return this}crossFadeTo(t,e,i){return t.crossFadeFrom(this,e,i)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,i){const s=this._mixer,r=s.time,n=this.timeScale;let a=this._timeScaleInterpolant;null===a&&(a=s._lendControlInterpolant(),this._timeScaleInterpolant=a);const o=a.parameterPositions,h=a.sampleValues;return o[0]=r,o[1]=r+i,h[0]=t/n,h[1]=e/n,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,i,s){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const s=(t-r)*i;s<0||0===i?e=0:(this._startTime=null,e=i*s)}e*=this._updateTimeScale(t);const n=this._updateTime(e),a=this._updateWeight(t);if(a>0){const t=this._interpolants,e=this._propertyBindings;if(this.blendMode===Ve)for(let i=0,s=t.length;i!==s;++i)t[i].evaluate(n),e[i].accumulateAdditive(a);else for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(n),e[i].accumulate(s,a)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const s=i.evaluate(t)[0];e*=s,t>i.parameterPositions[1]&&(this.stopFading(),0===s&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let s=this.time+t,r=this._loopCount;const n=2202===i;if(0===t)return-1===r||!n||1&~r?s:e-s;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(s>=e)s=e;else{if(!(s<0)){this.time=s;break t}s=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,n)):this._setEndings(0===this.repetitions,!0,n)),s>=e||s<0){const i=Math.floor(s/e);s-=e*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,s=t>0?e:0,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,n)}else this._setEndings(!1,!1,n);this._loopCount=r,this.time=s,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this.time=s;if(n&&!(1&~r))return e-s}return s}_setEndings(t,e,i){const s=this._interpolantSettings;i?(s.endingStart=Fe,s.endingEnd=Fe):(s.endingStart=t?this.zeroSlopeAtStart?Fe:Oe:Ne,s.endingEnd=e?this.zeroSlopeAtEnd?Fe:Oe:Ne)}_scheduleFading(t,e,i){const s=this._mixer,r=s.time;let n=this._weightInterpolant;null===n&&(n=s._lendControlInterpolant(),this._weightInterpolant=n);const a=n.parameterPositions,o=n.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=i,this}}const _u=new Float32Array(1);class Au extends Ni{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(t,e){const i=t._localRoot||this._root,s=t._clip.tracks,r=s.length,n=t._propertyBindings,a=t._interpolants,o=i.uuid,h=this._bindingsByRootAndName;let l=h[o];void 0===l&&(l={},h[o]=l);for(let t=0;t!==r;++t){const r=s[t],h=r.name;let c=l[h];if(void 0!==c)++c.referenceCount,n[t]=c;else{if(c=n[t],void 0!==c){null===c._cacheIndex&&(++c.referenceCount,this._addInactiveBinding(c,o,h));continue}const s=e&&e._propertyBindings[t].binding.parsedPath;c=new mu(wu.create(i,h,s),r.ValueTypeName,r.getValueSize()),++c.referenceCount,this._addInactiveBinding(c,o,h),n[t]=c}a[t].resultBuffer=c.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,i=t._clip.uuid,s=this._actionsByClip[i];this._bindAction(t,s&&s.knownActions[0]),this._addInactiveAction(t,i,e)}const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0==i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0==--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,s=this.time+=t,r=Math.sign(t),n=this._accuIndex^=1;for(let a=0;a!==i;++a){e[a]._update(s,t,r,n)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(n);return this}setTime(t){this.time=0;for(let t=0;t=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,ju).distanceTo(t)}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const Uu=new Is,Du=new Is;class Hu{constructor(t=new Is,e=new Is){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){Uu.subVectors(t,this.start),Du.subVectors(this.end,this.start);const i=Du.dot(Du);let s=Du.dot(Uu)/i;return e&&(s=Di(s,0,1)),s}closestPointToPoint(t,e,i){const s=this.closestPointToPointParameter(t,e);return this.delta(i).multiplyScalar(s).add(this.start)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}const qu=new Is;class Ju extends Rr{constructor(t,e){super(),this.light=t,this.matrixAutoUpdate=!1,this.color=e,this.type="SpotLightHelper";const i=new Cn,s=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let t=0,e=1,i=32;t1)for(let i=0;i.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{fd.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(fd,e)}}setLength(t,e=.2*t,i=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(i,e,i),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}}class wd extends Vo{constructor(t=1){const e=[0,0,0,t,0,0,0,0,0,0,t,0,0,0,0,0,0,t],i=new Cn;i.setAttribute("position",new vn(e,3)),i.setAttribute("color",new vn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));super(i,new zo({vertexColors:!0,toneMapped:!1})),this.type="AxesHelper"}setColors(t,e,i){const s=new $r,r=this.geometry.attributes.color.array;return s.set(t),s.toArray(r,0),s.toArray(r,3),s.set(e),s.toArray(r,6),s.toArray(r,9),s.set(i),s.toArray(r,12),s.toArray(r,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class Md{constructor(){this.type="ShapePath",this.color=new $r,this.subPaths=[],this.currentPath=null}moveTo(t,e){return this.currentPath=new Sh,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this}lineTo(t,e){return this.currentPath.lineTo(t,e),this}quadraticCurveTo(t,e,i,s){return this.currentPath.quadraticCurveTo(t,e,i,s),this}bezierCurveTo(t,e,i,s,r,n){return this.currentPath.bezierCurveTo(t,e,i,s,r,n),this}splineThru(t){return this.currentPath.splineThru(t),this}toShapes(t){function e(t,e){const i=e.length;let s=!1;for(let r=i-1,n=0;nNumber.EPSILON){if(h<0&&(i=e[n],o=-o,a=e[r],h=-h),t.ya.y)continue;if(t.y===i.y){if(t.x===i.x)return!0}else{const e=h*(t.x-i.x)-o*(t.y-i.y);if(0===e)return!0;if(e<0)continue;s=!s}}else{if(t.y!==i.y)continue;if(a.x<=t.x&&t.x<=i.x||i.x<=t.x&&t.x<=a.x)return!0}}return s}const i=hl.isClockWise,s=this.subPaths;if(0===s.length)return[];let r,n,a;const o=[];if(1===s.length)return n=s[0],a=new Fh,a.curves=n.curves,o.push(a),o;let h=!i(s[0].getPoints());h=t?!h:h;const l=[],c=[];let u,d,p=[],m=0;c[m]=void 0,p[m]=[];for(let e=0,a=s.length;e1){let t=!1,i=0;for(let t=0,e=c.length;t0&&!1===t&&(p=l)}for(let t=0,e=c.length;te?(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2):(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0),t},cover:function(t,e){const i=t.image&&t.image.width?t.image.width/t.image.height:1;return i>e?(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0):(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2),t},fill:function(t){return t.repeat.x=1,t.repeat.y=1,t.offset.x=0,t.offset.y=0,t},getByteLength:_d};"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:t}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=t);export{et as ACESFilmicToneMapping,v as AddEquation,G as AddOperation,Ve as AdditiveAnimationBlendMode,g as AdditiveBlending,st as AgXToneMapping,Lt as AlphaFormat,Si as AlwaysCompare,W as AlwaysDepth,yi as AlwaysStencilFunc,Ec as AmbientLight,Su as AnimationAction,ic as AnimationClip,uc as AnimationLoader,Au as AnimationMixer,Mu as AnimationObjectGroup,Dl as AnimationUtils,rh as ArcCurve,Kc as ArrayCamera,vd as ArrowHelper,nt as AttachedBindMode,ou as Audio,pu as AudioAnalyser,Xc as AudioContext,au as AudioListener,Yc as AudioLoader,wd as AxesHelper,d as BackSide,De as BasicDepthPacking,o as BasicShadowMap,To as BatchedMesh,Wa as Bone,Zl as BooleanKeyframeTrack,Wu as Box2,Rs as Box3,yd as Box3Helper,Un as BoxGeometry,md as BoxHelper,un as BufferAttribute,Cn as BufferGeometry,jc as BufferGeometryLoader,zt as ByteType,rc as Cache,Yn as Camera,ud as CameraHelper,th as CanvasTexture,Ah as CapsuleGeometry,ch as CatmullRomCurve3,tt as CineonToneMapping,Th as CircleGeometry,mt as ClampToEdgeWrapping,tu as Clock,$r as Color,Gl as ColorKeyframeTrack,us as ColorManagement,Qo as CompressedArrayTexture,Ko as CompressedCubeTexture,$o as CompressedTexture,dc as CompressedTextureLoader,Ch as ConeGeometry,L as ConstantAlphaFactor,F as ConstantColorFactor,Sd as Controls,ta as CubeCamera,ht as CubeReflectionMapping,lt as CubeRefractionMapping,ea as CubeTexture,mc as CubeTextureLoader,dt as CubeUVReflectionMapping,mh as CubicBezierCurve,yh as CubicBezierCurve3,ql as CubicInterpolant,r as CullFaceBack,n as CullFaceFront,a as CullFaceFrontBack,s as CullFaceNone,ih as Curve,Mh as CurvePath,b as CustomBlending,it as CustomToneMapping,zh as CylinderGeometry,Lu as Cylindrical,Ts as Data3DTexture,_s as DataArrayTexture,Ua as DataTexture,yc as DataTextureLoader,on as DataUtils,ri as DecrementStencilOp,ai as DecrementWrapStencilOp,ac as DefaultLoadingManager,Dt as DepthFormat,Ht as DepthStencilFormat,eh as DepthTexture,at as DetachedBindMode,Rc as DirectionalLight,hd as DirectionalLightHelper,Xl as DiscreteInterpolant,Bh as DodecahedronGeometry,p as DoubleSide,k as DstAlphaFactor,E as DstColorFactor,ki as DynamicCopyUsage,Ai as DynamicDrawUsage,Ci as DynamicReadUsage,Oh as EdgesGeometry,sh as EllipseCurve,xi as EqualCompare,H as EqualDepth,ci as EqualStencilFunc,ct as EquirectangularReflectionMapping,ut as EquirectangularRefractionMapping,yr as Euler,Ni as EventDispatcher,ul as ExtrudeGeometry,cc as FileLoader,bn as Float16BufferAttribute,vn as Float32BufferAttribute,Rt as FloatType,oa as Fog,aa as FogExp2,Go as FramebufferTexture,u as FrontSide,oo as Frustum,Ru as GLBufferAttribute,Ei as GLSL1,Pi as GLSL3,vi as GreaterCompare,J as GreaterDepth,Mi as GreaterEqualCompare,q as GreaterEqualDepth,mi as GreaterEqualStencilFunc,di as GreaterStencilFunc,sd as GridHelper,sa as Group,Et as HalfFloatType,xc as HemisphereLight,id as HemisphereLightHelper,pl as IcosahedronGeometry,qc as ImageBitmapLoader,pc as ImageLoader,ys as ImageUtils,si as IncrementStencilOp,ni as IncrementWrapStencilOp,Ja as InstancedBufferAttribute,Vc as InstancedBufferGeometry,ku as InstancedInterleavedBuffer,to as InstancedMesh,yn as Int16BufferAttribute,fn as Int32BufferAttribute,dn as Int8BufferAttribute,Bt as IntType,la as InterleavedBuffer,ua as InterleavedBufferAttribute,Hl as Interpolant,Re as InterpolateDiscrete,Ee as InterpolateLinear,Pe as InterpolateSmooth,oi as InvertStencilOp,ei as KeepStencilOp,Yl as KeyframeTrack,Ba as LOD,_h as LatheGeometry,gr as Layers,fi as LessCompare,U as LessDepth,bi as LessEqualCompare,D as LessEqualDepth,ui as LessEqualStencilFunc,li as LessStencilFunc,fc as Light,Fc as LightProbe,Oo as Line,Hu as Line3,zo as LineBasicMaterial,gh as LineCurve,fh as LineCurve3,Nl as LineDashedMaterial,jo as LineLoop,Vo as LineSegments,wt as LinearFilter,Jl as LinearInterpolant,At as LinearMipMapLinearFilter,St as LinearMipMapNearestFilter,_t as LinearMipmapLinearFilter,Mt as LinearMipmapNearestFilter,$e as LinearSRGBColorSpace,Q as LinearToneMapping,Qe as LinearTransfer,oc as Loader,Lc as LoaderUtils,nc as LoadingManager,Ie as LoopOnce,ke as LoopPingPong,Be as LoopRepeat,Ut as LuminanceAlphaFormat,Wt as LuminanceFormat,e as MOUSE,tn as Material,Nc as MaterialLoader,Yi as MathUtils,Vu as Matrix2,Gi as Matrix3,nr as Matrix4,_ as MaxEquation,jn as Mesh,en as MeshBasicMaterial,Pl as MeshDepthMaterial,Ol as MeshDistanceMaterial,El as MeshLambertMaterial,Fl as MeshMatcapMaterial,Rl as MeshNormalMaterial,Bl as MeshPhongMaterial,Il as MeshPhysicalMaterial,Cl as MeshStandardMaterial,kl as MeshToonMaterial,S as MinEquation,yt as MirroredRepeatWrapping,Z as MixOperation,x as MultiplyBlending,Y as MultiplyOperation,gt as NearestFilter,vt as NearestMipMapLinearFilter,xt as NearestMipMapNearestFilter,bt as NearestMipmapLinearFilter,ft as NearestMipmapNearestFilter,rt as NeutralToneMapping,gi as NeverCompare,j as NeverDepth,hi as NeverStencilFunc,m as NoBlending,Ze as NoColorSpace,$ as NoToneMapping,Le as NormalAnimationBlendMode,y as NormalBlending,wi as NotEqualCompare,X as NotEqualDepth,pi as NotEqualStencilFunc,$l as NumberKeyframeTrack,Rr as Object3D,Wc as ObjectLoader,Ye as ObjectSpaceNormalMap,ml as OctahedronGeometry,T as OneFactor,V as OneMinusConstantAlphaFactor,N as OneMinusConstantColorFactor,R as OneMinusDstAlphaFactor,P as OneMinusDstColorFactor,B as OneMinusSrcAlphaFactor,C as OneMinusSrcColorFactor,Bc as OrthographicCamera,h as PCFShadowMap,l as PCFSoftShadowMap,Sh as Path,Qn as PerspectiveCamera,ro as Plane,yl as PlaneGeometry,gd as PlaneHelper,Ic as PointLight,Qu as PointLightHelper,Jo as Points,Wo as PointsMaterial,rd as PolarGridHelper,Ih as PolyhedronGeometry,du as PositionalAudio,wu as PropertyBinding,mu as PropertyMixer,xh as QuadraticBezierCurve,bh as QuadraticBezierCurve3,Cs as Quaternion,Kl as QuaternionKeyframeTrack,Ql as QuaternionLinearInterpolant,Wi as RAD2DEG,ze as RED_GREEN_RGTC2_Format,Ae as RED_RGTC1_Format,t as REVISION,He as RGBADepthPacking,jt as RGBAFormat,Gt as RGBAIntegerFormat,be as RGBA_ASTC_10x10_Format,ge as RGBA_ASTC_10x5_Format,fe as RGBA_ASTC_10x6_Format,xe as RGBA_ASTC_10x8_Format,ve as RGBA_ASTC_12x10_Format,we as RGBA_ASTC_12x12_Format,he as RGBA_ASTC_4x4_Format,le as RGBA_ASTC_5x4_Format,ce as RGBA_ASTC_5x5_Format,ue as RGBA_ASTC_6x5_Format,de as RGBA_ASTC_6x6_Format,pe as RGBA_ASTC_8x5_Format,me as RGBA_ASTC_8x6_Format,ye as RGBA_ASTC_8x8_Format,Me as RGBA_BPTC_Format,oe as RGBA_ETC2_EAC_Format,re as RGBA_PVRTC_2BPPV1_Format,se as RGBA_PVRTC_4BPPV1_Format,Qt as RGBA_S3TC_DXT1_Format,Kt as RGBA_S3TC_DXT3_Format,te as RGBA_S3TC_DXT5_Format,qe as RGBDepthPacking,Vt as RGBFormat,Zt as RGBIntegerFormat,Se as RGB_BPTC_SIGNED_Format,_e as RGB_BPTC_UNSIGNED_Format,ne as RGB_ETC1_Format,ae as RGB_ETC2_Format,ie as RGB_PVRTC_2BPPV1_Format,ee as RGB_PVRTC_4BPPV1_Format,$t as RGB_S3TC_DXT1_Format,Je as RGDepthPacking,Xt as RGFormat,Yt as RGIntegerFormat,zl as RawShaderMaterial,rr as Ray,Pu as Raycaster,Pc as RectAreaLight,qt as RedFormat,Jt as RedIntegerFormat,K as ReinhardToneMapping,Ms as RenderTarget,Tu as RenderTarget3D,zu as RenderTargetArray,pt as RepeatWrapping,ii as ReplaceStencilOp,M as ReverseSubtractEquation,gl as RingGeometry,Ce as SIGNED_RED_GREEN_RGTC2_Format,Te as SIGNED_RED_RGTC1_Format,Ge as SRGBColorSpace,Ke as SRGBTransfer,ha as Scene,Xn as ShaderMaterial,Tl as ShadowMaterial,Fh as Shape,fl as ShapeGeometry,Md as ShapePath,hl as ShapeUtils,Ct as ShortType,qa as Skeleton,Gu as SkeletonHelper,ja as SkinnedMesh,fs as Source,Gs as Sphere,xl as SphereGeometry,Nu as Spherical,Oc as SphericalHarmonics3,vh as SplineCurve,_c as SpotLight,Ju as SpotLightHelper,Ta as Sprite,da as SpriteMaterial,I as SrcAlphaFactor,O as SrcAlphaSaturateFactor,z as SrcColorFactor,Bi as StaticCopyUsage,_i as StaticDrawUsage,zi as StaticReadUsage,Qc as StereoCamera,Ri as StreamCopyUsage,Ti as StreamDrawUsage,Ii as StreamReadUsage,tc as StringKeyframeTrack,w as SubtractEquation,f as SubtractiveBlending,i as TOUCH,Xe as TangentSpaceNormalMap,bl as TetrahedronGeometry,vs as Texture,gc as TextureLoader,Ad as TextureUtils,vl as TorusGeometry,wl as TorusKnotGeometry,Jr as Triangle,Ue as TriangleFanDrawMode,We as TriangleStripDrawMode,je as TrianglesDrawMode,Ml as TubeGeometry,ot as UVMapping,gn as Uint16BufferAttribute,xn as Uint32BufferAttribute,pn as Uint8BufferAttribute,mn as Uint8ClampedBufferAttribute,Cu as Uniform,Bu as UniformsGroup,Jn as UniformsUtils,Tt as UnsignedByteType,Ft as UnsignedInt248Type,Nt as UnsignedInt5999Type,kt as UnsignedIntType,Pt as UnsignedShort4444Type,Ot as UnsignedShort5551Type,It as UnsignedShortType,c as VSMShadowMap,Zi as Vector2,Is as Vector3,ws as Vector4,ec as VectorKeyframeTrack,Zo as VideoFrameTexture,Yo as VideoTexture,zs as WebGL3DRenderTarget,As as WebGLArrayRenderTarget,Oi as WebGLCoordinateSystem,ia as WebGLCubeRenderTarget,Ss as WebGLRenderTarget,Fi as WebGPUCoordinateSystem,na as WebXRController,Sl as WireframeGeometry,Ne as WrapAroundEnding,Oe as ZeroCurvatureEnding,A as ZeroFactor,Fe as ZeroSlopeEnding,ti as ZeroStencilOp,Qi as arrayNeedsUint32,Dn as cloneUniforms,is as createCanvasElement,es as createElementNS,_d as getByteLength,qn as getUnlitUniformColorSpace,Hn as mergeUniforms,ns as probeAsync,as as toNormalizedProjectionMatrix,os as toReversedProjectionMatrix,rs as warnOnce}; +const t="173dev",e={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},i={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},s=0,r=1,n=2,a=3,o=0,h=1,l=2,c=3,u=0,d=1,p=2,m=0,y=1,g=2,f=3,x=4,b=5,v=100,w=101,M=102,S=103,_=104,A=200,T=201,z=202,C=203,I=204,B=205,k=206,R=207,E=208,P=209,O=210,F=211,N=212,L=213,V=214,j=0,U=1,W=2,D=3,H=4,q=5,J=6,X=7,Y=0,Z=1,G=2,$=0,Q=1,K=2,tt=3,et=4,it=5,st=6,rt=7,nt="attached",at="detached",ot=300,ht=301,lt=302,ct=303,ut=304,dt=306,pt=1e3,mt=1001,yt=1002,gt=1003,ft=1004,xt=1004,bt=1005,vt=1005,wt=1006,Mt=1007,St=1007,_t=1008,At=1008,Tt=1009,zt=1010,Ct=1011,It=1012,Bt=1013,kt=1014,Rt=1015,Et=1016,Pt=1017,Ot=1018,Ft=1020,Nt=35902,Lt=1021,Vt=1022,jt=1023,Ut=1024,Wt=1025,Dt=1026,Ht=1027,qt=1028,Jt=1029,Xt=1030,Yt=1031,Zt=1032,Gt=1033,$t=33776,Qt=33777,Kt=33778,te=33779,ee=35840,ie=35841,se=35842,re=35843,ne=36196,ae=37492,oe=37496,he=37808,le=37809,ce=37810,ue=37811,de=37812,pe=37813,me=37814,ye=37815,ge=37816,fe=37817,xe=37818,be=37819,ve=37820,we=37821,Me=36492,Se=36494,_e=36495,Ae=36283,Te=36284,ze=36285,Ce=36286,Ie=2200,Be=2201,ke=2202,Re=2300,Ee=2301,Pe=2302,Oe=2400,Fe=2401,Ne=2402,Le=2500,Ve=2501,je=0,Ue=1,We=2,De=3200,He=3201,qe=3202,Je=3203,Xe=0,Ye=1,Ze="",Ge="srgb",$e="srgb-linear",Qe="linear",Ke="srgb",ti=0,ei=7680,ii=7681,si=7682,ri=7683,ni=34055,ai=34056,oi=5386,hi=512,li=513,ci=514,ui=515,di=516,pi=517,mi=518,yi=519,gi=512,fi=513,xi=514,bi=515,vi=516,wi=517,Mi=518,Si=519,_i=35044,Ai=35048,Ti=35040,zi=35045,Ci=35049,Ii=35041,Bi=35046,ki=35050,Ri=35042,Ei="100",Pi="300 es",Oi=2e3,Fi=2001,Ni={COMPUTE:"compute",RENDER:"render"};class Li{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)}hasEventListener(t,e){const i=this._listeners;return void 0!==i&&(void 0!==i[t]&&-1!==i[t].indexOf(e))}removeEventListener(t,e){const i=this._listeners;if(void 0===i)return;const s=i[t];if(void 0!==s){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}}dispatchEvent(t){const e=this._listeners;if(void 0===e)return;const i=e[t.type];if(void 0!==i){t.target=this;const e=i.slice(0);for(let i=0,s=e.length;i>8&255]+Vi[t>>16&255]+Vi[t>>24&255]+"-"+Vi[255&e]+Vi[e>>8&255]+"-"+Vi[e>>16&15|64]+Vi[e>>24&255]+"-"+Vi[63&i|128]+Vi[i>>8&255]+"-"+Vi[i>>16&255]+Vi[i>>24&255]+Vi[255&s]+Vi[s>>8&255]+Vi[s>>16&255]+Vi[s>>24&255]).toLowerCase()}function Hi(t,e,i){return Math.max(e,Math.min(i,t))}function qi(t,e){return(t%e+e)%e}function Ji(t,e,i){return(1-i)*t+i*e}function Xi(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function Yi(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const Zi={DEG2RAD:Ui,RAD2DEG:Wi,generateUUID:Di,clamp:Hi,euclideanModulo:qi,mapLinear:function(t,e,i,s,r){return s+(t-e)*(r-s)/(i-e)},inverseLerp:function(t,e,i){return t!==e?(i-t)/(e-t):0},lerp:Ji,damp:function(t,e,i,s){return Ji(t,e,1-Math.exp(-i*s))},pingpong:function(t,e=1){return e-Math.abs(qi(t,2*e)-e)},smoothstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){void 0!==t&&(ji=t);let e=ji+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296},degToRad:function(t){return t*Ui},radToDeg:function(t){return t*Wi},isPowerOfTwo:function(t){return!(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,i,s,r){const n=Math.cos,a=Math.sin,o=n(i/2),h=a(i/2),l=n((e+s)/2),c=a((e+s)/2),u=n((e-s)/2),d=a((e-s)/2),p=n((s-e)/2),m=a((s-e)/2);switch(r){case"XYX":t.set(o*c,h*u,h*d,o*l);break;case"YZY":t.set(h*d,o*c,h*u,o*l);break;case"ZXZ":t.set(h*u,h*d,o*c,o*l);break;case"XZX":t.set(o*c,h*m,h*p,o*l);break;case"YXY":t.set(h*p,o*c,h*m,o*l);break;case"ZYZ":t.set(h*m,h*p,o*c,o*l);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:Yi,denormalize:Xi};class Gi{constructor(t=0,e=0){Gi.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,s=t.elements;return this.x=s[0]*e+s[3]*i+s[6],this.y=s[1]*e+s[4]*i+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Hi(this.x,t.x,e.x),this.y=Hi(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=Hi(this.x,t,e),this.y=Hi(this.y,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Hi(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(Hi(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),s=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*i-n*s+t.x,this.y=r*s+n*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class $i{constructor(t,e,i,s,r,n,a,o,h){$i.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h)}set(t,e,i,s,r,n,a,o,h){const l=this.elements;return l[0]=t,l[1]=s,l[2]=a,l[3]=e,l[4]=r,l[5]=o,l[6]=i,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[3],o=i[6],h=i[1],l=i[4],c=i[7],u=i[2],d=i[5],p=i[8],m=s[0],y=s[3],g=s[6],f=s[1],x=s[4],b=s[7],v=s[2],w=s[5],M=s[8];return r[0]=n*m+a*f+o*v,r[3]=n*y+a*x+o*w,r[6]=n*g+a*b+o*M,r[1]=h*m+l*f+c*v,r[4]=h*y+l*x+c*w,r[7]=h*g+l*b+c*M,r[2]=u*m+d*f+p*v,r[5]=u*y+d*x+p*w,r[8]=u*g+d*b+p*M,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8];return e*n*l-e*a*h-i*r*l+i*a*o+s*r*h-s*n*o}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=l*n-a*h,u=a*o-l*r,d=h*r-n*o,p=e*c+i*u+s*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=c*m,t[1]=(s*h-l*i)*m,t[2]=(a*i-s*n)*m,t[3]=u*m,t[4]=(l*e-s*o)*m,t[5]=(s*r-a*e)*m,t[6]=d*m,t[7]=(i*o-h*e)*m,t[8]=(n*e-i*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,s,r,n,a){const o=Math.cos(r),h=Math.sin(r);return this.set(i*o,i*h,-i*(o*n+h*a)+n+t,-s*h,s*o,-s*(-h*n+o*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(Qi.makeScale(t,e)),this}rotate(t){return this.premultiply(Qi.makeRotation(-t)),this}translate(t,e){return this.premultiply(Qi.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,i,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const Qi=new $i;function Ki(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}const ts={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function es(t,e){return new ts[t](e)}function is(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function ss(){const t=is("canvas");return t.style.display="block",t}const rs={};function ns(t){t in rs||(rs[t]=!0,console.warn(t))}function as(t,e,i){return new Promise((function(s,r){setTimeout((function n(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:r();break;case t.TIMEOUT_EXPIRED:setTimeout(n,i);break;default:s()}}),i)}))}function os(t){const e=t.elements;e[2]=.5*e[2]+.5*e[3],e[6]=.5*e[6]+.5*e[7],e[10]=.5*e[10]+.5*e[11],e[14]=.5*e[14]+.5*e[15]}function hs(t){const e=t.elements;-1===e[11]?(e[10]=-e[10]-1,e[14]=-e[14]):(e[10]=-e[10],e[14]=1-e[14])}const ls=(new $i).set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),cs=(new $i).set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function us(){const t={enabled:!0,workingColorSpace:$e,spaces:{},convert:function(t,e,i){return!1!==this.enabled&&e!==i&&e&&i?(this.spaces[e].transfer===Ke&&(t.r=ps(t.r),t.g=ps(t.g),t.b=ps(t.b)),this.spaces[e].primaries!==this.spaces[i].primaries&&(t.applyMatrix3(this.spaces[e].toXYZ),t.applyMatrix3(this.spaces[i].fromXYZ)),this.spaces[i].transfer===Ke&&(t.r=ms(t.r),t.g=ms(t.g),t.b=ms(t.b)),t):t},fromWorkingColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},toWorkingColorSpace:function(t,e){return this.convert(t,e,this.workingColorSpace)},getPrimaries:function(t){return this.spaces[t].primaries},getTransfer:function(t){return""===t?Qe:this.spaces[t].transfer},getLuminanceCoefficients:function(t,e=this.workingColorSpace){return t.fromArray(this.spaces[e].luminanceCoefficients)},define:function(t){Object.assign(this.spaces,t)},_getMatrix:function(t,e,i){return t.copy(this.spaces[e].toXYZ).multiply(this.spaces[i].fromXYZ)},_getDrawingBufferColorSpace:function(t){return this.spaces[t].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(t=this.workingColorSpace){return this.spaces[t].workingColorSpaceConfig.unpackColorSpace}},e=[.64,.33,.3,.6,.15,.06],i=[.2126,.7152,.0722],s=[.3127,.329];return t.define({[$e]:{primaries:e,whitePoint:s,transfer:Qe,toXYZ:ls,fromXYZ:cs,luminanceCoefficients:i,workingColorSpaceConfig:{unpackColorSpace:Ge},outputColorSpaceConfig:{drawingBufferColorSpace:Ge}},[Ge]:{primaries:e,whitePoint:s,transfer:Ke,toXYZ:ls,fromXYZ:cs,luminanceCoefficients:i,outputColorSpaceConfig:{drawingBufferColorSpace:Ge}}}),t}const ds=us();function ps(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function ms(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}let ys;class gs{static getDataURL(t){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{void 0===ys&&(ys=is("canvas")),ys.width=t.width,ys.height=t.height;const i=ys.getContext("2d");t instanceof ImageData?i.putImageData(t,0,0):i.drawImage(t,0,0,t.width,t.height),e=ys}return e.toDataURL("image/png")}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=is("canvas");e.width=t.width,e.height=t.height;const i=e.getContext("2d");i.drawImage(t,0,0,t.width,t.height);const s=i.getImageData(0,0,t.width,t.height),r=s.data;for(let t=0;t0&&(i.userData=this.userData),e||(t.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==ot)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case pt:t.x=t.x-Math.floor(t.x);break;case mt:t.x=t.x<0?0:1;break;case yt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case pt:t.y=t.y-Math.floor(t.y);break;case mt:t.y=t.y<0?0:1;break;case yt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){!0===t&&this.pmremVersion++}}ws.DEFAULT_IMAGE=null,ws.DEFAULT_MAPPING=ot,ws.DEFAULT_ANISOTROPY=1;class Ms{constructor(t=0,e=0,i=0,s=1){Ms.prototype.isVector4=!0,this.x=t,this.y=e,this.z=i,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,s){return this.x=t,this.y=e,this.z=i,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*i+n[8]*s+n[12]*r,this.y=n[1]*e+n[5]*i+n[9]*s+n[13]*r,this.z=n[2]*e+n[6]*i+n[10]*s+n[14]*r,this.w=n[3]*e+n[7]*i+n[11]*s+n[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,s,r;const n=.01,a=.1,o=t.elements,h=o[0],l=o[4],c=o[8],u=o[1],d=o[5],p=o[9],m=o[2],y=o[6],g=o[10];if(Math.abs(l-u)o&&t>f?tf?o=0?1:-1,s=1-e*e;if(s>Number.EPSILON){const r=Math.sqrt(s),n=Math.atan2(r,e*i);t=Math.sin(t*n)/r,a=Math.sin(a*n)/r}const r=a*i;if(o=o*t+u*r,h=h*t+d*r,l=l*t+p*r,c=c*t+m*r,t===1-a){const t=1/Math.sqrt(o*o+h*h+l*l+c*c);o*=t,h*=t,l*=t,c*=t}}t[e]=o,t[e+1]=h,t[e+2]=l,t[e+3]=c}static multiplyQuaternionsFlat(t,e,i,s,r,n){const a=i[s],o=i[s+1],h=i[s+2],l=i[s+3],c=r[n],u=r[n+1],d=r[n+2],p=r[n+3];return t[e]=a*p+l*c+o*d-h*u,t[e+1]=o*p+l*u+h*c-a*d,t[e+2]=h*p+l*d+a*u-o*c,t[e+3]=l*p-a*c-o*u-h*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,s){return this._x=t,this._y=e,this._z=i,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const i=t._x,s=t._y,r=t._z,n=t._order,a=Math.cos,o=Math.sin,h=a(i/2),l=a(s/2),c=a(r/2),u=o(i/2),d=o(s/2),p=o(r/2);switch(n){case"XYZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"YXZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"ZXY":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"ZYX":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"YZX":this._x=u*l*c+h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c-u*d*p;break;case"XZY":this._x=u*l*c-h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,s=Math.sin(i);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],s=e[4],r=e[8],n=e[1],a=e[5],o=e[9],h=e[2],l=e[6],c=e[10],u=i+a+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-o)*t,this._y=(r-h)*t,this._z=(n-s)*t}else if(i>a&&i>c){const t=2*Math.sqrt(1+i-a-c);this._w=(l-o)/t,this._x=.25*t,this._y=(s+n)/t,this._z=(r+h)/t}else if(a>c){const t=2*Math.sqrt(1+a-i-c);this._w=(r-h)/t,this._x=(s+n)/t,this._y=.25*t,this._z=(o+l)/t}else{const t=2*Math.sqrt(1+c-i-a);this._w=(n-s)/t,this._x=(r+h)/t,this._y=(o+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return iMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(Hi(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const s=Math.min(1,e/i);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,s=t._y,r=t._z,n=t._w,a=e._x,o=e._y,h=e._z,l=e._w;return this._x=i*l+n*a+s*h-r*o,this._y=s*l+n*o+r*a-i*h,this._z=r*l+n*h+i*o-s*a,this._w=n*l-i*a-s*o-r*h,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const i=this._x,s=this._y,r=this._z,n=this._w;let a=n*t._w+i*t._x+s*t._y+r*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),a>=1)return this._w=n,this._x=i,this._y=s,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const t=1-e;return this._w=t*n+e*this._w,this._x=t*i+e*this._x,this._y=t*s+e*this._y,this._z=t*r+e*this._z,this.normalize(),this}const h=Math.sqrt(o),l=Math.atan2(h,a),c=Math.sin((1-e)*l)/h,u=Math.sin(e*l)/h;return this._w=n*c+this._w*u,this._x=i*c+this._x*u,this._y=s*c+this._y*u,this._z=r*c+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,i){return this.copy(t).slerp(e,i)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),i=Math.random(),s=Math.sqrt(1-i),r=Math.sqrt(i);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class Bs{constructor(t=0,e=0,i=0){Bs.prototype.isVector3=!0,this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(Rs.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(Rs.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*s,this.y=r[1]*e+r[4]*i+r[7]*s,this.z=r[2]*e+r[5]*i+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=t.elements,n=1/(r[3]*e+r[7]*i+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*s+r[12])*n,this.y=(r[1]*e+r[5]*i+r[9]*s+r[13])*n,this.z=(r[2]*e+r[6]*i+r[10]*s+r[14])*n,this}applyQuaternion(t){const e=this.x,i=this.y,s=this.z,r=t.x,n=t.y,a=t.z,o=t.w,h=2*(n*s-a*i),l=2*(a*e-r*s),c=2*(r*i-n*e);return this.x=e+o*h+n*c-a*l,this.y=i+o*l+a*h-r*c,this.z=s+o*c+r*l-n*h,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*s,this.y=r[1]*e+r[5]*i+r[9]*s,this.z=r[2]*e+r[6]*i+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Hi(this.x,t.x,e.x),this.y=Hi(this.y,t.y,e.y),this.z=Hi(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=Hi(this.x,t,e),this.y=Hi(this.y,t,e),this.z=Hi(this.z,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Hi(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,s=t.y,r=t.z,n=e.x,a=e.y,o=e.z;return this.x=s*o-r*a,this.y=r*n-i*o,this.z=i*a-s*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return ks.copy(this).projectOnVector(t),this.sub(ks)}reflect(t){return this.sub(ks.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(Hi(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,s=this.z-t.z;return e*e+i*i+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const s=Math.sin(e)*t;return this.x=s*Math.sin(i),this.y=Math.cos(e)*t,this.z=s*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=2*Math.random()-1,i=Math.sqrt(1-e*e);return this.x=i*Math.cos(t),this.y=e,this.z=i*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const ks=new Bs,Rs=new Is;class Es{constructor(t=new Bs(1/0,1/0,1/0),e=new Bs(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){this.makeEmpty();for(let e=0,i=t.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,Os),Os.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(Ds),Hs.subVectors(this.max,Ds),Ns.subVectors(t.a,Ds),Ls.subVectors(t.b,Ds),Vs.subVectors(t.c,Ds),js.subVectors(Ls,Ns),Us.subVectors(Vs,Ls),Ws.subVectors(Ns,Vs);let e=[0,-js.z,js.y,0,-Us.z,Us.y,0,-Ws.z,Ws.y,js.z,0,-js.x,Us.z,0,-Us.x,Ws.z,0,-Ws.x,-js.y,js.x,0,-Us.y,Us.x,0,-Ws.y,Ws.x,0];return!!Xs(e,Ns,Ls,Vs,Hs)&&(e=[1,0,0,0,1,0,0,0,1],!!Xs(e,Ns,Ls,Vs,Hs)&&(qs.crossVectors(js,Us),e=[qs.x,qs.y,qs.z],Xs(e,Ns,Ls,Vs,Hs)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Os).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize(Os).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(Ps[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Ps[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Ps[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Ps[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Ps[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Ps[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Ps[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Ps[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Ps)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const Ps=[new Bs,new Bs,new Bs,new Bs,new Bs,new Bs,new Bs,new Bs],Os=new Bs,Fs=new Es,Ns=new Bs,Ls=new Bs,Vs=new Bs,js=new Bs,Us=new Bs,Ws=new Bs,Ds=new Bs,Hs=new Bs,qs=new Bs,Js=new Bs;function Xs(t,e,i,s,r){for(let n=0,a=t.length-3;n<=a;n+=3){Js.fromArray(t,n);const a=r.x*Math.abs(Js.x)+r.y*Math.abs(Js.y)+r.z*Math.abs(Js.z),o=e.dot(Js),h=i.dot(Js),l=s.dot(Js);if(Math.max(-Math.max(o,h,l),Math.min(o,h,l))>a)return!1}return!0}const Ys=new Es,Zs=new Bs,Gs=new Bs;class $s{constructor(t=new Bs,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const i=this.center;void 0!==e?i.copy(e):Ys.setFromPoints(t).getCenter(i);let s=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;Zs.subVectors(t,this.center);const e=Zs.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),i=.5*(t-this.radius);this.center.addScaledVector(Zs,i/t),this.radius+=i}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(Gs.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(Zs.copy(t.center).add(Gs)),this.expandByPoint(Zs.copy(t.center).sub(Gs))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const Qs=new Bs,Ks=new Bs,tr=new Bs,er=new Bs,ir=new Bs,sr=new Bs,rr=new Bs;class nr{constructor(t=new Bs,e=new Bs(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,Qs)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,i)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=Qs.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(Qs.copy(this.origin).addScaledVector(this.direction,e),Qs.distanceToSquared(t))}distanceSqToSegment(t,e,i,s){Ks.copy(t).add(e).multiplyScalar(.5),tr.copy(e).sub(t).normalize(),er.copy(this.origin).sub(Ks);const r=.5*t.distanceTo(e),n=-this.direction.dot(tr),a=er.dot(this.direction),o=-er.dot(tr),h=er.lengthSq(),l=Math.abs(1-n*n);let c,u,d,p;if(l>0)if(c=n*o-a,u=n*a-o,p=r*l,c>=0)if(u>=-p)if(u<=p){const t=1/l;c*=t,u*=t,d=c*(c+n*u+2*a)+u*(n*c+u+2*o)+h}else u=r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u=-r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u<=-p?(c=Math.max(0,-(-n*r+a)),u=c>0?-r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h):u<=p?(c=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+h):(c=Math.max(0,-(n*r+a)),u=c>0?r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h);else u=n>0?-r:r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;return i&&i.copy(this.origin).addScaledVector(this.direction,c),s&&s.copy(Ks).addScaledVector(tr,u),d}intersectSphere(t,e){Qs.subVectors(t.center,this.origin);const i=Qs.dot(this.direction),s=Qs.dot(Qs)-i*i,r=t.radius*t.radius;if(s>r)return null;const n=Math.sqrt(r-s),a=i-n,o=i+n;return o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,s,r,n,a,o;const h=1/this.direction.x,l=1/this.direction.y,c=1/this.direction.z,u=this.origin;return h>=0?(i=(t.min.x-u.x)*h,s=(t.max.x-u.x)*h):(i=(t.max.x-u.x)*h,s=(t.min.x-u.x)*h),l>=0?(r=(t.min.y-u.y)*l,n=(t.max.y-u.y)*l):(r=(t.max.y-u.y)*l,n=(t.min.y-u.y)*l),i>n||r>s?null:((r>i||isNaN(i))&&(i=r),(n=0?(a=(t.min.z-u.z)*c,o=(t.max.z-u.z)*c):(a=(t.max.z-u.z)*c,o=(t.min.z-u.z)*c),i>o||a>s?null:((a>i||i!=i)&&(i=a),(o=0?i:s,e)))}intersectsBox(t){return null!==this.intersectBox(t,Qs)}intersectTriangle(t,e,i,s,r){ir.subVectors(e,t),sr.subVectors(i,t),rr.crossVectors(ir,sr);let n,a=this.direction.dot(rr);if(a>0){if(s)return null;n=1}else{if(!(a<0))return null;n=-1,a=-a}er.subVectors(this.origin,t);const o=n*this.direction.dot(sr.crossVectors(er,sr));if(o<0)return null;const h=n*this.direction.dot(ir.cross(er));if(h<0)return null;if(o+h>a)return null;const l=-n*er.dot(rr);return l<0?null:this.at(l/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class ar{constructor(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){ar.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y)}set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){const g=this.elements;return g[0]=t,g[4]=e,g[8]=i,g[12]=s,g[1]=r,g[5]=n,g[9]=a,g[13]=o,g[2]=h,g[6]=l,g[10]=c,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=y,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new ar).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,i=t.elements,s=1/or.setFromMatrixColumn(t,0).length(),r=1/or.setFromMatrixColumn(t,1).length(),n=1/or.setFromMatrixColumn(t,2).length();return e[0]=i[0]*s,e[1]=i[1]*s,e[2]=i[2]*s,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*n,e[9]=i[9]*n,e[10]=i[10]*n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,i=t.x,s=t.y,r=t.z,n=Math.cos(i),a=Math.sin(i),o=Math.cos(s),h=Math.sin(s),l=Math.cos(r),c=Math.sin(r);if("XYZ"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=-o*c,e[8]=h,e[1]=i+s*h,e[5]=t-r*h,e[9]=-a*o,e[2]=r-t*h,e[6]=s+i*h,e[10]=n*o}else if("YXZ"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t+r*a,e[4]=s*a-i,e[8]=n*h,e[1]=n*c,e[5]=n*l,e[9]=-a,e[2]=i*a-s,e[6]=r+t*a,e[10]=n*o}else if("ZXY"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t-r*a,e[4]=-n*c,e[8]=s+i*a,e[1]=i+s*a,e[5]=n*l,e[9]=r-t*a,e[2]=-n*h,e[6]=a,e[10]=n*o}else if("ZYX"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=s*h-i,e[8]=t*h+r,e[1]=o*c,e[5]=r*h+t,e[9]=i*h-s,e[2]=-h,e[6]=a*o,e[10]=n*o}else if("YZX"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=r-t*c,e[8]=s*c+i,e[1]=c,e[5]=n*l,e[9]=-a*l,e[2]=-h*l,e[6]=i*c+s,e[10]=t-r*c}else if("XZY"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=-c,e[8]=h*l,e[1]=t*c+r,e[5]=n*l,e[9]=i*c-s,e[2]=s*c-i,e[6]=a*l,e[10]=r*c+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(lr,t,cr)}lookAt(t,e,i){const s=this.elements;return pr.subVectors(t,e),0===pr.lengthSq()&&(pr.z=1),pr.normalize(),ur.crossVectors(i,pr),0===ur.lengthSq()&&(1===Math.abs(i.z)?pr.x+=1e-4:pr.z+=1e-4,pr.normalize(),ur.crossVectors(i,pr)),ur.normalize(),dr.crossVectors(pr,ur),s[0]=ur.x,s[4]=dr.x,s[8]=pr.x,s[1]=ur.y,s[5]=dr.y,s[9]=pr.y,s[2]=ur.z,s[6]=dr.z,s[10]=pr.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[4],o=i[8],h=i[12],l=i[1],c=i[5],u=i[9],d=i[13],p=i[2],m=i[6],y=i[10],g=i[14],f=i[3],x=i[7],b=i[11],v=i[15],w=s[0],M=s[4],S=s[8],_=s[12],A=s[1],T=s[5],z=s[9],C=s[13],I=s[2],B=s[6],k=s[10],R=s[14],E=s[3],P=s[7],O=s[11],F=s[15];return r[0]=n*w+a*A+o*I+h*E,r[4]=n*M+a*T+o*B+h*P,r[8]=n*S+a*z+o*k+h*O,r[12]=n*_+a*C+o*R+h*F,r[1]=l*w+c*A+u*I+d*E,r[5]=l*M+c*T+u*B+d*P,r[9]=l*S+c*z+u*k+d*O,r[13]=l*_+c*C+u*R+d*F,r[2]=p*w+m*A+y*I+g*E,r[6]=p*M+m*T+y*B+g*P,r[10]=p*S+m*z+y*k+g*O,r[14]=p*_+m*C+y*R+g*F,r[3]=f*w+x*A+b*I+v*E,r[7]=f*M+x*T+b*B+v*P,r[11]=f*S+x*z+b*k+v*O,r[15]=f*_+x*C+b*R+v*F,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],s=t[8],r=t[12],n=t[1],a=t[5],o=t[9],h=t[13],l=t[2],c=t[6],u=t[10],d=t[14];return t[3]*(+r*o*c-s*h*c-r*a*u+i*h*u+s*a*d-i*o*d)+t[7]*(+e*o*d-e*h*u+r*n*u-s*n*d+s*h*l-r*o*l)+t[11]*(+e*h*c-e*a*d-r*n*c+i*n*d+r*a*l-i*h*l)+t[15]*(-s*a*l-e*o*c+e*a*u+s*n*c-i*n*u+i*o*l)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=t[9],u=t[10],d=t[11],p=t[12],m=t[13],y=t[14],g=t[15],f=c*y*h-m*u*h+m*o*d-a*y*d-c*o*g+a*u*g,x=p*u*h-l*y*h-p*o*d+n*y*d+l*o*g-n*u*g,b=l*m*h-p*c*h+p*a*d-n*m*d-l*a*g+n*c*g,v=p*c*o-l*m*o-p*a*u+n*m*u+l*a*y-n*c*y,w=e*f+i*x+s*b+r*v;if(0===w)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const M=1/w;return t[0]=f*M,t[1]=(m*u*r-c*y*r-m*s*d+i*y*d+c*s*g-i*u*g)*M,t[2]=(a*y*r-m*o*r+m*s*h-i*y*h-a*s*g+i*o*g)*M,t[3]=(c*o*r-a*u*r-c*s*h+i*u*h+a*s*d-i*o*d)*M,t[4]=x*M,t[5]=(l*y*r-p*u*r+p*s*d-e*y*d-l*s*g+e*u*g)*M,t[6]=(p*o*r-n*y*r-p*s*h+e*y*h+n*s*g-e*o*g)*M,t[7]=(n*u*r-l*o*r+l*s*h-e*u*h-n*s*d+e*o*d)*M,t[8]=b*M,t[9]=(p*c*r-l*m*r-p*i*d+e*m*d+l*i*g-e*c*g)*M,t[10]=(n*m*r-p*a*r+p*i*h-e*m*h-n*i*g+e*a*g)*M,t[11]=(l*a*r-n*c*r-l*i*h+e*c*h+n*i*d-e*a*d)*M,t[12]=v*M,t[13]=(l*m*s-p*c*s+p*i*u-e*m*u-l*i*y+e*c*y)*M,t[14]=(p*a*s-n*m*s-p*i*o+e*m*o+n*i*y-e*a*y)*M,t[15]=(n*c*s-l*a*s+l*i*o-e*c*o-n*i*u+e*a*u)*M,this}scale(t){const e=this.elements,i=t.x,s=t.y,r=t.z;return e[0]*=i,e[4]*=s,e[8]*=r,e[1]*=i,e[5]*=s,e[9]*=r,e[2]*=i,e[6]*=s,e[10]*=r,e[3]*=i,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,s))}makeTranslation(t,e,i){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),s=Math.sin(e),r=1-i,n=t.x,a=t.y,o=t.z,h=r*n,l=r*a;return this.set(h*n+i,h*a-s*o,h*o+s*a,0,h*a+s*o,l*a+i,l*o-s*n,0,h*o-s*a,l*o+s*n,r*o*o+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i,s,r,n){return this.set(1,i,r,0,t,1,n,0,e,s,1,0,0,0,0,1),this}compose(t,e,i){const s=this.elements,r=e._x,n=e._y,a=e._z,o=e._w,h=r+r,l=n+n,c=a+a,u=r*h,d=r*l,p=r*c,m=n*l,y=n*c,g=a*c,f=o*h,x=o*l,b=o*c,v=i.x,w=i.y,M=i.z;return s[0]=(1-(m+g))*v,s[1]=(d+b)*v,s[2]=(p-x)*v,s[3]=0,s[4]=(d-b)*w,s[5]=(1-(u+g))*w,s[6]=(y+f)*w,s[7]=0,s[8]=(p+x)*M,s[9]=(y-f)*M,s[10]=(1-(u+m))*M,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,i){const s=this.elements;let r=or.set(s[0],s[1],s[2]).length();const n=or.set(s[4],s[5],s[6]).length(),a=or.set(s[8],s[9],s[10]).length();this.determinant()<0&&(r=-r),t.x=s[12],t.y=s[13],t.z=s[14],hr.copy(this);const o=1/r,h=1/n,l=1/a;return hr.elements[0]*=o,hr.elements[1]*=o,hr.elements[2]*=o,hr.elements[4]*=h,hr.elements[5]*=h,hr.elements[6]*=h,hr.elements[8]*=l,hr.elements[9]*=l,hr.elements[10]*=l,e.setFromRotationMatrix(hr),i.x=r,i.y=n,i.z=a,this}makePerspective(t,e,i,s,r,n,a=2e3){const o=this.elements,h=2*r/(e-t),l=2*r/(i-s),c=(e+t)/(e-t),u=(i+s)/(i-s);let d,p;if(a===Oi)d=-(n+r)/(n-r),p=-2*n*r/(n-r);else{if(a!==Fi)throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+a);d=-n/(n-r),p=-n*r/(n-r)}return o[0]=h,o[4]=0,o[8]=c,o[12]=0,o[1]=0,o[5]=l,o[9]=u,o[13]=0,o[2]=0,o[6]=0,o[10]=d,o[14]=p,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this}makeOrthographic(t,e,i,s,r,n,a=2e3){const o=this.elements,h=1/(e-t),l=1/(i-s),c=1/(n-r),u=(e+t)*h,d=(i+s)*l;let p,m;if(a===Oi)p=(n+r)*c,m=-2*c;else{if(a!==Fi)throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+a);p=r*c,m=-1*c}return o[0]=2*h,o[4]=0,o[8]=0,o[12]=-u,o[1]=0,o[5]=2*l,o[9]=0,o[13]=-d,o[2]=0,o[6]=0,o[10]=m,o[14]=-p,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}const or=new Bs,hr=new ar,lr=new Bs(0,0,0),cr=new Bs(1,1,1),ur=new Bs,dr=new Bs,pr=new Bs,mr=new ar,yr=new Is;class gr{constructor(t=0,e=0,i=0,s=gr.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=i,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,s=this._order){return this._x=t,this._y=e,this._z=i,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,i=!0){const s=t.elements,r=s[0],n=s[4],a=s[8],o=s[1],h=s[5],l=s[9],c=s[2],u=s[6],d=s[10];switch(e){case"XYZ":this._y=Math.asin(Hi(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,d),this._z=Math.atan2(-n,r)):(this._x=Math.atan2(u,h),this._z=0);break;case"YXZ":this._x=Math.asin(-Hi(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,h)):(this._y=Math.atan2(-c,r),this._z=0);break;case"ZXY":this._x=Math.asin(Hi(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-c,d),this._z=Math.atan2(-n,h)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-Hi(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-n,h));break;case"YZX":this._z=Math.asin(Hi(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,h),this._y=Math.atan2(-c,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-Hi(n,-1,1)),Math.abs(n)<.9999999?(this._x=Math.atan2(u,h),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-l,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return mr.makeRotationFromQuaternion(t),this.setFromRotationMatrix(mr,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return yr.setFromEuler(this),this.setFromQuaternion(yr,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}gr.DEFAULT_ORDER="XYZ";class fr{constructor(){this.mask=1}set(t){this.mask=1<>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),!1===this.matrixAutoUpdate&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.visibility=this._visibility,s.active=this._active,s.bounds=this._bounds.map((t=>({boxInitialized:t.boxInitialized,boxMin:t.box.min.toArray(),boxMax:t.box.max.toArray(),sphereInitialized:t.sphereInitialized,sphereRadius:t.sphere.radius,sphereCenter:t.sphere.center.toArray()}))),s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.geometryCount=this._geometryCount,s.matricesTexture=this._matricesTexture.toJSON(t),null!==this._colorsTexture&&(s.colorsTexture=this._colorsTexture.toJSON(t)),null!==this.boundingSphere&&(s.boundingSphere={center:s.boundingSphere.center.toArray(),radius:s.boundingSphere.radius}),null!==this.boundingBox&&(s.boundingBox={min:s.boundingBox.min.toArray(),max:s.boundingBox.max.toArray()})),this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const i=e.shapes;if(Array.isArray(i))for(let e=0,s=i.length;e0){s.children=[];for(let e=0;e0){s.animations=[];for(let e=0;e0&&(i.geometries=e),s.length>0&&(i.materials=s),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),h.length>0&&(i.skeletons=h),l.length>0&&(i.animations=l),c.length>0&&(i.nodes=c)}return i.object=s,i;function n(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,i,s,r){Pr.subVectors(s,e),Or.subVectors(i,e),Fr.subVectors(t,e);const n=Pr.dot(Pr),a=Pr.dot(Or),o=Pr.dot(Fr),h=Or.dot(Or),l=Or.dot(Fr),c=n*h-a*a;if(0===c)return r.set(0,0,0),null;const u=1/c,d=(h*o-a*l)*u,p=(n*l-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,s){return null!==this.getBarycoord(t,e,i,s,Nr)&&(Nr.x>=0&&Nr.y>=0&&Nr.x+Nr.y<=1)}static getInterpolation(t,e,i,s,r,n,a,o){return null===this.getBarycoord(t,e,i,s,Nr)?(o.x=0,o.y=0,"z"in o&&(o.z=0),"w"in o&&(o.w=0),null):(o.setScalar(0),o.addScaledVector(r,Nr.x),o.addScaledVector(n,Nr.y),o.addScaledVector(a,Nr.z),o)}static getInterpolatedAttribute(t,e,i,s,r,n){return Hr.setScalar(0),qr.setScalar(0),Jr.setScalar(0),Hr.fromBufferAttribute(t,e),qr.fromBufferAttribute(t,i),Jr.fromBufferAttribute(t,s),n.setScalar(0),n.addScaledVector(Hr,r.x),n.addScaledVector(qr,r.y),n.addScaledVector(Jr,r.z),n}static isFrontFacing(t,e,i,s){return Pr.subVectors(i,e),Or.subVectors(t,e),Pr.cross(Or).dot(s)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,s){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,i,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,i),this.c.fromBufferAttribute(t,s),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Pr.subVectors(this.c,this.b),Or.subVectors(this.a,this.b),.5*Pr.cross(Or).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return Xr.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return Xr.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,i,s,r){return Xr.getInterpolation(t,this.a,this.b,this.c,e,i,s,r)}containsPoint(t){return Xr.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return Xr.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const i=this.a,s=this.b,r=this.c;let n,a;Lr.subVectors(s,i),Vr.subVectors(r,i),Ur.subVectors(t,i);const o=Lr.dot(Ur),h=Vr.dot(Ur);if(o<=0&&h<=0)return e.copy(i);Wr.subVectors(t,s);const l=Lr.dot(Wr),c=Vr.dot(Wr);if(l>=0&&c<=l)return e.copy(s);const u=o*c-l*h;if(u<=0&&o>=0&&l<=0)return n=o/(o-l),e.copy(i).addScaledVector(Lr,n);Dr.subVectors(t,r);const d=Lr.dot(Dr),p=Vr.dot(Dr);if(p>=0&&d<=p)return e.copy(r);const m=d*h-o*p;if(m<=0&&h>=0&&p<=0)return a=h/(h-p),e.copy(i).addScaledVector(Vr,a);const y=l*p-d*c;if(y<=0&&c-l>=0&&d-p>=0)return jr.subVectors(r,s),a=(c-l)/(c-l+(d-p)),e.copy(s).addScaledVector(jr,a);const g=1/(y+m+u);return n=m*g,a=u*g,e.copy(i).addScaledVector(Lr,n).addScaledVector(Vr,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const Yr={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Zr={h:0,s:0,l:0},Gr={h:0,s:0,l:0};function $r(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}class Qr{constructor(t,e,i){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,i)}set(t,e,i){if(void 0===e&&void 0===i){const e=t;e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e)}else this.setRGB(t,e,i);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=Ge){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,ds.toWorkingColorSpace(this,e),this}setRGB(t,e,i,s=ds.workingColorSpace){return this.r=t,this.g=e,this.b=i,ds.toWorkingColorSpace(this,s),this}setHSL(t,e,i,s=ds.workingColorSpace){if(t=qi(t,1),e=Hi(e,0,1),i=Hi(i,0,1),0===e)this.r=this.g=this.b=i;else{const s=i<=.5?i*(1+e):i+e-i*e,r=2*i-s;this.r=$r(r,s,t+1/3),this.g=$r(r,s,t),this.b=$r(r,s,t-1/3)}return ds.toWorkingColorSpace(this,s),this}setStyle(t,e=Ge){function i(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const n=s[1],a=s[2];switch(n){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:console.warn("THREE.Color: Unknown color model "+t)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(t)){const i=s[1],r=i.length;if(3===r)return this.setRGB(parseInt(i.charAt(0),16)/15,parseInt(i.charAt(1),16)/15,parseInt(i.charAt(2),16)/15,e);if(6===r)return this.setHex(parseInt(i,16),e);console.warn("THREE.Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=Ge){const i=Yr[t.toLowerCase()];return void 0!==i?this.setHex(i,e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=ps(t.r),this.g=ps(t.g),this.b=ps(t.b),this}copyLinearToSRGB(t){return this.r=ms(t.r),this.g=ms(t.g),this.b=ms(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=Ge){return ds.fromWorkingColorSpace(Kr.copy(this),t),65536*Math.round(Hi(255*Kr.r,0,255))+256*Math.round(Hi(255*Kr.g,0,255))+Math.round(Hi(255*Kr.b,0,255))}getHexString(t=Ge){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=ds.workingColorSpace){ds.fromWorkingColorSpace(Kr.copy(this),e);const i=Kr.r,s=Kr.g,r=Kr.b,n=Math.max(i,s,r),a=Math.min(i,s,r);let o,h;const l=(a+n)/2;if(a===n)o=0,h=0;else{const t=n-a;switch(h=l<=.5?t/(n+a):t/(2-n-a),n){case i:o=(s-r)/t+(s0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){console.warn(`THREE.Material: parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&s.isColor?s.set(i):s&&s.isVector3&&i&&i.isVector3?s.copy(i):this[e]=i:console.warn(`THREE.Material: '${e}' is not a property of THREE.${this.type}.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.6,type:"Material",generator:"Material.toJSON"}};function s(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),void 0!==this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),void 0!==this.dispersion&&(i.dispersion=this.dispersion),void 0!==this.iridescence&&(i.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(i.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(i.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(i.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(i.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),void 0!==this.anisotropy&&(i.anisotropy=this.anisotropy),void 0!==this.anisotropyRotation&&(i.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(i.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapRotation&&(i.envMapRotation=this.envMapRotation.toArray()),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),0!==this.side&&(i.side=this.side),!0===this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=!0),204!==this.blendSrc&&(i.blendSrc=this.blendSrc),205!==this.blendDst&&(i.blendDst=this.blendDst),100!==this.blendEquation&&(i.blendEquation=this.blendEquation),null!==this.blendSrcAlpha&&(i.blendSrcAlpha=this.blendSrcAlpha),null!==this.blendDstAlpha&&(i.blendDstAlpha=this.blendDstAlpha),null!==this.blendEquationAlpha&&(i.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(i.blendColor=this.blendColor.getHex()),0!==this.blendAlpha&&(i.blendAlpha=this.blendAlpha),3!==this.depthFunc&&(i.depthFunc=this.depthFunc),!1===this.depthTest&&(i.depthTest=this.depthTest),!1===this.depthWrite&&(i.depthWrite=this.depthWrite),!1===this.colorWrite&&(i.colorWrite=this.colorWrite),255!==this.stencilWriteMask&&(i.stencilWriteMask=this.stencilWriteMask),519!==this.stencilFunc&&(i.stencilFunc=this.stencilFunc),0!==this.stencilRef&&(i.stencilRef=this.stencilRef),255!==this.stencilFuncMask&&(i.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==ei&&(i.stencilFail=this.stencilFail),this.stencilZFail!==ei&&(i.stencilZFail=this.stencilZFail),this.stencilZPass!==ei&&(i.stencilZPass=this.stencilZPass),!0===this.stencilWrite&&(i.stencilWrite=this.stencilWrite),void 0!==this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaHash&&(i.alphaHash=!0),!0===this.alphaToCoverage&&(i.alphaToCoverage=!0),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=!0),!0===this.forceSinglePass&&(i.forceSinglePass=!0),!0===this.wireframe&&(i.wireframe=!0),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=!0),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),!1===this.fog&&(i.fog=!1),Object.keys(this.userData).length>0&&(i.userData=this.userData),e){const e=s(t.textures),r=s(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let s=0;s!==t;++s)i[s]=e[s].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}onBuild(){console.warn("Material: onBuild() has been removed.")}}class sn extends en{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new Qr(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new gr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const rn=nn();function nn(){const t=new ArrayBuffer(4),e=new Float32Array(t),i=new Uint32Array(t),s=new Uint32Array(512),r=new Uint32Array(512);for(let t=0;t<256;++t){const e=t-127;e<-27?(s[t]=0,s[256|t]=32768,r[t]=24,r[256|t]=24):e<-14?(s[t]=1024>>-e-14,s[256|t]=1024>>-e-14|32768,r[t]=-e-1,r[256|t]=-e-1):e<=15?(s[t]=e+15<<10,s[256|t]=e+15<<10|32768,r[t]=13,r[256|t]=13):e<128?(s[t]=31744,s[256|t]=64512,r[t]=24,r[256|t]=24):(s[t]=31744,s[256|t]=64512,r[t]=13,r[256|t]=13)}const n=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,i=0;for(;!(8388608&e);)e<<=1,i-=8388608;e&=-8388609,i+=947912704,n[t]=e|i}for(let t=1024;t<2048;++t)n[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)a[t]=t<<23;a[31]=1199570944,a[32]=2147483648;for(let t=33;t<63;++t)a[t]=2147483648+(t-32<<23);a[63]=3347054592;for(let t=1;t<64;++t)32!==t&&(o[t]=1024);return{floatView:e,uint32View:i,baseTable:s,shiftTable:r,mantissaTable:n,exponentTable:a,offsetTable:o}}function an(t){Math.abs(t)>65504&&console.warn("THREE.DataUtils.toHalfFloat(): Value out of range."),t=Hi(t,-65504,65504),rn.floatView[0]=t;const e=rn.uint32View[0],i=e>>23&511;return rn.baseTable[i]+((8388607&e)>>rn.shiftTable[i])}function on(t){const e=t>>10;return rn.uint32View[0]=rn.mantissaTable[rn.offsetTable[e]+(1023&t)]+rn.exponentTable[e],rn.floatView[0]}const hn={toHalfFloat:an,fromHalfFloat:on},ln=new Bs,cn=new Gi;let un=0;class dn{constructor(t,e,i=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:un++}),this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=i,this.usage=_i,this.updateRanges=[],this.gpuType=Rt,this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,i){t*=this.itemSize,i*=e.itemSize;for(let s=0,r=this.itemSize;se.count&&console.warn("THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Es);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return console.error("THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),void this.boundingBox.set(new Bs(-1/0,-1/0,-1/0),new Bs(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(let t=0,i=e.length;t0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const s=i[e];t.data.attributes[e]=s.toJSON(t.data)}const s={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],n=[];for(let e=0,s=i.length;e0&&(s[e]=n,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);const n=this.groups;n.length>0&&(t.data.groups=JSON.parse(JSON.stringify(n)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone(e));const s=t.attributes;for(const t in s){const i=s[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],s=r[t];for(let t=0,r=s.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;t(t.far-t.near)**2)return}Bn.copy(r).invert(),kn.copy(t.ray).applyMatrix4(Bn),null!==i.boundingBox&&!1===kn.intersectsBox(i.boundingBox)||this._computeIntersections(t,e,kn)}}_computeIntersections(t,e,i){let s;const r=this.geometry,n=this.material,a=r.index,o=r.attributes.position,h=r.attributes.uv,l=r.attributes.uv1,c=r.attributes.normal,u=r.groups,d=r.drawRange;if(null!==a)if(Array.isArray(n))for(let r=0,o=u.length;ri.far?null:{distance:l,point:jn.clone(),object:t}}(t,e,i,s,Pn,On,Fn,Vn);if(c){const t=new Bs;Xr.getBarycoord(Vn,Pn,On,Fn,t),r&&(c.uv=Xr.getInterpolatedAttribute(r,o,h,l,t,new Gi)),n&&(c.uv1=Xr.getInterpolatedAttribute(n,o,h,l,t,new Gi)),a&&(c.normal=Xr.getInterpolatedAttribute(a,o,h,l,t,new Bs),c.normal.dot(s.direction)>0&&c.normal.multiplyScalar(-1));const e={a:o,b:h,c:l,normal:new Bs,materialIndex:0};Xr.getNormal(Pn,On,Fn,e.normal),c.face=e,c.barycoord=t}return c}class Dn extends In{constructor(t=1,e=1,i=1,s=1,r=1,n=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:s,heightSegments:r,depthSegments:n};const a=this;s=Math.floor(s),r=Math.floor(r),n=Math.floor(n);const o=[],h=[],l=[],c=[];let u=0,d=0;function p(t,e,i,s,r,n,p,m,y,g,f){const x=n/y,b=p/g,v=n/2,w=p/2,M=m/2,S=y+1,_=g+1;let A=0,T=0;const z=new Bs;for(let n=0;n<_;n++){const a=n*b-w;for(let o=0;o0?1:-1,l.push(z.x,z.y,z.z),c.push(o/y),c.push(1-n/g),A+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e}}class Zn extends Er{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new ar,this.projectionMatrix=new ar,this.projectionMatrixInverse=new ar,this.coordinateSystem=Oi}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}const Gn=new Bs,$n=new Gi,Qn=new Gi;class Kn extends Zn{constructor(t=50,e=1,i=.1,s=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=i,this.far=s,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*Wi*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*Ui*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*Wi*Math.atan(Math.tan(.5*Ui*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(t,e,i){Gn.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),e.set(Gn.x,Gn.y).multiplyScalar(-t/Gn.z),Gn.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),i.set(Gn.x,Gn.y).multiplyScalar(-t/Gn.z)}getViewSize(t,e){return this.getViewBounds(t,$n,Qn),e.subVectors(Qn,$n)}setViewOffset(t,e,i,s,r,n){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=s,this.view.width=r,this.view.height=n,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*Ui*this.fov)/this.zoom,i=2*e,s=this.aspect*i,r=-.5*s;const n=this.view;if(null!==this.view&&this.view.enabled){const t=n.fullWidth,a=n.fullHeight;r+=n.offsetX*s/t,e-=n.offsetY*i/a,s*=n.width/t,i*=n.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,e,e-i,t,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const ta=-90;class ea extends Er{constructor(t,e,i){super(),this.type="CubeCamera",this.renderTarget=i,this.coordinateSystem=null,this.activeMipmapLevel=0;const s=new Kn(ta,1,t,e);s.layers=this.layers,this.add(s);const r=new Kn(ta,1,t,e);r.layers=this.layers,this.add(r);const n=new Kn(ta,1,t,e);n.layers=this.layers,this.add(n);const a=new Kn(ta,1,t,e);a.layers=this.layers,this.add(a);const o=new Kn(ta,1,t,e);o.layers=this.layers,this.add(o);const h=new Kn(ta,1,t,e);h.layers=this.layers,this.add(h)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[i,s,r,n,a,o]=e;for(const t of e)this.remove(t);if(t===Oi)i.up.set(0,1,0),i.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),n.up.set(0,0,1),n.lookAt(0,-1,0),a.up.set(0,1,0),a.lookAt(0,0,1),o.up.set(0,1,0),o.lookAt(0,0,-1);else{if(t!==Fi)throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);i.up.set(0,-1,0),i.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),n.up.set(0,0,-1),n.lookAt(0,-1,0),a.up.set(0,-1,0),a.lookAt(0,0,1),o.up.set(0,-1,0),o.lookAt(0,0,-1)}for(const t of e)this.add(t),t.updateMatrixWorld()}update(t,e){null===this.parent&&this.updateMatrixWorld();const{renderTarget:i,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,n,a,o,h,l]=this.children,c=t.getRenderTarget(),u=t.getActiveCubeFace(),d=t.getActiveMipmapLevel(),p=t.xr.enabled;t.xr.enabled=!1;const m=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,t.setRenderTarget(i,0,s),t.render(e,r),t.setRenderTarget(i,1,s),t.render(e,n),t.setRenderTarget(i,2,s),t.render(e,a),t.setRenderTarget(i,3,s),t.render(e,o),t.setRenderTarget(i,4,s),t.render(e,h),i.texture.generateMipmaps=m,t.setRenderTarget(i,5,s),t.render(e,l),t.setRenderTarget(c,u,d),t.xr.enabled=p,i.texture.needsPMREMUpdate=!0}}class ia extends ws{constructor(t,e,i,s,r,n,a,o,h,l){super(t=void 0!==t?t:[],e=void 0!==e?e:ht,i,s,r,n,a,o,h,l),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class sa extends _s{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const i={width:t,height:t,depth:1},s=[i,i,i,i,i,i];this.texture=new ia(s,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:wt}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const i={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},s=new Dn(5,5,5),r=new Yn({name:"CubemapFromEquirect",uniforms:Hn(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const n=new Un(s,r),a=e.minFilter;e.minFilter===_t&&(e.minFilter=wt);return new ea(1,10,this).update(t,n),e.minFilter=a,n.geometry.dispose(),n.material.dispose(),this}clear(t,e,i,s){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,i,s);t.setRenderTarget(r)}}class ra extends Er{constructor(){super(),this.isGroup=!0,this.type="Group"}}const na={type:"move"};class aa{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return null===this._hand&&(this._hand=new ra,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return null===this._targetRay&&(this._targetRay=new ra,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new Bs,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new Bs),this._targetRay}getGripSpace(){return null===this._grip&&(this._grip=new ra,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new Bs,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new Bs),this._grip}dispatchEvent(t){return null!==this._targetRay&&this._targetRay.dispatchEvent(t),null!==this._grip&&this._grip.dispatchEvent(t),null!==this._hand&&this._hand.dispatchEvent(t),this}connect(t){if(t&&t.hand){const e=this._hand;if(e)for(const i of t.hand.values())this._getHandJoint(e,i)}return this.dispatchEvent({type:"connected",data:t}),this}disconnect(t){return this.dispatchEvent({type:"disconnected",data:t}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this}update(t,e,i){let s=null,r=null,n=null;const a=this._targetRay,o=this._grip,h=this._hand;if(t&&"visible-blurred"!==e.session.visibilityState){if(h&&t.hand){n=!0;for(const s of t.hand.values()){const t=e.getJointPose(s,i),r=this._getHandJoint(h,s);null!==t&&(r.matrix.fromArray(t.transform.matrix),r.matrix.decompose(r.position,r.rotation,r.scale),r.matrixWorldNeedsUpdate=!0,r.jointRadius=t.radius),r.visible=null!==t}const s=h.joints["index-finger-tip"],r=h.joints["thumb-tip"],a=s.position.distanceTo(r.position),o=.02,l=.005;h.inputState.pinching&&a>o+l?(h.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!h.inputState.pinching&&a<=o-l&&(h.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));null!==a&&(s=e.getPose(t.targetRaySpace,i),null===s&&null!==r&&(s=r),null!==s&&(a.matrix.fromArray(s.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,s.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(s.linearVelocity)):a.hasLinearVelocity=!1,s.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(s.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(na)))}return null!==a&&(a.visible=null!==s),null!==o&&(o.visible=null!==r),null!==h&&(h.visible=null!==n),this}_getHandJoint(t,e){if(void 0===t.joints[e.jointName]){const i=new ra;i.matrixAutoUpdate=!1,i.visible=!1,t.joints[e.jointName]=i,t.add(i)}return t.joints[e.jointName]}}class oa{constructor(t,e=25e-5){this.isFogExp2=!0,this.name="",this.color=new Qr(t),this.density=e}clone(){return new oa(this.color,this.density)}toJSON(){return{type:"FogExp2",name:this.name,color:this.color.getHex(),density:this.density}}}class ha{constructor(t,e=1,i=1e3){this.isFog=!0,this.name="",this.color=new Qr(t),this.near=e,this.far=i}clone(){return new ha(this.color,this.near,this.far)}toJSON(){return{type:"Fog",name:this.name,color:this.color.getHex(),near:this.near,far:this.far}}}class la extends Er{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new gr,this.environmentIntensity=1,this.environmentRotation=new gr,this.overrideMaterial=null,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,this.backgroundRotation.copy(t.backgroundRotation),this.environmentIntensity=t.environmentIntensity,this.environmentRotation.copy(t.environmentRotation),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.fog&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),1!==this.environmentIntensity&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}class ca{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=_i,this.updateRanges=[],this.version=0,this.uuid=Di()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,i){t*=this.stride,i*=e.stride;for(let s=0,r=this.stride;st.far||e.push({distance:o,point:ya.clone(),uv:Xr.getInterpolation(ya,wa,Ma,Sa,_a,Aa,Ta,new Gi),face:null,object:this})}copy(t,e){return super.copy(t,e),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function Ca(t,e,i,s,r,n){xa.subVectors(t,i).addScalar(.5).multiply(s),void 0!==r?(ba.x=n*xa.x-r*xa.y,ba.y=r*xa.x+n*xa.y):ba.copy(xa),t.copy(e),t.x+=ba.x,t.y+=ba.y,t.applyMatrix4(va)}const Ia=new Bs,Ba=new Bs;class ka extends Er{constructor(){super(),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,i=e.length;t0){let i,s;for(i=1,s=e.length;i0){Ia.setFromMatrixPosition(this.matrixWorld);const i=t.ray.origin.distanceTo(Ia);this.getObjectForDistance(i).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){Ia.setFromMatrixPosition(t.matrixWorld),Ba.setFromMatrixPosition(this.matrixWorld);const i=Ia.distanceTo(Ba)/t.zoom;let s,r;for(e[0].object.visible=!0,s=1,r=e.length;s=t))break;e[s-1].object.visible=!1,e[s].object.visible=!0}for(this._currentLevel=s-1;s1?null:e.copy(t.start).addScaledVector(i,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||ro.getNormalMatrix(t),s=this.coplanarPoint(io).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const ao=new $s,oo=new Bs;class ho{constructor(t=new no,e=new no,i=new no,s=new no,r=new no,n=new no){this.planes=[t,e,i,s,r,n]}set(t,e,i,s,r,n){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(s),a[4].copy(r),a[5].copy(n),this}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t,e=2e3){const i=this.planes,s=t.elements,r=s[0],n=s[1],a=s[2],o=s[3],h=s[4],l=s[5],c=s[6],u=s[7],d=s[8],p=s[9],m=s[10],y=s[11],g=s[12],f=s[13],x=s[14],b=s[15];if(i[0].setComponents(o-r,u-h,y-d,b-g).normalize(),i[1].setComponents(o+r,u+h,y+d,b+g).normalize(),i[2].setComponents(o+n,u+l,y+p,b+f).normalize(),i[3].setComponents(o-n,u-l,y-p,b-f).normalize(),i[4].setComponents(o-a,u-c,y-m,b-x).normalize(),e===Oi)i[5].setComponents(o+a,u+c,y+m,b+x).normalize();else{if(e!==Fi)throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);i[5].setComponents(a,c,m,x).normalize()}return this}intersectsObject(t){if(void 0!==t.boundingSphere)null===t.boundingSphere&&t.computeBoundingSphere(),ao.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;null===e.boundingSphere&&e.computeBoundingSphere(),ao.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(ao)}intersectsSprite(t){return ao.center.set(0,0,0),ao.radius=.7071067811865476,ao.applyMatrix4(t.matrixWorld),this.intersectsSphere(ao)}intersectsSphere(t){const e=this.planes,i=t.center,s=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(i)0?t.max.x:t.min.x,oo.y=s.normal.y>0?t.max.y:t.min.y,oo.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(oo)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function lo(t,e){return t-e}function co(t,e){return t.z-e.z}function uo(t,e){return e.z-t.z}class po{constructor(){this.index=0,this.pool=[],this.list=[]}push(t,e,i,s){const r=this.pool,n=this.list;this.index>=r.length&&r.push({start:-1,count:-1,z:-1,index:-1});const a=r[this.index];n.push(a),this.index++,a.start=t,a.count=e,a.z=i,a.index=s}reset(){this.list.length=0,this.index=0}}const mo=new ar,yo=new Qr(1,1,1),go=new ho,fo=new Es,xo=new $s,bo=new Bs,vo=new Bs,wo=new Bs,Mo=new po,So=new Un,_o=[];function Ao(t,e,i=0){const s=e.itemSize;if(t.isInterleavedBufferAttribute||t.array.constructor!==e.array.constructor){const r=t.count;for(let n=0;n65535?new Uint32Array(s):new Uint16Array(s);e.setIndex(new dn(t,1))}this._geometryInitialized=!0}}_validateGeometry(t){const e=this.geometry;if(Boolean(t.getIndex())!==Boolean(e.getIndex()))throw new Error('THREE.BatchedMesh: All geometries must consistently have "index".');for(const i in e.attributes){if(!t.hasAttribute(i))throw new Error(`THREE.BatchedMesh: Added geometry missing "${i}". All geometries must have consistent attributes.`);const s=t.getAttribute(i),r=e.getAttribute(i);if(s.itemSize!==r.itemSize||s.normalized!==r.normalized)throw new Error("THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.")}}validateInstanceId(t){const e=this._instanceInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid instanceId ${t}. Instance is either out of range or has been deleted.`)}validateGeometryId(t){const e=this._geometryInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid geometryId ${t}. Geometry is either out of range or has been deleted.`)}setCustomSort(t){return this.customSort=t,this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Es);const t=this.boundingBox,e=this._instanceInfo;t.makeEmpty();for(let i=0,s=e.length;i=this.maxInstanceCount&&0===this._availableInstanceIds.length)throw new Error("THREE.BatchedMesh: Maximum item count reached.");const e={visible:!0,active:!0,geometryIndex:t};let i=null;this._availableInstanceIds.length>0?(this._availableInstanceIds.sort(lo),i=this._availableInstanceIds.shift(),this._instanceInfo[i]=e):(i=this._instanceInfo.length,this._instanceInfo.push(e));const s=this._matricesTexture;mo.identity().toArray(s.image.data,16*i),s.needsUpdate=!0;const r=this._colorsTexture;return r&&(yo.toArray(r.image.data,4*i),r.needsUpdate=!0),this._visibilityChanged=!0,i}addGeometry(t,e=-1,i=-1){this._initializeGeometry(t),this._validateGeometry(t);const s={vertexStart:-1,vertexCount:-1,reservedVertexCount:-1,indexStart:-1,indexCount:-1,reservedIndexCount:-1,start:-1,count:-1,boundingBox:null,boundingSphere:null,active:!0},r=this._geometryInfo;s.vertexStart=this._nextVertexStart,s.reservedVertexCount=-1===e?t.getAttribute("position").count:e;const n=t.getIndex();if(null!==n&&(s.indexStart=this._nextIndexStart,s.reservedIndexCount=-1===i?n.count:i),-1!==s.indexStart&&s.indexStart+s.reservedIndexCount>this._maxIndexCount||s.vertexStart+s.reservedVertexCount>this._maxVertexCount)throw new Error("THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.");let a;return this._availableGeometryIds.length>0?(this._availableGeometryIds.sort(lo),a=this._availableGeometryIds.shift(),r[a]=s):(a=this._geometryCount,this._geometryCount++,r.push(s)),this.setGeometryAt(a,t),this._nextIndexStart=s.indexStart+s.reservedIndexCount,this._nextVertexStart=s.vertexStart+s.reservedVertexCount,a}setGeometryAt(t,e){if(t>=this._geometryCount)throw new Error("THREE.BatchedMesh: Maximum geometry count reached.");this._validateGeometry(e);const i=this.geometry,s=null!==i.getIndex(),r=i.getIndex(),n=e.getIndex(),a=this._geometryInfo[t];if(s&&n.count>a.reservedIndexCount||e.attributes.position.count>a.reservedVertexCount)throw new Error("THREE.BatchedMesh: Reserved space not large enough for provided geometry.");const o=a.vertexStart,h=a.reservedVertexCount;a.vertexCount=e.getAttribute("position").count;for(const t in i.attributes){const s=e.getAttribute(t),r=i.getAttribute(t);Ao(s,r,o);const n=s.itemSize;for(let t=s.count,e=h;t=e.length||!1===e[t].active)return this;const i=this._instanceInfo;for(let e=0,s=i.length;ee)).sort(((t,e)=>i[t].vertexStart-i[e].vertexStart)),r=this.geometry;for(let n=0,a=i.length;n=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingBox){const t=new Es,e=i.index,r=i.attributes.position;for(let i=s.start,n=s.start+s.count;i=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingSphere){const e=new $s;this.getBoundingBoxAt(t,fo),fo.getCenter(e.center);const r=i.index,n=i.attributes.position;let a=0;for(let t=s.start,i=s.start+s.count;tt.active));if(Math.max(...i.map((t=>t.vertexStart+t.reservedVertexCount)))>t)throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${e}. Cannot shrink further.`);if(this.geometry.index){if(Math.max(...i.map((t=>t.indexStart+t.reservedIndexCount)))>e)throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${e}. Cannot shrink further.`)}const s=this.geometry;s.dispose(),this._maxVertexCount=t,this._maxIndexCount=e,this._geometryInitialized&&(this._geometryInitialized=!1,this.geometry=new In,this._initializeGeometry(s));const r=this.geometry;s.index&&To(s.index.array,r.index.array);for(const t in s.attributes)To(s.attributes[t].array,r.attributes[t].array)}raycast(t,e){const i=this._instanceInfo,s=this._geometryInfo,r=this.matrixWorld,n=this.geometry;So.material=this.material,So.geometry.index=n.index,So.geometry.attributes=n.attributes,null===So.geometry.boundingBox&&(So.geometry.boundingBox=new Es),null===So.geometry.boundingSphere&&(So.geometry.boundingSphere=new $s);for(let n=0,a=i.length;n({...t,boundingBox:null!==t.boundingBox?t.boundingBox.clone():null,boundingSphere:null!==t.boundingSphere?t.boundingSphere.clone():null}))),this._instanceInfo=t._instanceInfo.map((t=>({...t}))),this._maxInstanceCount=t._maxInstanceCount,this._maxVertexCount=t._maxVertexCount,this._maxIndexCount=t._maxIndexCount,this._geometryInitialized=t._geometryInitialized,this._geometryCount=t._geometryCount,this._multiDrawCounts=t._multiDrawCounts.slice(),this._multiDrawStarts=t._multiDrawStarts.slice(),this._matricesTexture=t._matricesTexture.clone(),this._matricesTexture.image.data=this._matricesTexture.image.data.slice(),null!==this._colorsTexture&&(this._colorsTexture=t._colorsTexture.clone(),this._colorsTexture.image.data=this._colorsTexture.image.data.slice()),this}dispose(){return this.geometry.dispose(),this._matricesTexture.dispose(),this._matricesTexture=null,this._indirectTexture.dispose(),this._indirectTexture=null,null!==this._colorsTexture&&(this._colorsTexture.dispose(),this._colorsTexture=null),this}onBeforeRender(t,e,i,s,r){if(!this._visibilityChanged&&!this.perObjectFrustumCulled&&!this.sortObjects)return;const n=s.getIndex(),a=null===n?1:n.array.BYTES_PER_ELEMENT,o=this._instanceInfo,h=this._multiDrawStarts,l=this._multiDrawCounts,c=this._geometryInfo,u=this.perObjectFrustumCulled,d=this._indirectTexture,p=d.image.data;u&&(mo.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse).multiply(this.matrixWorld),go.setFromProjectionMatrix(mo,t.coordinateSystem));let m=0;if(this.sortObjects){mo.copy(this.matrixWorld).invert(),bo.setFromMatrixPosition(i.matrixWorld).applyMatrix4(mo),vo.set(0,0,-1).transformDirection(i.matrixWorld).transformDirection(mo);for(let t=0,e=o.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;ts)return;Po.applyMatrix4(t.matrixWorld);const o=e.ray.origin.distanceTo(Po);return oe.far?void 0:{distance:o,point:Oo.clone().applyMatrix4(t.matrixWorld),index:r,face:null,faceIndex:null,barycoord:null,object:t}}const Lo=new Bs,Vo=new Bs;class jo extends Fo{constructor(t,e){super(t,e),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(null===t.index){const e=t.attributes.position,i=[];for(let t=0,s=e.count;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;tr.far)return;n.push({distance:h,distanceToRay:Math.sqrt(o),point:i,index:e,face:null,faceIndex:null,barycoord:null,object:a})}}class Zo extends ws{constructor(t,e,i,s,r,n,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isVideoTexture=!0,this.minFilter=void 0!==n?n:wt,this.magFilter=void 0!==r?r:wt,this.generateMipmaps=!1;const l=this;"requestVideoFrameCallback"in t&&t.requestVideoFrameCallback((function e(){l.needsUpdate=!0,t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}class Go extends Zo{constructor(t,e,i,s,r,n,a,o){super({},t,e,i,s,r,n,a,o),this.isVideoFrameTexture=!0}update(){}clone(){return(new this.constructor).copy(this)}setFrame(t){this.image=t,this.needsUpdate=!0}}class $o extends ws{constructor(t,e){super({width:t,height:e}),this.isFramebufferTexture=!0,this.magFilter=gt,this.minFilter=gt,this.generateMipmaps=!1,this.needsUpdate=!0}}class Qo extends ws{constructor(t,e,i,s,r,n,a,o,h,l,c,u){super(null,n,a,o,h,l,s,r,c,u),this.isCompressedTexture=!0,this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}class Ko extends Qo{constructor(t,e,i,s,r,n){super(t,e,i,r,n),this.isCompressedArrayTexture=!0,this.image.depth=s,this.wrapR=mt,this.layerUpdates=new Set}addLayerUpdate(t){this.layerUpdates.add(t)}clearLayerUpdates(){this.layerUpdates.clear()}}class th extends Qo{constructor(t,e,i){super(void 0,t[0].width,t[0].height,e,i,ht),this.isCompressedCubeTexture=!0,this.isCubeTexture=!0,this.image=t}}class eh extends ws{constructor(t,e,i,s,r,n,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isCanvasTexture=!0,this.needsUpdate=!0}}class ih extends ws{constructor(t,e,i,s,r,n,a,o,h,l=1026){if(l!==Dt&&l!==Ht)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===i&&l===Dt&&(i=kt),void 0===i&&l===Ht&&(i=1020),super(null,s,r,n,a,o,l,i,h),this.isDepthTexture=!0,this.image={width:t,height:e},this.magFilter=void 0!==a?a:gt,this.minFilter=void 0!==o?o:gt,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return null!==this.compareFunction&&(e.compareFunction=this.compareFunction),e}}class sh{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(t,e){const i=this.getUtoTmapping(t);return this.getPoint(i,e)}getPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPoint(i/t));return e}getSpacedPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPointAt(i/t));return e}getLength(){const t=this.getLengths();return t[t.length-1]}getLengths(t=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let i,s=this.getPoint(0),r=0;e.push(0);for(let n=1;n<=t;n++)i=this.getPoint(n/t),r+=i.distanceTo(s),e.push(r),s=i;return this.cacheArcLengths=e,e}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(t,e){const i=this.getLengths();let s=0;const r=i.length;let n;n=e||t*i[r-1];let a,o=0,h=r-1;for(;o<=h;)if(s=Math.floor(o+(h-o)/2),a=i[s]-n,a<0)o=s+1;else{if(!(a>0)){h=s;break}h=s-1}if(s=h,i[s]===n)return s/(r-1);const l=i[s];return(s+(n-l)/(i[s+1]-l))/(r-1)}getTangent(t,e){const i=1e-4;let s=t-i,r=t+i;s<0&&(s=0),r>1&&(r=1);const n=this.getPoint(s),a=this.getPoint(r),o=e||(n.isVector2?new Gi:new Bs);return o.copy(a).sub(n).normalize(),o}getTangentAt(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)}computeFrenetFrames(t,e){const i=new Bs,s=[],r=[],n=[],a=new Bs,o=new ar;for(let e=0;e<=t;e++){const i=e/t;s[e]=this.getTangentAt(i,new Bs)}r[0]=new Bs,n[0]=new Bs;let h=Number.MAX_VALUE;const l=Math.abs(s[0].x),c=Math.abs(s[0].y),u=Math.abs(s[0].z);l<=h&&(h=l,i.set(1,0,0)),c<=h&&(h=c,i.set(0,1,0)),u<=h&&i.set(0,0,1),a.crossVectors(s[0],i).normalize(),r[0].crossVectors(s[0],a),n[0].crossVectors(s[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),n[e]=n[e-1].clone(),a.crossVectors(s[e-1],s[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(Hi(s[e-1].dot(s[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}n[e].crossVectors(s[e],r[e])}if(!0===e){let e=Math.acos(Hi(r[0].dot(r[t]),-1,1));e/=t,s[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(o.makeRotationAxis(s[i],e*i)),n[i].crossVectors(s[i],r[i])}return{tangents:s,normals:r,binormals:n}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.6,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class rh extends sh{constructor(t=0,e=0,i=1,s=1,r=0,n=2*Math.PI,a=!1,o=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=i,this.yRadius=s,this.aStartAngle=r,this.aEndAngle=n,this.aClockwise=a,this.aRotation=o}getPoint(t,e=new Gi){const i=e,s=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const n=Math.abs(r)s;)r-=s;r0?0:(Math.floor(Math.abs(h)/r)+1)*r:0===l&&h===r-1&&(h=r-2,l=1),this.closed||h>0?a=s[(h-1)%r]:(oh.subVectors(s[0],s[1]).add(s[0]),a=oh);const c=s[h%r],u=s[(h+1)%r];if(this.closed||h+2s.length-2?s.length-1:n+1],c=s[n>s.length-3?s.length-1:n+2];return i.set(dh(a,o.x,h.x,l.x,c.x),dh(a,o.y,h.y,l.y,c.y)),i}copy(t){super.copy(t),this.points=[];for(let e=0,i=t.points.length;e=i){const t=s[r]-i,n=this.curves[r],a=n.getLength(),o=0===a?0:1-t/a;return n.getPointAt(o,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,s=this.curves.length;i1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,i=t.curves.length;e0){const t=h.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(h);const l=h.getPoint(1);return this.currentPoint.copy(l),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class Ah extends In{constructor(t=[new Gi(0,-.5),new Gi(.5,0),new Gi(0,.5)],e=12,i=0,s=2*Math.PI){super(),this.type="LatheGeometry",this.parameters={points:t,segments:e,phiStart:i,phiLength:s},e=Math.floor(e),s=Hi(s,0,2*Math.PI);const r=[],n=[],a=[],o=[],h=[],l=1/e,c=new Bs,u=new Gi,d=new Bs,p=new Bs,m=new Bs;let y=0,g=0;for(let e=0;e<=t.length-1;e++)switch(e){case 0:y=t[e+1].x-t[e].x,g=t[e+1].y-t[e].y,d.x=1*g,d.y=-y,d.z=0*g,m.copy(d),d.normalize(),o.push(d.x,d.y,d.z);break;case t.length-1:o.push(m.x,m.y,m.z);break;default:y=t[e+1].x-t[e].x,g=t[e+1].y-t[e].y,d.x=1*g,d.y=-y,d.z=0*g,p.copy(d),d.x+=m.x,d.y+=m.y,d.z+=m.z,d.normalize(),o.push(d.x,d.y,d.z),m.copy(p)}for(let r=0;r<=e;r++){const d=i+r*l*s,p=Math.sin(d),m=Math.cos(d);for(let i=0;i<=t.length-1;i++){c.x=t[i].x*p,c.y=t[i].y,c.z=t[i].x*m,n.push(c.x,c.y,c.z),u.x=r/e,u.y=i/(t.length-1),a.push(u.x,u.y);const s=o[3*i+0]*p,l=o[3*i+1],d=o[3*i+0]*m;h.push(s,l,d)}}for(let i=0;i0||0!==s)&&(l.push(n,a,h),x+=3),(e>0||s!==r-1)&&(l.push(a,o,h),x+=3)}h.addGroup(g,x,0),g+=x}(),!1===n&&(t>0&&f(!0),e>0&&f(!1)),this.setIndex(l),this.setAttribute("position",new wn(c,3)),this.setAttribute("normal",new wn(u,3)),this.setAttribute("uv",new wn(d,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Ch(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Ih extends Ch{constructor(t=1,e=1,i=32,s=1,r=!1,n=0,a=2*Math.PI){super(0,t,e,i,s,r,n,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:s,openEnded:r,thetaStart:n,thetaLength:a}}static fromJSON(t){return new Ih(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Bh extends In{constructor(t=[],e=[],i=1,s=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:s};const r=[],n=[];function a(t,e,i,s){const r=s+1,n=[];for(let s=0;s<=r;s++){n[s]=[];const a=t.clone().lerp(i,s/r),o=e.clone().lerp(i,s/r),h=r-s;for(let t=0;t<=h;t++)n[s][t]=0===t&&s===r?a:a.clone().lerp(o,t/h)}for(let t=0;t.9&&a<.1&&(e<.2&&(n[t+0]+=1),i<.2&&(n[t+2]+=1),s<.2&&(n[t+4]+=1))}}()}(),this.setAttribute("position",new wn(r,3)),this.setAttribute("normal",new wn(r.slice(),3)),this.setAttribute("uv",new wn(n,2)),0===s?this.computeVertexNormals():this.normalizeNormals()}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Bh(t.vertices,t.indices,t.radius,t.details)}}class kh extends Bh{constructor(t=1,e=0){const i=(1+Math.sqrt(5))/2,s=1/i;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-s,-i,0,-s,i,0,s,-i,0,s,i,-s,-i,0,-s,i,0,s,-i,0,s,i,0,-i,0,-s,i,0,-s,-i,0,s,i,0,s],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}static fromJSON(t){return new kh(t.radius,t.detail)}}const Rh=new Bs,Eh=new Bs,Ph=new Bs,Oh=new Xr;class Fh extends In{constructor(t=null,e=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:t,thresholdAngle:e},null!==t){const i=4,s=Math.pow(10,i),r=Math.cos(Ui*e),n=t.getIndex(),a=t.getAttribute("position"),o=n?n.count:a.count,h=[0,0,0],l=["a","b","c"],c=new Array(3),u={},d=[];for(let t=0;t80*i){o=l=t[0],h=c=t[1];for(let e=i;el&&(l=u),d>c&&(c=d);p=Math.max(l-o,c-h),p=0!==p?32767/p:0}return Uh(n,a,i,o,h,p,0),a};function Vh(t,e,i,s,r){let n,a;if(r===function(t,e,i,s){let r=0;for(let n=e,a=i-s;n0)for(n=e;n=e;n-=s)a=al(n,t[n],t[n+1],a);return a&&tl(a,a.next)&&(ol(a),a=a.next),a}function jh(t,e){if(!t)return t;e||(e=t);let i,s=t;do{if(i=!1,s.steiner||!tl(s,s.next)&&0!==Kh(s.prev,s,s.next))s=s.next;else{if(ol(s),s=e=s.prev,s===s.next)break;i=!0}}while(i||s!==e);return e}function Uh(t,e,i,s,r,n,a){if(!t)return;!a&&n&&function(t,e,i,s){let r=t;do{0===r.z&&(r.z=Zh(r.x,r.y,e,i,s)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i,s,r,n,a,o,h,l=1;do{for(i=t,t=null,n=null,a=0;i;){for(a++,s=i,o=0,e=0;e0||h>0&&s;)0!==o&&(0===h||!s||i.z<=s.z)?(r=i,i=i.nextZ,o--):(r=s,s=s.nextZ,h--),n?n.nextZ=r:t=r,r.prevZ=n,n=r;i=s}n.nextZ=null,l*=2}while(a>1)}(r)}(t,s,r,n);let o,h,l=t;for(;t.prev!==t.next;)if(o=t.prev,h=t.next,n?Dh(t,s,r,n):Wh(t))e.push(o.i/i|0),e.push(t.i/i|0),e.push(h.i/i|0),ol(t),t=h.next,l=h.next;else if((t=h)===l){a?1===a?Uh(t=Hh(jh(t),e,i),e,i,s,r,n,2):2===a&&qh(t,e,i,s,r,n):Uh(jh(t),e,i,s,r,n,1);break}}function Wh(t){const e=t.prev,i=t,s=t.next;if(Kh(e,i,s)>=0)return!1;const r=e.x,n=i.x,a=s.x,o=e.y,h=i.y,l=s.y,c=rn?r>a?r:a:n>a?n:a,p=o>h?o>l?o:l:h>l?h:l;let m=s.next;for(;m!==e;){if(m.x>=c&&m.x<=d&&m.y>=u&&m.y<=p&&$h(r,o,n,h,a,l,m.x,m.y)&&Kh(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function Dh(t,e,i,s){const r=t.prev,n=t,a=t.next;if(Kh(r,n,a)>=0)return!1;const o=r.x,h=n.x,l=a.x,c=r.y,u=n.y,d=a.y,p=oh?o>l?o:l:h>l?h:l,g=c>u?c>d?c:d:u>d?u:d,f=Zh(p,m,e,i,s),x=Zh(y,g,e,i,s);let b=t.prevZ,v=t.nextZ;for(;b&&b.z>=f&&v&&v.z<=x;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&$h(o,c,h,u,l,d,b.x,b.y)&&Kh(b.prev,b,b.next)>=0)return!1;if(b=b.prevZ,v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&$h(o,c,h,u,l,d,v.x,v.y)&&Kh(v.prev,v,v.next)>=0)return!1;v=v.nextZ}for(;b&&b.z>=f;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&$h(o,c,h,u,l,d,b.x,b.y)&&Kh(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;v&&v.z<=x;){if(v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&$h(o,c,h,u,l,d,v.x,v.y)&&Kh(v.prev,v,v.next)>=0)return!1;v=v.nextZ}return!0}function Hh(t,e,i){let s=t;do{const r=s.prev,n=s.next.next;!tl(r,n)&&el(r,s,s.next,n)&&rl(r,n)&&rl(n,r)&&(e.push(r.i/i|0),e.push(s.i/i|0),e.push(n.i/i|0),ol(s),ol(s.next),s=t=n),s=s.next}while(s!==t);return jh(s)}function qh(t,e,i,s,r,n){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&Qh(a,t)){let o=nl(a,t);return a=jh(a,a.next),o=jh(o,o.next),Uh(a,e,i,s,r,n,0),void Uh(o,e,i,s,r,n,0)}t=t.next}a=a.next}while(a!==t)}function Jh(t,e){return t.x-e.x}function Xh(t,e){const i=function(t,e){let i,s=e,r=-1/0;const n=t.x,a=t.y;do{if(a<=s.y&&a>=s.next.y&&s.next.y!==s.y){const t=s.x+(a-s.y)*(s.next.x-s.x)/(s.next.y-s.y);if(t<=n&&t>r&&(r=t,i=s.x=s.x&&s.x>=h&&n!==s.x&&$h(ai.x||s.x===i.x&&Yh(i,s)))&&(i=s,u=c)),s=s.next}while(s!==o);return i}(t,e);if(!i)return e;const s=nl(i,t);return jh(s,s.next),jh(i,i.next)}function Yh(t,e){return Kh(t.prev,t,e.prev)<0&&Kh(e.next,t,t.next)<0}function Zh(t,e,i,s,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-s)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Gh(t){let e=t,i=t;do{(e.x=(t-a)*(n-o)&&(t-a)*(s-o)>=(i-a)*(e-o)&&(i-a)*(n-o)>=(r-a)*(s-o)}function Qh(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&el(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(rl(t,e)&&rl(e,t)&&function(t,e){let i=t,s=!1;const r=(t.x+e.x)/2,n=(t.y+e.y)/2;do{i.y>n!=i.next.y>n&&i.next.y!==i.y&&r<(i.next.x-i.x)*(n-i.y)/(i.next.y-i.y)+i.x&&(s=!s),i=i.next}while(i!==t);return s}(t,e)&&(Kh(t.prev,t,e.prev)||Kh(t,e.prev,e))||tl(t,e)&&Kh(t.prev,t,t.next)>0&&Kh(e.prev,e,e.next)>0)}function Kh(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function tl(t,e){return t.x===e.x&&t.y===e.y}function el(t,e,i,s){const r=sl(Kh(t,e,i)),n=sl(Kh(t,e,s)),a=sl(Kh(i,s,t)),o=sl(Kh(i,s,e));return r!==n&&a!==o||(!(0!==r||!il(t,i,e))||(!(0!==n||!il(t,s,e))||(!(0!==a||!il(i,t,s))||!(0!==o||!il(i,e,s)))))}function il(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function sl(t){return t>0?1:t<0?-1:0}function rl(t,e){return Kh(t.prev,t,t.next)<0?Kh(t,e,t.next)>=0&&Kh(t,t.prev,e)>=0:Kh(t,e,t.prev)<0||Kh(t,t.next,e)<0}function nl(t,e){const i=new hl(t.i,t.x,t.y),s=new hl(e.i,e.x,e.y),r=t.next,n=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,s.next=i,i.prev=s,n.next=s,s.prev=n,s}function al(t,e,i,s){const r=new hl(t,e,i);return s?(r.next=s.next,r.prev=s,s.next.prev=r,s.next=r):(r.prev=r,r.next=r),r}function ol(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function hl(t,e,i){this.i=t,this.x=e,this.y=i,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}class ll{static area(t){const e=t.length;let i=0;for(let s=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function ul(t,e){for(let i=0;iNumber.EPSILON){const u=Math.sqrt(c),d=Math.sqrt(h*h+l*l),p=e.x-o/u,m=e.y+a/u,y=((i.x-l/d-p)*l-(i.y+h/d-m)*h)/(a*l-o*h);s=p+a*y-t.x,r=m+o*y-t.y;const g=s*s+r*r;if(g<=2)return new Gi(s,r);n=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?h>Number.EPSILON&&(t=!0):a<-Number.EPSILON?h<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(l)&&(t=!0),t?(s=-o,r=a,n=Math.sqrt(c)):(s=a,r=o,n=Math.sqrt(c/2))}return new Gi(s/n,r/n)}const k=[];for(let t=0,e=T.length,i=e-1,s=t+1;t=0;t--){const e=t/p,i=c*Math.cos(e*Math.PI/2),s=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=T.length;t=0;){const s=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=o+2*p;t0)&&d.push(e,r,h),(t!==i-1||o0!=t>0&&this.version++,this._anisotropy=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get dispersion(){return this._dispersion}set dispersion(t){this._dispersion>0!=t>0&&this.version++,this._dispersion=t}get sheen(){return this._sheen}set sheen(t){this._sheen>0!=t>0&&this.version++,this._sheen=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=t.anisotropy,this.anisotropyRotation=t.anisotropyRotation,this.anisotropyMap=t.anisotropyMap,this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.dispersion=t.dispersion,this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class kl extends en{constructor(t){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new Qr(16777215),this.specular=new Qr(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Qr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Gi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new gr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Rl extends en{constructor(t){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new Qr(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Qr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Gi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}class El extends en{constructor(t){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Gi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}class Pl extends en{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new Qr(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Qr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Gi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new gr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Ol extends en{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class Fl extends en{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}class Nl extends en{constructor(t){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new Qr(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Gi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Ll extends Co{constructor(t){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}function Vl(t,e,i){return!t||!i&&t.constructor===e?t:"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t)}function jl(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function Ul(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort((function(e,i){return t[e]-t[i]})),i}function Wl(t,e,i){const s=t.length,r=new t.constructor(s);for(let n=0,a=0;a!==s;++n){const s=i[n]*e;for(let i=0;i!==e;++i)r[a++]=t[s+i]}return r}function Dl(t,e,i,s){let r=1,n=t[0];for(;void 0!==n&&void 0===n[s];)n=t[r++];if(void 0===n)return;let a=n[s];if(void 0!==a)if(Array.isArray(a))do{a=n[s],void 0!==a&&(e.push(n.time),i.push.apply(i,a)),n=t[r++]}while(void 0!==n);else if(void 0!==a.toArray)do{a=n[s],void 0!==a&&(e.push(n.time),a.toArray(i,i.length)),n=t[r++]}while(void 0!==n);else do{a=n[s],void 0!==a&&(e.push(n.time),i.push(a)),n=t[r++]}while(void 0!==n)}const Hl={convertArray:Vl,isTypedArray:jl,getKeyframeOrder:Ul,sortedArray:Wl,flattenJSON:Dl,subclip:function(t,e,i,s,r=30){const n=t.clone();n.name=e;const a=[];for(let t=0;t=s)){h.push(e.times[t]);for(let i=0;in.tracks[t].times[0]&&(o=n.tracks[t].times[0]);for(let t=0;t=s.times[u]){const t=u*h+o,e=t+h-o;d=s.values.slice(t,e)}else{const t=s.createInterpolant(),e=o,i=h-o;t.evaluate(n),d=t.resultBuffer.slice(e,i)}if("quaternion"===r){(new Is).fromArray(d).normalize().conjugate().toArray(d)}const p=a.times.length;for(let t=0;t=r)break t;{const a=e[1];t=r)break e}n=i,i=0}}for(;i>>1;te;)--n;if(++n,0!==r||n!==s){r>=n&&(n=Math.max(n,1),r=n-1);const t=this.getValueSize();this.times=i.slice(r,n),this.values=this.values.slice(r*t,n*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,s=this.values,r=i.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);let n=null;for(let e=0;e!==r;e++){const s=i[e];if("number"==typeof s&&isNaN(s)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,e,s),t=!1;break}if(null!==n&&n>s){console.error("THREE.KeyframeTrack: Out of order keys.",this,e,s,n),t=!1;break}n=s}if(void 0!==s&&jl(s))for(let e=0,i=s.length;e!==i;++e){const i=s[e];if(isNaN(i)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t}optimize(){const t=this.times.slice(),e=this.values.slice(),i=this.getValueSize(),s=this.getInterpolation()===Pe,r=t.length-1;let n=1;for(let a=1;a0){t[n]=t[r];for(let t=r*i,s=n*i,a=0;a!==i;++a)e[s+a]=e[t+a];++n}return n!==t.length?(this.times=t.slice(0,n),this.values=e.slice(0,n*i)):(this.times=t,this.values=e),this}clone(){const t=this.times.slice(),e=this.values.slice(),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}Zl.prototype.TimeBufferType=Float32Array,Zl.prototype.ValueBufferType=Float32Array,Zl.prototype.DefaultInterpolation=Ee;class Gl extends Zl{constructor(t,e,i){super(t,e,i)}}Gl.prototype.ValueTypeName="bool",Gl.prototype.ValueBufferType=Array,Gl.prototype.DefaultInterpolation=Re,Gl.prototype.InterpolantFactoryMethodLinear=void 0,Gl.prototype.InterpolantFactoryMethodSmooth=void 0;class $l extends Zl{}$l.prototype.ValueTypeName="color";class Ql extends Zl{}Ql.prototype.ValueTypeName="number";class Kl extends ql{constructor(t,e,i,s){super(t,e,i,s)}interpolate_(t,e,i,s){const r=this.resultBuffer,n=this.sampleValues,a=this.valueSize,o=(i-e)/(s-e);let h=t*a;for(let t=h+a;h!==t;h+=4)Is.slerpFlat(r,0,n,h-a,n,h,o);return r}}class tc extends Zl{InterpolantFactoryMethodLinear(t){return new Kl(this.times,this.values,this.getValueSize(),t)}}tc.prototype.ValueTypeName="quaternion",tc.prototype.InterpolantFactoryMethodSmooth=void 0;class ec extends Zl{constructor(t,e,i){super(t,e,i)}}ec.prototype.ValueTypeName="string",ec.prototype.ValueBufferType=Array,ec.prototype.DefaultInterpolation=Re,ec.prototype.InterpolantFactoryMethodLinear=void 0,ec.prototype.InterpolantFactoryMethodSmooth=void 0;class ic extends Zl{}ic.prototype.ValueTypeName="vector";class sc{constructor(t="",e=-1,i=[],s=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=s,this.uuid=Di(),this.duration<0&&this.resetDuration()}static parse(t){const e=[],i=t.tracks,s=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(rc(i[t]).scale(s));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r}static toJSON(t){const e=[],i=t.tracks,s={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode};for(let t=0,s=i.length;t!==s;++t)e.push(Zl.toJSON(i[t]));return s}static CreateFromMorphTargetSequence(t,e,i,s){const r=e.length,n=[];for(let t=0;t1){const t=n[1];let e=s[t];e||(s[t]=e=[]),e.push(i)}}const n=[];for(const t in s)n.push(this.CreateFromMorphTargetSequence(t,s[t],e,i));return n}static parseAnimation(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,s,r){if(0!==i.length){const n=[],a=[];Dl(i,n,a,s),0!==n.length&&r.push(new t(e,n,a))}},s=[],r=t.name||"default",n=t.fps||30,a=t.blendMode;let o=t.length||-1;const h=t.hierarchy||[];for(let t=0;t{e&&e(r),this.manager.itemEnd(t)}),0),r;if(void 0!==lc[t])return void lc[t].push({onLoad:e,onProgress:i,onError:s});lc[t]=[],lc[t].push({onLoad:e,onProgress:i,onError:s});const n=new Request(t,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"}),a=this.mimeType,o=this.responseType;fetch(n).then((e=>{if(200===e.status||0===e.status){if(0===e.status&&console.warn("THREE.FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===e.body||void 0===e.body.getReader)return e;const i=lc[t],s=e.body.getReader(),r=e.headers.get("X-File-Size")||e.headers.get("Content-Length"),n=r?parseInt(r):0,a=0!==n;let o=0;const h=new ReadableStream({start(t){!function e(){s.read().then((({done:s,value:r})=>{if(s)t.close();else{o+=r.byteLength;const s=new ProgressEvent("progress",{lengthComputable:a,loaded:o,total:n});for(let t=0,e=i.length;t{t.error(e)}))}()}});return new Response(h)}throw new cc(`fetch for "${e.url}" responded with ${e.status}: ${e.statusText}`,e)})).then((t=>{switch(o){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then((t=>(new DOMParser).parseFromString(t,a)));case"json":return t.json();default:if(void 0===a)return t.text();{const e=/charset="?([^;"\s]*)"?/i.exec(a),i=e&&e[1]?e[1].toLowerCase():void 0,s=new TextDecoder(i);return t.arrayBuffer().then((t=>s.decode(t)))}}})).then((e=>{nc.add(t,e);const i=lc[t];delete lc[t];for(let t=0,s=i.length;t{const i=lc[t];if(void 0===i)throw this.manager.itemError(t),e;delete lc[t];for(let t=0,s=i.length;t{this.manager.itemEnd(t)})),this.manager.itemStart(t)}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}}class dc extends hc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new uc(this.manager);n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,(function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):console.error(e),r.manager.itemError(t)}}),i,s)}parse(t){const e=[];for(let i=0;i0:s.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(s.uniforms[e]={},r.type){case"t":s.uniforms[e].value=i(r.value);break;case"c":s.uniforms[e].value=(new Qr).setHex(r.value);break;case"v2":s.uniforms[e].value=(new Gi).fromArray(r.value);break;case"v3":s.uniforms[e].value=(new Bs).fromArray(r.value);break;case"v4":s.uniforms[e].value=(new Ms).fromArray(r.value);break;case"m3":s.uniforms[e].value=(new $i).fromArray(r.value);break;case"m4":s.uniforms[e].value=(new ar).fromArray(r.value);break;default:s.uniforms[e].value=r.value}}if(void 0!==t.defines&&(s.defines=t.defines),void 0!==t.vertexShader&&(s.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(s.fragmentShader=t.fragmentShader),void 0!==t.glslVersion&&(s.glslVersion=t.glslVersion),void 0!==t.extensions)for(const e in t.extensions)s.extensions[e]=t.extensions[e];if(void 0!==t.lights&&(s.lights=t.lights),void 0!==t.clipping&&(s.clipping=t.clipping),void 0!==t.size&&(s.size=t.size),void 0!==t.sizeAttenuation&&(s.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(s.map=i(t.map)),void 0!==t.matcap&&(s.matcap=i(t.matcap)),void 0!==t.alphaMap&&(s.alphaMap=i(t.alphaMap)),void 0!==t.bumpMap&&(s.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(s.bumpScale=t.bumpScale),void 0!==t.normalMap&&(s.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(s.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),s.normalScale=(new Gi).fromArray(e)}return void 0!==t.displacementMap&&(s.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(s.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(s.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(s.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(s.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(s.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(s.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(s.specularMap=i(t.specularMap)),void 0!==t.specularIntensityMap&&(s.specularIntensityMap=i(t.specularIntensityMap)),void 0!==t.specularColorMap&&(s.specularColorMap=i(t.specularColorMap)),void 0!==t.envMap&&(s.envMap=i(t.envMap)),void 0!==t.envMapRotation&&s.envMapRotation.fromArray(t.envMapRotation),void 0!==t.envMapIntensity&&(s.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(s.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(s.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(s.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(s.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(s.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(s.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(s.gradientMap=i(t.gradientMap)),void 0!==t.clearcoatMap&&(s.clearcoatMap=i(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(s.clearcoatRoughnessMap=i(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(s.clearcoatNormalMap=i(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(s.clearcoatNormalScale=(new Gi).fromArray(t.clearcoatNormalScale)),void 0!==t.iridescenceMap&&(s.iridescenceMap=i(t.iridescenceMap)),void 0!==t.iridescenceThicknessMap&&(s.iridescenceThicknessMap=i(t.iridescenceThicknessMap)),void 0!==t.transmissionMap&&(s.transmissionMap=i(t.transmissionMap)),void 0!==t.thicknessMap&&(s.thicknessMap=i(t.thicknessMap)),void 0!==t.anisotropyMap&&(s.anisotropyMap=i(t.anisotropyMap)),void 0!==t.sheenColorMap&&(s.sheenColorMap=i(t.sheenColorMap)),void 0!==t.sheenRoughnessMap&&(s.sheenRoughnessMap=i(t.sheenRoughnessMap)),s}setTextures(t){return this.textures=t,this}createMaterialFromType(t){return Lc.createMaterialFromType(t)}static createMaterialFromType(t){return new{ShadowMaterial:zl,SpriteMaterial:pa,RawShaderMaterial:Cl,ShaderMaterial:Yn,PointsMaterial:Wo,MeshPhysicalMaterial:Bl,MeshStandardMaterial:Il,MeshPhongMaterial:kl,MeshToonMaterial:Rl,MeshNormalMaterial:El,MeshLambertMaterial:Pl,MeshDepthMaterial:Ol,MeshDistanceMaterial:Fl,MeshBasicMaterial:sn,MeshMatcapMaterial:Nl,LineDashedMaterial:Ll,LineBasicMaterial:Co,Material:en}[t]}}class Vc{static decodeText(t){if(console.warn("THREE.LoaderUtils: decodeText() has been deprecated with r165 and will be removed with r175. Use TextDecoder instead."),"undefined"!=typeof TextDecoder)return(new TextDecoder).decode(t);let e="";for(let i=0,s=t.length;i0){const i=new ac(e);r=new mc(i),r.setCrossOrigin(this.crossOrigin);for(let e=0,i=t.length;e0){s=new mc(this.manager),s.setCrossOrigin(this.crossOrigin);for(let e=0,s=t.length;e{const e=new Es;e.min.fromArray(t.boxMin),e.max.fromArray(t.boxMax);const i=new $s;return i.radius=t.sphereRadius,i.center.fromArray(t.sphereCenter),{boxInitialized:t.boxInitialized,box:e,sphereInitialized:t.sphereInitialized,sphere:i}})),n._maxInstanceCount=t.maxInstanceCount,n._maxVertexCount=t.maxVertexCount,n._maxIndexCount=t.maxIndexCount,n._geometryInitialized=t.geometryInitialized,n._geometryCount=t.geometryCount,n._matricesTexture=c(t.matricesTexture.uuid),void 0!==t.colorsTexture&&(n._colorsTexture=c(t.colorsTexture.uuid));break;case"LOD":n=new ka;break;case"Line":n=new Fo(h(t.geometry),l(t.material));break;case"LineLoop":n=new Uo(h(t.geometry),l(t.material));break;case"LineSegments":n=new jo(h(t.geometry),l(t.material));break;case"PointCloud":case"Points":n=new Xo(h(t.geometry),l(t.material));break;case"Sprite":n=new za(l(t.material));break;case"Group":n=new ra;break;case"Bone":n=new Wa;break;default:n=new Er}if(n.uuid=t.uuid,void 0!==t.name&&(n.name=t.name),void 0!==t.matrix?(n.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(n.matrixAutoUpdate=t.matrixAutoUpdate),n.matrixAutoUpdate&&n.matrix.decompose(n.position,n.quaternion,n.scale)):(void 0!==t.position&&n.position.fromArray(t.position),void 0!==t.rotation&&n.rotation.fromArray(t.rotation),void 0!==t.quaternion&&n.quaternion.fromArray(t.quaternion),void 0!==t.scale&&n.scale.fromArray(t.scale)),void 0!==t.up&&n.up.fromArray(t.up),void 0!==t.castShadow&&(n.castShadow=t.castShadow),void 0!==t.receiveShadow&&(n.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.intensity&&(n.shadow.intensity=t.shadow.intensity),void 0!==t.shadow.bias&&(n.shadow.bias=t.shadow.bias),void 0!==t.shadow.normalBias&&(n.shadow.normalBias=t.shadow.normalBias),void 0!==t.shadow.radius&&(n.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&n.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(n.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.frustumCulled&&(n.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(n.renderOrder=t.renderOrder),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.layers&&(n.layers.mask=t.layers),void 0!==t.children){const a=t.children;for(let t=0;t{e&&e(i),r.manager.itemEnd(t)})).catch((t=>{s&&s(t)})):(setTimeout((function(){e&&e(n),r.manager.itemEnd(t)}),0),n);const a={};a.credentials="anonymous"===this.crossOrigin?"same-origin":"include",a.headers=this.requestHeader;const o=fetch(t,a).then((function(t){return t.blob()})).then((function(t){return createImageBitmap(t,Object.assign(r.options,{colorSpaceConversion:"none"}))})).then((function(i){return nc.add(t,i),e&&e(i),r.manager.itemEnd(t),i})).catch((function(e){s&&s(e),nc.remove(t),r.manager.itemError(t),r.manager.itemEnd(t)}));nc.add(t,o),r.manager.itemStart(t)}}let Xc;class Yc{static getContext(){return void 0===Xc&&(Xc=new(window.AudioContext||window.webkitAudioContext)),Xc}static setContext(t){Xc=t}}class Zc extends hc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new uc(this.manager);function a(e){s?s(e):console.error(e),r.manager.itemError(t)}n.setResponseType("arraybuffer"),n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,(function(t){try{const i=t.slice(0);Yc.getContext().decodeAudioData(i,(function(t){e(t)})).catch(a)}catch(t){a(t)}}),i,s)}}const Gc=new ar,$c=new ar,Qc=new ar;class Kc{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new Kn,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new Kn,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(t){const e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep,Qc.copy(t.projectionMatrix);const i=e.eyeSep/2,s=i*e.near/e.focus,r=e.near*Math.tan(Ui*e.fov*.5)/e.zoom;let n,a;$c.elements[12]=-i,Gc.elements[12]=i,n=-r*e.aspect+s,a=r*e.aspect+s,Qc.elements[0]=2*e.near/(a-n),Qc.elements[8]=(a+n)/(a-n),this.cameraL.projectionMatrix.copy(Qc),n=-r*e.aspect-s,a=r*e.aspect-s,Qc.elements[0]=2*e.near/(a-n),Qc.elements[8]=(a+n)/(a-n),this.cameraR.projectionMatrix.copy(Qc)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply($c),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(Gc)}}class tu extends Kn{constructor(t=[]){super(),this.isArrayCamera=!0,this.cameras=t,this.index=0}}class eu{constructor(t=!0){this.autoStart=t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=iu(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const e=iu();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}}function iu(){return performance.now()}const su=new Bs,ru=new Is,nu=new Bs,au=new Bs;class ou extends Er{constructor(){super(),this.type="AudioListener",this.context=Yc.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new eu}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t);const e=this.context.listener,i=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(su,ru,nu),au.set(0,0,-1).applyQuaternion(ru),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(su.x,t),e.positionY.linearRampToValueAtTime(su.y,t),e.positionZ.linearRampToValueAtTime(su.z,t),e.forwardX.linearRampToValueAtTime(au.x,t),e.forwardY.linearRampToValueAtTime(au.y,t),e.forwardZ.linearRampToValueAtTime(au.z,t),e.upX.linearRampToValueAtTime(i.x,t),e.upY.linearRampToValueAtTime(i.y,t),e.upZ.linearRampToValueAtTime(i.z,t)}else e.setPosition(su.x,su.y,su.z),e.setOrientation(au.x,au.y,au.z,i.x,i.y,i.z)}}class hu extends Er{constructor(t){super(),this.type="Audio",this.listener=t,this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this}setMediaElementSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this}setMediaStreamSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(t),this.connect(),this}setBuffer(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this}play(t=0){if(!0===this.isPlaying)return void console.warn("THREE.Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void console.warn("THREE.Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+t;const e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd,e.onended=this.onEnded.bind(this),e.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=e,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;console.warn("THREE.Audio: this Audio has no playback control.")}stop(t=0){if(!1!==this.hasPlaybackControl)return this._progress=0,null!==this.source&&(this.source.stop(this.context.currentTime+t),this.source.onended=null),this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(i,s,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){a.setValue(i,s);break}}saveOriginalState(){const t=this.binding,e=this.buffer,i=this.valueSize,s=i*this._origIndex;t.getValue(e,s);for(let t=i,r=s;t!==r;++t)e[t]=e[s+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i=.5)for(let s=0;s!==r;++s)t[e+s]=t[i+s]}_slerp(t,e,i,s){Is.slerpFlat(t,e,t,e,t,i,s)}_slerpAdditive(t,e,i,s,r){const n=this._workIndex*r;Is.multiplyQuaternionsFlat(t,n,t,e,t,i),Is.slerpFlat(t,e,t,e,t,n,s)}_lerp(t,e,i,s,r){const n=1-s;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*n+t[i+a]*s}}_lerpAdditive(t,e,i,s,r){for(let n=0;n!==r;++n){const r=e+n;t[r]=t[r]+t[i+n]*s}}}const gu="\\[\\]\\.:\\/",fu=new RegExp("["+gu+"]","g"),xu="[^"+gu+"]",bu="[^"+gu.replace("\\.","")+"]",vu=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",xu)+/(WCOD+)?/.source.replace("WCOD",bu)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",xu)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",xu)+"$"),wu=["material","materials","bones","map"];class Mu{constructor(t,e,i){this.path=e,this.parsedPath=i||Mu.parseTrackName(e),this.node=Mu.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,i){return t&&t.isAnimationObjectGroup?new Mu.Composite(t,e,i):new Mu(t,e,i)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(fu,"")}static parseTrackName(t){const e=vu.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},s=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==s&&-1!==s){const t=i.nodeName.substring(s+1);-1!==wu.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,s),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let s=0;s=r){const n=r++,l=t[n];e[l.uuid]=h,t[h]=l,e[o]=n,t[n]=a;for(let t=0,e=s;t!==e;++t){const e=i[t],s=e[n],r=e[h];e[h]=s,e[n]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,i=this._bindings,s=i.length;let r=this.nCachedObjects_,n=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,h=e[o];if(void 0!==h)if(delete e[o],h0&&(e[a.uuid]=h),t[h]=a,t.pop();for(let t=0,e=s;t!==e;++t){const e=i[t];e[h]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const i=this._bindingsIndicesByPath;let s=i[t];const r=this._bindings;if(void 0!==s)return r[s];const n=this._paths,a=this._parsedPaths,o=this._objects,h=o.length,l=this.nCachedObjects_,c=new Array(h);s=r.length,i[t]=s,n.push(t),a.push(e),r.push(c);for(let i=l,s=o.length;i!==s;++i){const s=o[i];c[i]=new Mu(s,t,e)}return c}unsubscribe_(t){const e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){const s=this._paths,r=this._parsedPaths,n=this._bindings,a=n.length-1,o=n[a];e[t[a]]=i,n[i]=o,n.pop(),r[i]=r[a],r.pop(),s[i]=s[a],s.pop()}}}class _u{constructor(t,e,i=null,s=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=i,this.blendMode=s;const r=e.tracks,n=r.length,a=new Array(n),o={endingStart:Oe,endingEnd:Oe};for(let t=0;t!==n;++t){const e=r[t].createInterpolant(null);a[t]=e,e.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(n),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,i){if(t.fadeOut(e),this.fadeIn(e),i){const i=this._clip.duration,s=t._clip.duration,r=s/i,n=i/s;t.warp(1,r,e),this.warp(n,1,e)}return this}crossFadeTo(t,e,i){return t.crossFadeFrom(this,e,i)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,i){const s=this._mixer,r=s.time,n=this.timeScale;let a=this._timeScaleInterpolant;null===a&&(a=s._lendControlInterpolant(),this._timeScaleInterpolant=a);const o=a.parameterPositions,h=a.sampleValues;return o[0]=r,o[1]=r+i,h[0]=t/n,h[1]=e/n,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,i,s){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const s=(t-r)*i;s<0||0===i?e=0:(this._startTime=null,e=i*s)}e*=this._updateTimeScale(t);const n=this._updateTime(e),a=this._updateWeight(t);if(a>0){const t=this._interpolants,e=this._propertyBindings;if(this.blendMode===Ve)for(let i=0,s=t.length;i!==s;++i)t[i].evaluate(n),e[i].accumulateAdditive(a);else for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(n),e[i].accumulate(s,a)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const s=i.evaluate(t)[0];e*=s,t>i.parameterPositions[1]&&(this.stopFading(),0===s&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let s=this.time+t,r=this._loopCount;const n=2202===i;if(0===t)return-1===r||!n||1&~r?s:e-s;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(s>=e)s=e;else{if(!(s<0)){this.time=s;break t}s=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,n)):this._setEndings(0===this.repetitions,!0,n)),s>=e||s<0){const i=Math.floor(s/e);s-=e*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,s=t>0?e:0,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,n)}else this._setEndings(!1,!1,n);this._loopCount=r,this.time=s,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this.time=s;if(n&&!(1&~r))return e-s}return s}_setEndings(t,e,i){const s=this._interpolantSettings;i?(s.endingStart=Fe,s.endingEnd=Fe):(s.endingStart=t?this.zeroSlopeAtStart?Fe:Oe:Ne,s.endingEnd=e?this.zeroSlopeAtEnd?Fe:Oe:Ne)}_scheduleFading(t,e,i){const s=this._mixer,r=s.time;let n=this._weightInterpolant;null===n&&(n=s._lendControlInterpolant(),this._weightInterpolant=n);const a=n.parameterPositions,o=n.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=i,this}}const Au=new Float32Array(1);class Tu extends Li{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(t,e){const i=t._localRoot||this._root,s=t._clip.tracks,r=s.length,n=t._propertyBindings,a=t._interpolants,o=i.uuid,h=this._bindingsByRootAndName;let l=h[o];void 0===l&&(l={},h[o]=l);for(let t=0;t!==r;++t){const r=s[t],h=r.name;let c=l[h];if(void 0!==c)++c.referenceCount,n[t]=c;else{if(c=n[t],void 0!==c){null===c._cacheIndex&&(++c.referenceCount,this._addInactiveBinding(c,o,h));continue}const s=e&&e._propertyBindings[t].binding.parsedPath;c=new yu(Mu.create(i,h,s),r.ValueTypeName,r.getValueSize()),++c.referenceCount,this._addInactiveBinding(c,o,h),n[t]=c}a[t].resultBuffer=c.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,i=t._clip.uuid,s=this._actionsByClip[i];this._bindAction(t,s&&s.knownActions[0]),this._addInactiveAction(t,i,e)}const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0==i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0==--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,s=this.time+=t,r=Math.sign(t),n=this._accuIndex^=1;for(let a=0;a!==i;++a){e[a]._update(s,t,r,n)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(n);return this}setTime(t){this.time=0;for(let t=0;t=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Uu).distanceTo(t)}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const Du=new Bs,Hu=new Bs;class qu{constructor(t=new Bs,e=new Bs){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){Du.subVectors(t,this.start),Hu.subVectors(this.end,this.start);const i=Hu.dot(Hu);let s=Hu.dot(Du)/i;return e&&(s=Hi(s,0,1)),s}closestPointToPoint(t,e,i){const s=this.closestPointToPointParameter(t,e);return this.delta(i).multiplyScalar(s).add(this.start)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}const Ju=new Bs;class Xu extends Er{constructor(t,e){super(),this.light=t,this.matrixAutoUpdate=!1,this.color=e,this.type="SpotLightHelper";const i=new In,s=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let t=0,e=1,i=32;t1)for(let i=0;i.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{xd.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(xd,e)}}setLength(t,e=.2*t,i=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(i,e,i),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}}class Md extends jo{constructor(t=1){const e=[0,0,0,t,0,0,0,0,0,0,t,0,0,0,0,0,0,t],i=new In;i.setAttribute("position",new wn(e,3)),i.setAttribute("color",new wn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));super(i,new Co({vertexColors:!0,toneMapped:!1})),this.type="AxesHelper"}setColors(t,e,i){const s=new Qr,r=this.geometry.attributes.color.array;return s.set(t),s.toArray(r,0),s.toArray(r,3),s.set(e),s.toArray(r,6),s.toArray(r,9),s.set(i),s.toArray(r,12),s.toArray(r,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class Sd{constructor(){this.type="ShapePath",this.color=new Qr,this.subPaths=[],this.currentPath=null}moveTo(t,e){return this.currentPath=new _h,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this}lineTo(t,e){return this.currentPath.lineTo(t,e),this}quadraticCurveTo(t,e,i,s){return this.currentPath.quadraticCurveTo(t,e,i,s),this}bezierCurveTo(t,e,i,s,r,n){return this.currentPath.bezierCurveTo(t,e,i,s,r,n),this}splineThru(t){return this.currentPath.splineThru(t),this}toShapes(t){function e(t,e){const i=e.length;let s=!1;for(let r=i-1,n=0;nNumber.EPSILON){if(h<0&&(i=e[n],o=-o,a=e[r],h=-h),t.ya.y)continue;if(t.y===i.y){if(t.x===i.x)return!0}else{const e=h*(t.x-i.x)-o*(t.y-i.y);if(0===e)return!0;if(e<0)continue;s=!s}}else{if(t.y!==i.y)continue;if(a.x<=t.x&&t.x<=i.x||i.x<=t.x&&t.x<=a.x)return!0}}return s}const i=ll.isClockWise,s=this.subPaths;if(0===s.length)return[];let r,n,a;const o=[];if(1===s.length)return n=s[0],a=new Nh,a.curves=n.curves,o.push(a),o;let h=!i(s[0].getPoints());h=t?!h:h;const l=[],c=[];let u,d,p=[],m=0;c[m]=void 0,p[m]=[];for(let e=0,a=s.length;e1){let t=!1,i=0;for(let t=0,e=c.length;t0&&!1===t&&(p=l)}for(let t=0,e=c.length;te?(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2):(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0),t},cover:function(t,e){const i=t.image&&t.image.width?t.image.width/t.image.height:1;return i>e?(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0):(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2),t},fill:function(t){return t.repeat.x=1,t.repeat.y=1,t.offset.x=0,t.offset.y=0,t},getByteLength:Ad};"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:t}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=t);export{et as ACESFilmicToneMapping,v as AddEquation,G as AddOperation,Ve as AdditiveAnimationBlendMode,g as AdditiveBlending,st as AgXToneMapping,Lt as AlphaFormat,Si as AlwaysCompare,U as AlwaysDepth,yi as AlwaysStencilFunc,Pc as AmbientLight,_u as AnimationAction,sc as AnimationClip,dc as AnimationLoader,Tu as AnimationMixer,Su as AnimationObjectGroup,Hl as AnimationUtils,nh as ArcCurve,tu as ArrayCamera,wd as ArrowHelper,nt as AttachedBindMode,hu as Audio,mu as AudioAnalyser,Yc as AudioContext,ou as AudioListener,Zc as AudioLoader,Md as AxesHelper,d as BackSide,De as BasicDepthPacking,o as BasicShadowMap,zo as BatchedMesh,Wa as Bone,Gl as BooleanKeyframeTrack,Wu as Box2,Es as Box3,gd as Box3Helper,Dn as BoxGeometry,yd as BoxHelper,dn as BufferAttribute,In as BufferGeometry,Uc as BufferGeometryLoader,zt as ByteType,nc as Cache,Zn as Camera,dd as CameraHelper,eh as CanvasTexture,Th as CapsuleGeometry,uh as CatmullRomCurve3,tt as CineonToneMapping,zh as CircleGeometry,mt as ClampToEdgeWrapping,eu as Clock,Qr as Color,$l as ColorKeyframeTrack,ds as ColorManagement,Ko as CompressedArrayTexture,th as CompressedCubeTexture,Qo as CompressedTexture,pc as CompressedTextureLoader,Ih as ConeGeometry,L as ConstantAlphaFactor,F as ConstantColorFactor,_d as Controls,ea as CubeCamera,ht as CubeReflectionMapping,lt as CubeRefractionMapping,ia as CubeTexture,yc as CubeTextureLoader,dt as CubeUVReflectionMapping,yh as CubicBezierCurve,gh as CubicBezierCurve3,Jl as CubicInterpolant,r as CullFaceBack,n as CullFaceFront,a as CullFaceFrontBack,s as CullFaceNone,sh as Curve,Sh as CurvePath,b as CustomBlending,it as CustomToneMapping,Ch as CylinderGeometry,Vu as Cylindrical,zs as Data3DTexture,As as DataArrayTexture,Da as DataTexture,gc as DataTextureLoader,hn as DataUtils,ri as DecrementStencilOp,ai as DecrementWrapStencilOp,oc as DefaultLoadingManager,Dt as DepthFormat,Ht as DepthStencilFormat,ih as DepthTexture,at as DetachedBindMode,Ec as DirectionalLight,ld as DirectionalLightHelper,Yl as DiscreteInterpolant,kh as DodecahedronGeometry,p as DoubleSide,k as DstAlphaFactor,E as DstColorFactor,ki as DynamicCopyUsage,Ai as DynamicDrawUsage,Ci as DynamicReadUsage,Fh as EdgesGeometry,rh as EllipseCurve,xi as EqualCompare,H as EqualDepth,ci as EqualStencilFunc,ct as EquirectangularReflectionMapping,ut as EquirectangularRefractionMapping,gr as Euler,Li as EventDispatcher,dl as ExtrudeGeometry,uc as FileLoader,vn as Float16BufferAttribute,wn as Float32BufferAttribute,Rt as FloatType,ha as Fog,oa as FogExp2,$o as FramebufferTexture,u as FrontSide,ho as Frustum,Eu as GLBufferAttribute,Ei as GLSL1,Pi as GLSL3,vi as GreaterCompare,J as GreaterDepth,Mi as GreaterEqualCompare,q as GreaterEqualDepth,mi as GreaterEqualStencilFunc,di as GreaterStencilFunc,rd as GridHelper,ra as Group,Et as HalfFloatType,bc as HemisphereLight,sd as HemisphereLightHelper,ml as IcosahedronGeometry,Jc as ImageBitmapLoader,mc as ImageLoader,gs as ImageUtils,si as IncrementStencilOp,ni as IncrementWrapStencilOp,Xa as InstancedBufferAttribute,jc as InstancedBufferGeometry,Ru as InstancedInterleavedBuffer,eo as InstancedMesh,gn as Int16BufferAttribute,xn as Int32BufferAttribute,pn as Int8BufferAttribute,Bt as IntType,ca as InterleavedBuffer,da as InterleavedBufferAttribute,ql as Interpolant,Re as InterpolateDiscrete,Ee as InterpolateLinear,Pe as InterpolateSmooth,oi as InvertStencilOp,ei as KeepStencilOp,Zl as KeyframeTrack,ka as LOD,Ah as LatheGeometry,fr as Layers,fi as LessCompare,W as LessDepth,bi as LessEqualCompare,D as LessEqualDepth,ui as LessEqualStencilFunc,li as LessStencilFunc,xc as Light,Nc as LightProbe,Fo as Line,qu as Line3,Co as LineBasicMaterial,fh as LineCurve,xh as LineCurve3,Ll as LineDashedMaterial,Uo as LineLoop,jo as LineSegments,wt as LinearFilter,Xl as LinearInterpolant,At as LinearMipMapLinearFilter,St as LinearMipMapNearestFilter,_t as LinearMipmapLinearFilter,Mt as LinearMipmapNearestFilter,$e as LinearSRGBColorSpace,Q as LinearToneMapping,Qe as LinearTransfer,hc as Loader,Vc as LoaderUtils,ac as LoadingManager,Ie as LoopOnce,ke as LoopPingPong,Be as LoopRepeat,Wt as LuminanceAlphaFormat,Ut as LuminanceFormat,e as MOUSE,en as Material,Lc as MaterialLoader,Zi as MathUtils,ju as Matrix2,$i as Matrix3,ar as Matrix4,_ as MaxEquation,Un as Mesh,sn as MeshBasicMaterial,Ol as MeshDepthMaterial,Fl as MeshDistanceMaterial,Pl as MeshLambertMaterial,Nl as MeshMatcapMaterial,El as MeshNormalMaterial,kl as MeshPhongMaterial,Bl as MeshPhysicalMaterial,Il as MeshStandardMaterial,Rl as MeshToonMaterial,S as MinEquation,yt as MirroredRepeatWrapping,Z as MixOperation,x as MultiplyBlending,Y as MultiplyOperation,gt as NearestFilter,vt as NearestMipMapLinearFilter,xt as NearestMipMapNearestFilter,bt as NearestMipmapLinearFilter,ft as NearestMipmapNearestFilter,rt as NeutralToneMapping,gi as NeverCompare,j as NeverDepth,hi as NeverStencilFunc,m as NoBlending,Ze as NoColorSpace,$ as NoToneMapping,Le as NormalAnimationBlendMode,y as NormalBlending,wi as NotEqualCompare,X as NotEqualDepth,pi as NotEqualStencilFunc,Ql as NumberKeyframeTrack,Er as Object3D,Wc as ObjectLoader,Ye as ObjectSpaceNormalMap,yl as OctahedronGeometry,T as OneFactor,V as OneMinusConstantAlphaFactor,N as OneMinusConstantColorFactor,R as OneMinusDstAlphaFactor,P as OneMinusDstColorFactor,B as OneMinusSrcAlphaFactor,C as OneMinusSrcColorFactor,kc as OrthographicCamera,h as PCFShadowMap,l as PCFSoftShadowMap,_h as Path,Kn as PerspectiveCamera,no as Plane,gl as PlaneGeometry,fd as PlaneHelper,Bc as PointLight,Ku as PointLightHelper,Xo as Points,Wo as PointsMaterial,nd as PolarGridHelper,Bh as PolyhedronGeometry,pu as PositionalAudio,Mu as PropertyBinding,yu as PropertyMixer,bh as QuadraticBezierCurve,vh as QuadraticBezierCurve3,Is as Quaternion,tc as QuaternionKeyframeTrack,Kl as QuaternionLinearInterpolant,Wi as RAD2DEG,ze as RED_GREEN_RGTC2_Format,Ae as RED_RGTC1_Format,t as REVISION,He as RGBADepthPacking,jt as RGBAFormat,Gt as RGBAIntegerFormat,be as RGBA_ASTC_10x10_Format,ge as RGBA_ASTC_10x5_Format,fe as RGBA_ASTC_10x6_Format,xe as RGBA_ASTC_10x8_Format,ve as RGBA_ASTC_12x10_Format,we as RGBA_ASTC_12x12_Format,he as RGBA_ASTC_4x4_Format,le as RGBA_ASTC_5x4_Format,ce as RGBA_ASTC_5x5_Format,ue as RGBA_ASTC_6x5_Format,de as RGBA_ASTC_6x6_Format,pe as RGBA_ASTC_8x5_Format,me as RGBA_ASTC_8x6_Format,ye as RGBA_ASTC_8x8_Format,Me as RGBA_BPTC_Format,oe as RGBA_ETC2_EAC_Format,re as RGBA_PVRTC_2BPPV1_Format,se as RGBA_PVRTC_4BPPV1_Format,Qt as RGBA_S3TC_DXT1_Format,Kt as RGBA_S3TC_DXT3_Format,te as RGBA_S3TC_DXT5_Format,qe as RGBDepthPacking,Vt as RGBFormat,Zt as RGBIntegerFormat,Se as RGB_BPTC_SIGNED_Format,_e as RGB_BPTC_UNSIGNED_Format,ne as RGB_ETC1_Format,ae as RGB_ETC2_Format,ie as RGB_PVRTC_2BPPV1_Format,ee as RGB_PVRTC_4BPPV1_Format,$t as RGB_S3TC_DXT1_Format,Je as RGDepthPacking,Xt as RGFormat,Yt as RGIntegerFormat,Cl as RawShaderMaterial,nr as Ray,Ou as Raycaster,Oc as RectAreaLight,qt as RedFormat,Jt as RedIntegerFormat,K as ReinhardToneMapping,Ss as RenderTarget,zu as RenderTarget3D,Cu as RenderTargetArray,pt as RepeatWrapping,ii as ReplaceStencilOp,M as ReverseSubtractEquation,fl as RingGeometry,Ce as SIGNED_RED_GREEN_RGTC2_Format,Te as SIGNED_RED_RGTC1_Format,Ge as SRGBColorSpace,Ke as SRGBTransfer,la as Scene,Yn as ShaderMaterial,zl as ShadowMaterial,Nh as Shape,xl as ShapeGeometry,Sd as ShapePath,ll as ShapeUtils,Ct as ShortType,Ja as Skeleton,$u as SkeletonHelper,Ua as SkinnedMesh,xs as Source,$s as Sphere,bl as SphereGeometry,Lu as Spherical,Fc as SphericalHarmonics3,wh as SplineCurve,Ac as SpotLight,Xu as SpotLightHelper,za as Sprite,pa as SpriteMaterial,I as SrcAlphaFactor,O as SrcAlphaSaturateFactor,z as SrcColorFactor,Bi as StaticCopyUsage,_i as StaticDrawUsage,zi as StaticReadUsage,Kc as StereoCamera,Ri as StreamCopyUsage,Ti as StreamDrawUsage,Ii as StreamReadUsage,ec as StringKeyframeTrack,w as SubtractEquation,f as SubtractiveBlending,i as TOUCH,Xe as TangentSpaceNormalMap,vl as TetrahedronGeometry,ws as Texture,fc as TextureLoader,Td as TextureUtils,Ni as TimestampQuery,wl as TorusGeometry,Ml as TorusKnotGeometry,Xr as Triangle,We as TriangleFanDrawMode,Ue as TriangleStripDrawMode,je as TrianglesDrawMode,Sl as TubeGeometry,ot as UVMapping,fn as Uint16BufferAttribute,bn as Uint32BufferAttribute,mn as Uint8BufferAttribute,yn as Uint8ClampedBufferAttribute,Iu as Uniform,ku as UniformsGroup,Xn as UniformsUtils,Tt as UnsignedByteType,Ft as UnsignedInt248Type,Nt as UnsignedInt5999Type,kt as UnsignedIntType,Pt as UnsignedShort4444Type,Ot as UnsignedShort5551Type,It as UnsignedShortType,c as VSMShadowMap,Gi as Vector2,Bs as Vector3,Ms as Vector4,ic as VectorKeyframeTrack,Go as VideoFrameTexture,Zo as VideoTexture,Cs as WebGL3DRenderTarget,Ts as WebGLArrayRenderTarget,Oi as WebGLCoordinateSystem,sa as WebGLCubeRenderTarget,_s as WebGLRenderTarget,Fi as WebGPUCoordinateSystem,aa as WebXRController,_l as WireframeGeometry,Ne as WrapAroundEnding,Oe as ZeroCurvatureEnding,A as ZeroFactor,Fe as ZeroSlopeEnding,ti as ZeroStencilOp,Ki as arrayNeedsUint32,Hn as cloneUniforms,ss as createCanvasElement,is as createElementNS,Ad as getByteLength,Jn as getUnlitUniformColorSpace,qn as mergeUniforms,as as probeAsync,os as toNormalizedProjectionMatrix,hs as toReversedProjectionMatrix,ns as warnOnce}; diff --git a/build/three.module.js b/build/three.module.js index ca58dd66ba1061..71235964ef290f 100644 --- a/build/three.module.js +++ b/build/three.module.js @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ import { Color, Matrix3, Vector2, mergeUniforms, Vector3, CubeUVReflectionMapping, Mesh, BoxGeometry, ShaderMaterial, cloneUniforms, BackSide, ColorManagement, SRGBTransfer, PlaneGeometry, FrontSide, getUnlitUniformColorSpace, Euler, Matrix4, IntType, RGBAFormat, HalfFloatType, UnsignedByteType, FloatType, Plane, EquirectangularReflectionMapping, EquirectangularRefractionMapping, WebGLCubeRenderTarget, CubeReflectionMapping, CubeRefractionMapping, PerspectiveCamera, NoToneMapping, MeshBasicMaterial, BufferGeometry, BufferAttribute, WebGLRenderTarget, NoBlending, OrthographicCamera, LinearFilter, LinearSRGBColorSpace, warnOnce, arrayNeedsUint32, Uint32BufferAttribute, Uint16BufferAttribute, Vector4, DataArrayTexture, LessEqualCompare, Texture, DepthTexture, Data3DTexture, CubeTexture, GLSL3, CustomToneMapping, NeutralToneMapping, AgXToneMapping, ACESFilmicToneMapping, CineonToneMapping, ReinhardToneMapping, LinearToneMapping, PCFShadowMap, PCFSoftShadowMap, VSMShadowMap, LinearTransfer, AddOperation, MixOperation, MultiplyOperation, ObjectSpaceNormalMap, TangentSpaceNormalMap, NormalBlending, DoubleSide, UniformsUtils, Layers, Frustum, MeshDepthMaterial, RGBADepthPacking, MeshDistanceMaterial, NearestFilter, LessEqualDepth, AddEquation, SubtractEquation, ReverseSubtractEquation, ZeroFactor, OneFactor, SrcColorFactor, SrcAlphaFactor, SrcAlphaSaturateFactor, DstColorFactor, DstAlphaFactor, OneMinusSrcColorFactor, OneMinusSrcAlphaFactor, OneMinusDstColorFactor, OneMinusDstAlphaFactor, ConstantColorFactor, OneMinusConstantColorFactor, ConstantAlphaFactor, OneMinusConstantAlphaFactor, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, CullFaceNone, CullFaceBack, CullFaceFront, NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessDepth, AlwaysDepth, NeverDepth, MinEquation, MaxEquation, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestMipmapNearestFilter, NearestMipmapLinearFilter, LinearMipmapNearestFilter, LinearMipmapLinearFilter, NeverCompare, AlwaysCompare, LessCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare, NoColorSpace, DepthStencilFormat, getByteLength, UnsignedIntType, UnsignedInt248Type, UnsignedShortType, DepthFormat, createElementNS, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt5999Type, ByteType, ShortType, AlphaFormat, RGBFormat, LuminanceFormat, LuminanceAlphaFormat, RedFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, EventDispatcher, ArrayCamera, WebXRController, RAD2DEG, createCanvasElement, SRGBColorSpace, REVISION, toNormalizedProjectionMatrix, toReversedProjectionMatrix, probeAsync, WebGLCoordinateSystem } from './three.core.js'; -export { AdditiveAnimationBlendMode, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxHelper, BufferGeometryLoader, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CircleGeometry, Clock, ColorKeyframeTrack, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, Controls, CubeCamera, CubeTextureLoader, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceFrontBack, Curve, CurvePath, CylinderGeometry, Cylindrical, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualStencilFunc, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, Fog, FogExp2, FramebufferTexture, 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, 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, MaterialLoader, MathUtils, Matrix2, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NeverStencilFunc, NormalAnimationBlendMode, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, OctahedronGeometry, Path, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RGBDepthPacking, RGBIntegerFormat, RGDepthPacking, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RenderTarget, RenderTarget3D, RenderTargetArray, 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, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroSlopeEnding, ZeroStencilOp } from './three.core.js'; +export { AdditiveAnimationBlendMode, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxHelper, BufferGeometryLoader, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CircleGeometry, Clock, ColorKeyframeTrack, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, Controls, CubeCamera, CubeTextureLoader, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceFrontBack, Curve, CurvePath, CylinderGeometry, Cylindrical, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualStencilFunc, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, Fog, FogExp2, FramebufferTexture, 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, 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, MaterialLoader, MathUtils, Matrix2, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NeverStencilFunc, NormalAnimationBlendMode, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, OctahedronGeometry, Path, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RGBDepthPacking, RGBIntegerFormat, RGDepthPacking, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RenderTarget, RenderTarget3D, RenderTargetArray, 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, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroSlopeEnding, ZeroStencilOp } from './three.core.js'; function WebGLAnimation() { diff --git a/build/three.module.min.js b/build/three.module.min.js index e071790887d6f2..d1d41040a4a290 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{Color as e,Matrix3 as t,Vector2 as n,mergeUniforms as r,Vector3 as i,CubeUVReflectionMapping as a,Mesh as o,BoxGeometry as s,ShaderMaterial as l,cloneUniforms as c,BackSide as d,ColorManagement as u,SRGBTransfer as f,PlaneGeometry as p,FrontSide as m,getUnlitUniformColorSpace as h,Euler as _,Matrix4 as g,IntType as v,RGBAFormat as E,HalfFloatType as S,UnsignedByteType as T,FloatType as M,Plane as x,EquirectangularReflectionMapping as R,EquirectangularRefractionMapping as A,WebGLCubeRenderTarget as b,CubeReflectionMapping as C,CubeRefractionMapping as L,PerspectiveCamera as P,NoToneMapping as U,MeshBasicMaterial as D,BufferGeometry as w,BufferAttribute as y,WebGLRenderTarget as I,NoBlending as N,OrthographicCamera as O,LinearFilter as F,LinearSRGBColorSpace as B,warnOnce as H,arrayNeedsUint32 as G,Uint32BufferAttribute as V,Uint16BufferAttribute as z,Vector4 as k,DataArrayTexture as W,LessEqualCompare as X,Texture as Y,DepthTexture as K,Data3DTexture as j,CubeTexture as q,GLSL3 as Z,CustomToneMapping as $,NeutralToneMapping as Q,AgXToneMapping as J,ACESFilmicToneMapping as ee,CineonToneMapping as te,ReinhardToneMapping as ne,LinearToneMapping as re,PCFShadowMap as ie,PCFSoftShadowMap as ae,VSMShadowMap as oe,LinearTransfer as se,AddOperation as le,MixOperation as ce,MultiplyOperation as de,ObjectSpaceNormalMap as ue,TangentSpaceNormalMap as fe,NormalBlending as pe,DoubleSide as me,UniformsUtils as he,Layers as _e,Frustum as ge,MeshDepthMaterial as ve,RGBADepthPacking as Ee,MeshDistanceMaterial as Se,NearestFilter as Te,LessEqualDepth as Me,AddEquation as xe,SubtractEquation as Re,ReverseSubtractEquation as Ae,ZeroFactor as be,OneFactor as Ce,SrcColorFactor as Le,SrcAlphaFactor as Pe,SrcAlphaSaturateFactor as Ue,DstColorFactor as De,DstAlphaFactor as we,OneMinusSrcColorFactor as ye,OneMinusSrcAlphaFactor as Ie,OneMinusDstColorFactor as Ne,OneMinusDstAlphaFactor as Oe,ConstantColorFactor as Fe,OneMinusConstantColorFactor as Be,ConstantAlphaFactor as He,OneMinusConstantAlphaFactor as Ge,CustomBlending as Ve,MultiplyBlending as ze,SubtractiveBlending as ke,AdditiveBlending as We,CullFaceNone as Xe,CullFaceBack as Ye,CullFaceFront as Ke,NotEqualDepth as je,GreaterDepth as qe,GreaterEqualDepth as Ze,EqualDepth as $e,LessDepth as Qe,AlwaysDepth as Je,NeverDepth as et,MinEquation as tt,MaxEquation as nt,RepeatWrapping as rt,ClampToEdgeWrapping as it,MirroredRepeatWrapping as at,NearestMipmapNearestFilter as ot,NearestMipmapLinearFilter as st,LinearMipmapNearestFilter as lt,LinearMipmapLinearFilter as ct,NeverCompare as dt,AlwaysCompare as ut,LessCompare as ft,EqualCompare as pt,GreaterEqualCompare as mt,GreaterCompare as ht,NotEqualCompare as _t,NoColorSpace as gt,DepthStencilFormat as vt,getByteLength as Et,UnsignedIntType as St,UnsignedInt248Type as Tt,UnsignedShortType as Mt,DepthFormat as xt,createElementNS as Rt,UnsignedShort4444Type as At,UnsignedShort5551Type as bt,UnsignedInt5999Type as Ct,ByteType as Lt,ShortType as Pt,AlphaFormat as Ut,RGBFormat as Dt,LuminanceFormat as wt,LuminanceAlphaFormat as yt,RedFormat as It,RedIntegerFormat as Nt,RGFormat as Ot,RGIntegerFormat as Ft,RGBAIntegerFormat as Bt,RGB_S3TC_DXT1_Format as Ht,RGBA_S3TC_DXT1_Format as Gt,RGBA_S3TC_DXT3_Format as Vt,RGBA_S3TC_DXT5_Format as zt,RGB_PVRTC_4BPPV1_Format as kt,RGB_PVRTC_2BPPV1_Format as Wt,RGBA_PVRTC_4BPPV1_Format as Xt,RGBA_PVRTC_2BPPV1_Format as Yt,RGB_ETC1_Format as Kt,RGB_ETC2_Format as jt,RGBA_ETC2_EAC_Format as qt,RGBA_ASTC_4x4_Format as Zt,RGBA_ASTC_5x4_Format as $t,RGBA_ASTC_5x5_Format as Qt,RGBA_ASTC_6x5_Format as Jt,RGBA_ASTC_6x6_Format as en,RGBA_ASTC_8x5_Format as tn,RGBA_ASTC_8x6_Format as nn,RGBA_ASTC_8x8_Format as rn,RGBA_ASTC_10x5_Format as an,RGBA_ASTC_10x6_Format as on,RGBA_ASTC_10x8_Format as sn,RGBA_ASTC_10x10_Format as ln,RGBA_ASTC_12x10_Format as cn,RGBA_ASTC_12x12_Format as dn,RGBA_BPTC_Format as un,RGB_BPTC_SIGNED_Format as fn,RGB_BPTC_UNSIGNED_Format as pn,RED_RGTC1_Format as mn,SIGNED_RED_RGTC1_Format as hn,RED_GREEN_RGTC2_Format as _n,SIGNED_RED_GREEN_RGTC2_Format as gn,EventDispatcher as vn,ArrayCamera as En,WebXRController as Sn,RAD2DEG as Tn,createCanvasElement as Mn,SRGBColorSpace as xn,REVISION as Rn,toNormalizedProjectionMatrix as An,toReversedProjectionMatrix as bn,probeAsync as Cn,WebGLCoordinateSystem as Ln}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,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,Controls,CubeCamera,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CylinderGeometry,Cylindrical,DataTexture,DataTextureLoader,DataUtils,DecrementStencilOp,DecrementWrapStencilOp,DefaultLoadingManager,DetachedBindMode,DirectionalLight,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicDrawUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,EqualStencilFunc,ExtrudeGeometry,FileLoader,Float16BufferAttribute,Float32BufferAttribute,Fog,FogExp2,FramebufferTexture,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,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,MaterialLoader,MathUtils,Matrix2,MeshLambertMaterial,MeshMatcapMaterial,MeshNormalMaterial,MeshPhongMaterial,MeshPhysicalMaterial,MeshStandardMaterial,MeshToonMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NeverStencilFunc,NormalAnimationBlendMode,NotEqualStencilFunc,NumberKeyframeTrack,Object3D,ObjectLoader,OctahedronGeometry,Path,PlaneHelper,PointLight,PointLightHelper,Points,PointsMaterial,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,Quaternion,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBDepthPacking,RGBIntegerFormat,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RectAreaLight,RenderTarget,RenderTarget3D,RenderTargetArray,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,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,UVMapping,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGPUCoordinateSystem,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding,ZeroStencilOp}from"./three.core.min.js";function Pn(){let e=null,t=!1,n=null,r=null;function i(t,a){n(t,a),r=e.requestAnimationFrame(i)}return{start:function(){!0!==t&&null!==n&&(r=e.requestAnimationFrame(i),t=!0)},stop:function(){e.cancelAnimationFrame(r),t=!1},setAnimationLoop:function(e){n=e},setContext:function(t){e=t}}}function Un(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 r=t.get(n);r&&(e.deleteBuffer(r.buffer),t.delete(n))},update:function(n,r){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}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\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\t\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, roughness * 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 * ( 1.0 - 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 = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), 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.07, 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:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\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#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 saturate(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.specularColor;\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 * transposeMat3( 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 a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\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\tvec2 fab = DFGApprox( normal, viewDir, roughness );\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}\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.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * 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\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\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\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\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 );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\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.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\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 )\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_LOGDEPTHBUF )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\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\tuniform sampler2D directionalShadowMap[ 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\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\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 sampler2D pointShadowMap[ 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\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D 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\t\n\t\tfloat lightToPositionLength = length( lightToPosition );\n\t\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t\t) * ( 1.0 / 9.0 );\n\t\t\t#else\n\t\t\t\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\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\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.diffuseColor, material.specularColor, 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\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\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}",distanceRGBA_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}",distanceRGBA_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 \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 = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \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 \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( packNormalToRGB( normal ), diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \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 \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\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\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 \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 \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}",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}"},wn={common:{diffuse:{value:new e(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new t},alphaMap:{value:null},alphaMapTransform:{value:new t},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new t}},envmap:{envMap:{value:null},envMapRotation:{value:new t},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new t}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new t}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new t},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new t},normalScale:{value:new n(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new t},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new t}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new t}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new t}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new e(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},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 e(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new t},alphaTest:{value:0},uvTransform:{value:new t}},sprite:{diffuse:{value:new e(16777215)},opacity:{value:1},center:{value:new n(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new t},alphaMap:{value:null},alphaMapTransform:{value:new t},alphaTest:{value:0}}},yn={basic:{uniforms:r([wn.common,wn.specularmap,wn.envmap,wn.aomap,wn.lightmap,wn.fog]),vertexShader:Dn.meshbasic_vert,fragmentShader:Dn.meshbasic_frag},lambert:{uniforms:r([wn.common,wn.specularmap,wn.envmap,wn.aomap,wn.lightmap,wn.emissivemap,wn.bumpmap,wn.normalmap,wn.displacementmap,wn.fog,wn.lights,{emissive:{value:new e(0)}}]),vertexShader:Dn.meshlambert_vert,fragmentShader:Dn.meshlambert_frag},phong:{uniforms:r([wn.common,wn.specularmap,wn.envmap,wn.aomap,wn.lightmap,wn.emissivemap,wn.bumpmap,wn.normalmap,wn.displacementmap,wn.fog,wn.lights,{emissive:{value:new e(0)},specular:{value:new e(1118481)},shininess:{value:30}}]),vertexShader:Dn.meshphong_vert,fragmentShader:Dn.meshphong_frag},standard:{uniforms:r([wn.common,wn.envmap,wn.aomap,wn.lightmap,wn.emissivemap,wn.bumpmap,wn.normalmap,wn.displacementmap,wn.roughnessmap,wn.metalnessmap,wn.fog,wn.lights,{emissive:{value:new e(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Dn.meshphysical_vert,fragmentShader:Dn.meshphysical_frag},toon:{uniforms:r([wn.common,wn.aomap,wn.lightmap,wn.emissivemap,wn.bumpmap,wn.normalmap,wn.displacementmap,wn.gradientmap,wn.fog,wn.lights,{emissive:{value:new e(0)}}]),vertexShader:Dn.meshtoon_vert,fragmentShader:Dn.meshtoon_frag},matcap:{uniforms:r([wn.common,wn.bumpmap,wn.normalmap,wn.displacementmap,wn.fog,{matcap:{value:null}}]),vertexShader:Dn.meshmatcap_vert,fragmentShader:Dn.meshmatcap_frag},points:{uniforms:r([wn.points,wn.fog]),vertexShader:Dn.points_vert,fragmentShader:Dn.points_frag},dashed:{uniforms:r([wn.common,wn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Dn.linedashed_vert,fragmentShader:Dn.linedashed_frag},depth:{uniforms:r([wn.common,wn.displacementmap]),vertexShader:Dn.depth_vert,fragmentShader:Dn.depth_frag},normal:{uniforms:r([wn.common,wn.bumpmap,wn.normalmap,wn.displacementmap,{opacity:{value:1}}]),vertexShader:Dn.meshnormal_vert,fragmentShader:Dn.meshnormal_frag},sprite:{uniforms:r([wn.sprite,wn.fog]),vertexShader:Dn.sprite_vert,fragmentShader:Dn.sprite_frag},background:{uniforms:{uvTransform:{value:new t},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Dn.background_vert,fragmentShader:Dn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new t}},vertexShader:Dn.backgroundCube_vert,fragmentShader:Dn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Dn.cube_vert,fragmentShader:Dn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Dn.equirect_vert,fragmentShader:Dn.equirect_frag},distanceRGBA:{uniforms:r([wn.common,wn.displacementmap,{referencePosition:{value:new i},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Dn.distanceRGBA_vert,fragmentShader:Dn.distanceRGBA_frag},shadow:{uniforms:r([wn.lights,wn.fog,{color:{value:new e(0)},opacity:{value:1}}]),vertexShader:Dn.shadow_vert,fragmentShader:Dn.shadow_frag}};yn.physical={uniforms:r([yn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new t},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new t},clearcoatNormalScale:{value:new n(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new t},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new t},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new t},sheen:{value:0},sheenColor:{value:new e(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new t},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new t},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new t},transmissionSamplerSize:{value:new n},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new t},attenuationDistance:{value:0},attenuationColor:{value:new e(0)},specularColor:{value:new e(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new t},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new t},anisotropyVector:{value:new n},anisotropyMap:{value:null},anisotropyMapTransform:{value:new t}}]),vertexShader:Dn.meshphysical_vert,fragmentShader:Dn.meshphysical_frag};const In={r:0,b:0,g:0},Nn=new _,On=new g;function Fn(t,n,r,i,_,g,v){const E=new e(0);let S,T,M=!0===g?0:1,x=null,R=0,A=null;function b(e){let t=!0===e.isScene?e.background:null;if(t&&t.isTexture){t=(e.backgroundBlurriness>0?r:n).get(t)}return t}function C(e,n){e.getRGB(In,h(t)),i.buffers.color.setClear(In.r,In.g,In.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(e){let n=!1;const r=b(e);null===r?C(E,M):r&&r.isColor&&(C(r,1),n=!0);const a=t.xr.getEnvironmentBlendMode();"additive"===a?i.buffers.color.setClear(0,0,0,1,v):"alpha-blend"===a&&i.buffers.color.setClear(0,0,0,0,v),(t.autoClear||n)&&(i.buffers.depth.setTest(!0),i.buffers.depth.setMask(!0),i.buffers.color.setMask(!0),t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil))},addToRenderList:function(e,n){const r=b(n);r&&(r.isCubeTexture||r.mapping===a)?(void 0===T&&(T=new o(new s(1,1,1),new l({name:"BackgroundCubeMaterial",uniforms:c(yn.backgroundCube.uniforms),vertexShader:yn.backgroundCube.vertexShader,fragmentShader:yn.backgroundCube.fragmentShader,side:d,depthTest:!1,depthWrite:!1,fog:!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}}),_.update(T)),Nn.copy(n.backgroundRotation),Nn.x*=-1,Nn.y*=-1,Nn.z*=-1,r.isCubeTexture&&!1===r.isRenderTargetTexture&&(Nn.y*=-1,Nn.z*=-1),T.material.uniforms.envMap.value=r,T.material.uniforms.flipEnvMap.value=r.isCubeTexture&&!1===r.isRenderTargetTexture?-1:1,T.material.uniforms.backgroundBlurriness.value=n.backgroundBlurriness,T.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,T.material.uniforms.backgroundRotation.value.setFromMatrix4(On.makeRotationFromEuler(Nn)),T.material.toneMapped=u.getTransfer(r.colorSpace)!==f,x===r&&R===r.version&&A===t.toneMapping||(T.material.needsUpdate=!0,x=r,R=r.version,A=t.toneMapping),T.layers.enableAll(),e.unshift(T,T.geometry,T.material,0,0,null)):r&&r.isTexture&&(void 0===S&&(S=new o(new p(2,2),new l({name:"BackgroundMaterial",uniforms:c(yn.background.uniforms),vertexShader:yn.background.vertexShader,fragmentShader:yn.background.fragmentShader,side:m,depthTest:!1,depthWrite:!1,fog:!1})),S.geometry.deleteAttribute("normal"),Object.defineProperty(S.material,"map",{get:function(){return this.uniforms.t2D.value}}),_.update(S)),S.material.uniforms.t2D.value=r,S.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,S.material.toneMapped=u.getTransfer(r.colorSpace)!==f,!0===r.matrixAutoUpdate&&r.updateMatrix(),S.material.uniforms.uvTransform.value.copy(r.matrix),x===r&&R===r.version&&A===t.toneMapping||(S.material.needsUpdate=!0,x=r,R=r.version,A=t.toneMapping),S.layers.enableAll(),e.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 Bn(e,t){const n=e.getParameter(e.MAX_VERTEX_ATTRIBS),r={},i=c(null);let a=i,o=!1;function s(t){return e.bindVertexArray(t)}function l(t){return e.deleteVertexArray(t)}function c(e){const t=[],r=[],i=[];for(let e=0;e=0){const n=i[t];let r=o[t];if(void 0===r&&("instanceMatrix"===t&&e.instanceMatrix&&(r=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(r=e.instanceColor)),void 0===n)return!0;if(n.attribute!==r)return!0;if(r&&n.data!==r.data)return!0;s++}}return a.attributesNum!==s||a.index!==r}(n,h,l,_),g&&function(e,t,n,r){const i={},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 r={};r.attribute=n,n&&n.data&&(r.data=n.data),i[t]=r,s++}}a.attributes=i,a.attributesNum=s,a.index=r}(n,h,l,_),null!==_&&t.update(_,e.ELEMENT_ARRAY_BUFFER),(g||o)&&(o=!1,function(n,r,i,a){d();const o=a.attributes,s=i.getAttributes(),l=r.defaultAttributeValues;for(const r in s){const i=s[r];if(i.location>=0){let s=o[r];if(void 0===s&&("instanceMatrix"===r&&n.instanceMatrix&&(s=n.instanceMatrix),"instanceColor"===r&&n.instanceColor&&(s=n.instanceColor)),void 0!==s){const r=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&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);const l=!0===n.logarithmicDepthBuffer,c=!0===n.reverseDepthBuffer&&t.has("EXT_clip_control"),d=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),u=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==i)return i;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");i=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else i=0;return i},getMaxPrecision:a,textureFormatReadable:function(t){return t===E||r.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const i=n===S&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==T&&r.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==M&&!i)},precision:o,logarithmicDepthBuffer:l,reverseDepthBuffer:c,maxTextures:d,maxVertexTextures:u,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),vertexTextures:u>0,maxSamples:e.getParameter(e.MAX_SAMPLES)}}function Vn(e){const n=this;let r=null,i=0,a=!1,o=!1;const s=new x,l=new t,c={value:null,needsUpdate:!1};function d(e,t,r,i){const a=null!==e?e.length:0;let o=null;if(0!==a){if(o=c.value,!0!==i||null===o){const n=r+4*a,i=t.matrixWorldInverse;l.getNormalMatrix(i),(null===o||o.length0);n.numPlanes=i,n.numIntersection=0}();else{const e=o?0:i,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]=r[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=C:t===A&&(e.mapping=L),e}function r(e){const n=e.target;n.removeEventListener("dispose",r);const i=t.get(n);void 0!==i&&(t.delete(n),i.dispose())}return{get:function(i){if(i&&i.isTexture){const a=i.mapping;if(a===R||a===A){if(t.has(i)){return n(t.get(i).texture,i.mapping)}{const a=i.image;if(a&&a.height>0){const o=new b(a.height);return o.fromEquirectangularTexture(e,i),t.set(i,o),i.addEventListener("dispose",r),n(o.texture,i.mapping)}return null}}}return i},dispose:function(){t=new WeakMap}}}const kn=[.125,.215,.35,.446,.526,.582],Wn=20,Xn=new O,Yn=new e;let Kn=null,jn=0,qn=0,Zn=!1;const $n=(1+Math.sqrt(5))/2,Qn=1/$n,Jn=[new i(-$n,Qn,0),new i($n,Qn,0),new i(-Qn,0,$n),new i(Qn,0,$n),new i(0,$n,-Qn),new i(0,$n,Qn),new i(-1,1,-1),new i(1,1,-1),new i(-1,1,1),new i(1,1,1)];class er{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(e,t=0,n=.1,r=100){Kn=this._renderer.getRenderTarget(),jn=this._renderer.getActiveCubeFace(),qn=this._renderer.getActiveMipmapLevel(),Zn=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(256);const i=this._allocateTargets();return i.depthBuffer=!0,this._sceneToCubeUV(e,n,r,i),t>0&&this._blur(i,0,0,t),this._applyPMREM(i),this._cleanup(i),i}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=ir(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=rr(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.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._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?s=kn[o-e+4-1]:0===o&&(s=0),r.push(s);const l=1/(a-2),c=-l,d=1+l,u=[c,c,d,c,d,d,c,c,d,d,c,d],f=6,p=6,m=3,h=2,_=1,g=new Float32Array(m*p*f),v=new Float32Array(h*p*f),E=new Float32Array(_*p*f);for(let e=0;e2?0:-1,r=[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];g.set(r,m*p*e),v.set(u,h*p*e);const i=[e,e,e,e,e,e];E.set(i,_*p*e)}const S=new w;S.setAttribute("position",new y(g,m)),S.setAttribute("uv",new y(v,h)),S.setAttribute("faceIndex",new y(E,_)),t.push(S),i>4&&i--}return{lodPlanes:t,sizeLods:n,sigmas:r}}(r)),this._blurMaterial=function(e,t,n){const r=new Float32Array(Wn),a=new i(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:Wn,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:r},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:a}},vertexShader:ar(),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:N,depthTest:!1,depthWrite:!1});return o}(r,e,t)}return r}_compileMaterial(e){const t=new o(this._lodPlanes[0],e);this._renderer.compile(t,Xn)}_sceneToCubeUV(e,t,n,r){const i=new P(90,1,t,n),a=[1,-1,1,1,1,1],l=[1,1,1,-1,-1,-1],c=this._renderer,u=c.autoClear,f=c.toneMapping;c.getClearColor(Yn),c.toneMapping=U,c.autoClear=!1;const p=new D({name:"PMREM.Background",side:d,depthWrite:!1,depthTest:!1}),m=new o(new s,p);let h=!1;const _=e.background;_?_.isColor&&(p.color.copy(_),e.background=null,h=!0):(p.color.copy(Yn),h=!0);for(let t=0;t<6;t++){const n=t%3;0===n?(i.up.set(0,a[t],0),i.lookAt(l[t],0,0)):1===n?(i.up.set(0,0,a[t]),i.lookAt(0,l[t],0)):(i.up.set(0,a[t],0),i.lookAt(0,0,l[t]));const o=this._cubeSize;nr(r,n*o,t>2?o:0,o,o),c.setRenderTarget(r),h&&c.render(m,i),c.render(e,i)}m.geometry.dispose(),m.material.dispose(),c.toneMapping=f,c.autoClear=u,e.background=_}_textureToCubeUV(e,t){const n=this._renderer,r=e.mapping===C||e.mapping===L;r?(null===this._cubemapMaterial&&(this._cubemapMaterial=ir()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=rr());const i=r?this._cubemapMaterial:this._equirectMaterial,a=new o(this._lodPlanes[0],i);i.uniforms.envMap.value=e;const s=this._cubeSize;nr(t,0,0,3*s,2*s),n.setRenderTarget(t),n.render(a,Xn)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const r=this._lodPlanes.length;for(let t=1;tWn&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${h} samples when the maximum is set to 20`);const _=[];let g=0;for(let e=0;ev-4?r-v+4:0),4*(this._cubeSize-E),3*E,2*E),l.setRenderTarget(t),l.render(d,Xn)}}function tr(e,t,n){const r=new I(e,t,n);return r.texture.mapping=a,r.texture.name="PMREM.cubeUv",r.scissorTest=!0,r}function nr(e,t,n,r,i){e.viewport.set(t,n,r,i),e.scissor.set(t,n,r,i)}function rr(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:ar(),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:N,depthTest:!1,depthWrite:!1})}function ir(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:ar(),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:N,depthTest:!1,depthWrite:!1})}function ar(){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 or(e){let t=new WeakMap,n=null;function r(e){const n=e.target;n.removeEventListener("dispose",r);const i=t.get(n);void 0!==i&&(t.delete(n),i.dispose())}return{get:function(i){if(i&&i.isTexture){const a=i.mapping,o=a===R||a===A,s=a===C||a===L;if(o||s){let a=t.get(i);const l=void 0!==a?a.texture.pmremVersion:0;if(i.isRenderTargetTexture&&i.pmremVersion!==l)return null===n&&(n=new er(e)),a=o?n.fromEquirectangular(i,a):n.fromCubemap(i,a),a.texture.pmremVersion=i.pmremVersion,t.set(i,a),a.texture;if(void 0!==a)return a.texture;{const l=i.image;return o&&l&&l.height>0||s&&l&&function(e){let t=0;const n=6;for(let r=0;rt.maxTextureSize&&(T=Math.ceil(S/t.maxTextureSize),S=t.maxTextureSize);const x=new Float32Array(S*T*4*u),R=new W(x,S,T,u);R.type=M,R.needsUpdate=!0;const A=4*E;for(let C=0;C0)return e;const i=t*n;let a=vr[i];if(void 0===a&&(a=new Float32Array(i),vr[i]=a),0!==t){r.toArray(a,0);for(let r=1,i=0;r!==t;++r)i+=n,e[r].toArray(a,i)}return a}function Rr(e,t){if(e.length!==t.length)return!1;for(let n=0,r=e.length;n":" "} ${i}: ${n[e]}`)}return r.join("\n")}(e.getShaderSource(t),r)}return i}function Mi(e,t){const n=function(e){u._getMatrix(Si,u.workingColorSpace,e);const t=`mat3( ${Si.elements.map((e=>e.toFixed(4)))} )`;switch(u.getTransfer(e)){case se:return[t,"LinearTransferOETF"];case f:return[t,"sRGBTransferOETF"];default:return console.warn("THREE.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")}function xi(e,t){let n;switch(t){case re:n="Linear";break;case ne:n="Reinhard";break;case te:n="Cineon";break;case ee:n="ACESFilmic";break;case J:n="AgX";break;case Q:n="Neutral";break;case $:n="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",t),n="Linear"}return"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const Ri=new i;function Ai(){u.getLuminanceCoefficients(Ri);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${Ri.x.toFixed(4)}, ${Ri.y.toFixed(4)}, ${Ri.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function bi(e){return""!==e}function Ci(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 Li(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Pi=/^[ \t]*#include +<([\w\d./]+)>/gm;function Ui(e){return e.replace(Pi,wi)}const Di=new Map;function wi(e,t){let n=Dn[t];if(void 0===n){const e=Di.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=Dn[e],console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Ui(n)}const yi=/#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 Ii(e){return e.replace(yi,Ni)}function Ni(e,t,n,r){let i="";for(let e=parseInt(t);e0&&(g+="\n"),v=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h].filter(bi).join("\n"),v.length>0&&(v+="\n")):(g=[Oi(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,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 "+u:"",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 "+c:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","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(bi).join("\n"),v=[Oi(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,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 "+d:"",n.envMap?"#define "+u:"",n.envMap?"#define "+f:"",p?"#define CUBEUV_TEXEL_WIDTH "+p.texelWidth:"",p?"#define CUBEUV_TEXEL_HEIGHT "+p.texelHeight:"",p?"#define CUBEUV_MAX_MIP "+p.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 "+c:"",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_LOGDEPTHBUF":"",n.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==U?"#define TONE_MAPPING":"",n.toneMapping!==U?Dn.tonemapping_pars_fragment:"",n.toneMapping!==U?xi("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",Dn.colorspace_pars_fragment,Mi("linearToOutputTexel",n.outputColorSpace),Ai(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(bi).join("\n")),s=Ui(s),s=Ci(s,n),s=Li(s,n),l=Ui(l),l=Ci(l,n),l=Li(l,n),s=Ii(s),l=Ii(l),!0!==n.isRawShaderMaterial&&(E="#version 300 es\n",g=[m,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+g,v=["#define varying in",n.glslVersion===Z?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===Z?"":"#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"+v);const S=E+g+s,T=E+v+l,M=vi(i,i.VERTEX_SHADER,S),x=vi(i,i.FRAGMENT_SHADER,T);function R(t){if(e.debug.checkShaderErrors){const n=i.getProgramInfoLog(_).trim(),r=i.getShaderInfoLog(M).trim(),a=i.getShaderInfoLog(x).trim();let o=!0,s=!0;if(!1===i.getProgramParameter(_,i.LINK_STATUS))if(o=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(i,_,M,x);else{const e=Ti(i,M,"vertex"),r=Ti(i,x,"fragment");console.error("THREE.WebGLProgram: Shader Error "+i.getError()+" - VALIDATE_STATUS "+i.getProgramParameter(_,i.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+n+"\n"+e+"\n"+r)}else""!==n?console.warn("THREE.WebGLProgram: Program Info Log:",n):""!==r&&""!==a||(s=!1);s&&(t.diagnostics={runnable:o,programLog:n,vertexShader:{log:r,prefix:g},fragmentShader:{log:a,prefix:v}})}i.deleteShader(M),i.deleteShader(x),A=new gi(i,_),b=function(e,t){const n={},r=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let i=0;i0,J=o.clearcoat>0,ee=o.dispersion>0,te=o.iridescence>0,ne=o.sheen>0,re=o.transmission>0,ie=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,he=ne&&!!o.sheenRoughnessMap,_e=!!o.specularMap,ge=!!o.specularColorMap,ve=!!o.specularIntensityMap,Ee=re&&!!o.transmissionMap,Se=re&&!!o.thicknessMap,Te=!!o.gradientMap,Me=!!o.alphaMap,xe=o.alphaTest>0,Re=!!o.alphaHash,Ae=!!o.extensions;let be=U;o.toneMapped&&(null!==O&&!0!==O.isXRRenderTarget||(be=e.toneMapping));const Ce={shaderID:C,shaderType:o.type,shaderName:o.name,vertexShader:D,fragmentShader:w,defines:o.defines,customVertexShaderID:y,customFragmentShaderID:I,isRawShaderMaterial:!0===o.isRawShaderMaterial,glslVersion:o.glslVersion,precision:g,batching:G,batchingColor:G&&null!==T._colorsTexture,instancing:H,instancingColor:H&&null!==T.instanceColor,instancingMorph:H&&null!==T.morphTexture,supportsVertexTextures:_,outputColorSpace:null===O?e.outputColorSpace:!0===O.isXRRenderTarget?O.texture.colorSpace:B,alphaToCoverage:!!o.alphaToCoverage,map:V,matcap:z,envMap:k,envMapMode:k&&A.mapping,envMapCubeUVHeight:b,aoMap:W,lightMap:X,bumpMap:Y,normalMap:K,displacementMap:_&&j,emissiveMap:q,normalMapObjectSpace:K&&o.normalMapType===ue,normalMapTangentSpace:K&&o.normalMapType===fe,metalnessMap:Z,roughnessMap:$,anisotropy:Q,anisotropyMap:ie,clearcoat:J,clearcoatMap:ae,clearcoatNormalMap:oe,clearcoatRoughnessMap:se,dispersion:ee,iridescence:te,iridescenceMap:le,iridescenceThicknessMap:ce,sheen:ne,sheenColorMap:de,sheenRoughnessMap:he,specularMap:_e,specularColorMap:ge,specularIntensityMap:ve,transmission:re,transmissionMap:Ee,thicknessMap:Se,gradientMap:Te,opaque:!1===o.transparent&&o.blending===pe&&!1===o.alphaToCoverage,alphaMap:Me,alphaTest:xe,alphaHash:Re,combine:o.combine,mapUv:V&&E(o.map.channel),aoMapUv:W&&E(o.aoMap.channel),lightMapUv:X&&E(o.lightMap.channel),bumpMapUv:Y&&E(o.bumpMap.channel),normalMapUv:K&&E(o.normalMap.channel),displacementMapUv:j&&E(o.displacementMap.channel),emissiveMapUv:q&&E(o.emissiveMap.channel),metalnessMapUv:Z&&E(o.metalnessMap.channel),roughnessMapUv:$&&E(o.roughnessMap.channel),anisotropyMapUv:ie&&E(o.anisotropyMap.channel),clearcoatMapUv:ae&&E(o.clearcoatMap.channel),clearcoatNormalMapUv:oe&&E(o.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:se&&E(o.clearcoatRoughnessMap.channel),iridescenceMapUv:le&&E(o.iridescenceMap.channel),iridescenceThicknessMapUv:ce&&E(o.iridescenceThicknessMap.channel),sheenColorMapUv:de&&E(o.sheenColorMap.channel),sheenRoughnessMapUv:he&&E(o.sheenRoughnessMap.channel),specularMapUv:_e&&E(o.specularMap.channel),specularColorMapUv:ge&&E(o.specularColorMap.channel),specularIntensityMapUv:ve&&E(o.specularIntensityMap.channel),transmissionMapUv:Ee&&E(o.transmissionMap.channel),thicknessMapUv:Se&&E(o.thicknessMap.channel),alphaMapUv:Me&&E(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,sizeAttenuation:!0===o.sizeAttenuation,logarithmicDepthBuffer:h,reverseDepthBuffer:F,skinning:!0===T.isSkinnedMesh,morphTargets:void 0!==x.morphAttributes.position,morphNormals:void 0!==x.morphAttributes.normal,morphColors:void 0!==x.morphAttributes.color,morphTargetsCount:P,morphTextureStride:N,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&&m.length>0,shadowMapType:e.shadowMap.type,toneMapping:be,decodeVideoTexture:V&&!0===o.map.isVideoTexture&&u.getTransfer(o.map.colorSpace)===f,decodeVideoTextureEmissive:q&&!0===o.emissiveMap.isVideoTexture&&u.getTransfer(o.emissiveMap.colorSpace)===f,premultipliedAlpha:o.premultipliedAlpha,doubleSided:o.side===me,flipSided:o.side===d,useDepthPacking:o.depthPacking>=0,depthPacking:o.depthPacking||0,index0AttributeName:o.index0AttributeName,extensionClipCullDistance:Ae&&!0===o.extensions.clipCullDistance&&r.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Ae&&!0===o.extensions.multiDraw||G)&&r.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:r.has("KHR_parallel_shader_compile"),customProgramCacheKey:o.customProgramCacheKey()};return Ce.vertexUv1s=p.has(1),Ce.vertexUv2s=p.has(2),Ce.vertexUv3s=p.has(3),p.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.supportsVertexTextures&&l.enable(0);t.instancing&&l.enable(1);t.instancingColor&&l.enable(2);t.instancingMorph&&l.enable(3);t.matcap&&l.enable(4);t.envMap&&l.enable(5);t.normalMapObjectSpace&&l.enable(6);t.normalMapTangentSpace&&l.enable(7);t.clearcoat&&l.enable(8);t.iridescence&&l.enable(9);t.alphaTest&&l.enable(10);t.vertexColors&&l.enable(11);t.vertexAlphas&&l.enable(12);t.vertexUv1s&&l.enable(13);t.vertexUv2s&&l.enable(14);t.vertexUv3s&&l.enable(15);t.vertexTangents&&l.enable(16);t.anisotropy&&l.enable(17);t.alphaHash&&l.enable(18);t.batching&&l.enable(19);t.dispersion&&l.enable(20);t.batchingColor&&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.reverseDepthBuffer&&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=yn[t];n=he.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let r;for(let e=0,t=m.length;e0?r.push(d):!0===o.transparent?i.push(d):n.push(d)},unshift:function(e,t,o,s,l,c){const d=a(e,t,o,s,l,c);o.transmission>0?r.unshift(d):!0===o.transparent?i.unshift(d):n.unshift(d)},finish:function(){for(let n=t,r=e.length;n1&&n.sort(e||ki),r.length>1&&r.sort(t||Wi),i.length>1&&i.sort(t||Wi)}}}function Yi(){let e=new WeakMap;return{get:function(t,n){const r=e.get(t);let i;return void 0===r?(i=new Xi,e.set(t,[i])):n>=r.length?(i=new Xi,r.push(i)):i=r[n],i},dispose:function(){e=new WeakMap}}}function Ki(){const t={};return{get:function(n){if(void 0!==t[n.id])return t[n.id];let r;switch(n.type){case"DirectionalLight":r={direction:new i,color:new e};break;case"SpotLight":r={position:new i,direction:new i,color:new e,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":r={position:new i,color:new e,distance:0,decay:0};break;case"HemisphereLight":r={direction:new i,skyColor:new e,groundColor:new e};break;case"RectAreaLight":r={color:new e,position:new i,halfWidth:new i,halfHeight:new i}}return t[n.id]=r,r}}}let ji=0;function qi(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function Zi(e){const t=new Ki,r=function(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let r;switch(t.type){case"DirectionalLight":case"SpotLight":r={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new n};break;case"PointLight":r={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new n,shadowCameraNear:1,shadowCameraFar:1e3}}return e[t.id]=r,r}}}(),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 i);const o=new i,s=new g,l=new g;return{setup:function(n){let i=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;n.sort(qi);for(let e=0,E=n.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=wn.LTC_FLOAT_1,a.rectAreaLTC2=wn.LTC_FLOAT_2):(a.rectAreaLTC1=wn.LTC_HALF_1,a.rectAreaLTC2=wn.LTC_HALF_2)),a.ambient[0]=i,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=ji++)},setupView:function(e,t){let n=0,r=0,i=0,c=0,d=0;const u=t.matrixWorldInverse;for(let t=0,f=e.length;t=i.length?(a=new $i(e),i.push(a)):a=i[r],a},dispose:function(){t=new WeakMap}}}function Ji(e,t,r){let i=new ge;const a=new n,s=new n,c=new k,u=new ve({depthPacking:Ee}),f=new Se,p={},h=r.maxTextureSize,_={[m]:d,[d]:m,[me]:me},g=new l({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new n},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;\n#include \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 = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\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 = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\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( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),v=g.clone();v.defines.HORIZONTAL_PASS=1;const E=new w;E.setAttribute("position",new y(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const S=new o(E,g),T=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=ie;let M=this.type;function x(n,r){const i=t.update(S);g.defines.VSM_SAMPLES!==n.blurSamples&&(g.defines.VSM_SAMPLES=n.blurSamples,v.defines.VSM_SAMPLES=n.blurSamples,g.needsUpdate=!0,v.needsUpdate=!0),null===n.mapPass&&(n.mapPass=new I(a.x,a.y)),g.uniforms.shadow_pass.value=n.map.texture,g.uniforms.resolution.value=n.mapSize,g.uniforms.radius.value=n.radius,e.setRenderTarget(n.mapPass),e.clear(),e.renderBufferDirect(r,null,i,g,S,null),v.uniforms.shadow_pass.value=n.mapPass.texture,v.uniforms.resolution.value=n.mapSize,v.uniforms.radius.value=n.radius,e.setRenderTarget(n.map),e.clear(),e.renderBufferDirect(r,null,i,v,S,null)}function R(t,n,r,i){let a=null;const o=!0===r.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)a=o;else if(a=!0===r.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){const e=a.uuid,t=n.uuid;let r=p[e];void 0===r&&(r={},p[e]=r);let i=r[t];void 0===i&&(i=a.clone(),r[t]=i,n.addEventListener("dispose",b)),a=i}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=i===oe?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:_[n.side],a.alphaMap=n.alphaMap,a.alphaTest=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===r.isPointLight&&!0===a.isMeshDistanceMaterial){e.properties.get(a).light=r}return a}function A(n,r,a,o,s){if(!1===n.visible)return;if(n.layers.test(r.layers)&&(n.isMesh||n.isLine||n.isPoints)&&(n.castShadow||n.receiveShadow&&s===oe)&&(!n.frustumCulled||i.intersectsObject(n))){n.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,n.matrixWorld);const i=t.update(n),l=n.material;if(Array.isArray(l)){const t=i.groups;for(let c=0,d=t.length;ch||a.y>h)&&(a.x>h&&(s.x=Math.floor(h/m.x),a.x=s.x*m.x,d.mapSize.x=s.x),a.y>h&&(s.y=Math.floor(h/m.y),a.y=s.y*m.y,d.mapSize.y=s.y)),null===d.map||!0===f||!0===p){const e=this.type!==oe?{minFilter:Te,magFilter:Te}:{};null!==d.map&&d.map.dispose(),d.map=new I(a.x,a.y,e),d.map.texture.name=l.name+".shadowMap",d.camera.updateProjectionMatrix()}e.setRenderTarget(d.map),e.clear();const _=d.getViewportCount();for(let e=0;e<_;e++){const t=d.getViewport(e);c.set(s.x*t.x,s.y*t.y,s.x*t.z,s.y*t.w),u.viewport(c),d.updateMatrices(l,e),i=d.getFrustum(),A(n,r,d.camera,l,this.type)}!0!==d.isPointLightShadow&&this.type===oe&&x(d,r),d.needsUpdate=!1}M=this.type,T.needsUpdate=!1,e.setRenderTarget(o,l,d)}}const ea={[et]:Je,[Qe]:qe,[$e]:je,[Me]:Ze,[Je]:et,[qe]:Qe,[je]:$e,[Ze]:Me};function ta(t,n){const r=new function(){let e=!1;const n=new k;let r=null;const i=new k(0,0,0,0);return{setMask:function(n){r===n||e||(t.colorMask(n,n,n,n),r=n)},setLocked:function(t){e=t},setClear:function(e,r,a,o,s){!0===s&&(e*=o,r*=o,a*=o),n.set(e,r,a,o),!1===i.equals(n)&&(t.clearColor(e,r,a,o),i.copy(n))},reset:function(){e=!1,r=null,i.set(-1,0,0,0)}}},i=new function(){let e=!1,r=!1,i=null,a=null,o=null;return{setReversed:function(e){if(r!==e){const e=n.get("EXT_clip_control");r?e.clipControlEXT(e.LOWER_LEFT_EXT,e.ZERO_TO_ONE_EXT):e.clipControlEXT(e.LOWER_LEFT_EXT,e.NEGATIVE_ONE_TO_ONE_EXT);const t=o;o=null,this.setClear(t)}r=e},getReversed:function(){return r},setTest:function(e){e?W(t.DEPTH_TEST):X(t.DEPTH_TEST)},setMask:function(n){i===n||e||(t.depthMask(n),i=n)},setFunc:function(e){if(r&&(e=ea[e]),a!==e){switch(e){case et:t.depthFunc(t.NEVER);break;case Je:t.depthFunc(t.ALWAYS);break;case Qe:t.depthFunc(t.LESS);break;case Me:t.depthFunc(t.LEQUAL);break;case $e:t.depthFunc(t.EQUAL);break;case Ze:t.depthFunc(t.GEQUAL);break;case qe:t.depthFunc(t.GREATER);break;case je:t.depthFunc(t.NOTEQUAL);break;default:t.depthFunc(t.LEQUAL)}a=e}},setLocked:function(t){e=t},setClear:function(e){o!==e&&(r&&(e=1-e),t.clearDepth(e),o=e)},reset:function(){e=!1,i=null,a=null,o=null,r=!1}}},a=new function(){let e=!1,n=null,r=null,i=null,a=null,o=null,s=null,l=null,c=null;return{setTest:function(n){e||(n?W(t.STENCIL_TEST):X(t.STENCIL_TEST))},setMask:function(r){n===r||e||(t.stencilMask(r),n=r)},setFunc:function(e,n,o){r===e&&i===n&&a===o||(t.stencilFunc(e,n,o),r=e,i=n,a=o)},setOp:function(e,n,r){o===e&&s===n&&l===r||(t.stencilOp(e,n,r),o=e,s=n,l=r)},setLocked:function(t){e=t},setClear:function(e){c!==e&&(t.clearStencil(e),c=e)},reset:function(){e=!1,n=null,r=null,i=null,a=null,o=null,s=null,l=null,c=null}}},o=new WeakMap,s=new WeakMap;let l={},c={},u=new WeakMap,f=[],p=null,m=!1,h=null,_=null,g=null,v=null,E=null,S=null,T=null,M=new e(0,0,0),x=0,R=!1,A=null,b=null,C=null,L=null,P=null;const U=t.getParameter(t.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let D=!1,w=0;const y=t.getParameter(t.VERSION);-1!==y.indexOf("WebGL")?(w=parseFloat(/^WebGL (\d)/.exec(y)[1]),D=w>=1):-1!==y.indexOf("OpenGL ES")&&(w=parseFloat(/^OpenGL ES (\d)/.exec(y)[1]),D=w>=2);let I=null,O={};const F=t.getParameter(t.SCISSOR_BOX),B=t.getParameter(t.VIEWPORT),H=(new k).fromArray(F),G=(new k).fromArray(B);function V(e,n,r,i){const a=new Uint8Array(4),o=t.createTexture();t.bindTexture(e,o),t.texParameteri(e,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(e,t.TEXTURE_MAG_FILTER,t.NEAREST);for(let o=0;on||i.height>n)&&(r=n/Math.max(i.width,i.height)),r<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(r*i.width),a=Math.floor(r*i.height);void 0===m&&(m=g(n,a));const o=t?g(n,a):m;o.width=n,o.height=a;return o.getContext("2d").drawImage(e,0,0,n,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+i.width+"x"+i.height+") to ("+n+"x"+a+")."),o}return"data"in e&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+i.width+"x"+i.height+")."),e}return e}function S(e){return e.generateMipmaps}function x(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 A(n,r,i,a,o=!1){if(null!==n){if(void 0!==e[n])return e[n];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+n+"'")}let s=r;if(r===e.RED&&(i===e.FLOAT&&(s=e.R32F),i===e.HALF_FLOAT&&(s=e.R16F),i===e.UNSIGNED_BYTE&&(s=e.R8)),r===e.RED_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.R8UI),i===e.UNSIGNED_SHORT&&(s=e.R16UI),i===e.UNSIGNED_INT&&(s=e.R32UI),i===e.BYTE&&(s=e.R8I),i===e.SHORT&&(s=e.R16I),i===e.INT&&(s=e.R32I)),r===e.RG&&(i===e.FLOAT&&(s=e.RG32F),i===e.HALF_FLOAT&&(s=e.RG16F),i===e.UNSIGNED_BYTE&&(s=e.RG8)),r===e.RG_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.RG8UI),i===e.UNSIGNED_SHORT&&(s=e.RG16UI),i===e.UNSIGNED_INT&&(s=e.RG32UI),i===e.BYTE&&(s=e.RG8I),i===e.SHORT&&(s=e.RG16I),i===e.INT&&(s=e.RG32I)),r===e.RGB_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.RGB8UI),i===e.UNSIGNED_SHORT&&(s=e.RGB16UI),i===e.UNSIGNED_INT&&(s=e.RGB32UI),i===e.BYTE&&(s=e.RGB8I),i===e.SHORT&&(s=e.RGB16I),i===e.INT&&(s=e.RGB32I)),r===e.RGBA_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.RGBA8UI),i===e.UNSIGNED_SHORT&&(s=e.RGBA16UI),i===e.UNSIGNED_INT&&(s=e.RGBA32UI),i===e.BYTE&&(s=e.RGBA8I),i===e.SHORT&&(s=e.RGBA16I),i===e.INT&&(s=e.RGBA32I)),r===e.RGB&&i===e.UNSIGNED_INT_5_9_9_9_REV&&(s=e.RGB9_E5),r===e.RGBA){const t=o?se:u.getTransfer(a);i===e.FLOAT&&(s=e.RGBA32F),i===e.HALF_FLOAT&&(s=e.RGBA16F),i===e.UNSIGNED_BYTE&&(s=t===f?e.SRGB8_ALPHA8:e.RGBA8),i===e.UNSIGNED_SHORT_4_4_4_4&&(s=e.RGBA4),i===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||t.get("EXT_color_buffer_float"),s}function b(t,n){let r;return t?null===n||n===St||n===Tt?r=e.DEPTH24_STENCIL8:n===M?r=e.DEPTH32F_STENCIL8:n===Mt&&(r=e.DEPTH24_STENCIL8,console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===St||n===Tt?r=e.DEPTH_COMPONENT24:n===M?r=e.DEPTH_COMPONENT32F:n===Mt&&(r=e.DEPTH_COMPONENT16),r}function C(e,t){return!0===S(e)||e.isFramebufferTexture&&e.minFilter!==Te&&e.minFilter!==F?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=i.get(e);if(void 0===t.__webglInit)return;const n=e.source,r=h.get(n);if(r){const i=r[t.__cacheKey];i.usedTimes--,0===i.usedTimes&&U(e),0===Object.keys(r).length&&h.delete(n)}i.remove(e)}(t),t.isVideoTexture&&p.delete(t)}function P(t){const n=t.target;n.removeEventListener("dispose",P),function(t){const n=i.get(t);t.depthTexture&&(t.depthTexture.dispose(),i.remove(t.depthTexture));if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(n.__webglFramebuffer[t]))for(let r=0;r0&&a.__version!==t.version){const e=t.image;if(null===e)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==e.complete)return void G(a,t,n);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}r.bindTexture(e.TEXTURE_2D,a.__webglTexture,e.TEXTURE0+n)}const y={[rt]:e.REPEAT,[it]:e.CLAMP_TO_EDGE,[at]:e.MIRRORED_REPEAT},I={[Te]:e.NEAREST,[ot]:e.NEAREST_MIPMAP_NEAREST,[st]:e.NEAREST_MIPMAP_LINEAR,[F]:e.LINEAR,[lt]:e.LINEAR_MIPMAP_NEAREST,[ct]:e.LINEAR_MIPMAP_LINEAR},N={[dt]:e.NEVER,[ut]:e.ALWAYS,[ft]:e.LESS,[X]:e.LEQUAL,[pt]:e.EQUAL,[mt]:e.GEQUAL,[ht]:e.GREATER,[_t]:e.NOTEQUAL};function O(n,r){if(r.type!==M||!1!==t.has("OES_texture_float_linear")||r.magFilter!==F&&r.magFilter!==lt&&r.magFilter!==st&&r.magFilter!==ct&&r.minFilter!==F&&r.minFilter!==lt&&r.minFilter!==st&&r.minFilter!==ct||console.warn("THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),e.texParameteri(n,e.TEXTURE_WRAP_S,y[r.wrapS]),e.texParameteri(n,e.TEXTURE_WRAP_T,y[r.wrapT]),n!==e.TEXTURE_3D&&n!==e.TEXTURE_2D_ARRAY||e.texParameteri(n,e.TEXTURE_WRAP_R,y[r.wrapR]),e.texParameteri(n,e.TEXTURE_MAG_FILTER,I[r.magFilter]),e.texParameteri(n,e.TEXTURE_MIN_FILTER,I[r.minFilter]),r.compareFunction&&(e.texParameteri(n,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(n,e.TEXTURE_COMPARE_FUNC,N[r.compareFunction])),!0===t.has("EXT_texture_filter_anisotropic")){if(r.magFilter===Te)return;if(r.minFilter!==st&&r.minFilter!==ct)return;if(r.type===M&&!1===t.has("OES_texture_float_linear"))return;if(r.anisotropy>1||i.get(r).__currentAnisotropy){const o=t.get("EXT_texture_filter_anisotropic");e.texParameterf(n,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(r.anisotropy,a.getMaxAnisotropy())),i.get(r).__currentAnisotropy=r.anisotropy}}}function H(t,n){let r=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",L));const i=n.source;let a=h.get(i);void 0===a&&(a={},h.set(i,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++,r=!0),a[o].usedTimes++;const i=a[t.__cacheKey];void 0!==i&&(a[t.__cacheKey].usedTimes--,0===i.usedTimes&&U(n)),t.__cacheKey=o,t.__webglTexture=a[o].texture}return r}function G(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=H(t,n),d=n.source;r.bindTexture(l,t.__webglTexture,e.TEXTURE0+s);const f=i.get(d);if(d.version!==f.__version||!0===c){r.activeTexture(e.TEXTURE0+s);const t=u.getPrimaries(u.workingColorSpace),i=n.colorSpace===gt?null:u.getPrimaries(n.colorSpace),p=n.colorSpace===gt||t===i?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,p);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=A(n.internalFormat,h,_,n.colorSpace,n.isVideoTexture);O(l,n);const M=n.mipmaps,R=!0!==n.isVideoTexture,L=void 0===f.__version||!0===c,P=d.dataReady,U=C(n,m);if(n.isDepthTexture)T=b(n.format===vt,n.type),L&&(R?r.texStorage2D(e.TEXTURE_2D,1,T,m.width,m.height):r.texImage2D(e.TEXTURE_2D,0,T,m.width,m.height,0,h,_,null));else if(n.isDataTexture)if(M.length>0){R&&L&&r.texStorage2D(e.TEXTURE_2D,U,T,M[0].width,M[0].height);for(let t=0,n=M.length;t0){const i=Et(g.width,g.height,n.format,n.type);for(const a of n.layerUpdates){const n=g.data.subarray(a*i/g.data.BYTES_PER_ELEMENT,(a+1)*i/g.data.BYTES_PER_ELEMENT);r.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,a,g.width,g.height,1,h,n)}n.clearLayerUpdates()}else r.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,g.data)}else r.compressedTexImage3D(e.TEXTURE_2D_ARRAY,t,T,g.width,g.height,m.depth,0,g.data,0,0);else console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else R?P&&r.texSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,_,g.data):r.texImage3D(e.TEXTURE_2D_ARRAY,t,T,g.width,g.height,m.depth,0,h,_,g.data)}else{R&&L&&r.texStorage2D(e.TEXTURE_2D,U,T,M[0].width,M[0].height);for(let t=0,i=M.length;t0){const t=Et(m.width,m.height,n.format,n.type);for(const i of n.layerUpdates){const n=m.data.subarray(i*t/m.data.BYTES_PER_ELEMENT,(i+1)*t/m.data.BYTES_PER_ELEMENT);r.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,i,m.width,m.height,1,h,_,n)}n.clearLayerUpdates()}else r.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)}else r.texImage3D(e.TEXTURE_2D_ARRAY,0,T,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isData3DTexture)R?(L&&r.texStorage3D(e.TEXTURE_3D,U,T,m.width,m.height,m.depth),P&&r.texSubImage3D(e.TEXTURE_3D,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)):r.texImage3D(e.TEXTURE_3D,0,T,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isFramebufferTexture){if(L)if(R)r.texStorage2D(e.TEXTURE_2D,U,T,m.width,m.height);else{let t=m.width,n=m.height;for(let i=0;i>=1,n>>=1}}else if(M.length>0){if(R&&L){const t=Z(M[0]);r.texStorage2D(e.TEXTURE_2D,U,T,t.width,t.height)}for(let t=0,n=M.length;t>d),i=Math.max(1,n.height>>d);c===e.TEXTURE_3D||c===e.TEXTURE_2D_ARRAY?r.texImage3D(c,d,p,t,i,n.depth,0,u,f,null):r.texImage2D(c,d,p,t,i,0,u,f,null)}r.bindFramebuffer(e.FRAMEBUFFER,t),j(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,K(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),r.bindFramebuffer(e.FRAMEBUFFER,null)}function z(t,n,r){if(e.bindRenderbuffer(e.RENDERBUFFER,t),n.depthBuffer){const i=n.depthTexture,a=i&&i.isDepthTexture?i.type:null,o=b(n.stencilBuffer,a),s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,c=K(n);j(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,c,o,n.width,n.height):r?e.renderbufferStorageMultisample(e.RENDERBUFFER,c,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 i=0;i{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)throw new Error("target.depthTexture not supported in Cube render targets");!function(t,n){if(n&&n.isWebGLCubeRenderTarget)throw new Error("Depth Texture with cube render targets is not supported");if(r.bindFramebuffer(e.FRAMEBUFFER,t),!n.depthTexture||!n.depthTexture.isDepthTexture)throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");const a=i.get(n.depthTexture);a.__renderTarget=n,a.__webglTexture&&n.depthTexture.image.width===n.width&&n.depthTexture.image.height===n.height||(n.depthTexture.image.width=n.width,n.depthTexture.image.height=n.height,n.depthTexture.needsUpdate=!0),w(n.depthTexture,0);const o=a.__webglTexture,s=K(n);if(n.depthTexture.format===xt)j(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,o,0,s):e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,o,0);else{if(n.depthTexture.format!==vt)throw new Error("Unknown depthTexture format");j(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.TEXTURE_2D,o,0,s):e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.TEXTURE_2D,o,0)}}(n.__webglFramebuffer,t)}else if(a){n.__webglDepthbuffer=[];for(let i=0;i<6;i++)if(r.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[i]),void 0===n.__webglDepthbuffer[i])n.__webglDepthbuffer[i]=e.createRenderbuffer(),z(n.__webglDepthbuffer[i],t,!1);else{const r=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,a=n.__webglDepthbuffer[i];e.bindRenderbuffer(e.RENDERBUFFER,a),e.framebufferRenderbuffer(e.FRAMEBUFFER,r,e.RENDERBUFFER,a)}}else if(r.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer),void 0===n.__webglDepthbuffer)n.__webglDepthbuffer=e.createRenderbuffer(),z(n.__webglDepthbuffer,t,!1);else{const r=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,i=n.__webglDepthbuffer;e.bindRenderbuffer(e.RENDERBUFFER,i),e.framebufferRenderbuffer(e.FRAMEBUFFER,r,e.RENDERBUFFER,i)}r.bindFramebuffer(e.FRAMEBUFFER,null)}const W=[],Y=[];function K(e){return Math.min(a.maxSamples,e.samples)}function j(e){const n=i.get(e);return e.samples>0&&!0===t.has("WEBGL_multisampled_render_to_texture")&&!1!==n.__useRenderToTexture}function q(e,t){const n=e.colorSpace,r=e.format,i=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==B&&n!==gt&&(u.getTransfer(n)===f?r===E&&i===T||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",n)),t}function Z(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=D;return e>=a.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+a.maxTextures),D+=1,e},this.resetTextureUnits=function(){D=0},this.setTexture2D=w,this.setTexture2DArray=function(t,n){const a=i.get(t);t.version>0&&a.__version!==t.version?G(a,t,n):r.bindTexture(e.TEXTURE_2D_ARRAY,a.__webglTexture,e.TEXTURE0+n)},this.setTexture3D=function(t,n){const a=i.get(t);t.version>0&&a.__version!==t.version?G(a,t,n):r.bindTexture(e.TEXTURE_3D,a.__webglTexture,e.TEXTURE0+n)},this.setTextureCube=function(t,n){const s=i.get(t);t.version>0&&s.__version!==t.version?function(t,n,s){if(6!==n.image.length)return;const l=H(t,n),c=n.source;r.bindTexture(e.TEXTURE_CUBE_MAP,t.__webglTexture,e.TEXTURE0+s);const d=i.get(c);if(c.version!==d.__version||!0===l){r.activeTexture(e.TEXTURE0+s);const t=u.getPrimaries(u.workingColorSpace),i=n.colorSpace===gt?null:u.getPrimaries(n.colorSpace),f=n.colorSpace===gt||t===i?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);const p=n.isCompressedTexture||n.image[0].isCompressedTexture,m=n.image[0]&&n.image[0].isDataTexture,h=[];for(let e=0;e<6;e++)h[e]=p||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=A(n.internalFormat,g,T,n.colorSpace),R=!0!==n.isVideoTexture,b=void 0===d.__version||!0===l,L=c.dataReady;let P,U=C(n,_);if(O(e.TEXTURE_CUBE_MAP,n),p){R&&b&&r.texStorage2D(e.TEXTURE_CUBE_MAP,U,M,_.width,_.height);for(let t=0;t<6;t++){P=h[t].mipmaps;for(let i=0;i0&&U++;const t=Z(h[0]);r.texStorage2D(e.TEXTURE_CUBE_MAP,U,M,t.width,t.height)}for(let t=0;t<6;t++)if(m){R?L&&r.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,h[t].width,h[t].height,g,T,h[t].data):r.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 r=0;r0){a.__webglFramebuffer=[];for(let t=0;t0&&!1===j(t)){a.__webglMultisampledFramebuffer=e.createFramebuffer(),a.__webglColorRenderbuffer=[],r.bindFramebuffer(e.FRAMEBUFFER,a.__webglMultisampledFramebuffer);for(let n=0;n0)for(let i=0;i0)for(let r=0;r0)if(!1===j(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=i.get(t),u=n.length>1;if(u)for(let t=0;t= 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 p(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class aa extends vn{constructor(e,t){super();const r=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 _=new ia,g=t.getContextAttributes();let v=null,S=null;const M=[],x=[],R=new n;let A=null;const b=new P;b.viewport=new k;const C=new P;C.viewport=new k;const L=[b,C],U=new En;let D=null,w=null;function y(e){const t=x.indexOf(e.inputSource);if(-1===t)return;const n=M[t];void 0!==n&&(n.update(e.inputSource,e.frame,d||s),n.dispatchEvent({type:e.type,data:e.inputSource}))}function N(){a.removeEventListener("select",y),a.removeEventListener("selectstart",y),a.removeEventListener("selectend",y),a.removeEventListener("squeeze",y),a.removeEventListener("squeezestart",y),a.removeEventListener("squeezeend",y),a.removeEventListener("end",N),a.removeEventListener("inputsourceschange",O);for(let e=0;e=0&&(x[r]=null,M[r].disconnect(n))}for(let t=0;t=x.length){x.push(n),r=e;break}if(null===x[e]){x[e]=n,r=e;break}}if(-1===r)break}const i=M[r];i&&i.connect(n)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(e){let t=M[e];return void 0===t&&(t=new Sn,M[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=M[e];return void 0===t&&(t=new Sn,M[e]=t),t.getGripSpace()},this.getHand=function(e){let t=M[e];return void 0===t&&(t=new Sn,M[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){o=e,!0===r.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){l=e,!0===r.isPresenting&&console.warn("THREE.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 f},this.getFrame=function(){return h},this.getSession=function(){return a},this.setSession=async function(n){if(a=n,null!==a){v=e.getRenderTarget(),a.addEventListener("select",y),a.addEventListener("selectstart",y),a.addEventListener("selectend",y),a.addEventListener("squeeze",y),a.addEventListener("squeezestart",y),a.addEventListener("squeezeend",y),a.addEventListener("end",N),a.addEventListener("inputsourceschange",O),!0!==g.xrCompatible&&await t.makeXRCompatible(),A=e.getPixelRatio(),e.getSize(R);if("undefined"!=typeof XRWebGLBinding&&"createProjectionLayer"in XRWebGLBinding.prototype){let n=null,r=null,i=null;g.depth&&(i=g.stencil?t.DEPTH24_STENCIL8:t.DEPTH_COMPONENT24,n=g.stencil?vt:xt,r=g.stencil?Tt:St);const s={colorFormat:t.RGBA8,depthFormat:i,scaleFactor:o};f=new XRWebGLBinding(a,t),p=f.createProjectionLayer(s),a.updateRenderState({layers:[p]}),e.setPixelRatio(1),e.setSize(p.textureWidth,p.textureHeight,!1),S=new I(p.textureWidth,p.textureHeight,{format:E,type:T,depthTexture:new K(p.textureWidth,p.textureHeight,r,void 0,void 0,void 0,void 0,void 0,void 0,n),stencilBuffer:g.stencil,colorSpace:e.outputColorSpace,samples:g.antialias?4:0,resolveDepthBuffer:!1===p.ignoreDepthValues})}else{const n={antialias:g.antialias,alpha:!0,depth:g.depth,stencil:g.stencil,framebufferScaleFactor:o};m=new XRWebGLLayer(a,t,n),a.updateRenderState({baseLayer:m}),e.setPixelRatio(1),e.setSize(m.framebufferWidth,m.framebufferHeight,!1),S=new I(m.framebufferWidth,m.framebufferHeight,{format:E,type:T,colorSpace:e.outputColorSpace,stencilBuffer:g.stencil})}S.isXRRenderTarget=!0,this.setFoveation(c),d=null,s=await a.requestReferenceSpace(l),V.setContext(a),V.start(),r.isPresenting=!0,r.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==a)return a.environmentBlendMode},this.getDepthTexture=function(){return _.getDepthTexture()};const F=new i,B=new i;function H(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!==_.texture&&(_.depthNear>0&&(t=_.depthNear),_.depthFar>0&&(n=_.depthFar)),U.near=C.near=b.near=t,U.far=C.far=b.far=n,D===U.near&&w===U.far||(a.updateRenderState({depthNear:U.near,depthFar:U.far}),D=U.near,w=U.far),b.layers.mask=2|e.layers.mask,C.layers.mask=4|e.layers.mask,U.layers.mask=b.layers.mask|C.layers.mask;const r=e.parent,i=U.cameras;H(U,r);for(let e=0;e0&&(e.alphaTest.value=r.alphaTest);const i=t.get(r),a=i.envMap,o=i.envMapRotation;a&&(e.envMap.value=a,oa.copy(o),oa.x*=-1,oa.y*=-1,oa.z*=-1,a.isCubeTexture&&!1===a.isRenderTargetTexture&&(oa.y*=-1,oa.z*=-1),e.envMapRotation.value.setFromMatrix4(sa.makeRotationFromEuler(oa)),e.flipEnvMap.value=a.isCubeTexture&&!1===a.isRenderTargetTexture?-1:1,e.reflectivity.value=r.reflectivity,e.ior.value=r.ior,e.refractionRatio.value=r.refractionRatio),r.lightMap&&(e.lightMap.value=r.lightMap,e.lightMapIntensity.value=r.lightMapIntensity,n(r.lightMap,e.lightMapTransform)),r.aoMap&&(e.aoMap.value=r.aoMap,e.aoMapIntensity.value=r.aoMapIntensity,n(r.aoMap,e.aoMapTransform))}return{refreshFogUniforms:function(t,n){n.color.getRGB(t.fogColor.value,h(e)),n.isFog?(t.fogNear.value=n.near,t.fogFar.value=n.far):n.isFogExp2&&(t.fogDensity.value=n.density)},refreshMaterialUniforms:function(e,i,a,o,s){i.isMeshBasicMaterial||i.isMeshLambertMaterial?r(e,i):i.isMeshToonMaterial?(r(e,i),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}(e,i)):i.isMeshPhongMaterial?(r(e,i),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4)}(e,i)):i.isMeshStandardMaterial?(r(e,i),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,i),i.isMeshPhysicalMaterial&&function(e,t,r){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===d&&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=r.texture,e.transmissionSamplerSize.value.set(r.width,r.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,i,s)):i.isMeshMatcapMaterial?(r(e,i),function(e,t){t.matcap&&(e.matcap.value=t.matcap)}(e,i)):i.isMeshDepthMaterial?r(e,i):i.isMeshDistanceMaterial?(r(e,i),function(e,n){const r=t.get(n).light;e.referencePosition.value.setFromMatrixPosition(r.matrixWorld),e.nearDistance.value=r.shadow.camera.near,e.farDistance.value=r.shadow.camera.far}(e,i)):i.isMeshNormalMaterial?r(e,i):i.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,i),i.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,i)):i.isPointsMaterial?function(e,t,r,i){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*r,e.scale.value=.5*i,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,i,a,o):i.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,i):i.isShadowMaterial?(e.color.value.copy(i.color),e.opacity.value=i.opacity):i.isShaderMaterial&&(i.uniformsNeedUpdate=!1)}}}function ca(e,t,n,r){let i={},a={},o=[];const s=e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS);function l(e,t,n,r){const i=e.value,a=t+"_"+n;if(void 0===r[a])return r[a]="number"==typeof i||"boolean"==typeof i?i:i.clone(),!0;{const e=r[a];if("number"==typeof i||"boolean"==typeof i){if(e!==i)return r[a]=i,!0}else if(!1===e.equals(i))return e.copy(i),!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?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",e),t}function d(t){const n=t.target;n.removeEventListener("dispose",d);const r=o.indexOf(n.__bindingPointIndex);o.splice(r,1),e.deleteBuffer(i[n.id]),delete i[n.id],delete a[n.id]}return{bind:function(e,t){const n=t.program;r.uniformBlockBinding(e,n)},update:function(n,u){let f=i[n.id];void 0===f&&(!function(e){const t=e.uniforms;let n=0;const r=16;for(let e=0,i=t.length;e0&&(n+=r-i);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=U;r.toneMapped&&(null!==w&&!0!==w.isXRRenderTarget||(m=C.toneMapping));const h=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,_=void 0!==h?h.length:0,g=fe.get(r),v=R.state.lights;if(!0===J&&(!0===ee||e!==N)){const t=e===N&&r.id===y;Ae.setState(r,e,t)}let E=!1;r.version===g.__version?g.needsLights&&g.lightsStateVersion!==v.state.version||g.outputColorSpace!==s||i.isBatchedMesh&&!1===g.batching?E=!0:i.isBatchedMesh||!0!==g.batching?i.isBatchedMesh&&!0===g.batchingColor&&null===i.colorTexture||i.isBatchedMesh&&!1===g.batchingColor&&null!==i.colorTexture||i.isInstancedMesh&&!1===g.instancing?E=!0:i.isInstancedMesh||!0!==g.instancing?i.isSkinnedMesh&&!1===g.skinning?E=!0:i.isSkinnedMesh||!0!==g.skinning?i.isInstancedMesh&&!0===g.instancingColor&&null===i.instanceColor||i.isInstancedMesh&&!1===g.instancingColor&&null!==i.instanceColor||i.isInstancedMesh&&!0===g.instancingMorph&&null===i.morphTexture||i.isInstancedMesh&&!1===g.instancingMorph&&null!==i.morphTexture||g.envMap!==l||!0===r.fog&&g.fog!==a?E=!0:void 0===g.numClippingPlanes||g.numClippingPlanes===Ae.numPlanes&&g.numIntersection===Ae.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=r.version);let S=g.currentProgram;!0===E&&(S=Qe(r,t,i));let T=!1,M=!1,x=!1;const A=S.getUniforms(),b=g.uniforms;de.useProgram(S.program)&&(T=!0,M=!0,x=!0);r.id!==y&&(y=r.id,M=!0);if(T||N!==e){de.buffers.depth.getReversed()?(te.copy(e.projectionMatrix),An(te),bn(te),A.setValue(Ie,"projectionMatrix",te)):A.setValue(Ie,"projectionMatrix",e.projectionMatrix),A.setValue(Ie,"viewMatrix",e.matrixWorldInverse);const t=A.map.cameraPosition;void 0!==t&&t.setValue(Ie,re.setFromMatrixPosition(e.matrixWorld)),ce.logarithmicDepthBuffer&&A.setValue(Ie,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(r.isMeshPhongMaterial||r.isMeshToonMaterial||r.isMeshLambertMaterial||r.isMeshBasicMaterial||r.isMeshStandardMaterial||r.isShaderMaterial)&&A.setValue(Ie,"isOrthographic",!0===e.isOrthographicCamera),N!==e&&(N=e,M=!0,x=!0)}if(i.isSkinnedMesh){A.setOptional(Ie,i,"bindMatrix"),A.setOptional(Ie,i,"bindMatrixInverse");const e=i.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),A.setValue(Ie,"boneTexture",e.boneTexture,pe))}i.isBatchedMesh&&(A.setOptional(Ie,i,"batchingTexture"),A.setValue(Ie,"batchingTexture",i._matricesTexture,pe),A.setOptional(Ie,i,"batchingIdTexture"),A.setValue(Ie,"batchingIdTexture",i._indirectTexture,pe),A.setOptional(Ie,i,"batchingColorTexture"),null!==i._colorsTexture&&A.setValue(Ie,"batchingColorTexture",i._colorsTexture,pe));const L=n.morphAttributes;void 0===L.position&&void 0===L.normal&&void 0===L.color||Le.update(i,n,S);(M||g.receiveShadow!==i.receiveShadow)&&(g.receiveShadow=i.receiveShadow,A.setValue(Ie,"receiveShadow",i.receiveShadow));r.isMeshGouraudMaterial&&null!==r.envMap&&(b.envMap.value=l,b.flipEnvMap.value=l.isCubeTexture&&!1===l.isRenderTargetTexture?-1:1);r.isMeshStandardMaterial&&null===r.envMap&&null!==t.environment&&(b.envMapIntensity.value=t.environmentIntensity);M&&(A.setValue(Ie,"toneMappingExposure",C.toneMappingExposure),g.needsLights&&(D=x,(P=b).ambientLightColor.needsUpdate=D,P.lightProbe.needsUpdate=D,P.directionalLights.needsUpdate=D,P.directionalLightShadows.needsUpdate=D,P.pointLights.needsUpdate=D,P.pointLightShadows.needsUpdate=D,P.spotLights.needsUpdate=D,P.spotLightShadows.needsUpdate=D,P.rectAreaLights.needsUpdate=D,P.hemisphereLights.needsUpdate=D),a&&!0===r.fog&&Me.refreshFogUniforms(b,a),Me.refreshMaterialUniforms(b,r,Y,X,R.state.transmissionRenderTarget[e.id]),gi.upload(Ie,Je(g),b,pe));var P,D;r.isShaderMaterial&&!0===r.uniformsNeedUpdate&&(gi.upload(Ie,Je(g),b,pe),r.uniformsNeedUpdate=!1);r.isSpriteMaterial&&A.setValue(Ie,"center",i.center);if(A.setValue(Ie,"modelViewMatrix",i.modelViewMatrix),A.setValue(Ie,"normalMatrix",i.normalMatrix),A.setValue(Ie,"modelMatrix",i.matrixWorld),r.isShaderMaterial||r.isRawShaderMaterial){const e=r.uniformsGroups;for(let t=0,n=e.length;t{function n(){r.forEach((function(e){fe.get(e).currentProgram.isReady()&&r.delete(e)})),0!==r.size?setTimeout(n,10):t(e)}null!==le.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)}))};let ke=null;function We(){Ye.stop()}function Xe(){Ye.start()}const Ye=new Pn;function Ke(e,t,n,r){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)R.pushLight(e),e.castShadow&&R.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||Q.intersectsSprite(e)){r&&ie.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ne);const t=Se.update(e),i=e.material;i.visible&&x.push(e,t,i,n,ie.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||Q.intersectsObject(e))){const t=Se.update(e),i=e.material;if(r&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),ie.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),ie.copy(t.boundingSphere.center)),ie.applyMatrix4(e.matrixWorld).applyMatrix4(ne)),Array.isArray(i)){const r=t.groups;for(let a=0,o=r.length;a0&&Ze(i,t,n),a.length>0&&Ze(a,t,n),o.length>0&&Ze(o,t,n),de.buffers.depth.setTest(!0),de.buffers.depth.setMask(!0),de.buffers.color.setMask(!0),de.setPolygonOffset(!1)}function qe(e,t,n,r){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;void 0===R.state.transmissionRenderTarget[r.id]&&(R.state.transmissionRenderTarget[r.id]=new I(1,1,{generateMipmaps:!0,type:le.has("EXT_color_buffer_half_float")||le.has("EXT_color_buffer_float")?S:T,minFilter:ct,samples:4,stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:u.workingColorSpace}));const i=R.state.transmissionRenderTarget[r.id],a=r.viewport||O;i.setSize(a.z*C.transmissionResolutionScale,a.w*C.transmissionResolutionScale);const s=C.getRenderTarget();C.setRenderTarget(i),C.getClearColor(V),z=C.getClearAlpha(),z<1&&C.setClearColor(16777215,.5),C.clear(),oe&&Ce.render(n);const l=C.toneMapping;C.toneMapping=U;const c=r.viewport;if(void 0!==r.viewport&&(r.viewport=void 0),R.setupLightsView(r),!0===J&&Ae.setGlobalState(C.clippingPlanes,r),Ze(e,n,r),pe.updateMultisampleRenderTarget(i),pe.updateRenderTargetMipmap(i),!1===le.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let i=0,a=t.length;i0)for(let t=0,a=n.length;t0&&qe(r,i,e,t),oe&&Ce.render(e),je(x,e,t);null!==w&&0===D&&(pe.updateMultisampleRenderTarget(w),pe.updateRenderTargetMipmap(w)),!0===e.isScene&&e.onAfterRender(C,e,t),we.resetDefaultState(),y=-1,N=null,b.pop(),b.length>0?(R=b[b.length-1],!0===J&&Ae.setGlobalState(C.clippingPlanes,R.state.camera)):R=null,A.pop(),x=A.length>0?A[A.length-1]:null},this.getActiveCubeFace=function(){return P},this.getActiveMipmapLevel=function(){return D},this.getRenderTarget=function(){return w},this.setRenderTargetTextures=function(e,t,n){fe.get(e.texture).__webglTexture=t,fe.get(e.depthTexture).__webglTexture=n;const r=fe.get(e);r.__hasExternalTextures=!0,r.__autoAllocateDepthBuffer=void 0===n,r.__autoAllocateDepthBuffer||!0===le.has("WEBGL_multisampled_render_to_texture")&&(console.warn("THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided"),r.__useRenderToTexture=!1)},this.setRenderTargetFramebuffer=function(e,t){const n=fe.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const tt=Ie.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){w=e,P=t,D=n;let r=!0,i=null,a=!1,o=!1;if(e){const s=fe.get(e);if(void 0!==s.__useDefaultFramebuffer)de.bindFramebuffer(Ie.FRAMEBUFFER,null),r=!1;else if(void 0===s.__webglFramebuffer)pe.setupRenderTarget(e);else if(s.__hasExternalTextures)pe.rebindTextures(e,fe.get(e.texture).__webglTexture,fe.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(s.__boundDepthTexture!==t){if(null!==t&&fe.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");pe.setupDepthRenderbuffer(e)}}const l=e.texture;(l.isData3DTexture||l.isDataArrayTexture||l.isCompressedArrayTexture)&&(o=!0);const c=fe.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(i=Array.isArray(c[t])?c[t][n]:c[t],a=!0):i=e.samples>0&&!1===pe.useMultisampledRTT(e)?fe.get(e).__webglMultisampledFramebuffer:Array.isArray(c)?c[n]:c,O.copy(e.viewport),F.copy(e.scissor),G=e.scissorTest}else O.copy(q).multiplyScalar(Y).floor(),F.copy(Z).multiplyScalar(Y).floor(),G=$;0!==n&&(i=tt);if(de.bindFramebuffer(Ie.FRAMEBUFFER,i)&&r&&de.drawBuffers(e,i),de.viewport(O),de.scissor(F),de.setScissorTest(G),a){const r=fe.get(e.texture);Ie.framebufferTexture2D(Ie.FRAMEBUFFER,Ie.COLOR_ATTACHMENT0,Ie.TEXTURE_CUBE_MAP_POSITIVE_X+t,r.__webglTexture,n)}else if(o){const r=fe.get(e.texture),i=t;Ie.framebufferTextureLayer(Ie.FRAMEBUFFER,Ie.COLOR_ATTACHMENT0,r.__webglTexture,n,i)}else if(null!==e&&0!==n){const t=fe.get(e.texture);Ie.framebufferTexture2D(Ie.FRAMEBUFFER,Ie.COLOR_ATTACHMENT0,Ie.TEXTURE_2D,t.__webglTexture,n)}y=-1},this.readRenderTargetPixels=function(e,t,n,r,i,a,o){if(!e||!e.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let s=fe.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(s=s[o]),s){de.bindFramebuffer(Ie.FRAMEBUFFER,s);try{const o=e.texture,s=o.format,l=o.type;if(!ce.textureFormatReadable(s))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!ce.textureTypeReadable(l))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");t>=0&&t<=e.width-r&&n>=0&&n<=e.height-i&&Ie.readPixels(t,n,r,i,De.convert(s),De.convert(l),a)}finally{const e=null!==w?fe.get(w).__webglFramebuffer:null;de.bindFramebuffer(Ie.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,r,i,a,o){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let s=fe.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(s=s[o]),s){const o=e.texture,l=o.format,c=o.type;if(!ce.textureFormatReadable(l))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ce.textureTypeReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");if(t>=0&&t<=e.width-r&&n>=0&&n<=e.height-i){de.bindFramebuffer(Ie.FRAMEBUFFER,s);const e=Ie.createBuffer();Ie.bindBuffer(Ie.PIXEL_PACK_BUFFER,e),Ie.bufferData(Ie.PIXEL_PACK_BUFFER,a.byteLength,Ie.STREAM_READ),Ie.readPixels(t,n,r,i,De.convert(l),De.convert(c),0);const o=null!==w?fe.get(w).__webglFramebuffer:null;de.bindFramebuffer(Ie.FRAMEBUFFER,o);const d=Ie.fenceSync(Ie.SYNC_GPU_COMMANDS_COMPLETE,0);return Ie.flush(),await Cn(Ie,d,4),Ie.bindBuffer(Ie.PIXEL_PACK_BUFFER,e),Ie.getBufferSubData(Ie.PIXEL_PACK_BUFFER,0,a),Ie.deleteBuffer(e),Ie.deleteSync(d),a}throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(e,t=null,n=0){!0!==e.isTexture&&(H("WebGLRenderer: copyFramebufferToTexture function signature has changed."),t=arguments[0]||null,e=arguments[1]);const r=Math.pow(2,-n),i=Math.floor(e.image.width*r),a=Math.floor(e.image.height*r),o=null!==t?t.x:0,s=null!==t?t.y:0;pe.setTexture2D(e,0),Ie.copyTexSubImage2D(Ie.TEXTURE_2D,n,0,0,o,s,i,a),de.unbindTexture()};const nt=Ie.createFramebuffer(),rt=Ie.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,r=null,i=0,a=null){let o,s,l,c,d,u,f,p,m;!0!==e.isTexture&&(H("WebGLRenderer: copyTextureToTexture function signature has changed."),r=arguments[0]||null,e=arguments[1],t=arguments[2],a=arguments[3]||0,n=null),null===a&&(0!==i?(H("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),a=i,i=0):a=0);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,-i);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!==r?(f=r.x,p=r.y,m=r.z):(f=0,p=0,m=0);const _=De.convert(t.format),g=De.convert(t.type);let v;t.isData3DTexture?(pe.setTexture3D(t,0),v=Ie.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(pe.setTexture2DArray(t,0),v=Ie.TEXTURE_2D_ARRAY):(pe.setTexture2D(t,0),v=Ie.TEXTURE_2D),Ie.pixelStorei(Ie.UNPACK_FLIP_Y_WEBGL,t.flipY),Ie.pixelStorei(Ie.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),Ie.pixelStorei(Ie.UNPACK_ALIGNMENT,t.unpackAlignment);const E=Ie.getParameter(Ie.UNPACK_ROW_LENGTH),S=Ie.getParameter(Ie.UNPACK_IMAGE_HEIGHT),T=Ie.getParameter(Ie.UNPACK_SKIP_PIXELS),M=Ie.getParameter(Ie.UNPACK_SKIP_ROWS),x=Ie.getParameter(Ie.UNPACK_SKIP_IMAGES);Ie.pixelStorei(Ie.UNPACK_ROW_LENGTH,h.width),Ie.pixelStorei(Ie.UNPACK_IMAGE_HEIGHT,h.height),Ie.pixelStorei(Ie.UNPACK_SKIP_PIXELS,c),Ie.pixelStorei(Ie.UNPACK_SKIP_ROWS,d),Ie.pixelStorei(Ie.UNPACK_SKIP_IMAGES,u);const R=e.isDataArrayTexture||e.isData3DTexture,A=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=fe.get(e),r=fe.get(t),h=fe.get(n.__renderTarget),_=fe.get(r.__renderTarget);de.bindFramebuffer(Ie.READ_FRAMEBUFFER,h.__webglFramebuffer),de.bindFramebuffer(Ie.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}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\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\t\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, roughness * 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 * ( 1.0 - 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 = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), 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.07, 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:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\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#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 saturate(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.specularColor;\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 * transposeMat3( 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 a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\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\tvec2 fab = DFGApprox( normal, viewDir, roughness );\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}\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.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * 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\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\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\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\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 );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\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.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\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 )\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_LOGDEPTHBUF )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\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\tuniform sampler2D directionalShadowMap[ 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\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\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 sampler2D pointShadowMap[ 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\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D 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\t\n\t\tfloat lightToPositionLength = length( lightToPosition );\n\t\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t\t) * ( 1.0 / 9.0 );\n\t\t\t#else\n\t\t\t\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\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\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.diffuseColor, material.specularColor, 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\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\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}",distanceRGBA_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}",distanceRGBA_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 \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 = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \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 \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( packNormalToRGB( normal ), diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \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 \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\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\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 \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 \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}",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}"},wn={common:{diffuse:{value:new e(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new t},alphaMap:{value:null},alphaMapTransform:{value:new t},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new t}},envmap:{envMap:{value:null},envMapRotation:{value:new t},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new t}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new t}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new t},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new t},normalScale:{value:new n(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new t},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new t}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new t}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new t}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new e(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},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 e(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new t},alphaTest:{value:0},uvTransform:{value:new t}},sprite:{diffuse:{value:new e(16777215)},opacity:{value:1},center:{value:new n(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new t},alphaMap:{value:null},alphaMapTransform:{value:new t},alphaTest:{value:0}}},yn={basic:{uniforms:r([wn.common,wn.specularmap,wn.envmap,wn.aomap,wn.lightmap,wn.fog]),vertexShader:Dn.meshbasic_vert,fragmentShader:Dn.meshbasic_frag},lambert:{uniforms:r([wn.common,wn.specularmap,wn.envmap,wn.aomap,wn.lightmap,wn.emissivemap,wn.bumpmap,wn.normalmap,wn.displacementmap,wn.fog,wn.lights,{emissive:{value:new e(0)}}]),vertexShader:Dn.meshlambert_vert,fragmentShader:Dn.meshlambert_frag},phong:{uniforms:r([wn.common,wn.specularmap,wn.envmap,wn.aomap,wn.lightmap,wn.emissivemap,wn.bumpmap,wn.normalmap,wn.displacementmap,wn.fog,wn.lights,{emissive:{value:new e(0)},specular:{value:new e(1118481)},shininess:{value:30}}]),vertexShader:Dn.meshphong_vert,fragmentShader:Dn.meshphong_frag},standard:{uniforms:r([wn.common,wn.envmap,wn.aomap,wn.lightmap,wn.emissivemap,wn.bumpmap,wn.normalmap,wn.displacementmap,wn.roughnessmap,wn.metalnessmap,wn.fog,wn.lights,{emissive:{value:new e(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Dn.meshphysical_vert,fragmentShader:Dn.meshphysical_frag},toon:{uniforms:r([wn.common,wn.aomap,wn.lightmap,wn.emissivemap,wn.bumpmap,wn.normalmap,wn.displacementmap,wn.gradientmap,wn.fog,wn.lights,{emissive:{value:new e(0)}}]),vertexShader:Dn.meshtoon_vert,fragmentShader:Dn.meshtoon_frag},matcap:{uniforms:r([wn.common,wn.bumpmap,wn.normalmap,wn.displacementmap,wn.fog,{matcap:{value:null}}]),vertexShader:Dn.meshmatcap_vert,fragmentShader:Dn.meshmatcap_frag},points:{uniforms:r([wn.points,wn.fog]),vertexShader:Dn.points_vert,fragmentShader:Dn.points_frag},dashed:{uniforms:r([wn.common,wn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Dn.linedashed_vert,fragmentShader:Dn.linedashed_frag},depth:{uniforms:r([wn.common,wn.displacementmap]),vertexShader:Dn.depth_vert,fragmentShader:Dn.depth_frag},normal:{uniforms:r([wn.common,wn.bumpmap,wn.normalmap,wn.displacementmap,{opacity:{value:1}}]),vertexShader:Dn.meshnormal_vert,fragmentShader:Dn.meshnormal_frag},sprite:{uniforms:r([wn.sprite,wn.fog]),vertexShader:Dn.sprite_vert,fragmentShader:Dn.sprite_frag},background:{uniforms:{uvTransform:{value:new t},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Dn.background_vert,fragmentShader:Dn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new t}},vertexShader:Dn.backgroundCube_vert,fragmentShader:Dn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Dn.cube_vert,fragmentShader:Dn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Dn.equirect_vert,fragmentShader:Dn.equirect_frag},distanceRGBA:{uniforms:r([wn.common,wn.displacementmap,{referencePosition:{value:new i},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Dn.distanceRGBA_vert,fragmentShader:Dn.distanceRGBA_frag},shadow:{uniforms:r([wn.lights,wn.fog,{color:{value:new e(0)},opacity:{value:1}}]),vertexShader:Dn.shadow_vert,fragmentShader:Dn.shadow_frag}};yn.physical={uniforms:r([yn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new t},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new t},clearcoatNormalScale:{value:new n(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new t},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new t},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new t},sheen:{value:0},sheenColor:{value:new e(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new t},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new t},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new t},transmissionSamplerSize:{value:new n},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new t},attenuationDistance:{value:0},attenuationColor:{value:new e(0)},specularColor:{value:new e(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new t},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new t},anisotropyVector:{value:new n},anisotropyMap:{value:null},anisotropyMapTransform:{value:new t}}]),vertexShader:Dn.meshphysical_vert,fragmentShader:Dn.meshphysical_frag};const In={r:0,b:0,g:0},Nn=new _,On=new g;function Fn(t,n,r,i,_,g,v){const E=new e(0);let S,T,M=!0===g?0:1,x=null,R=0,A=null;function b(e){let t=!0===e.isScene?e.background:null;if(t&&t.isTexture){t=(e.backgroundBlurriness>0?r:n).get(t)}return t}function C(e,n){e.getRGB(In,h(t)),i.buffers.color.setClear(In.r,In.g,In.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(e){let n=!1;const r=b(e);null===r?C(E,M):r&&r.isColor&&(C(r,1),n=!0);const a=t.xr.getEnvironmentBlendMode();"additive"===a?i.buffers.color.setClear(0,0,0,1,v):"alpha-blend"===a&&i.buffers.color.setClear(0,0,0,0,v),(t.autoClear||n)&&(i.buffers.depth.setTest(!0),i.buffers.depth.setMask(!0),i.buffers.color.setMask(!0),t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil))},addToRenderList:function(e,n){const r=b(n);r&&(r.isCubeTexture||r.mapping===a)?(void 0===T&&(T=new o(new s(1,1,1),new l({name:"BackgroundCubeMaterial",uniforms:c(yn.backgroundCube.uniforms),vertexShader:yn.backgroundCube.vertexShader,fragmentShader:yn.backgroundCube.fragmentShader,side:d,depthTest:!1,depthWrite:!1,fog:!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}}),_.update(T)),Nn.copy(n.backgroundRotation),Nn.x*=-1,Nn.y*=-1,Nn.z*=-1,r.isCubeTexture&&!1===r.isRenderTargetTexture&&(Nn.y*=-1,Nn.z*=-1),T.material.uniforms.envMap.value=r,T.material.uniforms.flipEnvMap.value=r.isCubeTexture&&!1===r.isRenderTargetTexture?-1:1,T.material.uniforms.backgroundBlurriness.value=n.backgroundBlurriness,T.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,T.material.uniforms.backgroundRotation.value.setFromMatrix4(On.makeRotationFromEuler(Nn)),T.material.toneMapped=u.getTransfer(r.colorSpace)!==f,x===r&&R===r.version&&A===t.toneMapping||(T.material.needsUpdate=!0,x=r,R=r.version,A=t.toneMapping),T.layers.enableAll(),e.unshift(T,T.geometry,T.material,0,0,null)):r&&r.isTexture&&(void 0===S&&(S=new o(new p(2,2),new l({name:"BackgroundMaterial",uniforms:c(yn.background.uniforms),vertexShader:yn.background.vertexShader,fragmentShader:yn.background.fragmentShader,side:m,depthTest:!1,depthWrite:!1,fog:!1})),S.geometry.deleteAttribute("normal"),Object.defineProperty(S.material,"map",{get:function(){return this.uniforms.t2D.value}}),_.update(S)),S.material.uniforms.t2D.value=r,S.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,S.material.toneMapped=u.getTransfer(r.colorSpace)!==f,!0===r.matrixAutoUpdate&&r.updateMatrix(),S.material.uniforms.uvTransform.value.copy(r.matrix),x===r&&R===r.version&&A===t.toneMapping||(S.material.needsUpdate=!0,x=r,R=r.version,A=t.toneMapping),S.layers.enableAll(),e.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 Bn(e,t){const n=e.getParameter(e.MAX_VERTEX_ATTRIBS),r={},i=c(null);let a=i,o=!1;function s(t){return e.bindVertexArray(t)}function l(t){return e.deleteVertexArray(t)}function c(e){const t=[],r=[],i=[];for(let e=0;e=0){const n=i[t];let r=o[t];if(void 0===r&&("instanceMatrix"===t&&e.instanceMatrix&&(r=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(r=e.instanceColor)),void 0===n)return!0;if(n.attribute!==r)return!0;if(r&&n.data!==r.data)return!0;s++}}return a.attributesNum!==s||a.index!==r}(n,h,l,_),g&&function(e,t,n,r){const i={},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 r={};r.attribute=n,n&&n.data&&(r.data=n.data),i[t]=r,s++}}a.attributes=i,a.attributesNum=s,a.index=r}(n,h,l,_),null!==_&&t.update(_,e.ELEMENT_ARRAY_BUFFER),(g||o)&&(o=!1,function(n,r,i,a){d();const o=a.attributes,s=i.getAttributes(),l=r.defaultAttributeValues;for(const r in s){const i=s[r];if(i.location>=0){let s=o[r];if(void 0===s&&("instanceMatrix"===r&&n.instanceMatrix&&(s=n.instanceMatrix),"instanceColor"===r&&n.instanceColor&&(s=n.instanceColor)),void 0!==s){const r=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&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);const l=!0===n.logarithmicDepthBuffer,c=!0===n.reverseDepthBuffer&&t.has("EXT_clip_control"),d=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),u=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==i)return i;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");i=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else i=0;return i},getMaxPrecision:a,textureFormatReadable:function(t){return t===E||r.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const i=n===S&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==T&&r.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==M&&!i)},precision:o,logarithmicDepthBuffer:l,reverseDepthBuffer:c,maxTextures:d,maxVertexTextures:u,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),vertexTextures:u>0,maxSamples:e.getParameter(e.MAX_SAMPLES)}}function Vn(e){const n=this;let r=null,i=0,a=!1,o=!1;const s=new x,l=new t,c={value:null,needsUpdate:!1};function d(e,t,r,i){const a=null!==e?e.length:0;let o=null;if(0!==a){if(o=c.value,!0!==i||null===o){const n=r+4*a,i=t.matrixWorldInverse;l.getNormalMatrix(i),(null===o||o.length0);n.numPlanes=i,n.numIntersection=0}();else{const e=o?0:i,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]=r[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=C:t===A&&(e.mapping=L),e}function r(e){const n=e.target;n.removeEventListener("dispose",r);const i=t.get(n);void 0!==i&&(t.delete(n),i.dispose())}return{get:function(i){if(i&&i.isTexture){const a=i.mapping;if(a===R||a===A){if(t.has(i)){return n(t.get(i).texture,i.mapping)}{const a=i.image;if(a&&a.height>0){const o=new b(a.height);return o.fromEquirectangularTexture(e,i),t.set(i,o),i.addEventListener("dispose",r),n(o.texture,i.mapping)}return null}}}return i},dispose:function(){t=new WeakMap}}}const kn=[.125,.215,.35,.446,.526,.582],Wn=20,Xn=new O,Yn=new e;let Kn=null,jn=0,qn=0,Zn=!1;const $n=(1+Math.sqrt(5))/2,Qn=1/$n,Jn=[new i(-$n,Qn,0),new i($n,Qn,0),new i(-Qn,0,$n),new i(Qn,0,$n),new i(0,$n,-Qn),new i(0,$n,Qn),new i(-1,1,-1),new i(1,1,-1),new i(-1,1,1),new i(1,1,1)];class er{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(e,t=0,n=.1,r=100){Kn=this._renderer.getRenderTarget(),jn=this._renderer.getActiveCubeFace(),qn=this._renderer.getActiveMipmapLevel(),Zn=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(256);const i=this._allocateTargets();return i.depthBuffer=!0,this._sceneToCubeUV(e,n,r,i),t>0&&this._blur(i,0,0,t),this._applyPMREM(i),this._cleanup(i),i}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=ir(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=rr(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.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._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?s=kn[o-e+4-1]:0===o&&(s=0),r.push(s);const l=1/(a-2),c=-l,d=1+l,u=[c,c,d,c,d,d,c,c,d,d,c,d],f=6,p=6,m=3,h=2,_=1,g=new Float32Array(m*p*f),v=new Float32Array(h*p*f),E=new Float32Array(_*p*f);for(let e=0;e2?0:-1,r=[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];g.set(r,m*p*e),v.set(u,h*p*e);const i=[e,e,e,e,e,e];E.set(i,_*p*e)}const S=new w;S.setAttribute("position",new y(g,m)),S.setAttribute("uv",new y(v,h)),S.setAttribute("faceIndex",new y(E,_)),t.push(S),i>4&&i--}return{lodPlanes:t,sizeLods:n,sigmas:r}}(r)),this._blurMaterial=function(e,t,n){const r=new Float32Array(Wn),a=new i(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:Wn,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:r},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:a}},vertexShader:ar(),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:N,depthTest:!1,depthWrite:!1});return o}(r,e,t)}return r}_compileMaterial(e){const t=new o(this._lodPlanes[0],e);this._renderer.compile(t,Xn)}_sceneToCubeUV(e,t,n,r){const i=new P(90,1,t,n),a=[1,-1,1,1,1,1],l=[1,1,1,-1,-1,-1],c=this._renderer,u=c.autoClear,f=c.toneMapping;c.getClearColor(Yn),c.toneMapping=U,c.autoClear=!1;const p=new D({name:"PMREM.Background",side:d,depthWrite:!1,depthTest:!1}),m=new o(new s,p);let h=!1;const _=e.background;_?_.isColor&&(p.color.copy(_),e.background=null,h=!0):(p.color.copy(Yn),h=!0);for(let t=0;t<6;t++){const n=t%3;0===n?(i.up.set(0,a[t],0),i.lookAt(l[t],0,0)):1===n?(i.up.set(0,0,a[t]),i.lookAt(0,l[t],0)):(i.up.set(0,a[t],0),i.lookAt(0,0,l[t]));const o=this._cubeSize;nr(r,n*o,t>2?o:0,o,o),c.setRenderTarget(r),h&&c.render(m,i),c.render(e,i)}m.geometry.dispose(),m.material.dispose(),c.toneMapping=f,c.autoClear=u,e.background=_}_textureToCubeUV(e,t){const n=this._renderer,r=e.mapping===C||e.mapping===L;r?(null===this._cubemapMaterial&&(this._cubemapMaterial=ir()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=rr());const i=r?this._cubemapMaterial:this._equirectMaterial,a=new o(this._lodPlanes[0],i);i.uniforms.envMap.value=e;const s=this._cubeSize;nr(t,0,0,3*s,2*s),n.setRenderTarget(t),n.render(a,Xn)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const r=this._lodPlanes.length;for(let t=1;tWn&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${h} samples when the maximum is set to 20`);const _=[];let g=0;for(let e=0;ev-4?r-v+4:0),4*(this._cubeSize-E),3*E,2*E),l.setRenderTarget(t),l.render(d,Xn)}}function tr(e,t,n){const r=new I(e,t,n);return r.texture.mapping=a,r.texture.name="PMREM.cubeUv",r.scissorTest=!0,r}function nr(e,t,n,r,i){e.viewport.set(t,n,r,i),e.scissor.set(t,n,r,i)}function rr(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:ar(),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:N,depthTest:!1,depthWrite:!1})}function ir(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:ar(),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:N,depthTest:!1,depthWrite:!1})}function ar(){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 or(e){let t=new WeakMap,n=null;function r(e){const n=e.target;n.removeEventListener("dispose",r);const i=t.get(n);void 0!==i&&(t.delete(n),i.dispose())}return{get:function(i){if(i&&i.isTexture){const a=i.mapping,o=a===R||a===A,s=a===C||a===L;if(o||s){let a=t.get(i);const l=void 0!==a?a.texture.pmremVersion:0;if(i.isRenderTargetTexture&&i.pmremVersion!==l)return null===n&&(n=new er(e)),a=o?n.fromEquirectangular(i,a):n.fromCubemap(i,a),a.texture.pmremVersion=i.pmremVersion,t.set(i,a),a.texture;if(void 0!==a)return a.texture;{const l=i.image;return o&&l&&l.height>0||s&&l&&function(e){let t=0;const n=6;for(let r=0;rt.maxTextureSize&&(T=Math.ceil(S/t.maxTextureSize),S=t.maxTextureSize);const x=new Float32Array(S*T*4*u),R=new W(x,S,T,u);R.type=M,R.needsUpdate=!0;const A=4*E;for(let C=0;C0)return e;const i=t*n;let a=vr[i];if(void 0===a&&(a=new Float32Array(i),vr[i]=a),0!==t){r.toArray(a,0);for(let r=1,i=0;r!==t;++r)i+=n,e[r].toArray(a,i)}return a}function Rr(e,t){if(e.length!==t.length)return!1;for(let n=0,r=e.length;n":" "} ${i}: ${n[e]}`)}return r.join("\n")}(e.getShaderSource(t),r)}return i}function Mi(e,t){const n=function(e){u._getMatrix(Si,u.workingColorSpace,e);const t=`mat3( ${Si.elements.map((e=>e.toFixed(4)))} )`;switch(u.getTransfer(e)){case se:return[t,"LinearTransferOETF"];case f:return[t,"sRGBTransferOETF"];default:return console.warn("THREE.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")}function xi(e,t){let n;switch(t){case re:n="Linear";break;case ne:n="Reinhard";break;case te:n="Cineon";break;case ee:n="ACESFilmic";break;case J:n="AgX";break;case Q:n="Neutral";break;case $:n="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",t),n="Linear"}return"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const Ri=new i;function Ai(){u.getLuminanceCoefficients(Ri);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${Ri.x.toFixed(4)}, ${Ri.y.toFixed(4)}, ${Ri.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function bi(e){return""!==e}function Ci(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 Li(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Pi=/^[ \t]*#include +<([\w\d./]+)>/gm;function Ui(e){return e.replace(Pi,wi)}const Di=new Map;function wi(e,t){let n=Dn[t];if(void 0===n){const e=Di.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=Dn[e],console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Ui(n)}const yi=/#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 Ii(e){return e.replace(yi,Ni)}function Ni(e,t,n,r){let i="";for(let e=parseInt(t);e0&&(g+="\n"),v=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h].filter(bi).join("\n"),v.length>0&&(v+="\n")):(g=[Oi(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,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 "+u:"",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 "+c:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","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(bi).join("\n"),v=[Oi(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,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 "+d:"",n.envMap?"#define "+u:"",n.envMap?"#define "+f:"",p?"#define CUBEUV_TEXEL_WIDTH "+p.texelWidth:"",p?"#define CUBEUV_TEXEL_HEIGHT "+p.texelHeight:"",p?"#define CUBEUV_MAX_MIP "+p.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 "+c:"",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_LOGDEPTHBUF":"",n.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==U?"#define TONE_MAPPING":"",n.toneMapping!==U?Dn.tonemapping_pars_fragment:"",n.toneMapping!==U?xi("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",Dn.colorspace_pars_fragment,Mi("linearToOutputTexel",n.outputColorSpace),Ai(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(bi).join("\n")),s=Ui(s),s=Ci(s,n),s=Li(s,n),l=Ui(l),l=Ci(l,n),l=Li(l,n),s=Ii(s),l=Ii(l),!0!==n.isRawShaderMaterial&&(E="#version 300 es\n",g=[m,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+g,v=["#define varying in",n.glslVersion===Z?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===Z?"":"#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"+v);const S=E+g+s,T=E+v+l,M=vi(i,i.VERTEX_SHADER,S),x=vi(i,i.FRAGMENT_SHADER,T);function R(t){if(e.debug.checkShaderErrors){const n=i.getProgramInfoLog(_).trim(),r=i.getShaderInfoLog(M).trim(),a=i.getShaderInfoLog(x).trim();let o=!0,s=!0;if(!1===i.getProgramParameter(_,i.LINK_STATUS))if(o=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(i,_,M,x);else{const e=Ti(i,M,"vertex"),r=Ti(i,x,"fragment");console.error("THREE.WebGLProgram: Shader Error "+i.getError()+" - VALIDATE_STATUS "+i.getProgramParameter(_,i.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+n+"\n"+e+"\n"+r)}else""!==n?console.warn("THREE.WebGLProgram: Program Info Log:",n):""!==r&&""!==a||(s=!1);s&&(t.diagnostics={runnable:o,programLog:n,vertexShader:{log:r,prefix:g},fragmentShader:{log:a,prefix:v}})}i.deleteShader(M),i.deleteShader(x),A=new gi(i,_),b=function(e,t){const n={},r=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let i=0;i0,J=o.clearcoat>0,ee=o.dispersion>0,te=o.iridescence>0,ne=o.sheen>0,re=o.transmission>0,ie=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,he=ne&&!!o.sheenRoughnessMap,_e=!!o.specularMap,ge=!!o.specularColorMap,ve=!!o.specularIntensityMap,Ee=re&&!!o.transmissionMap,Se=re&&!!o.thicknessMap,Te=!!o.gradientMap,Me=!!o.alphaMap,xe=o.alphaTest>0,Re=!!o.alphaHash,Ae=!!o.extensions;let be=U;o.toneMapped&&(null!==O&&!0!==O.isXRRenderTarget||(be=e.toneMapping));const Ce={shaderID:C,shaderType:o.type,shaderName:o.name,vertexShader:D,fragmentShader:w,defines:o.defines,customVertexShaderID:y,customFragmentShaderID:I,isRawShaderMaterial:!0===o.isRawShaderMaterial,glslVersion:o.glslVersion,precision:g,batching:G,batchingColor:G&&null!==T._colorsTexture,instancing:H,instancingColor:H&&null!==T.instanceColor,instancingMorph:H&&null!==T.morphTexture,supportsVertexTextures:_,outputColorSpace:null===O?e.outputColorSpace:!0===O.isXRRenderTarget?O.texture.colorSpace:B,alphaToCoverage:!!o.alphaToCoverage,map:V,matcap:z,envMap:k,envMapMode:k&&A.mapping,envMapCubeUVHeight:b,aoMap:W,lightMap:X,bumpMap:Y,normalMap:K,displacementMap:_&&j,emissiveMap:q,normalMapObjectSpace:K&&o.normalMapType===ue,normalMapTangentSpace:K&&o.normalMapType===fe,metalnessMap:Z,roughnessMap:$,anisotropy:Q,anisotropyMap:ie,clearcoat:J,clearcoatMap:ae,clearcoatNormalMap:oe,clearcoatRoughnessMap:se,dispersion:ee,iridescence:te,iridescenceMap:le,iridescenceThicknessMap:ce,sheen:ne,sheenColorMap:de,sheenRoughnessMap:he,specularMap:_e,specularColorMap:ge,specularIntensityMap:ve,transmission:re,transmissionMap:Ee,thicknessMap:Se,gradientMap:Te,opaque:!1===o.transparent&&o.blending===pe&&!1===o.alphaToCoverage,alphaMap:Me,alphaTest:xe,alphaHash:Re,combine:o.combine,mapUv:V&&E(o.map.channel),aoMapUv:W&&E(o.aoMap.channel),lightMapUv:X&&E(o.lightMap.channel),bumpMapUv:Y&&E(o.bumpMap.channel),normalMapUv:K&&E(o.normalMap.channel),displacementMapUv:j&&E(o.displacementMap.channel),emissiveMapUv:q&&E(o.emissiveMap.channel),metalnessMapUv:Z&&E(o.metalnessMap.channel),roughnessMapUv:$&&E(o.roughnessMap.channel),anisotropyMapUv:ie&&E(o.anisotropyMap.channel),clearcoatMapUv:ae&&E(o.clearcoatMap.channel),clearcoatNormalMapUv:oe&&E(o.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:se&&E(o.clearcoatRoughnessMap.channel),iridescenceMapUv:le&&E(o.iridescenceMap.channel),iridescenceThicknessMapUv:ce&&E(o.iridescenceThicknessMap.channel),sheenColorMapUv:de&&E(o.sheenColorMap.channel),sheenRoughnessMapUv:he&&E(o.sheenRoughnessMap.channel),specularMapUv:_e&&E(o.specularMap.channel),specularColorMapUv:ge&&E(o.specularColorMap.channel),specularIntensityMapUv:ve&&E(o.specularIntensityMap.channel),transmissionMapUv:Ee&&E(o.transmissionMap.channel),thicknessMapUv:Se&&E(o.thicknessMap.channel),alphaMapUv:Me&&E(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,sizeAttenuation:!0===o.sizeAttenuation,logarithmicDepthBuffer:h,reverseDepthBuffer:F,skinning:!0===T.isSkinnedMesh,morphTargets:void 0!==x.morphAttributes.position,morphNormals:void 0!==x.morphAttributes.normal,morphColors:void 0!==x.morphAttributes.color,morphTargetsCount:P,morphTextureStride:N,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&&m.length>0,shadowMapType:e.shadowMap.type,toneMapping:be,decodeVideoTexture:V&&!0===o.map.isVideoTexture&&u.getTransfer(o.map.colorSpace)===f,decodeVideoTextureEmissive:q&&!0===o.emissiveMap.isVideoTexture&&u.getTransfer(o.emissiveMap.colorSpace)===f,premultipliedAlpha:o.premultipliedAlpha,doubleSided:o.side===me,flipSided:o.side===d,useDepthPacking:o.depthPacking>=0,depthPacking:o.depthPacking||0,index0AttributeName:o.index0AttributeName,extensionClipCullDistance:Ae&&!0===o.extensions.clipCullDistance&&r.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Ae&&!0===o.extensions.multiDraw||G)&&r.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:r.has("KHR_parallel_shader_compile"),customProgramCacheKey:o.customProgramCacheKey()};return Ce.vertexUv1s=p.has(1),Ce.vertexUv2s=p.has(2),Ce.vertexUv3s=p.has(3),p.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.supportsVertexTextures&&l.enable(0);t.instancing&&l.enable(1);t.instancingColor&&l.enable(2);t.instancingMorph&&l.enable(3);t.matcap&&l.enable(4);t.envMap&&l.enable(5);t.normalMapObjectSpace&&l.enable(6);t.normalMapTangentSpace&&l.enable(7);t.clearcoat&&l.enable(8);t.iridescence&&l.enable(9);t.alphaTest&&l.enable(10);t.vertexColors&&l.enable(11);t.vertexAlphas&&l.enable(12);t.vertexUv1s&&l.enable(13);t.vertexUv2s&&l.enable(14);t.vertexUv3s&&l.enable(15);t.vertexTangents&&l.enable(16);t.anisotropy&&l.enable(17);t.alphaHash&&l.enable(18);t.batching&&l.enable(19);t.dispersion&&l.enable(20);t.batchingColor&&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.reverseDepthBuffer&&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=yn[t];n=he.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let r;for(let e=0,t=m.length;e0?r.push(d):!0===o.transparent?i.push(d):n.push(d)},unshift:function(e,t,o,s,l,c){const d=a(e,t,o,s,l,c);o.transmission>0?r.unshift(d):!0===o.transparent?i.unshift(d):n.unshift(d)},finish:function(){for(let n=t,r=e.length;n1&&n.sort(e||ki),r.length>1&&r.sort(t||Wi),i.length>1&&i.sort(t||Wi)}}}function Yi(){let e=new WeakMap;return{get:function(t,n){const r=e.get(t);let i;return void 0===r?(i=new Xi,e.set(t,[i])):n>=r.length?(i=new Xi,r.push(i)):i=r[n],i},dispose:function(){e=new WeakMap}}}function Ki(){const t={};return{get:function(n){if(void 0!==t[n.id])return t[n.id];let r;switch(n.type){case"DirectionalLight":r={direction:new i,color:new e};break;case"SpotLight":r={position:new i,direction:new i,color:new e,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":r={position:new i,color:new e,distance:0,decay:0};break;case"HemisphereLight":r={direction:new i,skyColor:new e,groundColor:new e};break;case"RectAreaLight":r={color:new e,position:new i,halfWidth:new i,halfHeight:new i}}return t[n.id]=r,r}}}let ji=0;function qi(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function Zi(e){const t=new Ki,r=function(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let r;switch(t.type){case"DirectionalLight":case"SpotLight":r={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new n};break;case"PointLight":r={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new n,shadowCameraNear:1,shadowCameraFar:1e3}}return e[t.id]=r,r}}}(),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 i);const o=new i,s=new g,l=new g;return{setup:function(n){let i=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;n.sort(qi);for(let e=0,E=n.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=wn.LTC_FLOAT_1,a.rectAreaLTC2=wn.LTC_FLOAT_2):(a.rectAreaLTC1=wn.LTC_HALF_1,a.rectAreaLTC2=wn.LTC_HALF_2)),a.ambient[0]=i,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=ji++)},setupView:function(e,t){let n=0,r=0,i=0,c=0,d=0;const u=t.matrixWorldInverse;for(let t=0,f=e.length;t=i.length?(a=new $i(e),i.push(a)):a=i[r],a},dispose:function(){t=new WeakMap}}}function Ji(e,t,r){let i=new ge;const a=new n,s=new n,c=new k,u=new ve({depthPacking:Ee}),f=new Se,p={},h=r.maxTextureSize,_={[m]:d,[d]:m,[me]:me},g=new l({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new n},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;\n#include \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 = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\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 = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\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( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),v=g.clone();v.defines.HORIZONTAL_PASS=1;const E=new w;E.setAttribute("position",new y(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const S=new o(E,g),T=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=ie;let M=this.type;function x(n,r){const i=t.update(S);g.defines.VSM_SAMPLES!==n.blurSamples&&(g.defines.VSM_SAMPLES=n.blurSamples,v.defines.VSM_SAMPLES=n.blurSamples,g.needsUpdate=!0,v.needsUpdate=!0),null===n.mapPass&&(n.mapPass=new I(a.x,a.y)),g.uniforms.shadow_pass.value=n.map.texture,g.uniforms.resolution.value=n.mapSize,g.uniforms.radius.value=n.radius,e.setRenderTarget(n.mapPass),e.clear(),e.renderBufferDirect(r,null,i,g,S,null),v.uniforms.shadow_pass.value=n.mapPass.texture,v.uniforms.resolution.value=n.mapSize,v.uniforms.radius.value=n.radius,e.setRenderTarget(n.map),e.clear(),e.renderBufferDirect(r,null,i,v,S,null)}function R(t,n,r,i){let a=null;const o=!0===r.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)a=o;else if(a=!0===r.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){const e=a.uuid,t=n.uuid;let r=p[e];void 0===r&&(r={},p[e]=r);let i=r[t];void 0===i&&(i=a.clone(),r[t]=i,n.addEventListener("dispose",b)),a=i}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=i===oe?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:_[n.side],a.alphaMap=n.alphaMap,a.alphaTest=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===r.isPointLight&&!0===a.isMeshDistanceMaterial){e.properties.get(a).light=r}return a}function A(n,r,a,o,s){if(!1===n.visible)return;if(n.layers.test(r.layers)&&(n.isMesh||n.isLine||n.isPoints)&&(n.castShadow||n.receiveShadow&&s===oe)&&(!n.frustumCulled||i.intersectsObject(n))){n.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,n.matrixWorld);const i=t.update(n),l=n.material;if(Array.isArray(l)){const t=i.groups;for(let c=0,d=t.length;ch||a.y>h)&&(a.x>h&&(s.x=Math.floor(h/m.x),a.x=s.x*m.x,d.mapSize.x=s.x),a.y>h&&(s.y=Math.floor(h/m.y),a.y=s.y*m.y,d.mapSize.y=s.y)),null===d.map||!0===f||!0===p){const e=this.type!==oe?{minFilter:Te,magFilter:Te}:{};null!==d.map&&d.map.dispose(),d.map=new I(a.x,a.y,e),d.map.texture.name=l.name+".shadowMap",d.camera.updateProjectionMatrix()}e.setRenderTarget(d.map),e.clear();const _=d.getViewportCount();for(let e=0;e<_;e++){const t=d.getViewport(e);c.set(s.x*t.x,s.y*t.y,s.x*t.z,s.y*t.w),u.viewport(c),d.updateMatrices(l,e),i=d.getFrustum(),A(n,r,d.camera,l,this.type)}!0!==d.isPointLightShadow&&this.type===oe&&x(d,r),d.needsUpdate=!1}M=this.type,T.needsUpdate=!1,e.setRenderTarget(o,l,d)}}const ea={[et]:Je,[Qe]:qe,[$e]:je,[Me]:Ze,[Je]:et,[qe]:Qe,[je]:$e,[Ze]:Me};function ta(t,n){const r=new function(){let e=!1;const n=new k;let r=null;const i=new k(0,0,0,0);return{setMask:function(n){r===n||e||(t.colorMask(n,n,n,n),r=n)},setLocked:function(t){e=t},setClear:function(e,r,a,o,s){!0===s&&(e*=o,r*=o,a*=o),n.set(e,r,a,o),!1===i.equals(n)&&(t.clearColor(e,r,a,o),i.copy(n))},reset:function(){e=!1,r=null,i.set(-1,0,0,0)}}},i=new function(){let e=!1,r=!1,i=null,a=null,o=null;return{setReversed:function(e){if(r!==e){const e=n.get("EXT_clip_control");r?e.clipControlEXT(e.LOWER_LEFT_EXT,e.ZERO_TO_ONE_EXT):e.clipControlEXT(e.LOWER_LEFT_EXT,e.NEGATIVE_ONE_TO_ONE_EXT);const t=o;o=null,this.setClear(t)}r=e},getReversed:function(){return r},setTest:function(e){e?W(t.DEPTH_TEST):X(t.DEPTH_TEST)},setMask:function(n){i===n||e||(t.depthMask(n),i=n)},setFunc:function(e){if(r&&(e=ea[e]),a!==e){switch(e){case et:t.depthFunc(t.NEVER);break;case Je:t.depthFunc(t.ALWAYS);break;case Qe:t.depthFunc(t.LESS);break;case Me:t.depthFunc(t.LEQUAL);break;case $e:t.depthFunc(t.EQUAL);break;case Ze:t.depthFunc(t.GEQUAL);break;case qe:t.depthFunc(t.GREATER);break;case je:t.depthFunc(t.NOTEQUAL);break;default:t.depthFunc(t.LEQUAL)}a=e}},setLocked:function(t){e=t},setClear:function(e){o!==e&&(r&&(e=1-e),t.clearDepth(e),o=e)},reset:function(){e=!1,i=null,a=null,o=null,r=!1}}},a=new function(){let e=!1,n=null,r=null,i=null,a=null,o=null,s=null,l=null,c=null;return{setTest:function(n){e||(n?W(t.STENCIL_TEST):X(t.STENCIL_TEST))},setMask:function(r){n===r||e||(t.stencilMask(r),n=r)},setFunc:function(e,n,o){r===e&&i===n&&a===o||(t.stencilFunc(e,n,o),r=e,i=n,a=o)},setOp:function(e,n,r){o===e&&s===n&&l===r||(t.stencilOp(e,n,r),o=e,s=n,l=r)},setLocked:function(t){e=t},setClear:function(e){c!==e&&(t.clearStencil(e),c=e)},reset:function(){e=!1,n=null,r=null,i=null,a=null,o=null,s=null,l=null,c=null}}},o=new WeakMap,s=new WeakMap;let l={},c={},u=new WeakMap,f=[],p=null,m=!1,h=null,_=null,g=null,v=null,E=null,S=null,T=null,M=new e(0,0,0),x=0,R=!1,A=null,b=null,C=null,L=null,P=null;const U=t.getParameter(t.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let D=!1,w=0;const y=t.getParameter(t.VERSION);-1!==y.indexOf("WebGL")?(w=parseFloat(/^WebGL (\d)/.exec(y)[1]),D=w>=1):-1!==y.indexOf("OpenGL ES")&&(w=parseFloat(/^OpenGL ES (\d)/.exec(y)[1]),D=w>=2);let I=null,O={};const F=t.getParameter(t.SCISSOR_BOX),B=t.getParameter(t.VIEWPORT),H=(new k).fromArray(F),G=(new k).fromArray(B);function V(e,n,r,i){const a=new Uint8Array(4),o=t.createTexture();t.bindTexture(e,o),t.texParameteri(e,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(e,t.TEXTURE_MAG_FILTER,t.NEAREST);for(let o=0;on||i.height>n)&&(r=n/Math.max(i.width,i.height)),r<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(r*i.width),a=Math.floor(r*i.height);void 0===m&&(m=g(n,a));const o=t?g(n,a):m;o.width=n,o.height=a;return o.getContext("2d").drawImage(e,0,0,n,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+i.width+"x"+i.height+") to ("+n+"x"+a+")."),o}return"data"in e&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+i.width+"x"+i.height+")."),e}return e}function S(e){return e.generateMipmaps}function x(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 A(n,r,i,a,o=!1){if(null!==n){if(void 0!==e[n])return e[n];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+n+"'")}let s=r;if(r===e.RED&&(i===e.FLOAT&&(s=e.R32F),i===e.HALF_FLOAT&&(s=e.R16F),i===e.UNSIGNED_BYTE&&(s=e.R8)),r===e.RED_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.R8UI),i===e.UNSIGNED_SHORT&&(s=e.R16UI),i===e.UNSIGNED_INT&&(s=e.R32UI),i===e.BYTE&&(s=e.R8I),i===e.SHORT&&(s=e.R16I),i===e.INT&&(s=e.R32I)),r===e.RG&&(i===e.FLOAT&&(s=e.RG32F),i===e.HALF_FLOAT&&(s=e.RG16F),i===e.UNSIGNED_BYTE&&(s=e.RG8)),r===e.RG_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.RG8UI),i===e.UNSIGNED_SHORT&&(s=e.RG16UI),i===e.UNSIGNED_INT&&(s=e.RG32UI),i===e.BYTE&&(s=e.RG8I),i===e.SHORT&&(s=e.RG16I),i===e.INT&&(s=e.RG32I)),r===e.RGB_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.RGB8UI),i===e.UNSIGNED_SHORT&&(s=e.RGB16UI),i===e.UNSIGNED_INT&&(s=e.RGB32UI),i===e.BYTE&&(s=e.RGB8I),i===e.SHORT&&(s=e.RGB16I),i===e.INT&&(s=e.RGB32I)),r===e.RGBA_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.RGBA8UI),i===e.UNSIGNED_SHORT&&(s=e.RGBA16UI),i===e.UNSIGNED_INT&&(s=e.RGBA32UI),i===e.BYTE&&(s=e.RGBA8I),i===e.SHORT&&(s=e.RGBA16I),i===e.INT&&(s=e.RGBA32I)),r===e.RGB&&i===e.UNSIGNED_INT_5_9_9_9_REV&&(s=e.RGB9_E5),r===e.RGBA){const t=o?se:u.getTransfer(a);i===e.FLOAT&&(s=e.RGBA32F),i===e.HALF_FLOAT&&(s=e.RGBA16F),i===e.UNSIGNED_BYTE&&(s=t===f?e.SRGB8_ALPHA8:e.RGBA8),i===e.UNSIGNED_SHORT_4_4_4_4&&(s=e.RGBA4),i===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||t.get("EXT_color_buffer_float"),s}function b(t,n){let r;return t?null===n||n===St||n===Tt?r=e.DEPTH24_STENCIL8:n===M?r=e.DEPTH32F_STENCIL8:n===Mt&&(r=e.DEPTH24_STENCIL8,console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===St||n===Tt?r=e.DEPTH_COMPONENT24:n===M?r=e.DEPTH_COMPONENT32F:n===Mt&&(r=e.DEPTH_COMPONENT16),r}function C(e,t){return!0===S(e)||e.isFramebufferTexture&&e.minFilter!==Te&&e.minFilter!==F?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=i.get(e);if(void 0===t.__webglInit)return;const n=e.source,r=h.get(n);if(r){const i=r[t.__cacheKey];i.usedTimes--,0===i.usedTimes&&U(e),0===Object.keys(r).length&&h.delete(n)}i.remove(e)}(t),t.isVideoTexture&&p.delete(t)}function P(t){const n=t.target;n.removeEventListener("dispose",P),function(t){const n=i.get(t);t.depthTexture&&(t.depthTexture.dispose(),i.remove(t.depthTexture));if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(n.__webglFramebuffer[t]))for(let r=0;r0&&a.__version!==t.version){const e=t.image;if(null===e)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==e.complete)return void G(a,t,n);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}r.bindTexture(e.TEXTURE_2D,a.__webglTexture,e.TEXTURE0+n)}const y={[rt]:e.REPEAT,[it]:e.CLAMP_TO_EDGE,[at]:e.MIRRORED_REPEAT},I={[Te]:e.NEAREST,[ot]:e.NEAREST_MIPMAP_NEAREST,[st]:e.NEAREST_MIPMAP_LINEAR,[F]:e.LINEAR,[lt]:e.LINEAR_MIPMAP_NEAREST,[ct]:e.LINEAR_MIPMAP_LINEAR},N={[dt]:e.NEVER,[ut]:e.ALWAYS,[ft]:e.LESS,[X]:e.LEQUAL,[pt]:e.EQUAL,[mt]:e.GEQUAL,[ht]:e.GREATER,[_t]:e.NOTEQUAL};function O(n,r){if(r.type!==M||!1!==t.has("OES_texture_float_linear")||r.magFilter!==F&&r.magFilter!==lt&&r.magFilter!==st&&r.magFilter!==ct&&r.minFilter!==F&&r.minFilter!==lt&&r.minFilter!==st&&r.minFilter!==ct||console.warn("THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),e.texParameteri(n,e.TEXTURE_WRAP_S,y[r.wrapS]),e.texParameteri(n,e.TEXTURE_WRAP_T,y[r.wrapT]),n!==e.TEXTURE_3D&&n!==e.TEXTURE_2D_ARRAY||e.texParameteri(n,e.TEXTURE_WRAP_R,y[r.wrapR]),e.texParameteri(n,e.TEXTURE_MAG_FILTER,I[r.magFilter]),e.texParameteri(n,e.TEXTURE_MIN_FILTER,I[r.minFilter]),r.compareFunction&&(e.texParameteri(n,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(n,e.TEXTURE_COMPARE_FUNC,N[r.compareFunction])),!0===t.has("EXT_texture_filter_anisotropic")){if(r.magFilter===Te)return;if(r.minFilter!==st&&r.minFilter!==ct)return;if(r.type===M&&!1===t.has("OES_texture_float_linear"))return;if(r.anisotropy>1||i.get(r).__currentAnisotropy){const o=t.get("EXT_texture_filter_anisotropic");e.texParameterf(n,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(r.anisotropy,a.getMaxAnisotropy())),i.get(r).__currentAnisotropy=r.anisotropy}}}function H(t,n){let r=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",L));const i=n.source;let a=h.get(i);void 0===a&&(a={},h.set(i,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++,r=!0),a[o].usedTimes++;const i=a[t.__cacheKey];void 0!==i&&(a[t.__cacheKey].usedTimes--,0===i.usedTimes&&U(n)),t.__cacheKey=o,t.__webglTexture=a[o].texture}return r}function G(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=H(t,n),d=n.source;r.bindTexture(l,t.__webglTexture,e.TEXTURE0+s);const f=i.get(d);if(d.version!==f.__version||!0===c){r.activeTexture(e.TEXTURE0+s);const t=u.getPrimaries(u.workingColorSpace),i=n.colorSpace===gt?null:u.getPrimaries(n.colorSpace),p=n.colorSpace===gt||t===i?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,p);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=A(n.internalFormat,h,_,n.colorSpace,n.isVideoTexture);O(l,n);const M=n.mipmaps,R=!0!==n.isVideoTexture,L=void 0===f.__version||!0===c,P=d.dataReady,U=C(n,m);if(n.isDepthTexture)T=b(n.format===vt,n.type),L&&(R?r.texStorage2D(e.TEXTURE_2D,1,T,m.width,m.height):r.texImage2D(e.TEXTURE_2D,0,T,m.width,m.height,0,h,_,null));else if(n.isDataTexture)if(M.length>0){R&&L&&r.texStorage2D(e.TEXTURE_2D,U,T,M[0].width,M[0].height);for(let t=0,n=M.length;t0){const i=Et(g.width,g.height,n.format,n.type);for(const a of n.layerUpdates){const n=g.data.subarray(a*i/g.data.BYTES_PER_ELEMENT,(a+1)*i/g.data.BYTES_PER_ELEMENT);r.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,a,g.width,g.height,1,h,n)}n.clearLayerUpdates()}else r.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,g.data)}else r.compressedTexImage3D(e.TEXTURE_2D_ARRAY,t,T,g.width,g.height,m.depth,0,g.data,0,0);else console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else R?P&&r.texSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,_,g.data):r.texImage3D(e.TEXTURE_2D_ARRAY,t,T,g.width,g.height,m.depth,0,h,_,g.data)}else{R&&L&&r.texStorage2D(e.TEXTURE_2D,U,T,M[0].width,M[0].height);for(let t=0,i=M.length;t0){const t=Et(m.width,m.height,n.format,n.type);for(const i of n.layerUpdates){const n=m.data.subarray(i*t/m.data.BYTES_PER_ELEMENT,(i+1)*t/m.data.BYTES_PER_ELEMENT);r.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,i,m.width,m.height,1,h,_,n)}n.clearLayerUpdates()}else r.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)}else r.texImage3D(e.TEXTURE_2D_ARRAY,0,T,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isData3DTexture)R?(L&&r.texStorage3D(e.TEXTURE_3D,U,T,m.width,m.height,m.depth),P&&r.texSubImage3D(e.TEXTURE_3D,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)):r.texImage3D(e.TEXTURE_3D,0,T,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isFramebufferTexture){if(L)if(R)r.texStorage2D(e.TEXTURE_2D,U,T,m.width,m.height);else{let t=m.width,n=m.height;for(let i=0;i>=1,n>>=1}}else if(M.length>0){if(R&&L){const t=Z(M[0]);r.texStorage2D(e.TEXTURE_2D,U,T,t.width,t.height)}for(let t=0,n=M.length;t>d),i=Math.max(1,n.height>>d);c===e.TEXTURE_3D||c===e.TEXTURE_2D_ARRAY?r.texImage3D(c,d,p,t,i,n.depth,0,u,f,null):r.texImage2D(c,d,p,t,i,0,u,f,null)}r.bindFramebuffer(e.FRAMEBUFFER,t),j(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,K(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),r.bindFramebuffer(e.FRAMEBUFFER,null)}function z(t,n,r){if(e.bindRenderbuffer(e.RENDERBUFFER,t),n.depthBuffer){const i=n.depthTexture,a=i&&i.isDepthTexture?i.type:null,o=b(n.stencilBuffer,a),s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,c=K(n);j(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,c,o,n.width,n.height):r?e.renderbufferStorageMultisample(e.RENDERBUFFER,c,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 i=0;i{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)throw new Error("target.depthTexture not supported in Cube render targets");!function(t,n){if(n&&n.isWebGLCubeRenderTarget)throw new Error("Depth Texture with cube render targets is not supported");if(r.bindFramebuffer(e.FRAMEBUFFER,t),!n.depthTexture||!n.depthTexture.isDepthTexture)throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");const a=i.get(n.depthTexture);a.__renderTarget=n,a.__webglTexture&&n.depthTexture.image.width===n.width&&n.depthTexture.image.height===n.height||(n.depthTexture.image.width=n.width,n.depthTexture.image.height=n.height,n.depthTexture.needsUpdate=!0),w(n.depthTexture,0);const o=a.__webglTexture,s=K(n);if(n.depthTexture.format===xt)j(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,o,0,s):e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,o,0);else{if(n.depthTexture.format!==vt)throw new Error("Unknown depthTexture format");j(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.TEXTURE_2D,o,0,s):e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.TEXTURE_2D,o,0)}}(n.__webglFramebuffer,t)}else if(a){n.__webglDepthbuffer=[];for(let i=0;i<6;i++)if(r.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[i]),void 0===n.__webglDepthbuffer[i])n.__webglDepthbuffer[i]=e.createRenderbuffer(),z(n.__webglDepthbuffer[i],t,!1);else{const r=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,a=n.__webglDepthbuffer[i];e.bindRenderbuffer(e.RENDERBUFFER,a),e.framebufferRenderbuffer(e.FRAMEBUFFER,r,e.RENDERBUFFER,a)}}else if(r.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer),void 0===n.__webglDepthbuffer)n.__webglDepthbuffer=e.createRenderbuffer(),z(n.__webglDepthbuffer,t,!1);else{const r=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,i=n.__webglDepthbuffer;e.bindRenderbuffer(e.RENDERBUFFER,i),e.framebufferRenderbuffer(e.FRAMEBUFFER,r,e.RENDERBUFFER,i)}r.bindFramebuffer(e.FRAMEBUFFER,null)}const W=[],Y=[];function K(e){return Math.min(a.maxSamples,e.samples)}function j(e){const n=i.get(e);return e.samples>0&&!0===t.has("WEBGL_multisampled_render_to_texture")&&!1!==n.__useRenderToTexture}function q(e,t){const n=e.colorSpace,r=e.format,i=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==B&&n!==gt&&(u.getTransfer(n)===f?r===E&&i===T||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",n)),t}function Z(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=D;return e>=a.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+a.maxTextures),D+=1,e},this.resetTextureUnits=function(){D=0},this.setTexture2D=w,this.setTexture2DArray=function(t,n){const a=i.get(t);t.version>0&&a.__version!==t.version?G(a,t,n):r.bindTexture(e.TEXTURE_2D_ARRAY,a.__webglTexture,e.TEXTURE0+n)},this.setTexture3D=function(t,n){const a=i.get(t);t.version>0&&a.__version!==t.version?G(a,t,n):r.bindTexture(e.TEXTURE_3D,a.__webglTexture,e.TEXTURE0+n)},this.setTextureCube=function(t,n){const s=i.get(t);t.version>0&&s.__version!==t.version?function(t,n,s){if(6!==n.image.length)return;const l=H(t,n),c=n.source;r.bindTexture(e.TEXTURE_CUBE_MAP,t.__webglTexture,e.TEXTURE0+s);const d=i.get(c);if(c.version!==d.__version||!0===l){r.activeTexture(e.TEXTURE0+s);const t=u.getPrimaries(u.workingColorSpace),i=n.colorSpace===gt?null:u.getPrimaries(n.colorSpace),f=n.colorSpace===gt||t===i?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);const p=n.isCompressedTexture||n.image[0].isCompressedTexture,m=n.image[0]&&n.image[0].isDataTexture,h=[];for(let e=0;e<6;e++)h[e]=p||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=A(n.internalFormat,g,T,n.colorSpace),R=!0!==n.isVideoTexture,b=void 0===d.__version||!0===l,L=c.dataReady;let P,U=C(n,_);if(O(e.TEXTURE_CUBE_MAP,n),p){R&&b&&r.texStorage2D(e.TEXTURE_CUBE_MAP,U,M,_.width,_.height);for(let t=0;t<6;t++){P=h[t].mipmaps;for(let i=0;i0&&U++;const t=Z(h[0]);r.texStorage2D(e.TEXTURE_CUBE_MAP,U,M,t.width,t.height)}for(let t=0;t<6;t++)if(m){R?L&&r.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,h[t].width,h[t].height,g,T,h[t].data):r.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 r=0;r0){a.__webglFramebuffer=[];for(let t=0;t0&&!1===j(t)){a.__webglMultisampledFramebuffer=e.createFramebuffer(),a.__webglColorRenderbuffer=[],r.bindFramebuffer(e.FRAMEBUFFER,a.__webglMultisampledFramebuffer);for(let n=0;n0)for(let i=0;i0)for(let r=0;r0)if(!1===j(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=i.get(t),u=n.length>1;if(u)for(let t=0;t= 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 p(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class aa extends vn{constructor(e,t){super();const r=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 _=new ia,g=t.getContextAttributes();let v=null,S=null;const M=[],x=[],R=new n;let A=null;const b=new P;b.viewport=new k;const C=new P;C.viewport=new k;const L=[b,C],U=new En;let D=null,w=null;function y(e){const t=x.indexOf(e.inputSource);if(-1===t)return;const n=M[t];void 0!==n&&(n.update(e.inputSource,e.frame,d||s),n.dispatchEvent({type:e.type,data:e.inputSource}))}function N(){a.removeEventListener("select",y),a.removeEventListener("selectstart",y),a.removeEventListener("selectend",y),a.removeEventListener("squeeze",y),a.removeEventListener("squeezestart",y),a.removeEventListener("squeezeend",y),a.removeEventListener("end",N),a.removeEventListener("inputsourceschange",O);for(let e=0;e=0&&(x[r]=null,M[r].disconnect(n))}for(let t=0;t=x.length){x.push(n),r=e;break}if(null===x[e]){x[e]=n,r=e;break}}if(-1===r)break}const i=M[r];i&&i.connect(n)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(e){let t=M[e];return void 0===t&&(t=new Sn,M[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=M[e];return void 0===t&&(t=new Sn,M[e]=t),t.getGripSpace()},this.getHand=function(e){let t=M[e];return void 0===t&&(t=new Sn,M[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){o=e,!0===r.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){l=e,!0===r.isPresenting&&console.warn("THREE.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 f},this.getFrame=function(){return h},this.getSession=function(){return a},this.setSession=async function(n){if(a=n,null!==a){v=e.getRenderTarget(),a.addEventListener("select",y),a.addEventListener("selectstart",y),a.addEventListener("selectend",y),a.addEventListener("squeeze",y),a.addEventListener("squeezestart",y),a.addEventListener("squeezeend",y),a.addEventListener("end",N),a.addEventListener("inputsourceschange",O),!0!==g.xrCompatible&&await t.makeXRCompatible(),A=e.getPixelRatio(),e.getSize(R);if("undefined"!=typeof XRWebGLBinding&&"createProjectionLayer"in XRWebGLBinding.prototype){let n=null,r=null,i=null;g.depth&&(i=g.stencil?t.DEPTH24_STENCIL8:t.DEPTH_COMPONENT24,n=g.stencil?vt:xt,r=g.stencil?Tt:St);const s={colorFormat:t.RGBA8,depthFormat:i,scaleFactor:o};f=new XRWebGLBinding(a,t),p=f.createProjectionLayer(s),a.updateRenderState({layers:[p]}),e.setPixelRatio(1),e.setSize(p.textureWidth,p.textureHeight,!1),S=new I(p.textureWidth,p.textureHeight,{format:E,type:T,depthTexture:new K(p.textureWidth,p.textureHeight,r,void 0,void 0,void 0,void 0,void 0,void 0,n),stencilBuffer:g.stencil,colorSpace:e.outputColorSpace,samples:g.antialias?4:0,resolveDepthBuffer:!1===p.ignoreDepthValues})}else{const n={antialias:g.antialias,alpha:!0,depth:g.depth,stencil:g.stencil,framebufferScaleFactor:o};m=new XRWebGLLayer(a,t,n),a.updateRenderState({baseLayer:m}),e.setPixelRatio(1),e.setSize(m.framebufferWidth,m.framebufferHeight,!1),S=new I(m.framebufferWidth,m.framebufferHeight,{format:E,type:T,colorSpace:e.outputColorSpace,stencilBuffer:g.stencil})}S.isXRRenderTarget=!0,this.setFoveation(c),d=null,s=await a.requestReferenceSpace(l),V.setContext(a),V.start(),r.isPresenting=!0,r.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==a)return a.environmentBlendMode},this.getDepthTexture=function(){return _.getDepthTexture()};const F=new i,B=new i;function H(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!==_.texture&&(_.depthNear>0&&(t=_.depthNear),_.depthFar>0&&(n=_.depthFar)),U.near=C.near=b.near=t,U.far=C.far=b.far=n,D===U.near&&w===U.far||(a.updateRenderState({depthNear:U.near,depthFar:U.far}),D=U.near,w=U.far),b.layers.mask=2|e.layers.mask,C.layers.mask=4|e.layers.mask,U.layers.mask=b.layers.mask|C.layers.mask;const r=e.parent,i=U.cameras;H(U,r);for(let e=0;e0&&(e.alphaTest.value=r.alphaTest);const i=t.get(r),a=i.envMap,o=i.envMapRotation;a&&(e.envMap.value=a,oa.copy(o),oa.x*=-1,oa.y*=-1,oa.z*=-1,a.isCubeTexture&&!1===a.isRenderTargetTexture&&(oa.y*=-1,oa.z*=-1),e.envMapRotation.value.setFromMatrix4(sa.makeRotationFromEuler(oa)),e.flipEnvMap.value=a.isCubeTexture&&!1===a.isRenderTargetTexture?-1:1,e.reflectivity.value=r.reflectivity,e.ior.value=r.ior,e.refractionRatio.value=r.refractionRatio),r.lightMap&&(e.lightMap.value=r.lightMap,e.lightMapIntensity.value=r.lightMapIntensity,n(r.lightMap,e.lightMapTransform)),r.aoMap&&(e.aoMap.value=r.aoMap,e.aoMapIntensity.value=r.aoMapIntensity,n(r.aoMap,e.aoMapTransform))}return{refreshFogUniforms:function(t,n){n.color.getRGB(t.fogColor.value,h(e)),n.isFog?(t.fogNear.value=n.near,t.fogFar.value=n.far):n.isFogExp2&&(t.fogDensity.value=n.density)},refreshMaterialUniforms:function(e,i,a,o,s){i.isMeshBasicMaterial||i.isMeshLambertMaterial?r(e,i):i.isMeshToonMaterial?(r(e,i),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}(e,i)):i.isMeshPhongMaterial?(r(e,i),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4)}(e,i)):i.isMeshStandardMaterial?(r(e,i),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,i),i.isMeshPhysicalMaterial&&function(e,t,r){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===d&&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=r.texture,e.transmissionSamplerSize.value.set(r.width,r.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,i,s)):i.isMeshMatcapMaterial?(r(e,i),function(e,t){t.matcap&&(e.matcap.value=t.matcap)}(e,i)):i.isMeshDepthMaterial?r(e,i):i.isMeshDistanceMaterial?(r(e,i),function(e,n){const r=t.get(n).light;e.referencePosition.value.setFromMatrixPosition(r.matrixWorld),e.nearDistance.value=r.shadow.camera.near,e.farDistance.value=r.shadow.camera.far}(e,i)):i.isMeshNormalMaterial?r(e,i):i.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,i),i.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,i)):i.isPointsMaterial?function(e,t,r,i){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*r,e.scale.value=.5*i,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,i,a,o):i.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,i):i.isShadowMaterial?(e.color.value.copy(i.color),e.opacity.value=i.opacity):i.isShaderMaterial&&(i.uniformsNeedUpdate=!1)}}}function ca(e,t,n,r){let i={},a={},o=[];const s=e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS);function l(e,t,n,r){const i=e.value,a=t+"_"+n;if(void 0===r[a])return r[a]="number"==typeof i||"boolean"==typeof i?i:i.clone(),!0;{const e=r[a];if("number"==typeof i||"boolean"==typeof i){if(e!==i)return r[a]=i,!0}else if(!1===e.equals(i))return e.copy(i),!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?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",e),t}function d(t){const n=t.target;n.removeEventListener("dispose",d);const r=o.indexOf(n.__bindingPointIndex);o.splice(r,1),e.deleteBuffer(i[n.id]),delete i[n.id],delete a[n.id]}return{bind:function(e,t){const n=t.program;r.uniformBlockBinding(e,n)},update:function(n,u){let f=i[n.id];void 0===f&&(!function(e){const t=e.uniforms;let n=0;const r=16;for(let e=0,i=t.length;e0&&(n+=r-i);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=U;r.toneMapped&&(null!==w&&!0!==w.isXRRenderTarget||(m=C.toneMapping));const h=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,_=void 0!==h?h.length:0,g=fe.get(r),v=R.state.lights;if(!0===J&&(!0===ee||e!==N)){const t=e===N&&r.id===y;Ae.setState(r,e,t)}let E=!1;r.version===g.__version?g.needsLights&&g.lightsStateVersion!==v.state.version||g.outputColorSpace!==s||i.isBatchedMesh&&!1===g.batching?E=!0:i.isBatchedMesh||!0!==g.batching?i.isBatchedMesh&&!0===g.batchingColor&&null===i.colorTexture||i.isBatchedMesh&&!1===g.batchingColor&&null!==i.colorTexture||i.isInstancedMesh&&!1===g.instancing?E=!0:i.isInstancedMesh||!0!==g.instancing?i.isSkinnedMesh&&!1===g.skinning?E=!0:i.isSkinnedMesh||!0!==g.skinning?i.isInstancedMesh&&!0===g.instancingColor&&null===i.instanceColor||i.isInstancedMesh&&!1===g.instancingColor&&null!==i.instanceColor||i.isInstancedMesh&&!0===g.instancingMorph&&null===i.morphTexture||i.isInstancedMesh&&!1===g.instancingMorph&&null!==i.morphTexture||g.envMap!==l||!0===r.fog&&g.fog!==a?E=!0:void 0===g.numClippingPlanes||g.numClippingPlanes===Ae.numPlanes&&g.numIntersection===Ae.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=r.version);let S=g.currentProgram;!0===E&&(S=Qe(r,t,i));let T=!1,M=!1,x=!1;const A=S.getUniforms(),b=g.uniforms;de.useProgram(S.program)&&(T=!0,M=!0,x=!0);r.id!==y&&(y=r.id,M=!0);if(T||N!==e){de.buffers.depth.getReversed()?(te.copy(e.projectionMatrix),An(te),bn(te),A.setValue(Ie,"projectionMatrix",te)):A.setValue(Ie,"projectionMatrix",e.projectionMatrix),A.setValue(Ie,"viewMatrix",e.matrixWorldInverse);const t=A.map.cameraPosition;void 0!==t&&t.setValue(Ie,re.setFromMatrixPosition(e.matrixWorld)),ce.logarithmicDepthBuffer&&A.setValue(Ie,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(r.isMeshPhongMaterial||r.isMeshToonMaterial||r.isMeshLambertMaterial||r.isMeshBasicMaterial||r.isMeshStandardMaterial||r.isShaderMaterial)&&A.setValue(Ie,"isOrthographic",!0===e.isOrthographicCamera),N!==e&&(N=e,M=!0,x=!0)}if(i.isSkinnedMesh){A.setOptional(Ie,i,"bindMatrix"),A.setOptional(Ie,i,"bindMatrixInverse");const e=i.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),A.setValue(Ie,"boneTexture",e.boneTexture,pe))}i.isBatchedMesh&&(A.setOptional(Ie,i,"batchingTexture"),A.setValue(Ie,"batchingTexture",i._matricesTexture,pe),A.setOptional(Ie,i,"batchingIdTexture"),A.setValue(Ie,"batchingIdTexture",i._indirectTexture,pe),A.setOptional(Ie,i,"batchingColorTexture"),null!==i._colorsTexture&&A.setValue(Ie,"batchingColorTexture",i._colorsTexture,pe));const L=n.morphAttributes;void 0===L.position&&void 0===L.normal&&void 0===L.color||Le.update(i,n,S);(M||g.receiveShadow!==i.receiveShadow)&&(g.receiveShadow=i.receiveShadow,A.setValue(Ie,"receiveShadow",i.receiveShadow));r.isMeshGouraudMaterial&&null!==r.envMap&&(b.envMap.value=l,b.flipEnvMap.value=l.isCubeTexture&&!1===l.isRenderTargetTexture?-1:1);r.isMeshStandardMaterial&&null===r.envMap&&null!==t.environment&&(b.envMapIntensity.value=t.environmentIntensity);M&&(A.setValue(Ie,"toneMappingExposure",C.toneMappingExposure),g.needsLights&&(D=x,(P=b).ambientLightColor.needsUpdate=D,P.lightProbe.needsUpdate=D,P.directionalLights.needsUpdate=D,P.directionalLightShadows.needsUpdate=D,P.pointLights.needsUpdate=D,P.pointLightShadows.needsUpdate=D,P.spotLights.needsUpdate=D,P.spotLightShadows.needsUpdate=D,P.rectAreaLights.needsUpdate=D,P.hemisphereLights.needsUpdate=D),a&&!0===r.fog&&Me.refreshFogUniforms(b,a),Me.refreshMaterialUniforms(b,r,Y,X,R.state.transmissionRenderTarget[e.id]),gi.upload(Ie,Je(g),b,pe));var P,D;r.isShaderMaterial&&!0===r.uniformsNeedUpdate&&(gi.upload(Ie,Je(g),b,pe),r.uniformsNeedUpdate=!1);r.isSpriteMaterial&&A.setValue(Ie,"center",i.center);if(A.setValue(Ie,"modelViewMatrix",i.modelViewMatrix),A.setValue(Ie,"normalMatrix",i.normalMatrix),A.setValue(Ie,"modelMatrix",i.matrixWorld),r.isShaderMaterial||r.isRawShaderMaterial){const e=r.uniformsGroups;for(let t=0,n=e.length;t{function n(){r.forEach((function(e){fe.get(e).currentProgram.isReady()&&r.delete(e)})),0!==r.size?setTimeout(n,10):t(e)}null!==le.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)}))};let ke=null;function We(){Ye.stop()}function Xe(){Ye.start()}const Ye=new Pn;function Ke(e,t,n,r){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)R.pushLight(e),e.castShadow&&R.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||Q.intersectsSprite(e)){r&&ie.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ne);const t=Se.update(e),i=e.material;i.visible&&x.push(e,t,i,n,ie.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||Q.intersectsObject(e))){const t=Se.update(e),i=e.material;if(r&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),ie.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),ie.copy(t.boundingSphere.center)),ie.applyMatrix4(e.matrixWorld).applyMatrix4(ne)),Array.isArray(i)){const r=t.groups;for(let a=0,o=r.length;a0&&Ze(i,t,n),a.length>0&&Ze(a,t,n),o.length>0&&Ze(o,t,n),de.buffers.depth.setTest(!0),de.buffers.depth.setMask(!0),de.buffers.color.setMask(!0),de.setPolygonOffset(!1)}function qe(e,t,n,r){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;void 0===R.state.transmissionRenderTarget[r.id]&&(R.state.transmissionRenderTarget[r.id]=new I(1,1,{generateMipmaps:!0,type:le.has("EXT_color_buffer_half_float")||le.has("EXT_color_buffer_float")?S:T,minFilter:ct,samples:4,stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:u.workingColorSpace}));const i=R.state.transmissionRenderTarget[r.id],a=r.viewport||O;i.setSize(a.z*C.transmissionResolutionScale,a.w*C.transmissionResolutionScale);const s=C.getRenderTarget();C.setRenderTarget(i),C.getClearColor(V),z=C.getClearAlpha(),z<1&&C.setClearColor(16777215,.5),C.clear(),oe&&Ce.render(n);const l=C.toneMapping;C.toneMapping=U;const c=r.viewport;if(void 0!==r.viewport&&(r.viewport=void 0),R.setupLightsView(r),!0===J&&Ae.setGlobalState(C.clippingPlanes,r),Ze(e,n,r),pe.updateMultisampleRenderTarget(i),pe.updateRenderTargetMipmap(i),!1===le.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let i=0,a=t.length;i0)for(let t=0,a=n.length;t0&&qe(r,i,e,t),oe&&Ce.render(e),je(x,e,t);null!==w&&0===D&&(pe.updateMultisampleRenderTarget(w),pe.updateRenderTargetMipmap(w)),!0===e.isScene&&e.onAfterRender(C,e,t),we.resetDefaultState(),y=-1,N=null,b.pop(),b.length>0?(R=b[b.length-1],!0===J&&Ae.setGlobalState(C.clippingPlanes,R.state.camera)):R=null,A.pop(),x=A.length>0?A[A.length-1]:null},this.getActiveCubeFace=function(){return P},this.getActiveMipmapLevel=function(){return D},this.getRenderTarget=function(){return w},this.setRenderTargetTextures=function(e,t,n){fe.get(e.texture).__webglTexture=t,fe.get(e.depthTexture).__webglTexture=n;const r=fe.get(e);r.__hasExternalTextures=!0,r.__autoAllocateDepthBuffer=void 0===n,r.__autoAllocateDepthBuffer||!0===le.has("WEBGL_multisampled_render_to_texture")&&(console.warn("THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided"),r.__useRenderToTexture=!1)},this.setRenderTargetFramebuffer=function(e,t){const n=fe.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const tt=Ie.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){w=e,P=t,D=n;let r=!0,i=null,a=!1,o=!1;if(e){const s=fe.get(e);if(void 0!==s.__useDefaultFramebuffer)de.bindFramebuffer(Ie.FRAMEBUFFER,null),r=!1;else if(void 0===s.__webglFramebuffer)pe.setupRenderTarget(e);else if(s.__hasExternalTextures)pe.rebindTextures(e,fe.get(e.texture).__webglTexture,fe.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(s.__boundDepthTexture!==t){if(null!==t&&fe.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");pe.setupDepthRenderbuffer(e)}}const l=e.texture;(l.isData3DTexture||l.isDataArrayTexture||l.isCompressedArrayTexture)&&(o=!0);const c=fe.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(i=Array.isArray(c[t])?c[t][n]:c[t],a=!0):i=e.samples>0&&!1===pe.useMultisampledRTT(e)?fe.get(e).__webglMultisampledFramebuffer:Array.isArray(c)?c[n]:c,O.copy(e.viewport),F.copy(e.scissor),G=e.scissorTest}else O.copy(q).multiplyScalar(Y).floor(),F.copy(Z).multiplyScalar(Y).floor(),G=$;0!==n&&(i=tt);if(de.bindFramebuffer(Ie.FRAMEBUFFER,i)&&r&&de.drawBuffers(e,i),de.viewport(O),de.scissor(F),de.setScissorTest(G),a){const r=fe.get(e.texture);Ie.framebufferTexture2D(Ie.FRAMEBUFFER,Ie.COLOR_ATTACHMENT0,Ie.TEXTURE_CUBE_MAP_POSITIVE_X+t,r.__webglTexture,n)}else if(o){const r=fe.get(e.texture),i=t;Ie.framebufferTextureLayer(Ie.FRAMEBUFFER,Ie.COLOR_ATTACHMENT0,r.__webglTexture,n,i)}else if(null!==e&&0!==n){const t=fe.get(e.texture);Ie.framebufferTexture2D(Ie.FRAMEBUFFER,Ie.COLOR_ATTACHMENT0,Ie.TEXTURE_2D,t.__webglTexture,n)}y=-1},this.readRenderTargetPixels=function(e,t,n,r,i,a,o){if(!e||!e.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let s=fe.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(s=s[o]),s){de.bindFramebuffer(Ie.FRAMEBUFFER,s);try{const o=e.texture,s=o.format,l=o.type;if(!ce.textureFormatReadable(s))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!ce.textureTypeReadable(l))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");t>=0&&t<=e.width-r&&n>=0&&n<=e.height-i&&Ie.readPixels(t,n,r,i,De.convert(s),De.convert(l),a)}finally{const e=null!==w?fe.get(w).__webglFramebuffer:null;de.bindFramebuffer(Ie.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,r,i,a,o){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let s=fe.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(s=s[o]),s){const o=e.texture,l=o.format,c=o.type;if(!ce.textureFormatReadable(l))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ce.textureTypeReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");if(t>=0&&t<=e.width-r&&n>=0&&n<=e.height-i){de.bindFramebuffer(Ie.FRAMEBUFFER,s);const e=Ie.createBuffer();Ie.bindBuffer(Ie.PIXEL_PACK_BUFFER,e),Ie.bufferData(Ie.PIXEL_PACK_BUFFER,a.byteLength,Ie.STREAM_READ),Ie.readPixels(t,n,r,i,De.convert(l),De.convert(c),0);const o=null!==w?fe.get(w).__webglFramebuffer:null;de.bindFramebuffer(Ie.FRAMEBUFFER,o);const d=Ie.fenceSync(Ie.SYNC_GPU_COMMANDS_COMPLETE,0);return Ie.flush(),await Cn(Ie,d,4),Ie.bindBuffer(Ie.PIXEL_PACK_BUFFER,e),Ie.getBufferSubData(Ie.PIXEL_PACK_BUFFER,0,a),Ie.deleteBuffer(e),Ie.deleteSync(d),a}throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(e,t=null,n=0){!0!==e.isTexture&&(H("WebGLRenderer: copyFramebufferToTexture function signature has changed."),t=arguments[0]||null,e=arguments[1]);const r=Math.pow(2,-n),i=Math.floor(e.image.width*r),a=Math.floor(e.image.height*r),o=null!==t?t.x:0,s=null!==t?t.y:0;pe.setTexture2D(e,0),Ie.copyTexSubImage2D(Ie.TEXTURE_2D,n,0,0,o,s,i,a),de.unbindTexture()};const nt=Ie.createFramebuffer(),rt=Ie.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,r=null,i=0,a=null){let o,s,l,c,d,u,f,p,m;!0!==e.isTexture&&(H("WebGLRenderer: copyTextureToTexture function signature has changed."),r=arguments[0]||null,e=arguments[1],t=arguments[2],a=arguments[3]||0,n=null),null===a&&(0!==i?(H("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),a=i,i=0):a=0);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,-i);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!==r?(f=r.x,p=r.y,m=r.z):(f=0,p=0,m=0);const _=De.convert(t.format),g=De.convert(t.type);let v;t.isData3DTexture?(pe.setTexture3D(t,0),v=Ie.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(pe.setTexture2DArray(t,0),v=Ie.TEXTURE_2D_ARRAY):(pe.setTexture2D(t,0),v=Ie.TEXTURE_2D),Ie.pixelStorei(Ie.UNPACK_FLIP_Y_WEBGL,t.flipY),Ie.pixelStorei(Ie.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),Ie.pixelStorei(Ie.UNPACK_ALIGNMENT,t.unpackAlignment);const E=Ie.getParameter(Ie.UNPACK_ROW_LENGTH),S=Ie.getParameter(Ie.UNPACK_IMAGE_HEIGHT),T=Ie.getParameter(Ie.UNPACK_SKIP_PIXELS),M=Ie.getParameter(Ie.UNPACK_SKIP_ROWS),x=Ie.getParameter(Ie.UNPACK_SKIP_IMAGES);Ie.pixelStorei(Ie.UNPACK_ROW_LENGTH,h.width),Ie.pixelStorei(Ie.UNPACK_IMAGE_HEIGHT,h.height),Ie.pixelStorei(Ie.UNPACK_SKIP_PIXELS,c),Ie.pixelStorei(Ie.UNPACK_SKIP_ROWS,d),Ie.pixelStorei(Ie.UNPACK_SKIP_IMAGES,u);const R=e.isDataArrayTexture||e.isData3DTexture,A=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=fe.get(e),r=fe.get(t),h=fe.get(n.__renderTarget),_=fe.get(r.__renderTarget);de.bindFramebuffer(Ie.READ_FRAMEBUFFER,h.__webglFramebuffer),de.bindFramebuffer(Ie.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;n nodeObject( new SplitNode( nodeObject( node addMethodChaining( 'element', element ); addMethodChaining( 'convert', convert ); +/** @module ArrayNode **/ + +/** + * ArrayNode represents a collection of nodes, typically created using the {@link module:TSL~array} function. + * ```js + * const colors = array( [ + * vec3( 1, 0, 0 ), + * vec3( 0, 1, 0 ), + * vec3( 0, 0, 1 ) + * ] ); + * + * const redColor = tintColors.element( 0 ); + * + * @augments Node + */ +class ArrayNode extends TempNode { + + static get type() { + + return 'ArrayNode'; + + } + + /** + * Constructs a new array node. + * + * @param {String} [nodeType] - The data type of the elements. + * @param {Number} [count] - Size of the array. + * @param {Array?} [values=null] - Array default values. + */ + constructor( nodeType, count, values = null ) { + + super( nodeType ); + + /** + * Array size. + * + * @type {Array} + */ + this.count = count; + + /** + * Array default values. + * + * @type {Array} + */ + this.values = values; + + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ + this.isArrayNode = true; + + } + + getNodeType( builder ) { + + if ( this.nodeType === null ) { + + this.nodeType = this.values[ 0 ].getNodeType( builder ); + + } + + return this.nodeType; + + } + + getElementType( builder ) { + + return this.getNodeType( builder ); + + } + + generate( builder ) { + + const type = this.getNodeType( builder ); + + return builder.generateArray( type, this.count, this.values ); + + } + +} + +/** + * TSL function for creating an array node. + * + * @function + * @param {String|Array} nodeTypeOrValues - A string representing the element type (e.g., 'vec3') + * or an array containing the default values (e.g., [ vec3() ]). + * @param {Number?} [count] - Size of the array. + * @returns {ArrayNode} + */ +const array = ( ...params ) => { + + let node; + + if ( params.length === 1 ) { + + const values = params[ 0 ]; + + node = new ArrayNode( null, values.length, values ); + + } else { + + const nodeType = params[ 0 ]; + const count = params[ 1 ]; + + node = new ArrayNode( nodeType, count ); + + } + + return nodeObject( node ); + +}; + +addMethodChaining( 'toArray', ( node, count ) => array( Array( count ).fill( node ) ) ); + /** @module UniformGroupNode **/ /** @@ -4485,23 +4615,39 @@ class OperatorNode extends TempNode { } else { - if ( typeA === 'float' && builder.isMatrix( typeB ) ) { + // Handle matrix operations + if ( builder.isMatrix( typeA ) ) { - return typeB; + if ( typeB === 'float' ) { - } else if ( builder.isMatrix( typeA ) && builder.isVector( typeB ) ) { + return typeA; // matrix * scalar = matrix - // matrix x vector + } else if ( builder.isVector( typeB ) ) { - return builder.getVectorFromMatrix( typeA ); + return builder.getVectorFromMatrix( typeA ); // matrix * vector - } else if ( builder.isVector( typeA ) && builder.isMatrix( typeB ) ) { + } else if ( builder.isMatrix( typeB ) ) { - // vector x matrix + return typeA; // matrix * matrix - return builder.getVectorFromMatrix( typeB ); + } + + } else if ( builder.isMatrix( typeB ) ) { + + if ( typeA === 'float' ) { + + return typeB; // scalar * matrix = matrix - } else if ( builder.getTypeLength( typeB ) > builder.getTypeLength( typeA ) ) { + } else if ( builder.isVector( typeA ) ) { + + return builder.getVectorFromMatrix( typeB ); // vector * matrix + + } + + } + + // Handle non-matrix cases + if ( builder.getTypeLength( typeB ) > builder.getTypeLength( typeA ) ) { // anytype x anytype: use the greater length vector @@ -4549,17 +4695,41 @@ class OperatorNode extends TempNode { typeA = type; typeB = builder.changeComponentType( typeB, 'uint' ); - } else if ( builder.isMatrix( typeA ) && builder.isVector( typeB ) ) { + } else if ( builder.isMatrix( typeA ) ) { + + if ( typeB === 'float' ) { + + // Keep matrix type for typeA, but ensure typeB stays float + typeB = 'float'; + + } else if ( builder.isVector( typeB ) ) { - // matrix x vector + // matrix x vector + typeB = builder.getVectorFromMatrix( typeA ); + + } else if ( builder.isMatrix( typeB ) ) ; else { + + typeA = typeB = type; + + } - typeB = builder.getVectorFromMatrix( typeA ); + } else if ( builder.isMatrix( typeB ) ) { - } else if ( builder.isVector( typeA ) && builder.isMatrix( typeB ) ) { + if ( typeA === 'float' ) { - // vector x matrix + // Keep matrix type for typeB, but ensure typeA stays float + typeA = 'float'; - typeA = builder.getVectorFromMatrix( typeB ); + } else if ( builder.isVector( typeA ) ) { + + // vector x matrix + typeA = builder.getVectorFromMatrix( typeB ); + + } else { + + typeA = typeB = type; + + } } else { @@ -4641,7 +4811,20 @@ class OperatorNode extends TempNode { } else { - return builder.format( `( ${ a } ${ op } ${ b } )`, type, output ); + // Handle matrix operations + if ( builder.isMatrix( typeA ) && typeB === 'float' ) { + + return builder.format( `( ${ b } ${ op } ${ a } )`, type, output ); + + } else if ( typeA === 'float' && builder.isMatrix( typeB ) ) { + + return builder.format( `${ a } ${ op } ${ b }`, type, output ); + + } else { + + return builder.format( `( ${ a } ${ op } ${ b } )`, type, output ); + + } } @@ -4653,7 +4836,15 @@ class OperatorNode extends TempNode { } else { - return builder.format( `${ a } ${ op } ${ b }`, type, output ); + if ( builder.isMatrix( typeA ) && typeB === 'float' ) { + + return builder.format( `${ b } ${ op } ${ a }`, type, output ); + + } else { + + return builder.format( `${ a } ${ op } ${ b }`, type, output ); + + } } @@ -6392,6 +6583,12 @@ class VarNode extends Node { } + getElementType( builder ) { + + return this.node.getElementType( builder ); + + } + getNodeType( builder ) { return this.node.getNodeType( builder ); @@ -6427,8 +6624,6 @@ class VarNode extends Node { if ( shouldTreatAsReadOnly ) { - const type = builder.getType( nodeVar.type ); - if ( isWebGPUBackend ) { declarationPrefix = isDeterministic @@ -6437,7 +6632,9 @@ class VarNode extends Node { } else { - declarationPrefix = `const ${ type } ${ propertyName }`; + const count = builder.getArrayCount( node ); + + declarationPrefix = `const ${ builder.getVar( nodeVar.type, propertyName, count ) }`; } @@ -24268,9 +24465,7 @@ class Info { * @property {Number} triangles - The number of rendered triangle primitives of the current frame. * @property {Number} points - The number of rendered point primitives of the current frame. * @property {Number} lines - The number of rendered line primitives of the current frame. - * @property {Number} previousFrameCalls - The number of render calls of the previous frame. * @property {Number} timestamp - The timestamp of the frame when using `renderer.renderAsync()`. - * @property {Number} timestampCalls - The number of render calls using `renderer.renderAsync()`. */ this.render = { calls: 0, @@ -24280,8 +24475,6 @@ class Info { points: 0, lines: 0, timestamp: 0, - previousFrameCalls: 0, - timestampCalls: 0 }; /** @@ -24291,16 +24484,12 @@ class Info { * @readonly * @property {Number} calls - The number of compute calls since the app has been started. * @property {Number} frameCalls - The number of compute calls of the current frame. - * @property {Number} previousFrameCalls - The number of compute calls of the previous frame. * @property {Number} timestamp - The timestamp of the frame when using `renderer.computeAsync()`. - * @property {Number} timestampCalls - The number of render calls using `renderer.computeAsync()`. */ this.compute = { calls: 0, frameCalls: 0, - timestamp: 0, - previousFrameCalls: 0, - timestampCalls: 0 + timestamp: 0 }; /** @@ -24353,47 +24542,11 @@ class Info { } - /** - * Used by async render methods to updated timestamp metrics. - * - * @param {('render'|'compute')} type - The type of render call. - * @param {Number} time - The duration of the compute/render call in milliseconds. - */ - updateTimestamp( type, time ) { - - if ( this[ type ].timestampCalls === 0 ) { - - this[ type ].timestamp = 0; - - } - - - this[ type ].timestamp += time; - - this[ type ].timestampCalls ++; - - - if ( this[ type ].timestampCalls >= this[ type ].previousFrameCalls ) { - - this[ type ].timestampCalls = 0; - - } - - - } - /** * Resets frame related metrics. */ reset() { - const previousRenderFrameCalls = this.render.frameCalls; - this.render.previousFrameCalls = previousRenderFrameCalls; - - const previousComputeFrameCalls = this.compute.frameCalls; - this.compute.previousFrameCalls = previousComputeFrameCalls; - - this.render.drawCalls = 0; this.render.frameCalls = 0; this.compute.frameCalls = 0; @@ -26347,7 +26500,18 @@ class Textures extends DataMap { const options = { sampleCount }; - if ( ( renderTarget.isXRRenderTarget === true && renderTarget.hasExternalTextures === true ) === false ) { + // when using the WebXR Layers API, the render target uses external textures which + // require no manual updates + + if ( renderTarget.isXRRenderTarget === true && renderTarget.hasExternalTextures === true ) { + + if ( depthTexture && renderTarget.autoAllocateDepthBuffer === true ) { + + this.updateTexture( depthTexture, options ); + + } + + } else { for ( let i = 0; i < textures.length; i ++ ) { @@ -26359,11 +26523,11 @@ class Textures extends DataMap { } - } + if ( depthTexture ) { - if ( depthTexture && renderTarget.autoAllocateDepthBuffer !== false ) { + this.updateTexture( depthTexture, options ); - this.updateTexture( depthTexture, options ); + } } @@ -29473,7 +29637,7 @@ const storageObject = ( value, type, count ) => { // @deprecated, r171 * TSL function for creating a storage buffer node with a configured `StorageBufferAttribute`. * * @function - * @param {Number} count - The data count. + * @param {Number|TypedArray} count - The data count. It is also valid to pass a typed array as an argument. * @param {String} [type='float'] - The data type. * @returns {StorageBufferNode} */ @@ -29493,7 +29657,7 @@ const attributeArray = ( count, type = 'float' ) => { * TSL function for creating a storage buffer node with a configured `StorageInstancedBufferAttribute`. * * @function - * @param {Number} count - The data count. + * @param {Number|TypedArray} count - The data count. It is also valid to pass a typed array as an argument. * @param {String} [type='float'] - The data type. * @returns {StorageBufferNode} */ @@ -33938,7 +34102,13 @@ class AtomicFunctionNode extends TempNode { const params = []; params.push( `&${ a.build( builder, inputType ) }` ); - params.push( b.build( builder, inputType ) ); + + if ( b !== null ) { + + params.push( b.build( builder, inputType ) ); + + + } const methodSnippet = `${ builder.getMethod( method, type ) }( ${params.join( ', ' )} )`; @@ -33999,6 +34169,16 @@ const atomicFunc = ( method, pointerNode, valueNode, storeNode = null ) => { }; +/** + * Loads the value stored in the atomic variable. + * + * @function + * @param {Node} pointerNode - An atomic variable or element of an atomic buffer. + * @param {Node?} [storeNode=null] - A variable storing the return value of an atomic operation, typically the value of the atomic variable before the operation. + * @returns {AtomicFunctionNode} + */ +const atomicLoad = ( pointerNode, storeNode = null ) => atomicFunc( AtomicFunctionNode.ATOMIC_LOAD, pointerNode, null, storeNode ); + /** * Stores a value in the atomic variable. * @@ -37992,6 +38172,7 @@ var TSL = /*#__PURE__*/Object.freeze({ anisotropyT: anisotropyT, any: any, append: append, + array: array, arrayBuffer: arrayBuffer, asin: asin, assign: assign, @@ -38000,6 +38181,7 @@ var TSL = /*#__PURE__*/Object.freeze({ atomicAdd: atomicAdd, atomicAnd: atomicAnd, atomicFunc: atomicFunc, + atomicLoad: atomicLoad, atomicMax: atomicMax, atomicMin: atomicMin, atomicOr: atomicOr, @@ -39037,8 +39219,9 @@ class NodeVar { * @param {String} name - The name of the variable. * @param {String} type - The type of the variable. * @param {Boolean} [readOnly=false] - The read-only flag. + * @param {Number?} [count=null] - The size. */ - constructor( name, type, readOnly = false ) { + constructor( name, type, readOnly = false, count = null ) { /** * This flag can be used for type testing. @@ -39066,10 +39249,17 @@ class NodeVar { /** * The read-only flag. * - * @type {boolean} + * @type {Boolean} */ this.readOnly = readOnly; + /** + * The size. + * + * @type {Number?} + */ + this.count = count; + } } @@ -39549,6 +39739,41 @@ class ColorUniform extends Uniform { } +/** + * Represents a Matrix2 uniform. + * + * @private + * @augments Uniform + */ +class Matrix2Uniform extends Uniform { + + /** + * Constructs a new Number uniform. + * + * @param {String} name - The uniform's name. + * @param {Matrix2} value - The uniform's value. + */ + constructor( name, value = new Matrix2() ) { + + super( name, value ); + + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ + this.isMatrix2Uniform = true; + + this.boundary = 16; + this.itemSize = 4; + + } + +} + + /** * Represents a Matrix3 uniform. * @@ -39872,6 +40097,58 @@ class ColorNodeUniform extends ColorUniform { } + +/** + * A special form of Matrix2 uniform binding type. + * It's value is managed by a node object. + * + * @private + * @augments Matrix2Uniform + */ +class Matrix2NodeUniform extends Matrix2Uniform { + + /** + * Constructs a new node-based Matrix2 uniform. + * + * @param {NodeUniform} nodeUniform - The node uniform. + */ + constructor( nodeUniform ) { + + super( nodeUniform.name, nodeUniform.value ); + + /** + * The node uniform. + * + * @type {NodeUniform} + */ + this.nodeUniform = nodeUniform; + + } + + /** + * Overwritten to return the value of the node uniform. + * + * @return {Matrix2} The value. + */ + getValue() { + + return this.nodeUniform.value; + + } + + /** + * Returns the node uniform data type. + * + * @return {String} The data type. + */ + getType() { + + return this.nodeUniform.type; + + } + +} + /** * A special form of Matrix3 uniform binding type. * It's value is managed by a node object. @@ -41870,6 +42147,55 @@ class NodeBuilder { } + /** + * Generates the array declaration string. + * + * @param {String} type - The type. + * @param {Number?} [count] - The count. + * @return {String} The generated value as a shader string. + */ + generateArrayDeclaration( type, count ) { + + return this.getType( type ) + '[ ' + count + ' ]'; + + } + + /** + * Generates the array shader string for the given type and value. + * + * @param {String} type - The type. + * @param {Number?} [count] - The count. + * @param {Array?} [values=null] - The default values. + * @return {String} The generated value as a shader string. + */ + generateArray( type, count, values = null ) { + + let snippet = this.generateArrayDeclaration( type, count ) + '( '; + + for ( let i = 0; i < count; i ++ ) { + + const value = values ? values[ i ] : null; + + if ( value !== null ) { + + snippet += value.build( this, type ); + + } else { + + snippet += this.generateConst( type ); + + } + + if ( i < count - 1 ) snippet += ', '; + + } + + snippet += ' )'; + + return snippet; + + } + /** * Generates the shader string for the given type and value. * @@ -42137,9 +42463,16 @@ class NodeBuilder { if ( length === 1 ) return componentType; - const baseType = getTypeFromLength( length ); + let baseType = getTypeFromLength( length ); const prefix = componentType === 'float' ? '' : componentType[ 0 ]; + // fix edge case for mat2x2 being same size as vec4 + if ( /mat2/.test( componentType ) === true ) { + + baseType = baseType.replace( 'vec', 'mat' ); + + } + return prefix + baseType; } @@ -42414,6 +42747,23 @@ class NodeBuilder { } + /** + * Returns the array length. + * + * @param {Node} node - The node. + * @return {Number?} The array length. + */ + getArrayCount( node ) { + + let count = null; + + if ( node.isArrayNode ) count = node.count; + else if ( node.isVarNode && node.node.isArrayNode ) count = node.node.count; + + return count; + + } + /** * Returns an instance of {@link NodeVar} for the given variable node. * @@ -42446,7 +42796,11 @@ class NodeBuilder { } - nodeVar = new NodeVar( name, type, readOnly ); + // + + const count = this.getArrayCount( node ); + + nodeVar = new NodeVar( name, type, readOnly, count ); if ( ! readOnly ) { @@ -42481,6 +42835,24 @@ class NodeBuilder { return this.isDeterministic( node.aNode ) && ( node.bNode ? this.isDeterministic( node.bNode ) : true ); + } else if ( node.isArrayNode ) { + + if ( node.values !== null ) { + + for ( const n of node.values ) { + + if ( ! this.isDeterministic( n ) ) { + + return false; + + } + + } + + } + + return true; + } else if ( node.isConstNode ) { return true; @@ -42944,11 +43316,12 @@ class NodeBuilder { * * @param {String} type - The variable's type. * @param {String} name - The variable's name. + * @param {Number?} [count=null] - The array length. * @return {String} The shader string. */ - getVar( type, name ) { + getVar( type, name, count = null ) { - return `${ this.getType( type ) } ${ name }`; + return `${ count !== null ? this.generateArrayDeclaration( type, count ) : this.getType( type ) } ${ name }`; } @@ -43176,6 +43549,7 @@ class NodeBuilder { if ( type === 'vec3' || type === 'ivec3' || type === 'uvec3' ) return new Vector3NodeUniform( uniformNode ); if ( type === 'vec4' || type === 'ivec4' || type === 'uvec4' ) return new Vector4NodeUniform( uniformNode ); if ( type === 'color' ) return new ColorNodeUniform( uniformNode ); + if ( type === 'mat2' ) return new Matrix2NodeUniform( uniformNode ); if ( type === 'mat3' ) return new Matrix3NodeUniform( uniformNode ); if ( type === 'mat4' ) return new Matrix4NodeUniform( uniformNode ); @@ -45860,6 +46234,77 @@ class Lighting extends ChainMap { } +/** + * A special type of render target that is used when rendering + * with the WebXR Device API. + * + * @private + * @augments RenderTarget + */ +class XRRenderTarget extends RenderTarget { + + /** + * Constructs a new XR render target. + * + * @param {Number} [width=1] - The width of the render target. + * @param {Number} [height=1] - The height of the render target. + * @param {Object} [options={}] - The configuration options. + */ + constructor( width = 1, height = 1, options = {} ) { + + super( width, height, options ); + + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ + this.isXRRenderTarget = true; + + /** + * Whether the attachments of the render target + * are defined by external textures. This flag is + * set to `true` when using the WebXR Layers API. + * + * @type {Boolean} + * @default false + */ + this.hasExternalTextures = false; + + /** + * Whether a depth buffer should automatically be allocated + * for this XR render target or not. + * + * Allocating a depth buffer is the default behavior of XR render + * targets. However, when using the WebXR Layers API, this flag + * must be set to `false` when the `ignoreDepthValues` property of + * the projection layers evaluates to `true`. + * + * Reference: {@link https://www.w3.org/TR/webxrlayers-1/#dom-xrprojectionlayer-ignoredepthvalues}. + * + * @type {Boolean} + * @default true + */ + this.autoAllocateDepthBuffer = true; + + } + + copy( source ) { + + super.copy( source ); + + this.hasExternalTextures = source.hasExternalTextures; + this.autoAllocateDepthBuffer = source.autoAllocateDepthBuffer; + + return this; + + } + + +} + const _cameraLPos = /*@__PURE__*/ new Vector3(); const _cameraRPos = /*@__PURE__*/ new Vector3(); @@ -46166,7 +46611,7 @@ class XRManager extends EventDispatcher { this._xrFrame = null; /** - * Whether to use projection layers or not. + * Whether to use the WebXR Layers API or not. * * @private * @type {Boolean} @@ -46474,7 +46919,7 @@ class XRManager extends EventDispatcher { renderer.setPixelRatio( 1 ); renderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false ); - this._xrRenderTarget = new RenderTarget( + this._xrRenderTarget = new XRRenderTarget( glProjLayer.textureWidth, glProjLayer.textureHeight, { @@ -46507,7 +46952,7 @@ class XRManager extends EventDispatcher { renderer.setPixelRatio( 1 ); renderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false ); - this._xrRenderTarget = new RenderTarget( + this._xrRenderTarget = new XRRenderTarget( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, { @@ -46520,8 +46965,6 @@ class XRManager extends EventDispatcher { } - this._xrRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278 - // this.setFoveation( this.getFoveation() ); @@ -46966,7 +47409,7 @@ function onAnimationFrame( time, frame ) { // For side-by-side projection, we only produce a single texture for both eyes. if ( i === 0 ) { - backend.setRenderTargetTextures( + backend.setXRRenderTargetTextures( this._xrRenderTarget, glSubImage.colorTexture, this._glProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture @@ -47947,9 +48390,7 @@ class Renderer { if ( this._initialized === false ) await this.init(); - const renderContext = this._renderScene( scene, camera ); - - await this.backend.resolveTimestampAsync( renderContext, 'render' ); + this._renderScene( scene, camera ); } @@ -48411,7 +48852,11 @@ class Renderer { } + const currentXREnabled = this.xr.enabled; + + this.xr.enabled = false; this._renderScene( quad, quad.camera, false ); + this.xr.enabled = currentXREnabled; } @@ -49009,7 +49454,7 @@ class Renderer { */ get currentToneMapping() { - return this._renderTarget !== null ? NoToneMapping : this.toneMapping; + return ( this._renderTarget !== null && this._renderTarget.isXRRenderTarget !== true ) ? NoToneMapping : this.toneMapping; } @@ -49021,7 +49466,7 @@ class Renderer { */ get currentColorSpace() { - return this._renderTarget !== null ? LinearSRGBColorSpace : this.outputColorSpace; + return ( this._renderTarget !== null && this._renderTarget.isXRRenderTarget !== true ) ? LinearSRGBColorSpace : this.outputColorSpace; } @@ -49043,6 +49488,12 @@ class Renderer { this._renderContexts.dispose(); this._textures.dispose(); + Object.values( this.backend.timestampQueryPool ).forEach( queryPool => { + + if ( queryPool !== null ) queryPool.dispose(); + + } ); + this.setRenderTarget( null ); this.setAnimationLoop( null ); @@ -49230,8 +49681,6 @@ class Renderer { this.compute( computeNodes ); - await this.backend.resolveTimestampAsync( computeNodes, 'compute' ); - } /** @@ -49249,6 +49698,14 @@ class Renderer { } + async resolveTimestampsAsync( type = 'render' ) { + + if ( this._initialized === false ) await this.init(); + + return this.backend.resolveTimestampsAsync( type ); + + } + /** * Checks if the given feature is supported by the selected backend. If the * renderer has not been initialized, this method always returns `false`. @@ -51382,7 +51839,7 @@ ${ flowData.code } for ( const variable of vars ) { - snippets.push( `${ this.getVar( variable.type, variable.name ) };` ); + snippets.push( `${ this.getVar( variable.type, variable.name, variable.count ) };` ); } @@ -52282,6 +52739,16 @@ class Backend { */ this.domElement = null; + /** + * A reference to the timestamp query pool. + * + * @type {{render: TimestampQueryPool?, compute: TimestampQueryPool?}} + */ + this.timestampQueryPool = { + 'render': null, + 'compute': null + }; + } /** @@ -52661,11 +53128,33 @@ class Backend { * * @async * @abstract - * @param {RenderContext} renderContext - The render context. - * @param {String} type - The render context. - * @return {Promise} A Promise that resolves when the time stamp has been computed. + * @param {String} [type='render'] - The type of the time stamp. + * @return {Promise} A Promise that resolves with the time stamp. */ - async resolveTimestampAsync( /*renderContext, type*/ ) { } + async resolveTimestampsAsync( type = 'render' ) { + + if ( ! this.trackTimestamp ) { + + warnOnce( 'WebGPURenderer: Timestamp tracking is disabled.' ); + return; + + } + + const queryPool = this.timestampQueryPool[ type ]; + if ( ! queryPool ) { + + warnOnce( `WebGPURenderer: No timestamp query pool for type '${type}' found.` ); + return; + + } + + const duration = await queryPool.resolveQueriesAsync(); + + this.renderer.info[ type ].timestamp = duration; + + return duration; + + } /** * Can be used to synchronize CPU operations with GPU tasks. So when this method is called, @@ -53165,7 +53654,7 @@ class WebGLAttributeUtils { } -let initialized$1 = false, equationToGL, factorToGL; +let equationToGL, factorToGL; /** * A WebGL 2 backend utility module for managing the WebGL state. @@ -53238,13 +53727,8 @@ class WebGLState { this.currentBoundTextures = {}; this.currentBoundBufferBases = {}; - if ( initialized$1 === false ) { - - this._init(); - - initialized$1 = true; - } + this._init(); } @@ -55941,6 +56425,398 @@ class WebGLBufferRenderer { } +class TimestampQueryPool { + + constructor( maxQueries = 256 ) { + + this.trackTimestamp = true; + this.maxQueries = maxQueries; + this.currentQueryIndex = 0; // how many queries allocated so far + this.queryOffsets = new Map(); // track offsets for different contexts + this.isDisposed = false; + this.lastValue = 0; + this.pendingResolve = false; + + } + + /** + * Allocate queries for a specific renderContext. + * + * @abstract + */ + allocateQueriesForContext( /* renderContext */ ) {} + + /** + * Resolve all timestamps and return data (or process them). + * + * @abstract + * @returns {Promise|Number} The resolved timestamp value. + */ + async resolveQueriesAsync() {} + + /** + * Dispose of the query pool. + * + * @abstract + */ + dispose() {} + +} + +/** + * Manages a pool of WebGL timestamp queries for performance measurement. + * Handles creation, execution, and resolution of timer queries using WebGL extensions. + * @extends TimestampQueryPool + */ +class WebGLTimestampQueryPool extends TimestampQueryPool { + + /** + * Creates a new WebGL timestamp query pool. + * @param {WebGLRenderingContext|WebGL2RenderingContext} gl - The WebGL context. + * @param {string} type - The type identifier for this query pool. + * @param {number} [maxQueries=2048] - Maximum number of queries this pool can hold. + */ + constructor( gl, type, maxQueries = 2048 ) { + + super( maxQueries ); + + this.gl = gl; + this.type = type; + + // Check for timer query extensions + this.ext = gl.getExtension( 'EXT_disjoint_timer_query_webgl2' ) || + gl.getExtension( 'EXT_disjoint_timer_query' ); + + if ( ! this.ext ) { + + console.warn( 'EXT_disjoint_timer_query not supported; timestamps will be disabled.' ); + this.trackTimestamp = false; + return; + + } + + // Create query objects + this.queries = []; + for ( let i = 0; i < this.maxQueries; i ++ ) { + + this.queries.push( gl.createQuery() ); + + } + + this.activeQuery = null; + this.queryStates = new Map(); // Track state of each query: 'inactive', 'started', 'ended' + + } + + /** + * Allocates a pair of queries for a given render context. + * @param {Object} renderContext - The render context to allocate queries for. + * @returns {?number} The base offset for the allocated queries, or null if allocation failed. + */ + allocateQueriesForContext( renderContext ) { + + if ( ! this.trackTimestamp ) return null; + + // Check if we have enough space for a new query pair + if ( this.currentQueryIndex + 2 > this.maxQueries ) { + + return null; + + } + + const baseOffset = this.currentQueryIndex; + this.currentQueryIndex += 2; + + // Initialize query states + this.queryStates.set( baseOffset, 'inactive' ); + this.queryOffsets.set( renderContext.id, baseOffset ); + + return baseOffset; + + } + + /** + * Begins a timestamp query for the specified render context. + * @param {Object} renderContext - The render context to begin timing for. + */ + beginQuery( renderContext ) { + + if ( ! this.trackTimestamp || this.isDisposed ) { + + return; + + } + + const baseOffset = this.queryOffsets.get( renderContext.id ); + if ( baseOffset == null ) { + + return; + + } + + // Don't start a new query if there's an active one + if ( this.activeQuery !== null ) { + + return; + + } + + const query = this.queries[ baseOffset ]; + if ( ! query ) { + + return; + + } + + try { + + // Only begin if query is inactive + if ( this.queryStates.get( baseOffset ) === 'inactive' ) { + + this.gl.beginQuery( this.ext.TIME_ELAPSED_EXT, query ); + this.activeQuery = baseOffset; + this.queryStates.set( baseOffset, 'started' ); + + } + + } catch ( error ) { + + console.error( 'Error in beginQuery:', error ); + this.activeQuery = null; + this.queryStates.set( baseOffset, 'inactive' ); + + } + + } + + /** + * Ends the active timestamp query for the specified render context. + * @param {Object} renderContext - The render context to end timing for. + * @param {string} renderContext.id - Unique identifier for the render context. + */ + endQuery( renderContext ) { + + if ( ! this.trackTimestamp || this.isDisposed ) { + + return; + + } + + const baseOffset = this.queryOffsets.get( renderContext.id ); + if ( baseOffset == null ) { + + return; + + } + + // Only end if this is the active query + if ( this.activeQuery !== baseOffset ) { + + return; + + } + + try { + + this.gl.endQuery( this.ext.TIME_ELAPSED_EXT ); + this.queryStates.set( baseOffset, 'ended' ); + this.activeQuery = null; + + } catch ( error ) { + + console.error( 'Error in endQuery:', error ); + // Reset state on error + this.queryStates.set( baseOffset, 'inactive' ); + this.activeQuery = null; + + } + + } + + /** + * Asynchronously resolves all completed queries and returns the total duration. + * @returns {Promise} The total duration in milliseconds, or the last valid value if resolution fails. + */ + async resolveQueriesAsync() { + + if ( ! this.trackTimestamp || this.pendingResolve ) { + + return this.lastValue; + + } + + this.pendingResolve = true; + + try { + + // Wait for all ended queries to complete + const resolvePromises = []; + + for ( const [ baseOffset, state ] of this.queryStates ) { + + if ( state === 'ended' ) { + + const query = this.queries[ baseOffset ]; + resolvePromises.push( this.resolveQuery( query ) ); + + } + + } + + if ( resolvePromises.length === 0 ) { + + return this.lastValue; + + } + + const results = await Promise.all( resolvePromises ); + const totalDuration = results.reduce( ( acc, val ) => acc + val, 0 ); + + // Store the last valid result + this.lastValue = totalDuration; + + // Reset states + this.currentQueryIndex = 0; + this.queryOffsets.clear(); + this.queryStates.clear(); + this.activeQuery = null; + + return totalDuration; + + } catch ( error ) { + + console.error( 'Error resolving queries:', error ); + return this.lastValue; + + } finally { + + this.pendingResolve = false; + + } + + } + + /** + * Resolves a single query, checking for completion and disjoint operation. + * @private + * @param {WebGLQuery} query - The query object to resolve. + * @returns {Promise} The elapsed time in milliseconds. + */ + async resolveQuery( query ) { + + return new Promise( ( resolve ) => { + + if ( this.isDisposed ) { + + resolve( this.lastValue ); + return; + + } + + let timeoutId; + let isResolved = false; + + const cleanup = () => { + + if ( timeoutId ) { + + clearTimeout( timeoutId ); + timeoutId = null; + + } + + }; + + const finalizeResolution = ( value ) => { + + if ( ! isResolved ) { + + isResolved = true; + cleanup(); + resolve( value ); + + } + + }; + + const checkQuery = () => { + + if ( this.isDisposed ) { + + finalizeResolution( this.lastValue ); + return; + + } + + try { + + // Check if the GPU timer was disjoint (i.e., timing was unreliable) + const disjoint = this.gl.getParameter( this.ext.GPU_DISJOINT_EXT ); + if ( disjoint ) { + + finalizeResolution( this.lastValue ); + return; + + } + + const available = this.gl.getQueryParameter( query, this.gl.QUERY_RESULT_AVAILABLE ); + if ( ! available ) { + + timeoutId = setTimeout( checkQuery, 1 ); + return; + + } + + const elapsed = this.gl.getQueryParameter( query, this.gl.QUERY_RESULT ); + resolve( Number( elapsed ) / 1e6 ); // Convert nanoseconds to milliseconds + + } catch ( error ) { + + console.error( 'Error checking query:', error ); + resolve( this.lastValue ); + + } + + }; + + checkQuery(); + + } ); + + } + + /** + * Releases all resources held by this query pool. + * This includes deleting all query objects and clearing internal state. + */ + dispose() { + + if ( this.isDisposed ) { + + return; + + } + + this.isDisposed = true; + + if ( ! this.trackTimestamp ) return; + + for ( const query of this.queries ) { + + this.gl.deleteQuery( query ); + + } + + this.queries = []; + this.queryStates.clear(); + this.queryOffsets.clear(); + this.lastValue = 0; + this.activeQuery = null; + + } + +} + /** * A backend implementation targeting WebGL 2. * @@ -56250,19 +57126,25 @@ class WebGLBackend extends Backend { } /** - * Configures the render target with external textures. + * Configures the given XR render target with external textures. * - * @param {RenderTarget} renderTarget - The render target. + * This method is only relevant when using the WebXR Layers API. + * + * @param {XRRenderTarget} renderTarget - The XR render target. * @param {WebGLTexture} colorTexture - A native color texture. * @param {WebGLTexture?} [depthTexture=null] - A native depth texture. */ - setRenderTargetTextures( renderTarget, colorTexture, depthTexture = null ) { + setXRRenderTargetTextures( renderTarget, colorTexture, depthTexture = null ) { - this.set( renderTarget.texture, { textureGPU: colorTexture } ); + const gl = this.gl; + + this.set( renderTarget.texture, { textureGPU: colorTexture, glInternalFormat: gl.RGBA8 } ); // see #24698 why RGBA8 and not SRGB8_ALPHA8 is used if ( depthTexture !== null ) { - this.set( renderTarget.depthTexture, { textureGPU: depthTexture } ); + const glInternalFormat = renderTarget.stencilBuffer ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24; + + this.set( renderTarget.depthTexture, { textureGPU: depthTexture, glInternalFormat: glInternalFormat } ); renderTarget.autoAllocateDepthBuffer = false; @@ -56279,29 +57161,22 @@ class WebGLBackend extends Backend { if ( ! this.disjoint || ! this.trackTimestamp ) return; - const renderContextData = this.get( renderContext ); + const type = renderContext.isComputeNode ? 'compute' : 'render'; - if ( this.queryRunning ) { + if ( ! this.timestampQueryPool[ type ] ) { - if ( ! renderContextData.queryQueue ) renderContextData.queryQueue = []; - renderContextData.queryQueue.push( renderContext ); - return; + // TODO: Variable maxQueries? + this.timestampQueryPool[ type ] = new WebGLTimestampQueryPool( this.gl, type, 2048 ); } - if ( renderContextData.activeQuery ) { - - this.gl.endQuery( this.disjoint.TIME_ELAPSED_EXT ); - renderContextData.activeQuery = null; - - } + const timestampQueryPool = this.timestampQueryPool[ type ]; - renderContextData.activeQuery = this.gl.createQuery(); + const baseOffset = timestampQueryPool.allocateQueriesForContext( renderContext ); - if ( renderContextData.activeQuery !== null ) { + if ( baseOffset !== null ) { - this.gl.beginQuery( this.disjoint.TIME_ELAPSED_EXT, renderContextData.activeQuery ); - this.queryRunning = true; + timestampQueryPool.beginQuery( renderContext ); } @@ -56318,64 +57193,13 @@ class WebGLBackend extends Backend { if ( ! this.disjoint || ! this.trackTimestamp ) return; - const renderContextData = this.get( renderContext ); - - if ( renderContextData.activeQuery ) { - - this.gl.endQuery( this.disjoint.TIME_ELAPSED_EXT ); - - if ( ! renderContextData.gpuQueries ) renderContextData.gpuQueries = []; - renderContextData.gpuQueries.push( { query: renderContextData.activeQuery } ); - renderContextData.activeQuery = null; - this.queryRunning = false; + const type = renderContext.isComputeNode ? 'compute' : 'render'; + const timestampQueryPool = this.timestampQueryPool[ type ]; - if ( renderContextData.queryQueue && renderContextData.queryQueue.length > 0 ) { - - const nextRenderContext = renderContextData.queryQueue.shift(); - this.initTimestampQuery( nextRenderContext ); - - } - - } + timestampQueryPool.endQuery( renderContext ); } - /** - * Resolves the time stamp for the given render context and type. - * - * @async - * @param {RenderContext} renderContext - The render context. - * @param {String} type - The render context. - * @return {Promise} A Promise that resolves when the time stamp has been computed. - */ - async resolveTimestampAsync( renderContext, type = 'render' ) { - - if ( ! this.disjoint || ! this.trackTimestamp ) return; - - const renderContextData = this.get( renderContext ); - - if ( ! renderContextData.gpuQueries ) renderContextData.gpuQueries = []; - - for ( let i = 0; i < renderContextData.gpuQueries.length; i ++ ) { - - const queryInfo = renderContextData.gpuQueries[ i ]; - const available = this.gl.getQueryParameter( queryInfo.query, this.gl.QUERY_RESULT_AVAILABLE ); - const disjoint = this.gl.getParameter( this.disjoint.GPU_DISJOINT_EXT ); - - if ( available && ! disjoint ) { - - const elapsed = this.gl.getQueryParameter( queryInfo.query, this.gl.QUERY_RESULT ); - const duration = Number( elapsed ) / 1000000; // Convert nanoseconds to milliseconds - this.gl.deleteQuery( queryInfo.query ); - renderContextData.gpuQueries.splice( i, 1 ); // Remove the processed query - i --; - this.renderer.info.updateTimestamp( type, duration ); - - } - - } - - } /** * Returns the backend's rendering context. @@ -57856,7 +58680,7 @@ class WebGLBackend extends Backend { const isRenderTarget3D = renderTarget.isRenderTarget3D === true; const isRenderTargetArray = renderTarget.isRenderTargetArray === true; const isXRRenderTarget = renderTarget.isXRRenderTarget === true; - const hasExternalTextures = renderTarget.hasExternalTextures === true; + const hasExternalTextures = ( isXRRenderTarget === true && renderTarget.hasExternalTextures === true ); let msaaFb = renderTargetContextData.msaaFrameBuffer; let depthRenderbuffer = renderTargetContextData.depthRenderbuffer; @@ -58283,6 +59107,9 @@ class WebGLBackend extends Backend { */ dispose() { + const extension = this.extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.loseContext(); + this.renderer.domElement.removeEventListener( 'webglcontextlost', this._onContextLost ); } @@ -61228,6 +62055,19 @@ class WGSLNodeBuilder extends NodeBuilder { } + /** + * Generates the array declaration string. + * + * @param {String} type - The type. + * @param {Number?} [count] - The count. + * @return {String} The generated value as a shader string. + */ + generateArrayDeclaration( type, count ) { + + return `array< ${ this.getType( type ) }, ${ count } >`; + + } + /** * Generates a WGSL variable that holds the texture dimension of the given texture. * It also returns information about the the number of layers (elements) of an arrayed @@ -62304,11 +63144,24 @@ ${ flowData.code } * * @param {String} type - The variable's type. * @param {String} name - The variable's name. + * @param {Number?} [count=null] - The array length. * @return {String} The WGSL snippet that defines a variable. */ - getVar( type, name ) { + getVar( type, name, count = null ) { - return `var ${ name } : ${ this.getType( type ) }`; + let snippet = `var ${ name } : `; + + if ( count !== null ) { + + snippet += this.generateArrayDeclaration( type, count ); + + } else { + + snippet += this.getType( type ); + + } + + return snippet; } @@ -62327,7 +63180,7 @@ ${ flowData.code } for ( const variable of vars ) { - snippets.push( `\t${ this.getVar( variable.type, variable.name ) };` ); + snippets.push( `\t${ this.getVar( variable.type, variable.name, variable.count ) };` ); } @@ -64721,6 +65574,276 @@ class WebGPUPipelineUtils { } +/** + * Manages a pool of WebGPU timestamp queries for performance measurement. + * Extends the base TimestampQueryPool to provide WebGPU-specific implementation. + * @extends TimestampQueryPool + */ +class WebGPUTimestampQueryPool extends TimestampQueryPool { + + /** + * Creates a new WebGPU timestamp query pool. + * @param {GPUDevice} device - The WebGPU device to create queries on. + * @param {string} type - The type identifier for this query pool. + * @param {number} [maxQueries=2048] - Maximum number of queries this pool can hold. + */ + constructor( device, type, maxQueries = 2048 ) { + + super( maxQueries ); + this.device = device; + this.type = type; + + this.querySet = this.device.createQuerySet( { + type: 'timestamp', + count: this.maxQueries, + label: `queryset_global_timestamp_${type}` + } ); + + const bufferSize = this.maxQueries * 8; + this.resolveBuffer = this.device.createBuffer( { + label: `buffer_timestamp_resolve_${type}`, + size: bufferSize, + usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC + } ); + + this.resultBuffer = this.device.createBuffer( { + label: `buffer_timestamp_result_${type}`, + size: bufferSize, + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ + } ); + + } + + /** + * Allocates a pair of queries for a given render context. + * @param {Object} renderContext - The render context to allocate queries for. + * @returns {?number} The base offset for the allocated queries, or null if allocation failed. + */ + allocateQueriesForContext( renderContext ) { + + if ( ! this.trackTimestamp || this.isDisposed ) return null; + + if ( this.currentQueryIndex + 2 > this.maxQueries ) { + + warnOnce( 'WebGPUTimestampQueryPool: Maximum number of queries exceeded.' ); + return null; + + } + + const baseOffset = this.currentQueryIndex; + this.currentQueryIndex += 2; + + this.queryOffsets.set( renderContext.id, baseOffset ); + return baseOffset; + + } + + /** + * Asynchronously resolves all pending queries and returns the total duration. + * If there's already a pending resolve operation, returns that promise instead. + * @returns {Promise} The total duration in milliseconds, or the last valid value if resolution fails. + */ + async resolveQueriesAsync() { + + if ( ! this.trackTimestamp || this.currentQueryIndex === 0 || this.isDisposed ) { + + return this.lastValue; + + } + + if ( this.pendingResolve ) { + + return this.pendingResolve; + + } + + this.pendingResolve = this._resolveQueries(); + + try { + + const result = await this.pendingResolve; + return result; + + } finally { + + this.pendingResolve = null; + + } + + } + + /** + * Internal method to resolve queries and calculate total duration. + * @private + * @returns {Promise} The total duration in milliseconds. + */ + async _resolveQueries() { + + if ( this.isDisposed ) { + + return this.lastValue; + + } + + try { + + if ( this.resultBuffer.mapState !== 'unmapped' ) { + + return this.lastValue; + + } + + const currentOffsets = new Map( this.queryOffsets ); + const queryCount = this.currentQueryIndex; + const bytesUsed = queryCount * 8; + + // Reset state before GPU work + this.currentQueryIndex = 0; + this.queryOffsets.clear(); + + const commandEncoder = this.device.createCommandEncoder(); + + commandEncoder.resolveQuerySet( + this.querySet, + 0, + queryCount, + this.resolveBuffer, + 0 + ); + + commandEncoder.copyBufferToBuffer( + this.resolveBuffer, + 0, + this.resultBuffer, + 0, + bytesUsed + ); + + const commandBuffer = commandEncoder.finish(); + this.device.queue.submit( [ commandBuffer ] ); + + if ( this.resultBuffer.mapState !== 'unmapped' ) { + + return this.lastValue; + + } + + // Create and track the mapping operation + await this.resultBuffer.mapAsync( GPUMapMode.READ, 0, bytesUsed ); + + if ( this.isDisposed ) { + + if ( this.resultBuffer.mapState === 'mapped' ) { + + this.resultBuffer.unmap(); + + } + + return this.lastValue; + + } + + const times = new BigUint64Array( this.resultBuffer.getMappedRange( 0, bytesUsed ) ); + let totalDuration = 0; + + for ( const [ , baseOffset ] of currentOffsets ) { + + const startTime = times[ baseOffset ]; + const endTime = times[ baseOffset + 1 ]; + const duration = Number( endTime - startTime ) / 1e6; + totalDuration += duration; + + } + + this.resultBuffer.unmap(); + this.lastValue = totalDuration; + + return totalDuration; + + } catch ( error ) { + + console.error( 'Error resolving queries:', error ); + if ( this.resultBuffer.mapState === 'mapped' ) { + + this.resultBuffer.unmap(); + + } + + return this.lastValue; + + } + + } + + async dispose() { + + if ( this.isDisposed ) { + + return; + + } + + this.isDisposed = true; + + // Wait for pending resolve operation + if ( this.pendingResolve ) { + + try { + + await this.pendingResolve; + + } catch ( error ) { + + console.error( 'Error waiting for pending resolve:', error ); + + } + + } + + // Ensure buffer is unmapped before destroying + if ( this.resultBuffer && this.resultBuffer.mapState === 'mapped' ) { + + try { + + this.resultBuffer.unmap(); + + } catch ( error ) { + + console.error( 'Error unmapping buffer:', error ); + + } + + } + + // Destroy resources + if ( this.querySet ) { + + this.querySet.destroy(); + this.querySet = null; + + } + + if ( this.resolveBuffer ) { + + this.resolveBuffer.destroy(); + this.resolveBuffer = null; + + } + + if ( this.resultBuffer ) { + + this.resultBuffer.destroy(); + this.resultBuffer = null; + + } + + this.queryOffsets.clear(); + this.pendingResolve = null; + + } + +} + /*// debugger tools import 'https://greggman.github.io/webgpu-avoid-redundant-state-setting/webgpu-check-redundant-state-setting.js'; //*/ @@ -65427,8 +66550,6 @@ class WebGPUBackend extends Backend { } - this.prepareTimestampBuffer( renderContext, renderContextData.encoder ); - this.device.queue.submit( [ renderContextData.encoder.finish() ] ); @@ -65765,8 +66886,6 @@ class WebGPUBackend extends Backend { groupData.passEncoderGPU.end(); - this.prepareTimestampBuffer( computeGroup, groupData.cmdEncoderGPU ); - this.device.queue.submit( [ groupData.cmdEncoderGPU.finish() ] ); } @@ -66243,106 +67362,27 @@ class WebGPUBackend extends Backend { if ( ! this.trackTimestamp ) return; - const renderContextData = this.get( renderContext ); - - // init query set if not exists + const type = renderContext.isComputeNode ? 'compute' : 'render'; - if ( ! renderContextData.timestampQuerySet ) { + if ( ! this.timestampQueryPool[ type ] ) { - const type = renderContext.isComputeNode ? 'compute' : 'render'; - - renderContextData.timestampQuerySet = this.device.createQuerySet( { type: 'timestamp', count: 2, label: `timestamp_${type}_${renderContext.id}` } ); + // TODO: Variable maxQueries? + this.timestampQueryPool[ type ] = new WebGPUTimestampQueryPool( this.device, type, 2048 ); } - // augment descriptor + const timestampQueryPool = this.timestampQueryPool[ type ]; - descriptor.timestampWrites = { - querySet: renderContextData.timestampQuerySet, - beginningOfPassWriteIndex: 0, // Write timestamp in index 0 when pass begins. - endOfPassWriteIndex: 1, // Write timestamp in index 1 when pass ends. - }; + const baseOffset = timestampQueryPool.allocateQueriesForContext( renderContext ); - } - - /** - * Prepares the timestamp buffer. - * - * @param {RenderContext} renderContext - The render context. - * @param {GPUCommandEncoder} encoder - The command encoder. - */ - prepareTimestampBuffer( renderContext, encoder ) { - - if ( ! this.trackTimestamp ) return; - - const renderContextData = this.get( renderContext ); - - - const size = 2 * BigUint64Array.BYTES_PER_ELEMENT; - - if ( renderContextData.currentTimestampQueryBuffers === undefined ) { - - renderContextData.currentTimestampQueryBuffers = { - resolveBuffer: this.device.createBuffer( { - label: 'timestamp resolve buffer', - size: size, - usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC, - } ), - resultBuffer: this.device.createBuffer( { - label: 'timestamp result buffer', - size: size, - usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ, - } ) - }; - - } - - const { resolveBuffer, resultBuffer } = renderContextData.currentTimestampQueryBuffers; - - - encoder.resolveQuerySet( renderContextData.timestampQuerySet, 0, 2, resolveBuffer, 0 ); - - if ( resultBuffer.mapState === 'unmapped' ) { - - encoder.copyBufferToBuffer( resolveBuffer, 0, resultBuffer, 0, size ); - - } + descriptor.timestampWrites = { + querySet: timestampQueryPool.querySet, + beginningOfPassWriteIndex: baseOffset, + endOfPassWriteIndex: baseOffset + 1, + }; } - /** - * Resolves the time stamp for the given render context and type. - * - * @async - * @param {RenderContext} renderContext - The render context. - * @param {String} type - The render context. - * @return {Promise} A Promise that resolves when the time stamp has been computed. - */ - async resolveTimestampAsync( renderContext, type = 'render' ) { - - if ( ! this.trackTimestamp ) return; - - const renderContextData = this.get( renderContext ); - - if ( renderContextData.currentTimestampQueryBuffers === undefined ) return; - - const { resultBuffer } = renderContextData.currentTimestampQueryBuffers; - - if ( resultBuffer.mapState === 'unmapped' ) { - - await resultBuffer.mapAsync( GPUMapMode.READ ); - - const times = new BigUint64Array( resultBuffer.getMappedRange() ); - const duration = Number( times[ 1 ] - times[ 0 ] ) / 1000000; - - - this.renderer.info.updateTimestamp( type, duration ); - - resultBuffer.unmap(); - - } - - } // node builder @@ -67797,4 +68837,4 @@ class ClippingGroup extends Group { } -export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayCamera, ArrayElementNode, AssignNode, AttributeNode, BackSide, BasicEnvironmentNode, BasicShadowMap, BatchNode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CacheNode, Camera, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, CodeNode, Color, ColorManagement, ColorSpaceNode, ComputeNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, DataArrayTexture, DataTexture, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectUVNode, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExpressionNode, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, 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, Loader, LoopNode, LuminanceAlphaFormat, LuminanceFormat, MRTNode, MatcapUVNode, Material, MaterialLoader, MaterialNode, MaterialReferenceNode, MathUtils, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, 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, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalMapNode, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, OutputStructNode, PCFShadowMap, PMREMGenerator, PMREMNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PointLight, PointLightNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, PosterizeNode, PropertyNode, QuadMesh, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, 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_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, SceneNode, ScreenNode, ScriptableNode, ScriptableValueNode, SetNode, ShadowBaseNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SpriteSheetUVNode, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StaticDrawUsage, StorageArrayElementNode, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, ToneMappingNode, ToonOutlinePassNode, TriplanarTexturesNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnsignedByteType, 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, shaderStages, vectorComponents }; +export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayCamera, ArrayElementNode, ArrayNode, AssignNode, AttributeNode, BackSide, BasicEnvironmentNode, BasicShadowMap, BatchNode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CacheNode, Camera, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, CodeNode, Color, ColorManagement, ColorSpaceNode, ComputeNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, DataArrayTexture, DataTexture, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectUVNode, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExpressionNode, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, 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, Loader, LoopNode, LuminanceAlphaFormat, LuminanceFormat, MRTNode, MatcapUVNode, Material, MaterialLoader, MaterialNode, MaterialReferenceNode, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, 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, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalMapNode, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, OutputStructNode, PCFShadowMap, PMREMGenerator, PMREMNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PointLight, PointLightNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, PosterizeNode, PropertyNode, QuadMesh, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, 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_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, SceneNode, ScreenNode, ScriptableNode, ScriptableValueNode, SetNode, ShadowBaseNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SpriteSheetUVNode, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StaticDrawUsage, StorageArrayElementNode, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, ToneMappingNode, ToonOutlinePassNode, TriplanarTexturesNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnsignedByteType, 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, shaderStages, vectorComponents }; diff --git a/build/three.webgpu.min.js b/build/three.webgpu.min.js index e44c7f7d97218e..79c4d73697e6b6 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,Matrix3 as i,Matrix4 as n,EventDispatcher as o,MathUtils as a,WebGLCoordinateSystem as u,WebGPUCoordinateSystem as l,ColorManagement as d,SRGBTransfer as c,NoToneMapping as h,StaticDrawUsage as p,InterleavedBuffer as g,DynamicDrawUsage as m,InterleavedBufferAttribute as f,NoColorSpace as y,UnsignedIntType as x,IntType as b,BackSide as T,CubeReflectionMapping as _,CubeRefractionMapping as v,TangentSpaceNormalMap as N,ObjectSpaceNormalMap as S,InstancedInterleavedBuffer as A,InstancedBufferAttribute as R,DataArrayTexture as C,FloatType as E,FramebufferTexture as w,LinearMipmapLinearFilter as M,DepthTexture as B,Material as F,NormalBlending as U,LineBasicMaterial as P,LineDashedMaterial as I,NoBlending as L,MeshNormalMaterial as D,WebGLCubeRenderTarget as V,BoxGeometry as O,Mesh as G,Scene as k,LinearFilter as z,CubeCamera as $,CubeTexture as W,EquirectangularReflectionMapping as H,EquirectangularRefractionMapping as j,AddOperation as q,MixOperation as X,MultiplyOperation as K,MeshBasicMaterial as Y,MeshLambertMaterial as Q,MeshPhongMaterial as Z,Texture as J,MeshStandardMaterial as ee,MeshPhysicalMaterial as te,MeshToonMaterial as re,MeshMatcapMaterial as se,SpriteMaterial as ie,PointsMaterial as ne,ShadowMaterial as oe,Uint32BufferAttribute as ae,Uint16BufferAttribute as ue,DoubleSide as le,Camera as de,DepthStencilFormat as ce,DepthFormat as he,UnsignedInt248Type as pe,UnsignedByteType as ge,RenderTarget as me,Plane as fe,Object3D as ye,HalfFloatType as xe,LinearMipMapLinearFilter as be,OrthographicCamera as Te,BufferGeometry as _e,Float32BufferAttribute as ve,BufferAttribute as Ne,UVMapping as Se,Euler as Ae,LinearSRGBColorSpace as Re,LessCompare as Ce,VSMShadowMap as Ee,RGFormat as we,BasicShadowMap as Me,SphereGeometry as Be,CubeUVReflectionMapping as Fe,PerspectiveCamera as Ue,RGBAFormat as Pe,LinearMipmapNearestFilter as Ie,NearestMipmapLinearFilter as Le,Float16BufferAttribute as De,REVISION as Ve,ArrayCamera as Oe,WebXRController as Ge,RAD2DEG as ke,SRGBColorSpace as ze,PCFShadowMap as $e,FrontSide as We,Frustum as He,DataTexture as je,RedIntegerFormat as qe,RedFormat as Xe,RGIntegerFormat as Ke,RGBIntegerFormat as Ye,RGBFormat as Qe,RGBAIntegerFormat as Ze,UnsignedShortType as Je,ByteType as et,ShortType as tt,createCanvasElement as rt,AddEquation as st,SubtractEquation as it,ReverseSubtractEquation as nt,ZeroFactor as ot,OneFactor as at,SrcColorFactor as ut,SrcAlphaFactor as lt,SrcAlphaSaturateFactor as dt,DstColorFactor as ct,DstAlphaFactor as ht,OneMinusSrcColorFactor as pt,OneMinusSrcAlphaFactor as gt,OneMinusDstColorFactor as mt,OneMinusDstAlphaFactor as ft,CullFaceNone as yt,CullFaceBack as xt,CullFaceFront as bt,CustomBlending as Tt,MultiplyBlending as _t,SubtractiveBlending as vt,AdditiveBlending as Nt,NotEqualDepth as St,GreaterDepth as At,GreaterEqualDepth as Rt,EqualDepth as Ct,LessEqualDepth as Et,LessDepth as wt,AlwaysDepth as Mt,NeverDepth as Bt,UnsignedShort4444Type as Ft,UnsignedShort5551Type as Ut,UnsignedInt5999Type as Pt,AlphaFormat as It,LuminanceFormat as Lt,LuminanceAlphaFormat as Dt,RGB_S3TC_DXT1_Format as Vt,RGBA_S3TC_DXT1_Format as Ot,RGBA_S3TC_DXT3_Format as Gt,RGBA_S3TC_DXT5_Format as kt,RGB_PVRTC_4BPPV1_Format as zt,RGB_PVRTC_2BPPV1_Format as $t,RGBA_PVRTC_4BPPV1_Format as Wt,RGBA_PVRTC_2BPPV1_Format as Ht,RGB_ETC1_Format as jt,RGB_ETC2_Format as qt,RGBA_ETC2_EAC_Format as Xt,RGBA_ASTC_4x4_Format as Kt,RGBA_ASTC_5x4_Format as Yt,RGBA_ASTC_5x5_Format as Qt,RGBA_ASTC_6x5_Format as Zt,RGBA_ASTC_6x6_Format as Jt,RGBA_ASTC_8x5_Format as er,RGBA_ASTC_8x6_Format as tr,RGBA_ASTC_8x8_Format as rr,RGBA_ASTC_10x5_Format as sr,RGBA_ASTC_10x6_Format as ir,RGBA_ASTC_10x8_Format as nr,RGBA_ASTC_10x10_Format as or,RGBA_ASTC_12x10_Format as ar,RGBA_ASTC_12x12_Format as ur,RGBA_BPTC_Format as lr,RED_RGTC1_Format as dr,SIGNED_RED_RGTC1_Format as cr,RED_GREEN_RGTC2_Format as hr,SIGNED_RED_GREEN_RGTC2_Format as pr,RepeatWrapping as gr,ClampToEdgeWrapping as mr,MirroredRepeatWrapping as fr,NearestFilter as yr,NearestMipmapNearestFilter as xr,NeverCompare as br,AlwaysCompare as Tr,LessEqualCompare as _r,EqualCompare as vr,GreaterEqualCompare as Nr,GreaterCompare as Sr,NotEqualCompare as Ar,warnOnce as Rr,NotEqualStencilFunc as Cr,GreaterStencilFunc as Er,GreaterEqualStencilFunc as wr,EqualStencilFunc as Mr,LessEqualStencilFunc as Br,LessStencilFunc as Fr,AlwaysStencilFunc as Ur,NeverStencilFunc as Pr,DecrementWrapStencilOp as Ir,IncrementWrapStencilOp as Lr,DecrementStencilOp as Dr,IncrementStencilOp as Vr,InvertStencilOp as Or,ReplaceStencilOp as Gr,ZeroStencilOp as kr,KeepStencilOp as zr,MaxEquation as $r,MinEquation as Wr,SpotLight as Hr,PointLight as jr,DirectionalLight as qr,RectAreaLight as Xr,AmbientLight as Kr,HemisphereLight as Yr,LightProbe as Qr,LinearToneMapping as Zr,ReinhardToneMapping as Jr,CineonToneMapping as es,ACESFilmicToneMapping as ts,AgXToneMapping as rs,NeutralToneMapping as ss,Group as is,Loader as ns,FileLoader as os,MaterialLoader as as,ObjectLoader as us}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,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,ConstantAlphaFactor,ConstantColorFactor,Controls,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CustomToneMapping,CylinderGeometry,Cylindrical,Data3DTexture,DataTextureLoader,DataUtils,DefaultLoadingManager,DetachedBindMode,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,ExtrudeGeometry,Fog,FogExp2,GLBufferAttribute,GLSL1,GLSL3,GridHelper,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,InstancedBufferGeometry,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,KeyframeTrack,LOD,LatheGeometry,Layers,Light,Line,Line3,LineCurve,LineCurve3,LineLoop,LineSegments,LinearInterpolant,LinearMipMapNearestFilter,LinearTransfer,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,Matrix2,MeshDepthMaterial,MeshDistanceMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NormalAnimationBlendMode,NumberKeyframeTrack,OctahedronGeometry,OneMinusConstantAlphaFactor,OneMinusConstantColorFactor,PCFSoftShadowMap,Path,PlaneGeometry,PlaneHelper,PointLightHelper,Points,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,Quaternion,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGB_BPTC_SIGNED_Format,RGB_BPTC_UNSIGNED_Format,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RenderTarget3D,RenderTargetArray,RingGeometry,ShaderMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Sphere,Spherical,SphericalHarmonics3,SplineCurve,SpotLightHelper,Sprite,StaticCopyUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGLRenderTarget,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding}from"./three.core.min.js";const ls=["alphaMap","alphaTest","anisotropy","anisotropyMap","anisotropyRotation","aoMap","attenuationColor","attenuationDistance","bumpMap","clearcoat","clearcoatMap","clearcoatNormalMap","clearcoatNormalScale","clearcoatRoughness","color","dispersion","displacementMap","emissive","emissiveMap","envMap","gradientMap","ior","iridescence","iridescenceIOR","iridescenceMap","iridescenceThicknessMap","lightMap","map","matcap","metalness","metalnessMap","normalMap","normalScale","opacity","roughness","roughnessMap","sheen","sheenColor","sheenColorMap","sheenRoughnessMap","shininess","specular","specularColor","specularColorMap","specularIntensity","specularIntensityMap","specularMap","thickness","transmission","transmissionMap"];class ds{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=ls,this.renderId=0}firstInitialization(e){return!1===this.renderObjects.has(e)&&(this.getRenderObjectData(e),!0)}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:{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}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 null!==e.renderer.nodes.modelViewMatrix||null!==e.renderer.nodes.modelNormalViewMatrix}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){const{object:t,material:r,geometry:s}=e,i=this.getRenderObjectData(e);if(!0!==i.worldMatrix.equals(t.matrixWorld))return i.worldMatrix.copy(t.matrixWorld),!1;const n=i.material;for(const e in n){const t=n[e],s=r[e];if(void 0!==t.equals){if(!1===t.equals(s))return t.copy(s),!1}else if(!0===s.isTexture){if(t.id!==s.id||t.version!==s.version)return t.id=s.id,t.version=s.version,!1}else if(t!==s)return n[e]=s,!1}if(n.transmission>0){const{width:t,height:r}=e.context;if(i.bufferWidth!==t||i.bufferHeight!==r)return i.bufferWidth=t,i.bufferHeight=r,!1}const o=i.geometry,a=s.attributes,u=o.attributes,l=Object.keys(u),d=Object.keys(a);if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(a),!1;for(const e of l){const t=u[e],r=a[e];if(void 0===r)return delete u[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const c=s.index,h=o.indexVersion,p=c?c.version:null;if(h!==p)return o.indexVersion=p,!1;if(o.drawRange.start!==s.drawRange.start||o.drawRange.count!==s.drawRange.count)return o.drawRange.start=s.drawRange.start,o.drawRange.count=s.drawRange.count,!1;if(i.morphTargetInfluences){let e=!1;for(let r=0;r>>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 hs=e=>cs(e),ps=e=>cs(e),gs=(...e)=>cs(e);function ms(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of fs(e))r.push(cs(s.slice(0,-4)),i.getCacheKey(t));return cs(r)}function*fs(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0))).buffer}var Cs=Object.freeze({__proto__:null,arrayBufferToBase64:As,base64ToArrayBuffer:Rs,getCacheKey:ms,getDataFromObject:Ss,getLengthFromType:_s,getNodeChildren:fs,getTypeFromLength:bs,getTypedArrayFromType:Ts,getValueFromType:Ns,getValueType:vs,hash:gs,hashArray:ps,hashString:hs});const Es={VERTEX:"vertex",FRAGMENT:"fragment"},ws={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Ms={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Bs={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Fs=["fragment","vertex"],Us=["setup","analyze","generate"],Ps=[...Fs,"compute"],Is=["x","y","z","w"];let Ls=0;class Ds extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=ws.NONE,this.updateBeforeType=ws.NONE,this.updateAfterType=ws.NONE,this.uuid=a.generateUUID(),this.version=0,this.global=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:Ls++})}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.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,ws.FRAME)}onRenderUpdate(e){return this.onUpdate(e,ws.RENDER)}onObjectUpdate(e){return this.onUpdate(e,ws.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of fs(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=gs(ms(this,e),this.customCacheKey()),this._cacheKeyVersion=this.version),this._cacheKey}customCacheKey(){return 0}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return t.outputNode||null}analyze(e){if(1===e.increaseUsage(this)){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);e.addNode(this),e.addChain(this);let s=null;const i=e.getBuildStage();if("setup"===i){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){t.initialized=!0;const r=this.setup(e),s=r&&!0===r.isNode;for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e);s&&r.build(e),t.outputNode=r}}else if("analyze"===i)this.analyze(e);else if("generate"===i){if(1===this.generate.length){const r=this.getNodeType(e),i=e.getDataFromNode(this);s=i.snippet,void 0===s?(s=this.generate(e)||"",i.snippet=s):void 0!==i.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),s=e.format(s,r,t)}else s=this.generate(e,t)||""}return e.removeChain(this),e.addSequentialNode(this),s}getSerializeChildren(){return fs(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(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.6,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 Vs extends Ds{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)}generate(e){return`${this.node.build(e)}[ ${this.indexNode.build(e,"uint")} ]`}}class Os extends Ds{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 Gs extends Ds{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),o=e.getPropertyName(n);return e.addLineFlowCode(`${o} = ${i}`,this),s.snippet=i,s.propertyName=o,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class ks extends Gs{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=this.nodes,i=e.getComponentType(r),n=[];for(const t of s){let r=t.build(e);const s=e.getComponentType(t.getNodeType(e));s!==i&&(r=e.format(r,s,i)),n.push(r)}const o=`${e.getType(r)}( ${n.join(", ")} )`;return e.format(o,r,t)}}const zs=Is.join("");class $s extends Ds{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(Is.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))}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 o=r.build(e,n);i=this.components.length===s&&this.components===zs.slice(0,this.components.length)?e.format(o,n,t):e.format(`${o}.${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 Ws extends Gs{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)),o=e.getTypeFromLength(r.length,n),a=s.build(e,o),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),Zs=e=>Qs(e).split("").sort().join(""),Js={setup(e,t){const r=t.shift();return e(Si(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(Xs.assign(r,...e),r);if(Ks.has(t)){const s=Ks.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&Ks.has(t.slice(0,t.length-6))){const s=Ks.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=Qs(t),Ni(new $s(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Zs(t.slice(3).toLowerCase()),r=>Ni(new Ws(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Zs(t.slice(4).toLowerCase()),()=>Ni(new Hs(Ni(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Ni(new $s(e,t));if(!0===/^\d+$/.test(t))return Ni(new Vs(r,new qs(Number(t),"uint")))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},ei=new WeakMap,ti=new WeakMap,ri=function(e,t=null){for(const r in e)e[r]=Ni(e[r],t);return e},si=function(e,t=null){const r=e.length;for(let s=0;sNi(null!==s?Object.assign(e,s):e);return null===t?(...t)=>i(new e(...Ai(t))):null!==r?(r=Ni(r),(...s)=>i(new e(t,...Ai(s),r))):(...r)=>i(new e(t,...Ai(r)))},ni=function(e,...t){return Ni(new e(...Ai(t)))};class oi extends Ds{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t);if(s.onceOutput)return s.onceOutput;let i=null;if(t.layout){let s=ti.get(e.constructor);void 0===s&&(s=new WeakMap,ti.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=Ni(e.buildFunctionNode(t)),s.set(t,n)),null!==e.currentFunctionNode&&e.currentFunctionNode.includes.push(n),i=Ni(n.call(r))}else{const s=t.jsFunc,n=null!==r||s.length>1?s(r||[],e):s(e);i=Ni(n)}return t.once&&(s.onceOutput=i),i}getOutputNode(e){const t=e.getNodeProperties(this);return null===t.outputNode&&(t.outputNode=this.setupOutput(e)),t.outputNode}setup(e){return this.getOutputNode(e)}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}generate(e,t){return this.getOutputNode(e).build(e,t)}}class ai extends Ds{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return Si(e),Ni(new oi(this,e))}setup(){return this.call()}}const ui=[!1,!0],li=[0,1,2,3],di=[-1,-2],ci=[.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],hi=new Map;for(const e of ui)hi.set(e,new qs(e));const pi=new Map;for(const e of li)pi.set(e,new qs(e,"uint"));const gi=new Map([...pi].map((e=>new qs(e.value,"int"))));for(const e of di)gi.set(e,new qs(e,"int"));const mi=new Map([...gi].map((e=>new qs(e.value))));for(const e of ci)mi.set(e,new qs(e));for(const e of ci)mi.set(-e,new qs(-e));const fi={bool:hi,uint:pi,ints:gi,float:mi},yi=new Map([...hi,...mi]),xi=(e,t)=>yi.has(e)?yi.get(e):!0===e.isNode?e:new qs(e,t),bi=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[Ns(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Ni(t.get(r[0]));if(1===r.length){const t=xi(r[0],e);return(e=>{try{return e.getNodeType()}catch(e){return}})(t)===e?Ni(t):Ni(new Os(t,e))}const s=r.map((e=>xi(e)));return Ni(new ks(s,e))}},Ti=e=>"object"==typeof e&&null!==e?e.value:e,_i=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function vi(e,t){return new Proxy(new ai(e,t),Js)}const Ni=(e,t=null)=>function(e,t=null){const r=vs(e);if("node"===r){let t=ei.get(e);return void 0===t&&(t=new Proxy(e,Js),ei.set(e,t),ei.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Ni(xi(e,t)):"shader"===r?Ei(e):e}(e,t),Si=(e,t=null)=>new ri(e,t),Ai=(e,t=null)=>new si(e,t),Ri=(...e)=>new ii(...e),Ci=(...e)=>new ni(...e),Ei=(e,t)=>{const r=new vi(e,t),s=(...e)=>{let t;return Si(e),t=e[0]&&e[0].isNode?[...e]:e[0],r.call(t)};return s.shaderNode=r,s.setLayout=e=>(r.setLayout(e),s),s.once=()=>(r.once=!0,s),s};Ys("toGlobal",(e=>(e.global=!0,e)));const wi=e=>{Xs=e},Mi=()=>Xs,Bi=(...e)=>Xs.If(...e);function Fi(e){return Xs&&Xs.add(e),e}Ys("append",Fi);const Ui=new bi("color"),Pi=new bi("float",fi.float),Ii=new bi("int",fi.ints),Li=new bi("uint",fi.uint),Di=new bi("bool",fi.bool),Vi=new bi("vec2"),Oi=new bi("ivec2"),Gi=new bi("uvec2"),ki=new bi("bvec2"),zi=new bi("vec3"),$i=new bi("ivec3"),Wi=new bi("uvec3"),Hi=new bi("bvec3"),ji=new bi("vec4"),qi=new bi("ivec4"),Xi=new bi("uvec4"),Ki=new bi("bvec4"),Yi=new bi("mat2"),Qi=new bi("mat3"),Zi=new bi("mat4");Ys("toColor",Ui),Ys("toFloat",Pi),Ys("toInt",Ii),Ys("toUint",Li),Ys("toBool",Di),Ys("toVec2",Vi),Ys("toIVec2",Oi),Ys("toUVec2",Gi),Ys("toBVec2",ki),Ys("toVec3",zi),Ys("toIVec3",$i),Ys("toUVec3",Wi),Ys("toBVec3",Hi),Ys("toVec4",ji),Ys("toIVec4",qi),Ys("toUVec4",Xi),Ys("toBVec4",Ki),Ys("toMat2",Yi),Ys("toMat3",Qi),Ys("toMat4",Zi);const Ji=Ri(Vs),en=(e,t)=>Ni(new Os(Ni(e),t));Ys("element",Ji),Ys("convert",en);class tn extends Ds{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 rn=e=>new tn(e),sn=(e,t=0)=>new tn(e,!0,t),nn=sn("frame"),on=sn("render"),an=rn("object");class un extends js{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=an}label(e){return this.name=e,this}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate((t=>{const s=e(t,r);void 0!==s&&(this.value=s)}),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),o=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),a=e.getPropertyName(o);return void 0!==e.context.label&&delete e.context.label,e.format(a,r,t)}}const ln=(e,t)=>{const r=_i(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return Ni(new un(s,r))};class dn extends Ds{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0}getHash(e){return this.name||super.getHash(e)}isGlobal(){return!0}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 cn=(e,t)=>Ni(new dn(e,t)),hn=(e,t)=>Ni(new dn(e,t,!0)),pn=Ci(dn,"vec4","DiffuseColor"),gn=Ci(dn,"vec3","EmissiveColor"),mn=Ci(dn,"float","Roughness"),fn=Ci(dn,"float","Metalness"),yn=Ci(dn,"float","Clearcoat"),xn=Ci(dn,"float","ClearcoatRoughness"),bn=Ci(dn,"vec3","Sheen"),Tn=Ci(dn,"float","SheenRoughness"),_n=Ci(dn,"float","Iridescence"),vn=Ci(dn,"float","IridescenceIOR"),Nn=Ci(dn,"float","IridescenceThickness"),Sn=Ci(dn,"float","AlphaT"),An=Ci(dn,"float","Anisotropy"),Rn=Ci(dn,"vec3","AnisotropyT"),Cn=Ci(dn,"vec3","AnisotropyB"),En=Ci(dn,"color","SpecularColor"),wn=Ci(dn,"float","SpecularF90"),Mn=Ci(dn,"float","Shininess"),Bn=Ci(dn,"vec4","Output"),Fn=Ci(dn,"float","dashSize"),Un=Ci(dn,"float","gapSize"),Pn=Ci(dn,"float","pointWidth"),In=Ci(dn,"float","IOR"),Ln=Ci(dn,"float","Transmission"),Dn=Ci(dn,"float","Thickness"),Vn=Ci(dn,"float","AttenuationDistance"),On=Ci(dn,"color","AttenuationColor"),Gn=Ci(dn,"float","Dispersion");class kn extends Gs{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t}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 Is.join("").slice(0,r)!==t.components}return!1}generate(e,t){const{targetNode:r,sourceNode:s}=this,i=this.needsSplitAssign(e),n=r.getNodeType(e),o=r.context({assign:!0}).build(e),a=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=o);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${a}`,this);const u=r.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))for(let e=0;e(t=t.length>1||t[0]&&!0===t[0].isNode?Ai(t):Si(t[0]),Ni(new $n(Ni(e),t)));Ys("call",Wn);class Hn extends Gs{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Hn(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"=="===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("<"===r||">"===r||"<="===r||">="===r){const r=t?e.getTypeLength(t):Math.max(e.getTypeLength(n),e.getTypeLength(o));return r>1?`bvec${r}`:"bool"}return"float"===n&&e.isMatrix(o)?o:e.isMatrix(n)&&e.isVector(o)?e.getVectorFromMatrix(n):e.isVector(n)&&e.isMatrix(o)?e.getVectorFromMatrix(o):e.getTypeLength(o)>e.getTypeLength(n)?o:n}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e,t);let o=null,a=null;"void"!==n?(o=s.getNodeType(e),a=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r?e.isVector(o)?a=o:o!==a&&(o=a="float"):">>"===r||"<<"===r?(o=n,a=e.changeComponentType(a,"uint")):e.isMatrix(o)&&e.isVector(a)?a=e.getVectorFromMatrix(o):o=e.isVector(o)&&e.isMatrix(a)?e.getVectorFromMatrix(a):a=n):o=a=n;const u=s.build(e,o),l=void 0!==i?i.build(e,a):null,d=e.getTypeLength(t),c=e.getFunctionOperator(r);return"void"!==t?"<"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} < ${l} )`,n,t):"<="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} <= ${l} )`,n,t):">"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} > ${l} )`,n,t):">="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} >= ${l} )`,n,t):"!"===r||"~"===r?e.format(`(${r}${u})`,o,t):c?e.format(`${c}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t):"void"!==o?c?e.format(`${c}( ${u}, ${l} )`,n,t):e.format(`${u} ${r} ${l}`,n,t):void 0}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const jn=Ri(Hn,"+"),qn=Ri(Hn,"-"),Xn=Ri(Hn,"*"),Kn=Ri(Hn,"/"),Yn=Ri(Hn,"%"),Qn=Ri(Hn,"=="),Zn=Ri(Hn,"!="),Jn=Ri(Hn,"<"),eo=Ri(Hn,">"),to=Ri(Hn,"<="),ro=Ri(Hn,">="),so=Ri(Hn,"&&"),io=Ri(Hn,"||"),no=Ri(Hn,"!"),oo=Ri(Hn,"^^"),ao=Ri(Hn,"&"),uo=Ri(Hn,"~"),lo=Ri(Hn,"|"),co=Ri(Hn,"^"),ho=Ri(Hn,"<<"),po=Ri(Hn,">>");Ys("add",jn),Ys("sub",qn),Ys("mul",Xn),Ys("div",Kn),Ys("modInt",Yn),Ys("equal",Qn),Ys("notEqual",Zn),Ys("lessThan",Jn),Ys("greaterThan",eo),Ys("lessThanEqual",to),Ys("greaterThanEqual",ro),Ys("and",so),Ys("or",io),Ys("not",no),Ys("xor",oo),Ys("bitAnd",ao),Ys("bitNot",uo),Ys("bitOr",lo),Ys("bitXor",co),Ys("shiftLeft",ho),Ys("shiftRight",po);const go=(...e)=>(console.warn("TSL.OperatorNode: .remainder() has been renamed to .modInt()."),Yn(...e));Ys("remainder",go);class mo extends Gs{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){super(),this.method=e,this.aNode=t,this.bNode=r,this.cNode=s,this.isMathNode=!0}getInputType(e){const t=this.aNode.getNodeType(e),r=this.bNode?this.bNode.getNodeType(e):null,s=this.cNode?this.cNode.getNodeType(e):null,i=e.isMatrix(t)?0:e.getTypeLength(t),n=e.isMatrix(r)?0:e.getTypeLength(r),o=e.isMatrix(s)?0:e.getTypeLength(s);return i>n&&i>o?t:n>o?r:o>i?s:t}getNodeType(e){const t=this.method;return t===mo.LENGTH||t===mo.DISTANCE||t===mo.DOT?"float":t===mo.CROSS?"vec3":t===mo.ALL?"bool":t===mo.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):t===mo.MOD?this.aNode.getNodeType(e):this.getInputType(e)}generate(e,t){let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,o=this.bNode,a=this.cNode,d=e.renderer.coordinateSystem;if(r===mo.TRANSFORM_DIRECTION){let r=n,s=o;e.isMatrix(r.getNodeType(e))?s=ji(zi(s),0):r=ji(zi(r),0);const i=Xn(r,s).xyz;return Fo(i).build(e,t)}if(r===mo.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===mo.ONE_MINUS)return qn(1,n).build(e,t);if(r===mo.RECIPROCAL)return Kn(1,n).build(e,t);if(r===mo.DIFFERENCE)return Go(qn(n,o)).build(e,t);{const c=[];return r===mo.CROSS||r===mo.MOD?c.push(n.build(e,s),o.build(e,s)):d===u&&r===mo.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),o.build(e,i)):d===u&&(r===mo.MIN||r===mo.MAX)||r===mo.MOD?c.push(n.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):r===mo.REFRACT?c.push(n.build(e,i),o.build(e,i),a.build(e,"float")):r===mo.MIX?c.push(n.build(e,i),o.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)):(d===l&&r===mo.ATAN&&null!==o&&(r="atan2"),c.push(n.build(e,i)),null!==o&&c.push(o.build(e,i)),null!==a&&c.push(a.build(e,i))),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}mo.ALL="all",mo.ANY="any",mo.RADIANS="radians",mo.DEGREES="degrees",mo.EXP="exp",mo.EXP2="exp2",mo.LOG="log",mo.LOG2="log2",mo.SQRT="sqrt",mo.INVERSE_SQRT="inversesqrt",mo.FLOOR="floor",mo.CEIL="ceil",mo.NORMALIZE="normalize",mo.FRACT="fract",mo.SIN="sin",mo.COS="cos",mo.TAN="tan",mo.ASIN="asin",mo.ACOS="acos",mo.ATAN="atan",mo.ABS="abs",mo.SIGN="sign",mo.LENGTH="length",mo.NEGATE="negate",mo.ONE_MINUS="oneMinus",mo.DFDX="dFdx",mo.DFDY="dFdy",mo.ROUND="round",mo.RECIPROCAL="reciprocal",mo.TRUNC="trunc",mo.FWIDTH="fwidth",mo.TRANSPOSE="transpose",mo.BITCAST="bitcast",mo.EQUALS="equals",mo.MIN="min",mo.MAX="max",mo.MOD="mod",mo.STEP="step",mo.REFLECT="reflect",mo.DISTANCE="distance",mo.DIFFERENCE="difference",mo.DOT="dot",mo.CROSS="cross",mo.POW="pow",mo.TRANSFORM_DIRECTION="transformDirection",mo.MIX="mix",mo.CLAMP="clamp",mo.REFRACT="refract",mo.SMOOTHSTEP="smoothstep",mo.FACEFORWARD="faceforward";const fo=Pi(1e-6),yo=Pi(1e6),xo=Pi(Math.PI),bo=Pi(2*Math.PI),To=Ri(mo,mo.ALL),_o=Ri(mo,mo.ANY),vo=Ri(mo,mo.RADIANS),No=Ri(mo,mo.DEGREES),So=Ri(mo,mo.EXP),Ao=Ri(mo,mo.EXP2),Ro=Ri(mo,mo.LOG),Co=Ri(mo,mo.LOG2),Eo=Ri(mo,mo.SQRT),wo=Ri(mo,mo.INVERSE_SQRT),Mo=Ri(mo,mo.FLOOR),Bo=Ri(mo,mo.CEIL),Fo=Ri(mo,mo.NORMALIZE),Uo=Ri(mo,mo.FRACT),Po=Ri(mo,mo.SIN),Io=Ri(mo,mo.COS),Lo=Ri(mo,mo.TAN),Do=Ri(mo,mo.ASIN),Vo=Ri(mo,mo.ACOS),Oo=Ri(mo,mo.ATAN),Go=Ri(mo,mo.ABS),ko=Ri(mo,mo.SIGN),zo=Ri(mo,mo.LENGTH),$o=Ri(mo,mo.NEGATE),Wo=Ri(mo,mo.ONE_MINUS),Ho=Ri(mo,mo.DFDX),jo=Ri(mo,mo.DFDY),qo=Ri(mo,mo.ROUND),Xo=Ri(mo,mo.RECIPROCAL),Ko=Ri(mo,mo.TRUNC),Yo=Ri(mo,mo.FWIDTH),Qo=Ri(mo,mo.TRANSPOSE),Zo=Ri(mo,mo.BITCAST),Jo=Ri(mo,mo.EQUALS),ea=Ri(mo,mo.MIN),ta=Ri(mo,mo.MAX),ra=Ri(mo,mo.MOD),sa=Ri(mo,mo.STEP),ia=Ri(mo,mo.REFLECT),na=Ri(mo,mo.DISTANCE),oa=Ri(mo,mo.DIFFERENCE),aa=Ri(mo,mo.DOT),ua=Ri(mo,mo.CROSS),la=Ri(mo,mo.POW),da=Ri(mo,mo.POW,2),ca=Ri(mo,mo.POW,3),ha=Ri(mo,mo.POW,4),pa=Ri(mo,mo.TRANSFORM_DIRECTION),ga=e=>Xn(ko(e),la(Go(e),1/3)),ma=e=>aa(e,e),fa=Ri(mo,mo.MIX),ya=(e,t=0,r=1)=>Ni(new mo(mo.CLAMP,Ni(e),Ni(t),Ni(r))),xa=e=>ya(e),ba=Ri(mo,mo.REFRACT),Ta=Ri(mo,mo.SMOOTHSTEP),_a=Ri(mo,mo.FACEFORWARD),va=Ei((([e])=>{const t=aa(e.xy,Vi(12.9898,78.233)),r=ra(t,xo);return Uo(Po(r).mul(43758.5453))})),Na=(e,t,r)=>fa(t,r,e),Sa=(e,t,r)=>Ta(t,r,e),Aa=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),Oo(e,t)),Ra=_a,Ca=wo;Ys("all",To),Ys("any",_o),Ys("equals",Jo),Ys("radians",vo),Ys("degrees",No),Ys("exp",So),Ys("exp2",Ao),Ys("log",Ro),Ys("log2",Co),Ys("sqrt",Eo),Ys("inverseSqrt",wo),Ys("floor",Mo),Ys("ceil",Bo),Ys("normalize",Fo),Ys("fract",Uo),Ys("sin",Po),Ys("cos",Io),Ys("tan",Lo),Ys("asin",Do),Ys("acos",Vo),Ys("atan",Oo),Ys("abs",Go),Ys("sign",ko),Ys("length",zo),Ys("lengthSq",ma),Ys("negate",$o),Ys("oneMinus",Wo),Ys("dFdx",Ho),Ys("dFdy",jo),Ys("round",qo),Ys("reciprocal",Xo),Ys("trunc",Ko),Ys("fwidth",Yo),Ys("atan2",Aa),Ys("min",ea),Ys("max",ta),Ys("mod",ra),Ys("step",sa),Ys("reflect",ia),Ys("distance",na),Ys("dot",aa),Ys("cross",ua),Ys("pow",la),Ys("pow2",da),Ys("pow3",ca),Ys("pow4",ha),Ys("transformDirection",pa),Ys("mix",Na),Ys("clamp",ya),Ys("refract",ba),Ys("smoothstep",Sa),Ys("faceForward",_a),Ys("difference",oa),Ys("saturate",xa),Ys("cbrt",ga),Ys("transpose",Qo),Ys("rand",va);class Ea extends Ds{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 this.setup(e),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.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.getNodeProperties(this);n.condNode=t,n.ifNode=r.context({nodeBlock:r}),n.elseNode=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:o}=e.getNodeProperties(this),a="void"!==t,u=a?cn(r).build(e):"";s.nodeProperty=u;const l=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${l} ) {\n\n`).addFlowTab();let d=n.build(e,r);if(d&&(d=a?u+" = "+d+";":"return "+d+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+d+"\n\n"+e.tab+"}"),null!==o){e.addFlowCode(" else {\n\n").addFlowTab();let t=o.build(e,r);t&&(t=a?u+" = "+t+";":"return "+t+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(u,r,t)}}const wa=Ri(Ea);Ys("select",wa);const Ma=(...e)=>(console.warn("TSL.ConditionalNode: cond() has been renamed to select()."),wa(...e));Ys("cond",Ma);class Ba extends Ds{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){this.node.build(e)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value});const r=this.node.build(e);return e.setContext(t),r}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const Fa=Ri(Ba),Ua=(e,t)=>Fa(e,{label:t});Ys("context",Fa),Ys("label",Ua);class Pa extends Ds{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}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let o=!1,a=!1;s&&(o=e.isDeterministic(t),a=n?s:o);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,a),c=e.getPropertyName(d);let h=c;if(a){const t=e.getType(d.type);h=n?o?`const ${c}`:`let ${c}`:`const ${t} ${c}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const Ia=Ri(Pa),La=(e,t=null)=>Ia(e,t).append(),Da=(e,t=null)=>Ia(e,t,!0).append();Ys("toVar",La),Ys("toConst",Da);const Va=e=>(console.warn('TSL: "temp( node )" is deprecated. Use "Var( node )" or "node.toVar()" instead.'),Ia(e));Ys("temp",Va);class Oa extends Ds{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0}isGlobal(){return!0}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);t.varying=r=e.getVaryingFromNode(this,s,i),t.node=this.node}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e)}analyze(e){return this.setupVarying(e),this.node.analyze(e)}generate(e){const t=e.getNodeProperties(this),r=this.setupVarying(e),s="fragment"===e.shaderStage&&!0===t.reassignPosition&&e.context.needsPositionReassign;if(void 0===t.propertyName||s){const i=this.getNodeType(e),n=e.getPropertyName(r,Es.VERTEX);e.flowNodeFromShaderStage(Es.VERTEX,this.node,i,n),t.propertyName=n,s?t.reassignPosition=!1:void 0===t.reassignPosition&&e.context.isPositionNodeInput&&(t.reassignPosition=!0)}return e.getPropertyName(r)}}const Ga=Ri(Oa),ka=e=>Ga(e);Ys("toVarying",Ga),Ys("toVertexStage",ka),Ys("varying",((...e)=>(console.warn("TSL.VaryingNode: .varying() has been renamed to .toVarying()."),Ga(...e)))),Ys("vertexStage",((...e)=>(console.warn("TSL.VaryingNode: .vertexStage() has been renamed to .toVertexStage()."),Ga(...e))));const za=Ei((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return fa(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),$a=Ei((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return fa(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Wa="WorkingColorSpace",Ha="OutputColorSpace";class ja extends Gs{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===Wa?d.workingColorSpace:t===Ha?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 n=t;return!1!==d.enabled&&r!==s&&r&&s?(d.getTransfer(r)===c&&(n=ji(za(n.rgb),n.a)),d.getPrimaries(r)!==d.getPrimaries(s)&&(n=ji(Qi(d._getMatrix(new i,r,s)).mul(n.rgb),n.a)),d.getTransfer(s)===c&&(n=ji($a(n.rgb),n.a)),n):n}}const qa=e=>Ni(new ja(Ni(e),Wa,Ha)),Xa=e=>Ni(new ja(Ni(e),Ha,Wa)),Ka=(e,t)=>Ni(new ja(Ni(e),Wa,t)),Ya=(e,t)=>Ni(new ja(Ni(e),t,Wa));Ys("toOutputColorSpace",qa),Ys("toWorkingColorSpace",Xa),Ys("workingToColorSpace",Ka),Ys("colorSpaceToWorking",Ya);let Qa=class extends Vs{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 Za extends Ds{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=ws.OBJECT}setGroup(e){return this.group=e,this}element(e){return Ni(new Qa(this,Ni(e)))}setNodeType(e){const t=ln(null,e).getSelf();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;eNi(new Ja(e,t,r));class tu extends Gs{static get type(){return"ToneMappingNode"}constructor(e,t=su,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return gs(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===h)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=ji(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const ru=(e,t,r)=>Ni(new tu(e,Ni(t),Ni(r))),su=eu("toneMappingExposure","float");Ys("toneMapping",((e,t,r)=>ru(t,r,e)));class iu extends js{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=p,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(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=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,o=!0===r.isInterleavedBuffer?r:new g(r,i),a=new f(o,s,n);o.setUsage(this.usage),this.attribute=a,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=Ga(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}}const nu=(e,t=null,r=0,s=0)=>Ni(new iu(e,t,r,s)),ou=(e,t=null,r=0,s=0)=>nu(e,t,r,s).setUsage(m),au=(e,t=null,r=0,s=0)=>nu(e,t,r,s).setInstanced(!0),uu=(e,t=null,r=0,s=0)=>ou(e,t,r,s).setInstanced(!0);Ys("toAttribute",(e=>nu(e.value)));class lu extends Ds{static get type(){return"ComputeNode"}constructor(e,t,r=[64]){super("void"),this.isComputeNode=!0,this.computeNode=e,this.count=t,this.workgroupSize=r,this.dispatchCount=0,this.version=1,this.name="",this.updateBeforeType=ws.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}label(e){return this.name=e,this}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;eNi(new lu(Ni(e),t,r));Ys("compute",du);class cu extends Ds{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!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}}const hu=(e,t)=>Ni(new cu(Ni(e),t));Ys("cache",hu);class pu extends Ds{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 gu=Ri(pu);Ys("bypass",gu);class mu extends Ds{static get type(){return"RemapNode"}constructor(e,t,r,s=Pi(0),i=Pi(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 o=e.sub(t).div(r.sub(t));return!0===n&&(o=o.clamp()),o.mul(i.sub(s)).add(s)}}const fu=Ri(mu,null,null,{doClamp:!1}),yu=Ri(mu);Ys("remap",fu),Ys("remapClamp",yu);class xu extends Ds{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 bu=Ri(xu),Tu=e=>(e?wa(e,bu("discard")):bu("discard")).append();Ys("discard",Tu);class _u extends Gs{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||h,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||y;return r!==h&&(t=t.toneMapping(r)),s!==y&&s!==d.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const vu=(e,t=null,r=null)=>Ni(new _u(Ni(e),t,r));Ys("renderOutput",vu);class Nu extends Ds{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 Ga(this).build(e,r)}return console.warn(`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 Su=(e,t)=>Ni(new Nu(e,t)),Au=(e=0)=>Su("uv"+(e>0?e:""),"vec2");class Ru extends Ds{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 Cu=Ri(Ru);class Eu extends un{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=ws.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 wu=Ri(Eu);class Mu extends un{static get type(){return"TextureNode"}constructor(e,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.sampler=!0,this.updateMatrix=!1,this.updateType=ws.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=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===x?"uvec4":this.value.type===b?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Au(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=ln(this.value.matrix)),this._matrixUniform.mul(zi(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?ws.RENDER:ws.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Ii(Cu(this,this.levelNode).y).sub(t.y).sub(1))),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().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,o,a){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):a?e.generateTextureGrad(u,t,r,a,n):o?e.generateTextureCompare(u,t,r,o,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if("sampler"===t)return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:a,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=a?a.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);o=e.getPropertyName(y);const x=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${o} = ${x}`,this),n.snippet=x,n.propertyName=o}let a=o;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(a=Ya(bu(a,u),r.colorSpace).setup(e).build(e,u)),e.format(a,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){return console.warn("THREE.TextureNode: .uv() has been renamed. Use .sample() instead."),this.sample(e)}sample(e){const t=this.clone();return t.uvNode=Ni(e),t.referenceNode=this.getSelf(),Ni(t)}blur(e){const t=this.clone();return t.biasNode=Ni(e).mul(wu(t)),t.referenceNode=this.getSelf(),Ni(t)}level(e){const t=this.clone();return t.levelNode=Ni(e),t.referenceNode=this.getSelf(),Ni(t)}size(e){return Cu(this,e)}bias(e){const t=this.clone();return t.biasNode=Ni(e),t.referenceNode=this.getSelf(),Ni(t)}compare(e){const t=this.clone();return t.compareNode=Ni(e),t.referenceNode=this.getSelf(),Ni(t)}grad(e,t){const r=this.clone();return r.gradNode=[Ni(e),Ni(t)],r.referenceNode=this.getSelf(),Ni(r)}depth(e){const t=this.clone();return t.depthNode=Ni(e),t.referenceNode=this.getSelf(),Ni(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()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e}}const Bu=Ri(Mu),Fu=(...e)=>Bu(...e).setSampler(!1);class Uu extends un{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Pu=(e,t,r)=>Ni(new Uu(e,t,r));class Iu extends Vs{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 Lu extends Uu{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?vs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=ws.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;rNi(new Lu(e,t)),Vu=ln(0,"uint").setGroup(sn("cameraIndex")).toVarying("v_cameraIndex"),Ou=ln("float").label("cameraNear").setGroup(on).onRenderUpdate((({camera:e})=>e.near)),Gu=ln("float").label("cameraFar").setGroup(on).onRenderUpdate((({camera:e})=>e.far)),ku=Ei((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Du(r).setGroup(on).label("cameraProjectionMatrices").element(Vu).toVar("cameraProjectionMatrix")}else t=ln("mat4").label("cameraProjectionMatrix").setGroup(on).onRenderUpdate((({camera:e})=>e.projectionMatrix));return t})).once()(),zu=ln("mat4").label("cameraProjectionMatrixInverse").setGroup(on).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse)),$u=Ei((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Du(r).setGroup(on).label("cameraViewMatrices").element(Vu).toVar("cameraViewMatrix")}else t=ln("mat4").label("cameraViewMatrix").setGroup(on).onRenderUpdate((({camera:e})=>e.matrixWorldInverse));return t})).once()(),Wu=ln("mat4").label("cameraWorldMatrix").setGroup(on).onRenderUpdate((({camera:e})=>e.matrixWorld)),Hu=ln("mat3").label("cameraNormalMatrix").setGroup(on).onRenderUpdate((({camera:e})=>e.normalMatrix)),ju=ln(new r).label("cameraPosition").setGroup(on).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld)));class qu extends Ds{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=ws.OBJECT,this._uniformNode=new un(null)}getNodeType(){const e=this.scope;return e===qu.WORLD_MATRIX?"mat4":e===qu.POSITION||e===qu.VIEW_POSITION||e===qu.DIRECTION||e===qu.SCALE?"vec3":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===qu.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===qu.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===qu.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===qu.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===qu.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}}generate(e){const t=this.scope;return t===qu.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t!==qu.POSITION&&t!==qu.VIEW_POSITION&&t!==qu.DIRECTION&&t!==qu.SCALE||(this._uniformNode.nodeType="vec3"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}qu.WORLD_MATRIX="worldMatrix",qu.POSITION="position",qu.SCALE="scale",qu.VIEW_POSITION="viewPosition",qu.DIRECTION="direction";const Xu=Ri(qu,qu.DIRECTION),Ku=Ri(qu,qu.WORLD_MATRIX),Yu=Ri(qu,qu.POSITION),Qu=Ri(qu,qu.SCALE),Zu=Ri(qu,qu.VIEW_POSITION);class Ju extends qu{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const el=Ci(Ju,Ju.DIRECTION),tl=Ci(Ju,Ju.WORLD_MATRIX),rl=Ci(Ju,Ju.POSITION),sl=Ci(Ju,Ju.SCALE),il=Ci(Ju,Ju.VIEW_POSITION),nl=ln(new i).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),ol=ln(new n).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),al=Ei((e=>e.renderer.nodes.modelViewMatrix||ul)).once()().toVar("modelViewMatrix"),ul=$u.mul(tl),ll=Ei((e=>(e.context.isHighPrecisionModelViewMatrix=!0,ln("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highpModelViewMatrix"),dl=Ei((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return ln("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highpModelNormalViewMatrix"),cl=Su("position","vec3"),hl=cl.toVarying("positionLocal"),pl=cl.toVarying("positionPrevious"),gl=tl.mul(hl).xyz.toVarying("v_positionWorld").context({needsPositionReassign:!0}),ml=hl.transformDirection(tl).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection").context({needsPositionReassign:!0}),fl=Ei((e=>e.context.setupPositionView()),"vec3").once()().toVarying("v_positionView").context({needsPositionReassign:!0}),yl=fl.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class xl extends Ds{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===u&&r.side===T?"false":e.getFrontFacing()}}const bl=Ci(xl),Tl=Pi(bl).mul(2).sub(1),_l=Su("normal","vec3"),vl=Ei((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('TSL.NormalNode: Vertex attribute "normal" not found on geometry.'),zi(0,1,0)):_l),"vec3").once()().toVar("normalLocal"),Nl=fl.dFdx().cross(fl.dFdy()).normalize().toVar("normalFlat"),Sl=Ei((e=>{let t;return t=!0===e.material.flatShading?Nl:Ga(Ml(vl),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),Al=Ga(Sl.transformDirection($u),"v_normalWorld").normalize().toVar("normalWorld"),Rl=Ei((e=>e.context.setupNormal().context({getUV:null})),"vec3").once()().mul(Tl).toVar("transformedNormalView"),Cl=Rl.transformDirection($u).toVar("transformedNormalWorld"),El=Ei((e=>e.context.setupClearcoatNormal().context({getUV:null})),"vec3").once()().mul(Tl).toVar("transformedClearcoatNormalView"),wl=Ei((([e,t=tl])=>{const r=Qi(t),s=e.div(zi(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),Ml=Ei((([e],t)=>{const r=t.renderer.nodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=nl.mul(e);return $u.transformDirection(s)})),Bl=ln(0).onReference((({material:e})=>e)).onRenderUpdate((({material:e})=>e.refractionRatio)),Fl=yl.negate().reflect(Rl),Ul=yl.negate().refract(Rl,Bl),Pl=Fl.transformDirection($u).toVar("reflectVector"),Il=Ul.transformDirection($u).toVar("reflectVector");class Ll extends Mu{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===_?Pl:e.mapping===v?Il:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),zi(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==l&&r.isRenderTargetTexture?t:zi(t.x.negate(),t.yz)}generateUV(e,t){return t.build(e,"vec3")}}const Dl=Ri(Ll);class Vl extends Vs{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 Ol extends Ds{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=ws.OBJECT}element(e){return Ni(new Vl(this,Ni(e)))}setGroup(e){return this.group=e,this}label(e){return this.name=e,this}setNodeType(e){let t=null;t=null!==this.count?Pu(null,e,this.count):Array.isArray(this.getValueFromReference())?Du(null,e):"texture"===e?Bu(null):"cubeTexture"===e?Dl(null):ln(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.label(this.name),this.node=t.getSelf()}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;eNi(new Ol(e,t,r)),kl=(e,t,r,s)=>Ni(new Ol(e,t,s,r));class zl extends Ol{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 $l=(e,t,r=null)=>Ni(new zl(e,t,r)),Wl=Ei((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),Su("tangent","vec4"))))(),Hl=Wl.xyz.toVar("tangentLocal"),jl=al.mul(ji(Hl,0)).xyz.toVarying("v_tangentView").normalize().toVar("tangentView"),ql=jl.transformDirection($u).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Xl=jl.toVar("transformedTangentView"),Kl=Xl.transformDirection($u).normalize().toVar("transformedTangentWorld"),Yl=e=>e.mul(Wl.w).xyz,Ql=Ga(Yl(_l.cross(Wl)),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Zl=Ga(Yl(vl.cross(Hl)),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Jl=Ga(Yl(Sl.cross(jl)),"v_bitangentView").normalize().toVar("bitangentView"),ed=Ga(Yl(Al.cross(ql)),"v_bitangentWorld").normalize().toVar("bitangentWorld"),td=Yl(Rl.cross(Xl)).normalize().toVar("transformedBitangentView"),rd=td.transformDirection($u).normalize().toVar("transformedBitangentWorld"),sd=Qi(jl,Jl,Sl),id=yl.mul(sd),nd=(()=>{let e=Cn.cross(yl);return e=e.cross(Cn).normalize(),e=fa(e,Rl,An.mul(mn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),od=Ei((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),o=t.dFdy(),a=i.dFdx(),u=i.dFdy(),l=r,d=o.cross(l),c=l.cross(n),h=d.mul(a.x).add(c.mul(u.x)),p=d.mul(a.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=Tl.mul(g.inverseSqrt());return jn(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class ad extends Gs{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=N}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=zi(s.xy.mul(r),s.z));let i=null;if(t===S)i=Ml(s);else if(t===N){i=!0===e.hasGeometryAttribute("tangent")?sd.mul(s).normalize():od({eye_pos:fl,surf_norm:Sl,mapN:s,uv:Au()})}return i}}const ud=Ri(ad),ld=Ei((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||Au()),forceUVContext:!0}),s=Pi(r((e=>e)));return Vi(Pi(r((e=>e.add(e.dFdx())))).sub(s),Pi(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),dd=Ei((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,o=t.dFdy().normalize().cross(n),a=n.cross(i),u=i.dot(o).mul(Tl),l=u.sign().mul(s.x.mul(o).add(s.y.mul(a)));return u.abs().mul(r).sub(l).normalize()}));class cd extends Gs{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=ld({textureNode:this.textureNode,bumpScale:e});return dd({surf_pos:fl,surf_norm:Sl,dHdxy:t})}}const hd=Ri(cd),pd=new Map;class gd extends Ds{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=pd.get(e);return void 0===r&&(r=$l(e,t),pd.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===gd.COLOR){const e=void 0!==t.color?this.getColor(r):zi();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===gd.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===gd.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:Pi(1);else if(r===gd.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===gd.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===gd.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===gd.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===gd.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===gd.NORMAL)t.normalMap?(s=ud(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?hd(this.getTexture("bump").r,this.getFloat("bumpScale")):Sl;else if(r===gd.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===gd.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===gd.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?ud(this.getTexture(r),this.getCache(r+"Scale","vec2")):Sl;else if(r===gd.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===gd.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===gd.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Yi(Zd.x,Zd.y,Zd.y.negate(),Zd.x).mul(e.rg.mul(2).sub(Vi(1)).normalize().mul(e.b))}else s=Zd;else if(r===gd.IRIDESCENCE_THICKNESS){const e=Gl("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=Gl("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===gd.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===gd.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===gd.IOR)s=this.getFloat(r);else if(r===gd.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===gd.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}gd.ALPHA_TEST="alphaTest",gd.COLOR="color",gd.OPACITY="opacity",gd.SHININESS="shininess",gd.SPECULAR="specular",gd.SPECULAR_STRENGTH="specularStrength",gd.SPECULAR_INTENSITY="specularIntensity",gd.SPECULAR_COLOR="specularColor",gd.REFLECTIVITY="reflectivity",gd.ROUGHNESS="roughness",gd.METALNESS="metalness",gd.NORMAL="normal",gd.CLEARCOAT="clearcoat",gd.CLEARCOAT_ROUGHNESS="clearcoatRoughness",gd.CLEARCOAT_NORMAL="clearcoatNormal",gd.EMISSIVE="emissive",gd.ROTATION="rotation",gd.SHEEN="sheen",gd.SHEEN_ROUGHNESS="sheenRoughness",gd.ANISOTROPY="anisotropy",gd.IRIDESCENCE="iridescence",gd.IRIDESCENCE_IOR="iridescenceIOR",gd.IRIDESCENCE_THICKNESS="iridescenceThickness",gd.IOR="ior",gd.TRANSMISSION="transmission",gd.THICKNESS="thickness",gd.ATTENUATION_DISTANCE="attenuationDistance",gd.ATTENUATION_COLOR="attenuationColor",gd.LINE_SCALE="scale",gd.LINE_DASH_SIZE="dashSize",gd.LINE_GAP_SIZE="gapSize",gd.LINE_WIDTH="linewidth",gd.LINE_DASH_OFFSET="dashOffset",gd.POINT_SIZE="size",gd.DISPERSION="dispersion",gd.LIGHT_MAP="light",gd.AO="ao";const md=Ci(gd,gd.ALPHA_TEST),fd=Ci(gd,gd.COLOR),yd=Ci(gd,gd.SHININESS),xd=Ci(gd,gd.EMISSIVE),bd=Ci(gd,gd.OPACITY),Td=Ci(gd,gd.SPECULAR),_d=Ci(gd,gd.SPECULAR_INTENSITY),vd=Ci(gd,gd.SPECULAR_COLOR),Nd=Ci(gd,gd.SPECULAR_STRENGTH),Sd=Ci(gd,gd.REFLECTIVITY),Ad=Ci(gd,gd.ROUGHNESS),Rd=Ci(gd,gd.METALNESS),Cd=Ci(gd,gd.NORMAL),Ed=Ci(gd,gd.CLEARCOAT),wd=Ci(gd,gd.CLEARCOAT_ROUGHNESS),Md=Ci(gd,gd.CLEARCOAT_NORMAL),Bd=Ci(gd,gd.ROTATION),Fd=Ci(gd,gd.SHEEN),Ud=Ci(gd,gd.SHEEN_ROUGHNESS),Pd=Ci(gd,gd.ANISOTROPY),Id=Ci(gd,gd.IRIDESCENCE),Ld=Ci(gd,gd.IRIDESCENCE_IOR),Dd=Ci(gd,gd.IRIDESCENCE_THICKNESS),Vd=Ci(gd,gd.TRANSMISSION),Od=Ci(gd,gd.THICKNESS),Gd=Ci(gd,gd.IOR),kd=Ci(gd,gd.ATTENUATION_DISTANCE),zd=Ci(gd,gd.ATTENUATION_COLOR),$d=Ci(gd,gd.LINE_SCALE),Wd=Ci(gd,gd.LINE_DASH_SIZE),Hd=Ci(gd,gd.LINE_GAP_SIZE),jd=Ci(gd,gd.LINE_WIDTH),qd=Ci(gd,gd.LINE_DASH_OFFSET),Xd=Ci(gd,gd.POINT_SIZE),Kd=Ci(gd,gd.DISPERSION),Yd=Ci(gd,gd.LIGHT_MAP),Qd=Ci(gd,gd.AO),Zd=ln(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))})),Jd=Ei((e=>e.context.setupModelViewProjection()),"vec4").once()().toVarying("v_modelViewProjection");class ec extends Ds{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===ec.VERTEX)s=e.getVertexIndex();else if(r===ec.INSTANCE)s=e.getInstanceIndex();else if(r===ec.DRAW)s=e.getDrawIndex();else if(r===ec.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===ec.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==ec.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Ga(this).build(e,t)}return i}}ec.VERTEX="vertex",ec.INSTANCE="instance",ec.SUBGROUP="subgroup",ec.INVOCATION_LOCAL="invocationLocal",ec.INVOCATION_SUBGROUP="invocationSubgroup",ec.DRAW="draw";const tc=Ci(ec,ec.VERTEX),rc=Ci(ec,ec.INSTANCE),sc=Ci(ec,ec.SUBGROUP),ic=Ci(ec,ec.INVOCATION_SUBGROUP),nc=Ci(ec,ec.INVOCATION_LOCAL),oc=Ci(ec,ec.DRAW);class ac extends Ds{static get type(){return"InstanceNode"}constructor(e,t,r){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=ws.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=Pu(r.array,"mat4",Math.max(t,1)).element(rc);else{const e=new A(r.array,16,1);this.buffer=e;const t=r.usage===m?uu:au,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=Zi(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new R(s.array,3),t=s.usage===m?uu:au;this.bufferColor=e,n=zi(t(e,"vec3",3,0)),this.instanceColorNode=n}const o=i.mul(hl).xyz;if(hl.assign(o),e.hasGeometryAttribute("normal")){const e=wl(vl,i);vl.assign(e)}null!==this.instanceColorNode&&hn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==m&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==m&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const uc=Ri(ac);class lc extends ac{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const dc=Ri(lc);class cc extends Ds{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=rc:this.batchingIdNode=oc);const t=Ei((([e])=>{const t=Cu(Fu(this.batchMesh._indirectTexture),0),r=Ii(e).modInt(Ii(t)),s=Ii(e).div(Ii(t));return Fu(this.batchMesh._indirectTexture,Oi(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Ii(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=Cu(Fu(s),0),n=Pi(r).mul(4).toInt().toVar(),o=n.modInt(i),a=n.div(Ii(i)),u=Zi(Fu(s,Oi(o,a)),Fu(s,Oi(o.add(1),a)),Fu(s,Oi(o.add(2),a)),Fu(s,Oi(o.add(3),a))),l=this.batchMesh._colorsTexture;if(null!==l){const e=Ei((([e])=>{const t=Cu(Fu(l),0).x,r=e,s=r.modInt(t),i=r.div(t);return Fu(l,Oi(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);hn("vec3","vBatchColor").assign(t)}const d=Qi(u);hl.assign(u.mul(hl));const c=vl.div(zi(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;vl.assign(h),e.hasGeometryAttribute("tangent")&&Hl.mulAssign(d)}}const hc=Ri(cc),pc=new WeakMap;class gc extends Ds{static get type(){return"SkinningNode"}constructor(e,t=!1){let r,s,i;super("void"),this.skinnedMesh=e,this.useReference=t,this.updateType=ws.OBJECT,this.skinIndexNode=Su("skinIndex","uvec4"),this.skinWeightNode=Su("skinWeight","vec4"),t?(r=Gl("bindMatrix","mat4"),s=Gl("bindMatrixInverse","mat4"),i=kl("skeleton.boneMatrices","mat4",e.skeleton.bones.length)):(r=ln(e.bindMatrix,"mat4"),s=ln(e.bindMatrixInverse,"mat4"),i=Pu(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length)),this.bindMatrixNode=r,this.bindMatrixInverseNode=s,this.boneMatricesNode=i,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=hl){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=jn(o.mul(s.x).mul(d),a.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=vl){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=jn(s.x.mul(o),s.y.mul(a),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=kl("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,pl)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===Ss(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&pl.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(hl.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();vl.assign(t),e.hasGeometryAttribute("tangent")&&Hl.assign(t)}}generate(e,t){if("void"!==t)return hl.build(e,t)}update(e){const t=(this.useReference?e.object:this.skinnedMesh).skeleton;pc.get(t)!==e.frameId&&(pc.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const mc=e=>Ni(new gc(e,!0));class fc extends Ds{static get type(){return"LoopNode"}constructor(e=[]){super(),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(n)?">=":"<"));const d={start:i,end:n,condition:u},c=d.start,h=d.end;let p="",g="",m="";l||(l="int"===a||"uint"===a?u.includes("<")?"++":"--":u.includes("<")?"+= 1.":"-= 1."),p+=e.getVar(a,o)+" = "+c,g+=o+" "+u+" "+h,m+=o+" "+l;const f=`for ( ${p}; ${g}; ${m} )`;e.addFlowCode((0===t?"\n":"")+e.tab+f+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tNi(new fc(Ai(e,"int"))).append(),xc=()=>bu("break").append(),bc=new WeakMap,Tc=new s,_c=Ei((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const o=Ii(tc).mul(r).add(n),a=o.div(s),u=o.sub(a.mul(s));return Fu(e,Oi(u,a)).depth(i).mul(t)}));class vc extends Ds{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=ln(1),this.updateType=ws.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,o=void 0!==n?n.length:0,{texture:a,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,o=void 0!==n?n.length:0;let a=bc.get(e);if(void 0===a||a.count!==o){void 0!==a&&a.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*o),f=new C(m,h,p,o);f.type=E,f.needsUpdate=!0;const y=4*c;for(let b=0;b{const t=Pi(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Fu(this.mesh.morphTexture,Oi(Ii(e).add(1),Ii(rc))).r):t.assign(Gl("morphTargetInfluences","float").element(e).toVar()),!0===s&&hl.addAssign(_c({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Ii(0)})),!0===i&&vl.addAssign(_c({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Ii(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 Nc=Ri(vc);class Sc extends Ds{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Ac extends Sc{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class Rc extends Ba{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:zi().toVar("directDiffuse"),directSpecular:zi().toVar("directSpecular"),indirectDiffuse:zi().toVar("indirectDiffuse"),indirectSpecular:zi().toVar("indirectSpecular")};return{radiance:zi().toVar("radiance"),irradiance:zi().toVar("irradiance"),iblIrradiance:zi().toVar("iblIrradiance"),ambientOcclusion:Pi(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 Cc=Ri(Rc);class Ec extends Sc{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let wc,Mc;class Bc extends Ds{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===Bc.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=ws.NONE;return this.scope!==Bc.SIZE&&this.scope!==Bc.VIEWPORT||(e=ws.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Bc.VIEWPORT?null!==t?Mc.copy(t.viewport):(e.getViewport(Mc),Mc.multiplyScalar(e.getPixelRatio())):null!==t?(wc.width=t.width,wc.height=t.height):e.getDrawingBufferSize(wc)}setup(){const e=this.scope;let r=null;return r=e===Bc.SIZE?ln(wc||(wc=new t)):e===Bc.VIEWPORT?ln(Mc||(Mc=new s)):Vi(Pc.div(Uc)),r}generate(e){if(this.scope===Bc.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Uc).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Bc.COORDINATE="coordinate",Bc.VIEWPORT="viewport",Bc.SIZE="size",Bc.UV="uv";const Fc=Ci(Bc,Bc.UV),Uc=Ci(Bc,Bc.SIZE),Pc=Ci(Bc,Bc.COORDINATE),Ic=Ci(Bc,Bc.VIEWPORT),Lc=Ic.zw,Dc=Pc.sub(Ic.xy),Vc=Dc.div(Lc),Oc=Ei((()=>(console.warn('TSL.ViewportNode: "viewportResolution" is deprecated. Use "screenSize" instead.'),Uc)),"vec2").once()(),Gc=Ei((()=>(console.warn('TSL.ViewportNode: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),Fc)),"vec2").once()(),kc=Ei((()=>(console.warn('TSL.ViewportNode: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),Fc.flipY())),"vec2").once()(),zc=new t;class $c extends Mu{static get type(){return"ViewportTextureNode"}constructor(e=Fc,t=null,r=null){null===r&&((r=new w).minFilter=M),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=ws.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(zc);const r=this.value;r.image.width===zc.width&&r.image.height===zc.height||(r.image.width=zc.width,r.image.height=zc.height,r.needsUpdate=!0);const s=r.generateMipmaps;r.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(r),r.generateMipmaps=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const Wc=Ri($c),Hc=Ri($c,null,null,{generateMipmaps:!0});let jc=null;class qc extends $c{static get type(){return"ViewportDepthTextureNode"}constructor(e=Fc,t=null){null===jc&&(jc=new B),super(e,t,jc)}}const Xc=Ri(qc);class Kc extends Ds{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===Kc.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Kc.DEPTH_BASE)null!==r&&(s=eh().assign(r));else if(t===Kc.DEPTH)s=e.isPerspectiveCamera?Qc(fl.z,Ou,Gu):Yc(fl.z,Ou,Gu);else if(t===Kc.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Zc(r,Ou,Gu);s=Yc(e,Ou,Gu)}else s=r;else s=Yc(fl.z,Ou,Gu);return s}}Kc.DEPTH_BASE="depthBase",Kc.DEPTH="depth",Kc.LINEAR_DEPTH="linearDepth";const Yc=(e,t,r)=>e.add(t).div(t.sub(r)),Qc=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Zc=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Jc=(e,t,r)=>{t=t.max(1e-6).toVar();const s=Co(e.negate().div(t)),i=Co(r.div(t));return s.div(i)},eh=Ri(Kc,Kc.DEPTH_BASE),th=Ci(Kc,Kc.DEPTH),rh=Ri(Kc,Kc.LINEAR_DEPTH),sh=rh(Xc());th.assign=e=>eh(e);const ih=Ri(class extends Ds{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}});class nh extends Ds{static get type(){return"ClippingNode"}constructor(e=nh.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===nh.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===nh.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return Ei((()=>{const r=Pi().toVar("distanceToPlane"),s=Pi().toVar("distanceToGradient"),i=Pi(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Du(t);yc(n,(({i:t})=>{const n=e.element(t);r.assign(fl.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(Ta(s.negate(),s,r))}))}const o=e.length;if(o>0){const t=Du(e),n=Pi(1).toVar("intersectionClipOpacity");yc(o,(({i:e})=>{const i=t.element(e);r.assign(fl.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(Ta(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}pn.a.mulAssign(i),pn.a.equal(0).discard()}))()}setupDefault(e,t){return Ei((()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Du(t);yc(r,(({i:t})=>{const r=e.element(t);fl.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=Du(e),r=Di(!0).toVar("clipped");yc(s,(({i:e})=>{const s=t.element(e);r.assign(fl.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),Ei((()=>{const s=Du(e),i=ih(t.getClipDistance());yc(r,(({i:e})=>{const t=s.element(e),r=fl.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}nh.ALPHA_TO_COVERAGE="alphaToCoverage",nh.DEFAULT="default",nh.HARDWARE="hardware";const oh=Ei((([e])=>Uo(Xn(1e4,Po(Xn(17,e.x).add(Xn(.1,e.y)))).mul(jn(.1,Go(Po(Xn(13,e.y).add(e.x)))))))),ah=Ei((([e])=>oh(Vi(oh(e.xy),e.z)))),uh=Ei((([e])=>{const t=ta(zo(Ho(e.xyz)),zo(jo(e.xyz))),r=Pi(1).div(Pi(.05).mul(t)).toVar("pixScale"),s=Vi(Ao(Mo(Co(r))),Ao(Bo(Co(r)))),i=Vi(ah(Mo(s.x.mul(e.xyz))),ah(Mo(s.y.mul(e.xyz)))),n=Uo(Co(r)),o=jn(Xn(n.oneMinus(),i.x),Xn(n,i.y)),a=ea(n,n.oneMinus()),u=zi(o.mul(o).div(Xn(2,a).mul(qn(1,a))),o.sub(Xn(.5,a)).div(qn(1,a)),qn(1,qn(1,o).mul(qn(1,o)).div(Xn(2,a).mul(qn(1,a))))),l=o.lessThan(a.oneMinus()).select(o.lessThan(a).select(u.x,u.y),u.z);return ya(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class lh extends F{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.positionNode=null,this.geometryNode=null,this.depthNode=null,this.shadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null}customProgramCacheKey(){return this.type+ms(this)}build(e){this.setup(e)}setupObserver(e){return new ds(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=this.vertexNode||this.setupVertex(e);let i;e.stack.outputNode=s,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const n=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!==n&&e.stack.add(n);const o=ji(s,pn.a).max(0);if(i=this.setupOutput(e,o),Bn.assign(i),null!==this.outputNode&&(i=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(i=e,null!==r&&(i=e.merge(r))):null!==r&&(i=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=ji(t)),i=this.setupOutput(e,t)}e.stack.outputNode=i,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.samples;this.alphaToCoverage&&t>1?s=Ni(new nh(nh.ALPHA_TO_COVERAGE)):e.stack.add(Ni(new nh))}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.add(Ni(new nh(nh.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?Jc(fl.z,Ou,Gu):Yc(fl.z,Ou,Gu))}null!==s&&th.assign(s).append()}setupPositionView(){return al.mul(hl).xyz}setupModelViewProjection(){return ku.mul(fl)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),Jd}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&Nc(t).append(),!0===t.isSkinnedMesh&&mc(t).append(),this.displacementMap){const e=$l("displacementMap","texture"),t=$l("displacementScale","float"),r=$l("displacementBias","float");hl.addAssign(vl.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&hc(t).append(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&dc(t).append(),null!==this.positionNode&&hl.assign(this.positionNode.context({isPositionNodeInput:!0})),hl}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?ji(this.colorNode):fd;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=ji(r.xyz.mul(Su("color","vec3")),r.a)),e.instanceColor){r=hn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=hn("vec3","vBatchColor").mul(r)}pn.assign(r);const s=this.opacityNode?Pi(this.opacityNode):bd;if(pn.a.assign(pn.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?Pi(this.alphaTestNode):md;pn.a.lessThanEqual(e).discard()}!0===this.alphaHash&&pn.a.lessThan(uh(hl)).discard(),!1===this.transparent&&this.blending===U&&!1===this.alphaToCoverage&&pn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?zi(0):pn.rgb}setupNormal(){return this.normalNode?zi(this.normalNode):Cd}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?$l("envMap","cubeTexture"):$l("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Ec(Yd)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:Qd;t.push(new Ac(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}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 o=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e);o=Cc(n,t,r,s)}else null!==r&&(o=zi(null!==s?fa(o,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(gn.assign(zi(i||xd)),o=o.add(gn)),o}setupOutput(e,t){if(!0===this.fog){const r=e.fogNode;r&&(Bn.assign(t),t=ji(r))}return 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=F.prototype.toJSON.call(this,e),s=fs(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,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.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.shadowPositionNode=e.shadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const dh=new P;class ch extends lh{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(dh),this.setValues(e)}}const hh=new I;class ph extends lh{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(hh),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?Pi(this.offsetNode):qd,t=this.dashScaleNode?Pi(this.dashScaleNode):$d,r=this.dashSizeNode?Pi(this.dashSizeNode):Wd,s=this.gapSizeNode?Pi(this.gapSizeNode):Hd;Fn.assign(r),Un.assign(s);const i=Ga(Su("lineDistance").mul(t));(e?i.add(e):i).mod(Fn.add(Un)).greaterThan(Fn).discard()}}let gh=null;class mh extends $c{static get type(){return"ViewportSharedTextureNode"}constructor(e=Fc,t=null){null===gh&&(gh=new w),super(e,t,gh)}updateReference(){return this}}const fh=Ri(mh),yh=new I;class xh extends lh{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(yh),this.useColor=e.vertexColors,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=L,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,o=Ei((({start:e,end:t})=>{const r=ku.element(2).element(2),s=ku.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return ji(fa(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=Ei((()=>{const e=Su("instanceStart"),t=Su("instanceEnd"),r=ji(al.mul(ji(e,1))).toVar("start"),s=ji(al.mul(ji(t,1))).toVar("end");if(i){const e=this.dashScaleNode?Pi(this.dashScaleNode):$d,t=this.offsetNode?Pi(this.offsetNode):qd,r=Su("instanceDistanceStart"),s=Su("instanceDistanceEnd");let i=cl.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),hn("float","lineDistance").assign(i)}n&&(hn("vec3","worldStart").assign(r.xyz),hn("vec3","worldEnd").assign(s.xyz));const a=Ic.z.div(Ic.w),u=ku.element(2).element(3).equal(-1);Bi(u,(()=>{Bi(r.z.lessThan(0).and(s.z.greaterThan(0)),(()=>{s.assign(o({start:r,end:s}))})).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(o({start:s,end:r}))}))}));const l=ku.mul(r),d=ku.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(a)),p.assign(p.normalize());const g=ji().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=fa(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),o=e.cross(n),a=hn("vec4","worldPos");a.assign(cl.y.lessThan(.5).select(r,s));const u=jd.mul(.5);a.addAssign(ji(cl.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(a.addAssign(ji(cl.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),a.addAssign(ji(o.mul(u),0)),Bi(cl.y.greaterThan(1).or(cl.y.lessThan(0)),(()=>{a.subAssign(ji(o.mul(2).mul(u),0))}))),g.assign(ku.mul(a));const l=zi().toVar();l.assign(cl.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Vi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(a)),e.x.assign(e.x.div(a)),e.assign(cl.x.lessThan(0).select(e.negate(),e)),Bi(cl.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(cl.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(jd)),e.assign(e.div(Ic.w)),g.assign(cl.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(ji(e,0,0)))}return g}))();const a=Ei((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),o=t.sub(e),a=i.dot(n),u=n.dot(o),l=i.dot(o),d=n.dot(n),c=o.dot(o).mul(d).sub(u.mul(u)),h=a.mul(u).sub(l.mul(d)).div(c).clamp(),p=a.add(u.mul(h)).div(d).clamp();return Vi(h,p)}));if(this.colorNode=Ei((()=>{const e=Au();if(i){const t=this.dashSizeNode?Pi(this.dashSizeNode):Wd,r=this.gapSizeNode?Pi(this.gapSizeNode):Hd;Fn.assign(t),Un.assign(r);const s=hn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(Fn.add(Un)).greaterThan(Fn).discard()}const o=Pi(1).toVar("alpha");if(n){const e=hn("vec3","worldStart"),s=hn("vec3","worldEnd"),n=hn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=a({p1:e,p2:s,p3:zi(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(jd);if(!i)if(r&&t.samples>1){const e=h.fwidth();o.assign(Ta(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){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=Pi(s.fwidth()).toVar("dlen");Bi(e.y.abs().greaterThan(1),(()=>{o.assign(Ta(i.oneMinus(),i.add(1),s).oneMinus())}))}else Bi(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=Su("instanceColorStart"),t=Su("instanceColorEnd");u=cl.y.lessThan(.5).select(e,t).mul(fd)}else u=fd;return ji(u,o)}))(),this.transparent){const e=this.opacityNode?Pi(this.opacityNode):bd;this.outputNode=ji(this.colorNode.rgb.mul(e).add(fh().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 bh=e=>Ni(e).mul(.5).add(.5),Th=new D;class _h extends lh{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Th),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?Pi(this.opacityNode):bd;pn.assign(ji(bh(Rl),e))}}class vh extends Gs{static get type(){return"EquirectUVNode"}constructor(e=ml){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,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 Vi(t,r)}}const Nh=Ri(vh);class Sh extends V{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 O(5,5,5),n=Nh(ml),o=new lh;o.colorNode=Bu(t,n,0),o.side=T,o.blending=L;const a=new G(i,o),u=new k;u.add(a),t.minFilter===M&&(t.minFilter=z);const l=new $(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,a.geometry.dispose(),a.material.dispose(),this}}const Ah=new WeakMap;class Rh extends Gs{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=Dl();const t=new W;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=ws.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===H||r===j){if(Ah.has(e)){const t=Ah.get(e);Eh(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Sh(r.height);s.fromEquirectangularTexture(t,e),Eh(s.texture,e.mapping),this._cubeTexture=s.texture,Ah.set(e,s.texture),e.addEventListener("dispose",Ch)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function Ch(e){const t=e.target;t.removeEventListener("dispose",Ch);const r=Ah.get(t);void 0!==r&&(Ah.delete(t),r.dispose())}function Eh(e,t){t===H?e.mapping=_:t===j&&(e.mapping=v)}const wh=Ri(Rh);class Mh extends Sc{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=wh(this.envNode)}}class Bh extends Sc{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=Pi(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class Fh{start(){}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class Uh extends Fh{constructor(){super()}indirect(e,t,r){const s=e.ambientOcclusion,i=e.reflectedLight,n=r.context.irradianceLightMap;i.indirectDiffuse.assign(ji(0)),n?i.indirectDiffuse.addAssign(n):i.indirectDiffuse.addAssign(ji(1,1,1,0)),i.indirectDiffuse.mulAssign(s),i.indirectDiffuse.mulAssign(pn.rgb)}finish(e,t,r){const s=r.material,i=e.outgoingLight,n=r.context.environment;if(n)switch(s.combine){case K:i.rgb.assign(fa(i.rgb,i.rgb.mul(n.rgb),Nd.mul(Sd)));break;case X:i.rgb.assign(fa(i.rgb,n.rgb,Nd.mul(Sd)));break;case q:i.rgb.addAssign(n.rgb.mul(Nd.mul(Sd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",s.combine)}}}const Ph=new Y;class Ih extends lh{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Ph),this.setValues(e)}setupNormal(){return Sl}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Mh(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Bh(Yd)),t}setupOutgoingLight(){return pn.rgb}setupLightingModel(){return new Uh}}const Lh=Ei((({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))})),Dh=Ei((e=>e.diffuseColor.mul(1/Math.PI))),Vh=Ei((({dotNH:e})=>Mn.mul(Pi(.5)).add(1).mul(Pi(1/Math.PI)).mul(e.pow(Mn)))),Oh=Ei((({lightDirection:e})=>{const t=e.add(yl).normalize(),r=Rl.dot(t).clamp(),s=yl.dot(t).clamp(),i=Lh({f0:En,f90:1,dotVH:s}),n=Pi(.25),o=Vh({dotNH:r});return i.mul(n).mul(o)}));class Gh extends Uh{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Rl.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Dh({diffuseColor:pn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(Oh({lightDirection:e})).mul(Nd))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Dh({diffuseColor:pn}))),r.indirectDiffuse.mulAssign(e)}}const kh=new Q;class zh extends lh{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(kh),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Mh(t):null}setupLightingModel(){return new Gh(!1)}}const $h=new Z;class Wh extends lh{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues($h),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Mh(t):null}setupLightingModel(){return new Gh}setupVariants(){const e=(this.shininessNode?Pi(this.shininessNode):yd).max(1e-4);Mn.assign(e);const t=this.specularNode||Td;En.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Hh=Ei((e=>{if(!1===e.geometry.hasAttribute("normal"))return Pi(0);const t=Sl.dFdx().abs().max(Sl.dFdy().abs());return t.x.max(t.y).max(t.z)})),jh=Ei((e=>{const{roughness:t}=e,r=Hh();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),qh=Ei((({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 Kn(.5,i.add(n).max(fo))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Xh=Ei((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:o,dotNL:a})=>{const u=a.mul(zi(e.mul(r),t.mul(s),o).length()),l=o.mul(zi(e.mul(i),t.mul(n),a).length());return Kn(.5,u.add(l)).saturate()})).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"}]}),Kh=Ei((({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"}]}),Yh=Pi(1/Math.PI),Qh=Ei((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),o=zi(t.mul(s),e.mul(i),n.mul(r)),a=o.dot(o),u=n.div(a);return Yh.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"}]}),Zh=Ei((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:o,USE_ANISOTROPY:a}=e,u=e.normalView||Rl,l=i.pow2(),d=t.add(yl).normalize(),c=u.dot(t).clamp(),h=u.dot(yl).clamp(),p=u.dot(d).clamp(),g=yl.dot(d).clamp();let m,f,y=Lh({f0:r,f90:s,dotVH:g});if(Ti(o)&&(y=_n.mix(y,n)),Ti(a)){const e=Rn.dot(t),r=Rn.dot(yl),s=Rn.dot(d),i=Cn.dot(t),n=Cn.dot(yl),o=Cn.dot(d);m=Xh({alphaT:Sn,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=Qh({alphaT:Sn,alphaB:l,dotNH:p,dotTH:s,dotBH:o})}else m=qh({alpha:l,dotNL:c,dotNV:h}),f=Kh({alpha:l,dotNH:p});return y.mul(m).mul(f)})),Jh=Ei((({roughness:e,dotNV:t})=>{const r=ji(-1,-.0275,-.572,.022),s=ji(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return Vi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),ep=Ei((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Jh({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),tp=Ei((({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(zi(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"}]}),rp=Ei((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=Pi(1).div(r),i=t.pow2().oneMinus().max(.0078125);return Pi(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"}]}),sp=Ei((({dotNV:e,dotNL:t})=>Pi(1).div(Pi(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),ip=Ei((({lightDirection:e})=>{const t=e.add(yl).normalize(),r=Rl.dot(e).clamp(),s=Rl.dot(yl).clamp(),i=Rl.dot(t).clamp(),n=rp({roughness:Tn,dotNH:i}),o=sp({dotNV:s,dotNL:r});return bn.mul(n).mul(o)})),np=Ei((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Vi(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"}]}),op=Ei((({f:e})=>{const t=e.length();return ta(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),ap=Ei((({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(),o=i.div(n),a=r.greaterThan(0).select(o,ta(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(o));return e.cross(t).mul(a)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),up=Ei((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:o,p3:a})=>{const u=n.sub(i).toVar(),l=a.sub(i).toVar(),d=u.cross(l),c=zi().toVar();return Bi(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(Qi(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(o.sub(r)).normalize().toVar(),m=d.mul(a.sub(r)).normalize().toVar(),f=zi(0).toVar();f.addAssign(ap({v1:h,v2:p})),f.addAssign(ap({v1:p,v2:g})),f.addAssign(ap({v1:g,v2:m})),f.addAssign(ap({v1:m,v2:h})),c.assign(zi(op({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"}]}),lp=1/6,dp=e=>Xn(lp,Xn(e,Xn(e,e.negate().add(3)).sub(3)).add(1)),cp=e=>Xn(lp,Xn(e,Xn(e,Xn(3,e).sub(6))).add(4)),hp=e=>Xn(lp,Xn(e,Xn(e,Xn(-3,e).add(3)).add(3)).add(1)),pp=e=>Xn(lp,la(e,3)),gp=e=>dp(e).add(cp(e)),mp=e=>hp(e).add(pp(e)),fp=e=>jn(-1,cp(e).div(dp(e).add(cp(e)))),yp=e=>jn(1,pp(e).div(hp(e).add(pp(e)))),xp=(e,t,r)=>{const s=e.uvNode,i=Xn(s,t.zw).add(.5),n=Mo(i),o=Uo(i),a=gp(o.x),u=mp(o.x),l=fp(o.x),d=yp(o.x),c=fp(o.y),h=yp(o.y),p=Vi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Vi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Vi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Vi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=gp(o.y).mul(jn(a.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),x=mp(o.y).mul(jn(a.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(x)},bp=Ei((([e,t=Pi(3)])=>{const r=Vi(e.size(Ii(t))),s=Vi(e.size(Ii(t.add(1)))),i=Kn(1,r),n=Kn(1,s),o=xp(e,ji(i,r),Mo(t)),a=xp(e,ji(n,s),Bo(t));return Uo(t).mix(o,a)})),Tp=Ei((([e,t,r,s,i])=>{const n=zi(ba(t.negate(),Fo(e),Kn(1,s))),o=zi(zo(i[0].xyz),zo(i[1].xyz),zo(i[2].xyz));return Fo(n).mul(r.mul(o))})).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"}]}),_p=Ei((([e,t])=>e.mul(ya(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),vp=Hc(),Np=Hc(),Sp=Ei((([e,t,r],{material:s})=>{const i=(s.side===T?vp:Np).sample(e),n=Co(Uc.x).mul(_p(t,r));return bp(i,n)})),Ap=Ei((([e,t,r])=>(Bi(r.notEqual(0),(()=>{const s=Ro(t).negate().div(r);return So(s.negate().mul(e))})),zi(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),Rp=Ei((([e,t,r,s,i,n,o,a,u,l,d,c,h,p,g])=>{let m,f;if(g){m=ji().toVar(),f=zi().toVar();const i=d.sub(1).mul(g.mul(.025)),n=zi(d.sub(i),d,d.add(i));yc({start:0,end:3},(({i:i})=>{const d=n.element(i),g=Tp(e,t,c,d,a),y=o.add(g),x=l.mul(u.mul(ji(y,1))),b=Vi(x.xy.div(x.w)).toVar();b.addAssign(1),b.divAssign(2),b.assign(Vi(b.x,b.y.oneMinus()));const T=Sp(b,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Ap(zo(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=Tp(e,t,c,d,a),n=o.add(i),g=l.mul(u.mul(ji(n,1))),y=Vi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Vi(y.x,y.y.oneMinus())),m=Sp(y,r,d),f=s.mul(Ap(zo(i),h,p))}const y=f.rgb.mul(m.rgb),x=e.dot(t).clamp(),b=zi(ep({dotNV:x,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return ji(b.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),Cp=Qi(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Ep=(e,t)=>e.sub(t).div(e.add(t)).pow2(),wp=Ei((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=fa(e,t,Ta(0,.03,s)),o=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();Bi(o.lessThan(0),(()=>zi(1)));const a=o.sqrt(),u=Ep(n,e),l=Lh({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=Pi(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return zi(1).add(t).div(zi(1).sub(t))})(i.clamp(0,.9999)),g=Ep(p,n.toVec3()),m=Lh({f0:g,f90:1,dotVH:a}),f=zi(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,a,2),x=zi(h).add(f),b=l.mul(m).clamp(1e-5,.9999),T=b.sqrt(),_=d.pow2().mul(m).div(zi(1).sub(b)),v=l.add(_).toVar(),N=_.sub(d).toVar();return yc({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=zi(54856e-17,44201e-17,52481e-17),i=zi(1681e3,1795300,2208400),n=zi(43278e5,93046e5,66121e5),o=Pi(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let a=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return a=zi(a.x.add(o),a.y,a.z).div(1.0685e-7),Cp.mul(a)})(Pi(e).mul(y),Pi(e).mul(x)).mul(2);v.addAssign(N.mul(t))})),v.max(zi(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"}]}),Mp=Ei((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=wa(r.lessThan(.25),Pi(-339.2).mul(i).add(Pi(161.4).mul(r)).sub(25.9),Pi(-8.48).mul(i).add(Pi(14.3).mul(r)).sub(9.95)),o=wa(r.lessThan(.25),Pi(44).mul(i).sub(Pi(23.7).mul(r)).add(3.26),Pi(1.97).mul(i).sub(Pi(3.27).mul(r)).add(.72));return wa(r.lessThan(.25),0,Pi(.1).mul(r).sub(.025)).add(n.mul(s).add(o).exp()).mul(1/Math.PI).saturate()})),Bp=zi(.04),Fp=Pi(1);class Up extends Fh{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}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=zi().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=zi().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=zi().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=zi().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=zi().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=Rl.dot(yl).clamp();this.iridescenceFresnel=wp({outsideIOR:Pi(1),eta2:vn,cosTheta1:e,thinFilmThickness:Nn,baseF0:En}),this.iridescenceF0=tp({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=gl,r=ju.sub(gl).normalize(),s=Cl;e.backdrop=Rp(s,r,mn,pn,En,wn,t,tl,$u,ku,In,Dn,On,Vn,this.dispersion?Gn:null),e.backdropAlpha=Ln,pn.a.mulAssign(fa(1,e.backdrop.a,Ln))}}computeMultiscattering(e,t,r){const s=Rl.dot(yl).clamp(),i=Jh({roughness:mn,dotNV:s}),n=(this.iridescenceF0?_n.mix(En,this.iridescenceF0):En).mul(i.x).add(r.mul(i.y)),o=i.x.add(i.y).oneMinus(),a=En.add(En.oneMinus().mul(.047619)),u=n.mul(a).div(o.mul(a).oneMinus());e.addAssign(n),t.addAssign(u.mul(o))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Rl.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(ip({lightDirection:e}))),!0===this.clearcoat){const r=El.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Zh({lightDirection:e,f0:Bp,f90:Fp,roughness:xn,normalView:El})))}r.directDiffuse.addAssign(s.mul(Dh({diffuseColor:pn.rgb}))),r.directSpecular.addAssign(s.mul(Zh({lightDirection:e,f0:En,f90:1,roughness:mn,iridescence:this.iridescence,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:o}){const a=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=Rl,h=yl,p=fl.toVar(),g=np({N:c,V:h,roughness:mn}),m=n.sample(g).toVar(),f=o.sample(g).toVar(),y=Qi(zi(m.x,0,m.y),zi(0,1,0),zi(m.z,0,m.w)).toVar(),x=En.mul(f.x).add(En.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(x).mul(up({N:c,V:h,P:p,mInv:y,p0:a,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(pn).mul(up({N:c,V:h,P:p,mInv:Qi(1,0,0,0,1,0,0,0,1),p0:a,p1:u,p2:l,p3:d})))}indirect(e,t,r){this.indirectDiffuse(e,t,r),this.indirectSpecular(e,t,r),this.ambientOcclusion(e,t,r)}indirectDiffuse({irradiance:e,reflectedLight:t}){t.indirectDiffuse.addAssign(e.mul(Dh({diffuseColor:pn})))}indirectSpecular({radiance:e,iblIrradiance:t,reflectedLight:r}){if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(t.mul(bn,Mp({normal:Rl,viewDir:yl,roughness:Tn}))),!0===this.clearcoat){const e=El.dot(yl).clamp(),t=ep({dotNV:e,specularColor:Bp,specularF90:Fp,roughness:xn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const s=zi().toVar("singleScattering"),i=zi().toVar("multiScattering"),n=t.mul(1/Math.PI);this.computeMultiscattering(s,i,wn);const o=s.add(i),a=pn.mul(o.r.max(o.g).max(o.b).oneMinus());r.indirectSpecular.addAssign(e.mul(s)),r.indirectSpecular.addAssign(i.mul(n)),r.indirectDiffuse.addAssign(a.mul(n))}ambientOcclusion({ambientOcclusion:e,reflectedLight:t}){const r=Rl.dot(yl).clamp().add(e),s=mn.mul(-16).oneMinus().negate().exp2(),i=e.sub(r.pow(s).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(e),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(e),t.indirectDiffuse.mulAssign(e),t.indirectSpecular.mulAssign(i)}finish(e){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=El.dot(yl).clamp(),r=Lh({dotVH:e,f0:Bp,f90:Fp}),s=t.mul(yn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(yn));t.assign(s)}if(!0===this.sheen){const e=bn.r.max(bn.g).max(bn.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const Pp=Pi(1),Ip=Pi(-2),Lp=Pi(.8),Dp=Pi(-1),Vp=Pi(.4),Op=Pi(2),Gp=Pi(.305),kp=Pi(3),zp=Pi(.21),$p=Pi(4),Wp=Pi(4),Hp=Pi(16),jp=Ei((([e])=>{const t=zi(Go(e)).toVar(),r=Pi(-1).toVar();return Bi(t.x.greaterThan(t.z),(()=>{Bi(t.x.greaterThan(t.y),(()=>{r.assign(wa(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(wa(e.y.greaterThan(0),1,4))}))})).Else((()=>{Bi(t.z.greaterThan(t.y),(()=>{r.assign(wa(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(wa(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),qp=Ei((([e,t])=>{const r=Vi().toVar();return Bi(t.equal(0),(()=>{r.assign(Vi(e.z,e.y).div(Go(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(Vi(e.x.negate(),e.z.negate()).div(Go(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(Vi(e.x.negate(),e.y).div(Go(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(Vi(e.z.negate(),e.y).div(Go(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(Vi(e.x.negate(),e.z).div(Go(e.y)))})).Else((()=>{r.assign(Vi(e.x,e.y).div(Go(e.z)))})),Xn(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Xp=Ei((([e])=>{const t=Pi(0).toVar();return Bi(e.greaterThanEqual(Lp),(()=>{t.assign(Pp.sub(e).mul(Dp.sub(Ip)).div(Pp.sub(Lp)).add(Ip))})).ElseIf(e.greaterThanEqual(Vp),(()=>{t.assign(Lp.sub(e).mul(Op.sub(Dp)).div(Lp.sub(Vp)).add(Dp))})).ElseIf(e.greaterThanEqual(Gp),(()=>{t.assign(Vp.sub(e).mul(kp.sub(Op)).div(Vp.sub(Gp)).add(Op))})).ElseIf(e.greaterThanEqual(zp),(()=>{t.assign(Gp.sub(e).mul($p.sub(kp)).div(Gp.sub(zp)).add(kp))})).Else((()=>{t.assign(Pi(-2).mul(Co(Xn(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Kp=Ei((([e,t])=>{const r=e.toVar();r.assign(Xn(2,r).sub(1));const s=zi(r,1).toVar();return Bi(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"}]}),Yp=Ei((([e,t,r,s,i,n])=>{const o=Pi(r),a=zi(t),u=ya(Xp(o),Ip,n),l=Uo(u),d=Mo(u),c=zi(Qp(e,a,d,s,i,n)).toVar();return Bi(l.notEqual(0),(()=>{const t=zi(Qp(e,a,d.add(1),s,i,n)).toVar();c.assign(fa(c,t,l))})),c})),Qp=Ei((([e,t,r,s,i,n])=>{const o=Pi(r).toVar(),a=zi(t),u=Pi(jp(a)).toVar(),l=Pi(ta(Wp.sub(o),0)).toVar();o.assign(ta(o,Wp));const d=Pi(Ao(o)).toVar(),c=Vi(qp(a,u).mul(d.sub(2)).add(1)).toVar();return Bi(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(Xn(3,Hp))),c.y.addAssign(Xn(4,Ao(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(Vi(),Vi())})),Zp=Ei((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:a})=>{const u=Io(s),l=r.mul(u).add(i.cross(r).mul(Po(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Qp(e,l,t,n,o,a)})),Jp=Ei((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:o,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=zi(wa(t,r,ua(r,s))).toVar();Bi(To(h.equals(zi(0))),(()=>{h.assign(zi(s.z,0,s.x.negate()))})),h.assign(Fo(h));const p=zi().toVar();return p.addAssign(i.element(Ii(0)).mul(Zp({theta:0,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),yc({start:Ii(1),end:e},(({i:e})=>{Bi(e.greaterThanEqual(n),(()=>{xc()}));const t=Pi(o.mul(Pi(e))).toVar();p.addAssign(i.element(e).mul(Zp({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(Zp({theta:t,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),ji(p,1)}));let eg=null;const tg=new WeakMap;function rg(e){let t=tg.get(e);if((void 0!==t?t.pmremVersion:-1)!==e.pmremVersion){const r=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(r))return null;t=eg.fromEquirectangular(e,t)}t.pmremVersion=e.pmremVersion,tg.set(e,t)}return t.texture}class sg extends Gs{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 J;s.isRenderTargetTexture=!0,this._texture=Bu(s),this._width=ln(0),this._height=ln(0),this._maxMip=ln(0),this.updateBeforeType=ws.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(){let e=this._pmrem;const t=e?e.pmremVersion:-1,r=this._value;t!==r.pmremVersion&&(e=!0===r.isPMREMTexture?r:rg(r),null!==e&&(this._pmrem=e,this.updateFromTexture(e)))}setup(e){null===eg&&(eg=e.createPMREMGenerator()),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this));const r=this.value;e.renderer.coordinateSystem===u&&!0!==r.isPMREMTexture&&!0===r.isRenderTargetTexture&&(t=zi(t.x.negate(),t.yz)),t=zi(t.x,t.y.negate(),t.z);let s=this.levelNode;return null===s&&e.context.getTextureLevel&&(s=e.context.getTextureLevel(this)),Yp(this._texture,t,s,this._width,this._height,this._maxMip)}}const ig=Ri(sg),ng=new WeakMap;class og extends Sc{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=ng.get(e);void 0===s&&(s=ig(e),ng.set(e,s)),r=s}const s=t.envMap?Gl("envMapIntensity","float",e.material):Gl("environmentIntensity","float",e.scene),i=!0===t.useAnisotropy||t.anisotropy>0?nd:Rl,n=r.context(ag(mn,i)).mul(s),o=r.context(ug(Cl)).mul(Math.PI).mul(s),a=hu(n),u=hu(o);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(u);const l=e.context.lightingModel.clearcoatRadiance;if(l){const e=r.context(ag(xn,El)).mul(s),t=hu(e);l.addAssign(t)}}}const ag=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=yl.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection($u)),r),getTextureLevel:()=>e}},ug=e=>({getUV:()=>e,getTextureLevel:()=>Pi(1)}),lg=new ee;class dg extends lh{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(lg),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new og(t):null}setupLightingModel(){return new Up}setupSpecular(){const e=fa(zi(.04),pn.rgb,fn);En.assign(e),wn.assign(1)}setupVariants(){const e=this.metalnessNode?Pi(this.metalnessNode):Rd;fn.assign(e);let t=this.roughnessNode?Pi(this.roughnessNode):Ad;t=jh({roughness:t}),mn.assign(t),this.setupSpecular(),pn.assign(ji(pn.rgb.mul(e.oneMinus()),pn.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const cg=new te;class hg extends dg{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(cg),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?Pi(this.iorNode):Gd;In.assign(e),En.assign(fa(ea(da(In.sub(1).div(In.add(1))).mul(vd),zi(1)).mul(_d),pn.rgb,fn)),wn.assign(fa(_d,1,fn))}setupLightingModel(){return new Up(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?Pi(this.clearcoatNode):Ed,t=this.clearcoatRoughnessNode?Pi(this.clearcoatRoughnessNode):wd;yn.assign(e),xn.assign(jh({roughness:t}))}if(this.useSheen){const e=this.sheenNode?zi(this.sheenNode):Fd,t=this.sheenRoughnessNode?Pi(this.sheenRoughnessNode):Ud;bn.assign(e),Tn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?Pi(this.iridescenceNode):Id,t=this.iridescenceIORNode?Pi(this.iridescenceIORNode):Ld,r=this.iridescenceThicknessNode?Pi(this.iridescenceThicknessNode):Dd;_n.assign(e),vn.assign(t),Nn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Vi(this.anisotropyNode):Pd).toVar();An.assign(e.length()),Bi(An.equal(0),(()=>{e.assign(Vi(1,0))})).Else((()=>{e.divAssign(Vi(An)),An.assign(An.saturate())})),Sn.assign(An.pow2().mix(mn.pow2(),1)),Rn.assign(sd[0].mul(e.x).add(sd[1].mul(e.y))),Cn.assign(sd[1].mul(e.x).sub(sd[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?Pi(this.transmissionNode):Vd,t=this.thicknessNode?Pi(this.thicknessNode):Od,r=this.attenuationDistanceNode?Pi(this.attenuationDistanceNode):kd,s=this.attenuationColorNode?zi(this.attenuationColorNode):zd;if(Ln.assign(e),Dn.assign(t),Vn.assign(r),On.assign(s),this.useDispersion){const e=this.dispersionNode?Pi(this.dispersionNode):Kd;Gn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?zi(this.clearcoatNormalNode):Md}setup(e){e.context.setupClearcoatNormal=()=>this.setupClearcoatNormal(e),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 pg extends Up{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,o=!1){super(e,t,r,s,i,n),this.useSSS=o}direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){if(!0===this.useSSS){const s=i.material,{thicknessColorNode:n,thicknessDistortionNode:o,thicknessAmbientNode:a,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=s,c=e.add(Rl.mul(o)).normalize(),h=Pi(yl.dot(c.negate()).saturate().pow(l).mul(d)),p=zi(h.add(a).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i)}}class gg extends hg{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=Pi(.1),this.thicknessAmbientNode=Pi(0),this.thicknessAttenuationNode=Pi(.1),this.thicknessPowerNode=Pi(2),this.thicknessScaleNode=Pi(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new pg(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 mg=Ei((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Vi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=$l("gradientMap","texture").context({getUV:()=>i});return zi(e.r)}{const e=i.fwidth().mul(.5);return fa(zi(.7),zi(1),Ta(Pi(.7).sub(e.x),Pi(.7).add(e.x),i.x))}}));class fg extends Fh{direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){const n=mg({normal:_l,lightDirection:e,builder:i}).mul(t);r.directDiffuse.addAssign(n.mul(Dh({diffuseColor:pn.rgb})))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Dh({diffuseColor:pn}))),r.indirectDiffuse.mulAssign(e)}}const yg=new re;class xg extends lh{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(yg),this.setValues(e)}setupLightingModel(){return new fg}}class bg extends Gs{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=zi(yl.z,0,yl.x.negate()).normalize(),t=yl.cross(e);return Vi(e.dot(Rl),t.dot(Rl)).mul(.495).add(.5)}}const Tg=Ci(bg),_g=new se;class vg extends lh{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(_g),this.setValues(e)}setupVariants(e){const t=Tg;let r;r=e.material.matcap?$l("matcap","texture").context({getUV:()=>t}):zi(fa(.2,.8,t.y)),pn.rgb.mulAssign(r.rgb)}}class Ng extends Gs{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 Yi(e,s,s.negate(),e).mul(r)}{const e=t,s=Zi(ji(1,0,0,0),ji(0,Io(e.x),Po(e.x).negate(),0),ji(0,Po(e.x),Io(e.x),0),ji(0,0,0,1)),i=Zi(ji(Io(e.y),0,Po(e.y),0),ji(0,1,0,0),ji(Po(e.y).negate(),0,Io(e.y),0),ji(0,0,0,1)),n=Zi(ji(Io(e.z),Po(e.z).negate(),0,0),ji(Po(e.z),Io(e.z),0,0),ji(0,0,1,0),ji(0,0,0,1));return s.mul(i).mul(n).mul(ji(r,1)).xyz}}}const Sg=Ri(Ng),Ag=new ie;class Rg extends lh{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.setDefaultValues(Ag),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:o}=this,a=al.mul(zi(i||0));let u=Vi(tl[0].xyz.length(),tl[1].xyz.length());if(null!==o&&(u=u.mul(Pi(o))),!1===s)if(r.isPerspectiveCamera)u=u.mul(a.z.negate());else{const e=Pi(2).div(ku.element(1).element(1));u=u.mul(e.mul(2))}let l=cl.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Ni(new Za(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=Pi(n||Bd),c=Sg(l,d);return ji(a.xy.add(c),a.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 Cg=new ne;class Eg extends Rg{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Cg),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return al.mul(zi(e||hl)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=cl.xy.toVar(),o=Ic.z.div(Ic.w);if(r&&r.isNode){const e=Pi(r);n.assign(Sg(n,e))}let a=null!==i?Vi(i):Xd;return!0===this.sizeAttenuation&&(a=a.mul(a.div(fl.z.negate()))),s&&s.isNode&&(a=a.mul(Vi(s))),n.mulAssign(a.mul(2)),n.assign(n.div(Ic.z)),n.y.assign(n.y.mul(o)),n.assign(n.mul(t.w)),t.addAssign(ji(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class wg extends Fh{constructor(){super(),this.shadowNode=Pi(1).toVar("shadowMask")}direct({shadowMask:e}){this.shadowNode.mulAssign(e)}finish(e){pn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(pn.rgb)}}const Mg=new oe;class Bg extends lh{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Mg),this.setValues(e)}setupLightingModel(){return new wg}}const Fg=Ei((({texture:e,uv:t})=>{const r=1e-4,s=zi().toVar();return Bi(t.x.lessThan(r),(()=>{s.assign(zi(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign(zi(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign(zi(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign(zi(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign(zi(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign(zi(0,0,-1))})).Else((()=>{const r=.01,i=e.sample(t.add(zi(-.01,0,0))).r.sub(e.sample(t.add(zi(r,0,0))).r),n=e.sample(t.add(zi(0,-.01,0))).r.sub(e.sample(t.add(zi(0,r,0))).r),o=e.sample(t.add(zi(0,0,-.01))).r.sub(e.sample(t.add(zi(0,0,r))).r);s.assign(zi(i,n,o))})),s.normalize()}));class Ug extends Mu{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return zi(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(Ii(Cu(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return Fg({texture:this,uv:e})}}const Pg=Ri(Ug);class Ig extends lh{static get type(){return"VolumeNodeMaterial"}constructor(t){super(),this.isVolumeNodeMaterial=!0,this.base=new e(16777215),this.map=null,this.steps=100,this.testNode=null,this.setValues(t)}setup(e){const t=Pg(this.map,null,0),r=Ei((({orig:e,dir:t})=>{const r=zi(-.5),s=zi(.5),i=t.reciprocal(),n=r.sub(e).mul(i),o=s.sub(e).mul(i),a=ea(n,o),u=ta(n,o),l=ta(a.x,ta(a.y,a.z)),d=ea(u.x,ea(u.y,u.z));return Vi(l,d)}));this.fragmentNode=Ei((()=>{const e=Ga(zi(ol.mul(ji(ju,1)))),s=Ga(cl.sub(e)).normalize(),i=Vi(r({orig:e,dir:s})).toVar();i.x.greaterThan(i.y).discard(),i.assign(Vi(ta(i.x,0),i.y));const n=zi(e.add(i.x.mul(s))).toVar(),o=zi(s.abs().reciprocal()).toVar(),a=Pi(ea(o.x,ea(o.y,o.z))).toVar("delta");a.divAssign($l("steps","float"));const u=ji($l("base","color"),0).toVar();return yc({type:"float",start:i.x,end:i.y,update:"+= delta"},(()=>{const e=cn("float","d").assign(t.sample(n.add(.5)).r);null!==this.testNode?this.testNode({map:t,mapValue:e,probe:n,finalColor:u}).append():(u.a.assign(1),xc()),n.addAssign(s.mul(a))})),u.a.equal(0).discard(),ji(u)}))(),super.setup(e)}}class Lg{constructor(e,t){this.nodes=e,this.info=t,this._context=self,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,null!==this._animationLoop&&this._animationLoop(t,r)};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 Dg{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.material.addEventListener("dispose",this.onMaterialDispose)}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)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set;for(const i of e){const e=i.node&&i.node.attribute?i.node.attribute:t.getAttribute(i.name);if(void 0===e)continue;r.push(e);const n=e.isInterleavedBufferAttribute?e.data:e;s.add(n)}return this.attributes=r,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}),o=this.getIndex(),a=null!==o,u=r.isInstancedBufferGeometry?r.instanceCount:e.count>1?e.count:1;if(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;a?p=o.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&&(r+=e.uuid+","),r+=e.receiveShadow+",",hs(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}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=gs(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=gs(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const Gg=[];class kg{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,o,a){const u=this.getChainMap(a);Gg[0]=e,Gg[1]=t,Gg[2]=n,Gg[3]=i;let l=u.get(Gg);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,o,a),u.set(Gg,l)):(l.updateClipping(o),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,o,a)):l.version=t.version)),Gg.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Dg)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,o,a,u,l,d){const c=this.getChainMap(d),h=new Og(e,t,r,s,i,n,o,a,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class zg{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 $g=1,Wg=2,Hg=3,jg=4,qg=16;class Xg extends zg{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return void 0!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===$g?this.backend.createAttribute(e):t===Wg?this.backend.createIndexAttribute(e):t===Hg?this.backend.createStorageAttribute(e):t===jg&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version=0;--t)if(e[t]>=65535)return!0;return!1}(t)?ae:ue)(t,1);return i.version=Kg(e),i}class Qg extends zg{constructor(e,t){super(),this.attributes=e,this.info=t,this.wireframes=new WeakMap,this.attributeCall=new WeakMap}has(e){const t=e.geometry;return super.has(t)&&!0===this.get(t).initialized}updateForRender(e){!1===this.has(e)&&this.initGeometry(e),this.updateAttributes(e)}initGeometry(e){const t=e.geometry;this.get(t).initialized=!0,this.info.memory.geometries++;const r=()=>{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)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,Hg):this.updateAttribute(e,$g);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,Wg);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,jg)}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}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=Yg(t),e.set(t,r)):r.version!==Kg(t)&&(this.attributes.delete(r),r=Yg(t),e.set(t,r)),s=r}return s}}class Zg{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,previousFrameCalls:0,timestampCalls:0},this.compute={calls:0,frameCalls:0,timestamp:0,previousFrameCalls:0,timestampCalls: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):console.error("THREE.WebGPUInfo: Unknown object type.")}updateTimestamp(e,t){0===this[e].timestampCalls&&(this[e].timestamp=0),this[e].timestamp+=t,this[e].timestampCalls++,this[e].timestampCalls>=this[e].previousFrameCalls&&(this[e].timestampCalls=0)}reset(){const e=this.render.frameCalls;this.render.previousFrameCalls=e;const t=this.compute.frameCalls;this.compute.previousFrameCalls=t,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 Jg{constructor(e){this.cacheKey=e,this.usedTimes=0}}class em extends Jg{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class tm extends Jg{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let rm=0;class sm{constructor(e,t,r,s=null,i=null){this.id=rm++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class im extends zg{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 o=this.programs.compute.get(n.computeShader);void 0===o&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),o=new sm(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,o),r.createProgram(o));const a=this._getComputeCacheKey(e,o);let u=this.caches.get(a);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,o,a,t)),u.usedTimes++,o.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(),o=e.material?e.material.name:"";let a=this.programs.vertex.get(n.vertexShader);void 0===a&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),a=new sm(n.vertexShader,"vertex",o),this.programs.vertex.set(n.vertexShader,a),r.createProgram(a));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new sm(n.fragmentShader,"fragment",o),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,a,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,a,u,l,t)):e.pipeline=d,d.usedTimes++,a.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 tm(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 em(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 nm extends zg{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))}_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.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?jg:Hg;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,o=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampler)t.update();else if(t.isSampledTexture){const e=this.textures.get(t.texture);t.needsBindingsUpdate(e.generation)&&(s=!0);const a=t.update(),u=t.texture;a&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,o+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,a,u,t.textureNode.value,s),this.textures.updateTexture(u),s=!0),!0===u.isStorageTexture){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}}!0===s&&this.backend.updateBindings(e,t,i?n:0,o)}}function om(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.z!==t.z?e.z-t.z:e.id-t.id}function am(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 um(e){return(e.transmission>0||e.transmissionNode)&&e.side===le&&!1===e.forceSinglePass}class lm{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,o){let a=this.renderItems[this.renderItemsIndex];return void 0===a?(a={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:o},this.renderItems[this.renderItemsIndex]=a):(a.id=e.id,a.object=e,a.geometry=t,a.material=r,a.groupOrder=s,a.renderOrder=e.renderOrder,a.z=i,a.group=n,a.clippingContext=o),this.renderItemsIndex++,a}push(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(um(r)&&this.transparentDoublePass.push(a),this.transparent.push(a)):this.opaque.push(a)}unshift(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===r.transparent||r.transmission>0?(um(r)&&this.transparentDoublePass.unshift(a),this.transparent.unshift(a)):this.opaque.unshift(a)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||om),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||am),this.transparent.length>1&&this.transparent.sort(t||am)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=o.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 B,l.format=e.stencilBuffer?ce:he,l.type=e.stencilBuffer?pe:x,l.image.width=a,l.image.height=u,i[t]=l),r.width===o.width&&o.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=a,l.image.height=u)),r.width=o.width,r.height=o.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(!1==(!0===e.isXRRenderTarget&&!0===e.hasExternalTextures))for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.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),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e),this.info.memory.textures--};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=bm){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),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.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return this.isEnvironmentTexture(e)||!0===e.isCompressedTexture||e.generateMipmaps}isEnvironmentTexture(e){const t=e.mapping;return t===H||t===j||t===_||t===v}_destroyTexture(e){this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e)}}class _m extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class vm extends dn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class Nm extends Ds{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new vi(t);return this._currentCond=wa(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new vi(t),s=wa(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new vi(e),this}build(e,...t){const r=Mi();wi(this);for(const t of this.nodes)t.build(e,"void");return wi(r),this.outputNode?this.outputNode.build(e,...t):super.build(e,...t)}else(...e){return console.warn("TSL.StackNode: .else() has been renamed to .Else()."),this.Else(...e)}elseif(...e){return console.warn("TSL.StackNode: .elseif() has been renamed to .ElseIf()."),this.ElseIf(...e)}}const Sm=Ri(Nm);class Am extends Ds{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}setup(e){super.setup(e);const t=this.members,r=[];for(let s=0;s{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)})),Bm=(e,t)=>la(Xn(4,e.mul(qn(1,e))),t),Fm=Ei((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Um=Ei((([e])=>zi(Fm(e.z.add(Fm(e.y.mul(1)))),Fm(e.z.add(Fm(e.x.mul(1)))),Fm(e.y.add(Fm(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Pm=Ei((([e,t,r])=>{const s=zi(e).toVar(),i=Pi(1.4).toVar(),n=Pi(0).toVar(),o=zi(s).toVar();return yc({start:Pi(0),end:Pi(3),type:"float",condition:"<="},(()=>{const e=zi(Um(o.mul(2))).toVar();s.addAssign(e.add(r.mul(Pi(.1).mul(t)))),o.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const a=Pi(Fm(s.z.add(Fm(s.x.add(Fm(s.y)))))).toVar();n.addAssign(a.div(i)),o.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class Im extends Ds{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;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 o=n.inputs;if(t.length===o.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const Lm=Ri(Im),Dm=e=>(...t)=>Lm(e,...t),Vm=ln(0).setGroup(on).onRenderUpdate((e=>e.time)),Om=ln(0).setGroup(on).onRenderUpdate((e=>e.deltaTime)),Gm=ln(0,"uint").setGroup(on).onRenderUpdate((e=>e.frameId)),km=Ei((([e,t,r=Vi(.5)])=>Sg(e.sub(r),t).add(r))),zm=Ei((([e,t,r=Vi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),$m=Ei((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=tl.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=tl;const i=$u.mul(s);return Ti(t)&&(i[0][0]=tl[0].length(),i[0][1]=0,i[0][2]=0),Ti(r)&&(i[1][0]=0,i[1][1]=tl[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,ku.mul(i).mul(hl)})),Wm=Ei((([e=null])=>{const t=rh();return rh(Xc(e)).sub(t).lessThan(0).select(Fc,e)}));class Hm extends Ds{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Au(),r=Pi(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),o=n.mod(s),a=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=Vi(o,a);return t.add(l).mul(u)}}const jm=Ri(Hm);class qm extends Ds{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=Pi(1),i=hl,n=vl){super("vec4"),this.textureXNode=e,this.textureYNode=t,this.textureZNode=r,this.scaleNode=s,this.positionNode=i,this.normalNode=n}setup(){const{textureXNode:e,textureYNode:t,textureZNode:r,scaleNode:s,positionNode:i,normalNode:n}=this;let o=n.abs().normalize();o=o.div(o.dot(zi(1)));const a=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=Bu(d,a).mul(o.x),g=Bu(c,u).mul(o.y),m=Bu(h,l).mul(o.z);return jn(p,g,m)}}const Xm=Ri(qm),Km=new fe,Ym=new r,Qm=new r,Zm=new r,Jm=new n,ef=new r(0,0,-1),tf=new s,rf=new r,sf=new r,nf=new s,of=new t,af=new me,uf=Fc.flipX();af.depthTexture=new B(1,1);let lf=!1;class df extends Mu{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||af.texture,uf),this._reflectorBaseNode=e.reflector||new cf(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=Ni(new df({defaultTexture:af.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._reflectorBaseNode=this._reflectorBaseNode,e}}class cf extends Ds{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new ye,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:o=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=o,this.updateBeforeType=n?ws.RENDER:ws.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new WeakMap}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(of),e.setSize(Math.round(of.width*r),Math.round(of.height*r))}setup(e){return this._updateResolution(af,e.renderer),super.setup(e)}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 me(0,0,{type:xe}),!0===this.generateMipmaps&&(t.texture.minFilter=be,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new B),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&lf)return!1;lf=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,o=this.getVirtualCamera(r),a=this.getRenderTarget(o);if(s.getDrawingBufferSize(of),this._updateResolution(a,s),Qm.setFromMatrixPosition(n.matrixWorld),Zm.setFromMatrixPosition(r.matrixWorld),Jm.extractRotation(n.matrixWorld),Ym.set(0,0,1),Ym.applyMatrix4(Jm),rf.subVectors(Qm,Zm),rf.dot(Ym)>0)return;rf.reflect(Ym).negate(),rf.add(Qm),Jm.extractRotation(r.matrixWorld),ef.set(0,0,-1),ef.applyMatrix4(Jm),ef.add(Zm),sf.subVectors(Qm,ef),sf.reflect(Ym).negate(),sf.add(Qm),o.coordinateSystem=r.coordinateSystem,o.position.copy(rf),o.up.set(0,1,0),o.up.applyMatrix4(Jm),o.up.reflect(Ym),o.lookAt(sf),o.near=r.near,o.far=r.far,o.updateMatrixWorld(),o.projectionMatrix.copy(r.projectionMatrix),Km.setFromNormalAndCoplanarPoint(Ym,Qm),Km.applyMatrix4(o.matrixWorldInverse),tf.set(Km.normal.x,Km.normal.y,Km.normal.z,Km.constant);const u=o.projectionMatrix;nf.x=(Math.sign(tf.x)+u.elements[8])/u.elements[0],nf.y=(Math.sign(tf.y)+u.elements[9])/u.elements[5],nf.z=-1,nf.w=(1+u.elements[10])/u.elements[14],tf.multiplyScalar(1/tf.dot(nf));u.elements[2]=tf.x,u.elements[6]=tf.y,u.elements[10]=s.coordinateSystem===l?tf.z-0:tf.z+1-0,u.elements[14]=tf.w,this.textureNode.value=a.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=a.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),h=s.autoClear;s.setMRT(null),s.setRenderTarget(a),s.autoClear=!0,s.render(t,o),s.setMRT(c),s.setRenderTarget(d),s.autoClear=h,i.visible=!0,lf=!1}}const hf=new Te(-1,1,1,-1,0,1);class pf extends _e{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new ve([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new ve(t,2))}}const gf=new pf;class mf extends G{constructor(e=null){super(gf,e),this.camera=hf,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,hf)}render(e){e.render(this,hf)}}const ff=new t;class yf extends Mu{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:xe}){const i=new me(t,r,s);super(i.texture,Au()),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 mf(new lh),this.updateBeforeType=ws.RENDER}get autoSize(){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.autoSize){this.pixelRatio=e.getPixelRatio();const t=e.getSize(ff);this.setSize(t.width,t.height)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new Mu(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const xf=(e,...t)=>Ni(new yf(Ni(e),...t)),bf=Ei((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===l?(e=Vi(e.x,e.y.oneMinus()).mul(2).sub(1),i=ji(zi(e,t),1)):i=ji(zi(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=ji(r.mul(i));return n.xyz.div(n.w)})),Tf=Ei((([e,t])=>{const r=t.mul(ji(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Vi(s.x,s.y.oneMinus())})),_f=Ei((([e,t,r])=>{const s=Cu(Fu(t)),i=Oi(e.mul(s)).toVar(),n=Fu(t,i).toVar(),o=Fu(t,i.sub(Oi(2,0))).toVar(),a=Fu(t,i.sub(Oi(1,0))).toVar(),u=Fu(t,i.add(Oi(1,0))).toVar(),l=Fu(t,i.add(Oi(2,0))).toVar(),d=Fu(t,i.add(Oi(0,2))).toVar(),c=Fu(t,i.add(Oi(0,1))).toVar(),h=Fu(t,i.sub(Oi(0,1))).toVar(),p=Fu(t,i.sub(Oi(0,2))).toVar(),g=Go(qn(Pi(2).mul(a).sub(o),n)).toVar(),m=Go(qn(Pi(2).mul(u).sub(l),n)).toVar(),f=Go(qn(Pi(2).mul(c).sub(d),n)).toVar(),y=Go(qn(Pi(2).mul(h).sub(p),n)).toVar(),x=bf(e,n,r).toVar(),b=g.lessThan(m).select(x.sub(bf(e.sub(Vi(Pi(1).div(s.x),0)),a,r)),x.negate().add(bf(e.add(Vi(Pi(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(x.sub(bf(e.add(Vi(0,Pi(1).div(s.y))),c,r)),x.negate().add(bf(e.sub(Vi(0,Pi(1).div(s.y))),h,r)));return Fo(ua(b,T))}));class vf extends R{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class Nf extends Ne{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class Sf extends Vs{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}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 Af=Ri(Sf);class Rf extends Uu{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(t=bs(e.itemSize),r=e.count),super(e,t,r),this.isStorageBufferNode=!0,this.access=Bs.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 Af(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Bs.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=nu(this.value),this._varying=Ga(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}generate(e){if(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 Cf=(e,t=null,r=0)=>Ni(new Rf(e,t,r));class Ef extends Nu{static get type(){return"VertexColorNode"}constructor(e=0){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}}class wf extends Ds{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const Mf=Ci(wf),Bf=new Ae,Ff=new n;class Uf extends Ds{static get type(){return"SceneNode"}constructor(e=Uf.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===Uf.BACKGROUND_BLURRINESS?s=Gl("backgroundBlurriness","float",r):t===Uf.BACKGROUND_INTENSITY?s=Gl("backgroundIntensity","float",r):t===Uf.BACKGROUND_ROTATION?s=ln("mat4").label("backgroundRotation").setGroup(on).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Se?(Bf.copy(r.backgroundRotation),Bf.x*=-1,Bf.y*=-1,Bf.z*=-1,Ff.makeRotationFromEuler(Bf)):Ff.identity(),Ff})):console.error("THREE.SceneNode: Unknown scope:",t),s}}Uf.BACKGROUND_BLURRINESS="backgroundBlurriness",Uf.BACKGROUND_INTENSITY="backgroundIntensity",Uf.BACKGROUND_ROTATION="backgroundRotation";const Pf=Ci(Uf,Uf.BACKGROUND_BLURRINESS),If=Ci(Uf,Uf.BACKGROUND_INTENSITY),Lf=Ci(Uf,Uf.BACKGROUND_ROTATION);class Df extends Mu{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=Bs.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);e.getNodeProperties(this).storeNode=this.storeNode}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Bs.READ_WRITE)}toReadOnly(){return this.setAccess(Bs.READ_ONLY)}toWriteOnly(){return this.setAccess(Bs.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),o=s.build(e,"vec4"),a=e.generateTextureStore(e,i,n,o);e.addLineFlowCode(a,this)}}const Vf=Ri(Df);class Of extends Ol{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 Gf=new WeakMap;class kf extends Gs{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=ws.OBJECT,this.updateAfterType=ws.OBJECT,this.previousModelWorldMatrix=ln(new n),this.previousProjectionMatrix=ln(new n).setGroup(on),this.previousCameraViewMatrix=ln(new n)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=$f(r);this.previousModelWorldMatrix.value.copy(s);const i=zf(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new n,i.previousCameraViewMatrix=new n,i.currentProjectionMatrix=new n,i.currentCameraViewMatrix=new n,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}){$f(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?ku:ln(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(al).mul(hl),s=this.previousProjectionMatrix.mul(t).mul(pl),i=r.xy.div(r.w),n=s.xy.div(s.w);return qn(i,n)}}function zf(e){let t=Gf.get(e);return void 0===t&&(t={},Gf.set(e,t)),t}function $f(e,t=0){const r=zf(e);let s=r[t];return void 0===s&&(r[t]=s=new n),s}const Wf=Ci(kf),Hf=Ei((([e,t])=>ea(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),jf=Ei((([e,t])=>ea(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),qf=Ei((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Xf=Ei((([e,t])=>fa(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),sa(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Kf=Ei((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return ji(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"}]}),Yf=Ei((([e])=>ey(e.rgb))),Qf=Ei((([e,t=Pi(1)])=>t.mix(ey(e.rgb),e.rgb))),Zf=Ei((([e,t=Pi(1)])=>{const r=jn(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 fa(e.rgb,s,i)})),Jf=Ei((([e,t=Pi(1)])=>{const r=zi(.57735,.57735,.57735),s=t.cos();return zi(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(aa(r,e.rgb).mul(s.oneMinus())))))})),ey=(e,t=zi(d.getLuminanceCoefficients(new r)))=>aa(e,t),ty=Ei((([e,t=zi(1),s=zi(0),i=zi(1),n=Pi(1),o=zi(d.getLuminanceCoefficients(new r,Re))])=>{const a=e.rgb.dot(zi(o)),u=ta(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return Bi(u.r.greaterThan(0),(()=>{u.r.assign(l.r)})),Bi(u.g.greaterThan(0),(()=>{u.g.assign(l.g)})),Bi(u.b.greaterThan(0),(()=>{u.b.assign(l.b)})),u.assign(a.add(u.sub(a).mul(n))),ji(u.rgb,e.a)}));class ry extends Gs{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 sy=Ri(ry),iy=new t;class ny extends Mu{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return e.object.isQuadMesh&&this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class oy extends ny{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(){return new this.constructor(this.passNode,this.textureName,this.previousTexture)}}class ay extends Gs{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 B;i.isRenderTargetTexture=!0,i.name="depth";const n=new me(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:xe,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=ln(0),this._cameraFar=ln(0),this._mrt=null,this.isPassNode=!0,this.updateBeforeType=ws.FRAME}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}isGlobal(){return!0}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=Ni(new oy(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=Ni(new oy(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=Zc(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=Yc(i,r,s)}return t}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,!0===e.backend.isWebGLBackend&&(this.renderTarget.samples=0),this.scope===ay.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r,camera:s}=this;this._pixelRatio=t.getPixelRatio();const i=t.getSize(iy);this.setSize(i.width,i.height);const n=t.getRenderTarget(),o=t.getMRT();this._cameraNear.value=s.near,this._cameraFar.value=s.far;for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(n),t.setMRT(o)}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio,s=this._height*this._pixelRatio;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}ay.COLOR="color",ay.DEPTH="depth";class uy extends ay{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(ay.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction(((e,r,s,i,n,o,a,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,o,a,u)}t.renderObject(e,r,s,i,n,o,a,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new lh;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=T;const t=vl.negate(),r=ku.mul(al),s=Pi(1),i=r.mul(ji(hl,1)),n=r.mul(ji(hl.add(t),1)),o=Fo(i.sub(n));return e.vertexNode=i.add(o.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=ji(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 ly=Ei((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),dy=Ei((([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"}]}),cy=Ei((([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"}]}),hy=Ei((([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)})),py=Ei((([e,t])=>{const r=Qi(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Qi(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=hy(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),gy=Qi(zi(1.6605,-.1246,-.0182),zi(-.5876,1.1329,-.1006),zi(-.0728,-.0083,1.1187)),my=Qi(zi(.6274,.0691,.0164),zi(.3293,.9195,.088),zi(.0433,.0113,.8956)),fy=Ei((([e])=>{const t=zi(e).toVar(),r=zi(t.mul(t)).toVar(),s=zi(r.mul(r)).toVar();return Pi(15.5).mul(s.mul(r)).sub(Xn(40.14,s.mul(t))).add(Xn(31.96,s).sub(Xn(6.868,r.mul(t))).add(Xn(.4298,r).add(Xn(.1191,t).sub(.00232))))})),yy=Ei((([e,t])=>{const r=zi(e).toVar(),s=Qi(zi(.856627153315983,.137318972929847,.11189821299995),zi(.0951212405381588,.761241990602591,.0767994186031903),zi(.0482516061458583,.101439036467562,.811302368396859)),i=Qi(zi(1.1271005818144368,-.1413297634984383,-.14132976349843826),zi(-.11060664309660323,1.157823702216272,-.11060664309660294),zi(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=Pi(-12.47393),o=Pi(4.026069);return r.mulAssign(t),r.assign(my.mul(r)),r.assign(s.mul(r)),r.assign(ta(r,1e-10)),r.assign(Co(r)),r.assign(r.sub(n).div(o.sub(n))),r.assign(ya(r,0,1)),r.assign(fy(r)),r.assign(i.mul(r)),r.assign(la(ta(zi(0),r),zi(2.2))),r.assign(gy.mul(r)),r.assign(ya(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),xy=Ei((([e,t])=>{const r=Pi(.76),s=Pi(.15);e=e.mul(t);const i=ea(e.r,ea(e.g,e.b)),n=wa(i.lessThan(.08),i.sub(Xn(6.25,i.mul(i))),.04);e.subAssign(n);const o=ta(e.r,ta(e.g,e.b));Bi(o.lessThan(r),(()=>e));const a=qn(1,r),u=qn(1,a.mul(a).div(o.add(a.sub(r))));e.mulAssign(u.div(o));const l=qn(1,Kn(1,s.mul(o.sub(u)).add(1)));return fa(e,zi(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class by extends Ds{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.code=e,this.includes=t,this.language=r}isGlobal(){return!0}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 Ty=Ri(by);class _y extends by{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}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 o=e.getPropertyName(n),a=this.getNodeFunction(e).getCode(o);return n.code=a+"\n","property"===t?o:e.format(`${o}()`,i,t)}}const vy=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Ny extends Ds{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new o,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:Pi()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=As(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?Rs(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 Sy=Ri(Ny);class Ay 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 Ry{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 Cy=new Ay;class Ey extends Ds{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new Ay,this._output=Sy(),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]=Sy(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]=Sy(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 Ry(this),t=Cy.get("THREE"),r=Cy.get("TSL"),s=this.getMethod(),i=[e,this._local,Cy,()=>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:Pi()}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=[hs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return ps(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 wy=Ri(Ey);function My(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||fl.z).negate()}const By=Ei((([e,t],r)=>{const s=My(r);return Ta(e,t,s)})),Fy=Ei((([e],t)=>{const r=My(t);return e.mul(e,r,r).negate().exp().oneMinus()})),Uy=Ei((([e,t])=>ji(t.toFloat().mix(Bn.rgb,e.toVec3()),Bn.a)));let Py=null,Iy=null;class Ly extends Ds{static get type(){return"RangeNode"}constructor(e=Pi(),t=Pi()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(vs(this.minNode.value)),r=e.getTypeLength(vs(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,o=e.getTypeLength(vs(i)),u=e.getTypeLength(vs(n));Py=Py||new s,Iy=Iy||new s,Py.setScalar(0),Iy.setScalar(0),1===o?Py.setScalar(i):i.isColor?Py.set(i.r,i.g,i.b,1):Py.set(i.x,i.y,i.z||0,i.w||0),1===u?Iy.setScalar(n):n.isColor?Iy.set(n.r,n.g,n.b,1):Iy.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;eNi(new Vy(e,t)),Gy=Oy("numWorkgroups","uvec3"),ky=Oy("workgroupId","uvec3"),zy=Oy("globalId","uvec3"),$y=Oy("localId","uvec3"),Wy=Oy("subgroupSize","uint");const Hy=Ri(class extends Ds{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 jy extends Vs{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 qy extends Ds{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e}label(e){return this.name=e,this}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Ni(new jy(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class Xy extends Gs{static get type(){return"AtomicFunctionNode"}constructor(e,t,r,s=null){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.storeNode=s}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=this.method,r=this.getNodeType(e),s=this.getInputType(e),i=this.pointerNode,n=this.valueNode,o=[];o.push(`&${i.build(e,s)}`),o.push(n.build(e,s));const a=`${e.getMethod(t,r)}( ${o.join(", ")} )`;if(null!==this.storeNode){const t=this.storeNode.build(e,s);e.addLineFlowCode(`${t} = ${a}`,this)}else e.addLineFlowCode(a,this)}}Xy.ATOMIC_LOAD="atomicLoad",Xy.ATOMIC_STORE="atomicStore",Xy.ATOMIC_ADD="atomicAdd",Xy.ATOMIC_SUB="atomicSub",Xy.ATOMIC_MAX="atomicMax",Xy.ATOMIC_MIN="atomicMin",Xy.ATOMIC_AND="atomicAnd",Xy.ATOMIC_OR="atomicOr",Xy.ATOMIC_XOR="atomicXor";const Ky=Ri(Xy),Yy=(e,t,r,s=null)=>{const i=Ky(e,t,r,s);return i.append(),i};let Qy;function Zy(e){Qy=Qy||new WeakMap;let t=Qy.get(e);return void 0===t&&Qy.set(e,t={}),t}function Jy(e){const t=Zy(e);return t.shadowMatrix||(t.shadowMatrix=ln("mat4").setGroup(on).onRenderUpdate((()=>(!0!==e.castShadow&&e.shadow.updateMatrices(e),e.shadow.matrix))))}function ex(e){const t=Zy(e);if(void 0===t.projectionUV){const r=Jy(e).mul(gl);t.projectionUV=r.xyz.div(r.w)}return t.projectionUV}function tx(e){const t=Zy(e);return t.position||(t.position=ln(new r).setGroup(on).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function rx(e){const t=Zy(e);return t.targetPosition||(t.targetPosition=ln(new r).setGroup(on).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function sx(e){const t=Zy(e);return t.viewPosition||(t.viewPosition=ln(new r).setGroup(on).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const ix=e=>$u.transformDirection(tx(e).sub(rx(e))),nx=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},ox=new WeakMap;class ax extends Ds{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=zi().toVar("totalDiffuse"),this.totalSpecularNode=zi().toVar("totalSpecular"),this.outgoingLightNode=zi().toVar("outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=[],t=this._lights;for(let r=0;re.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Ni(e));else{let s=null;if(null!==r&&(s=nx(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;ox.has(e)?s=ox.get(e):(s=Ni(new r(e)),ox.set(e,s)),t.push(s)}}this._lightNodes=t}setupLights(e,t){for(const r of t)r.build(e)}setup(e){null===this._lightNodes&&this.setupLightsNode(e);const t=e.context,r=t.lightingModel;let s=this.outgoingLightNode;if(r){const{_lightNodes:i,totalDiffuseNode:n,totalSpecularNode:o}=this;t.outgoingLight=s;const a=e.addStack();e.getDataFromNode(this).nodes=a.nodes,r.start(t,a,e),this.setupLights(e,i),r.indirect(t,a,e);const{backdrop:u,backdropAlpha:l}=t,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=t.reflectedLight;let g=d.add(h);null!==u&&(g=zi(null!==l?l.mix(g,u):u),t.material.transparent=!0),n.assign(g),o.assign(c.add(p)),s.assign(n.add(o)),r.finish(t,a,e),s=s.bypass(e.removeStack())}return s}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 ux extends Ds{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=ws.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({material:e}){lx.assign(e.shadowPositionNode||gl)}dispose(){this.updateBeforeType=ws.NONE}}const lx=zi().toVar("shadowPositionWorld");function dx(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 cx(e,t){return t=dx(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function hx(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 px(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function gx(e,t){return t=px(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function mx(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function fx(e,t,r){return r=gx(t,r=cx(e,r))}function yx(e,t,r){hx(e,r),mx(t,r)}var xx=Object.freeze({__proto__:null,resetRendererAndSceneState:fx,resetRendererState:cx,resetSceneState:gx,restoreRendererAndSceneState:yx,restoreRendererState:hx,restoreSceneState:mx,saveRendererAndSceneState:function(e,t,r={}){return r=px(t,r=dx(e,r))},saveRendererState:dx,saveSceneState:px});const bx=new WeakMap,Tx=Ei((([e,t,r])=>{let s=gl.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),_x=e=>{let t=bx.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=Gl("near","float",t).setGroup(on),s=Gl("far","float",t).setGroup(on),i=Yu(e);return Tx(i,r,s)})(e):null;t=new lh,t.colorNode=ji(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,bx.set(e,t)}return t},vx=Ei((({depthTexture:e,shadowCoord:t})=>Bu(e,t.xy).compare(t.z))),Nx=Ei((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Bu(e,t).compare(r),i=Gl("mapSize","vec2",r).setGroup(on),n=Gl("radius","float",r).setGroup(on),o=Vi(1).div(i),a=o.x.negate().mul(n),u=o.y.negate().mul(n),l=o.x.mul(n),d=o.y.mul(n),c=a.div(2),h=u.div(2),p=l.div(2),g=d.div(2);return jn(s(t.xy.add(Vi(a,u)),t.z),s(t.xy.add(Vi(0,u)),t.z),s(t.xy.add(Vi(l,u)),t.z),s(t.xy.add(Vi(c,h)),t.z),s(t.xy.add(Vi(0,h)),t.z),s(t.xy.add(Vi(p,h)),t.z),s(t.xy.add(Vi(a,0)),t.z),s(t.xy.add(Vi(c,0)),t.z),s(t.xy,t.z),s(t.xy.add(Vi(p,0)),t.z),s(t.xy.add(Vi(l,0)),t.z),s(t.xy.add(Vi(c,g)),t.z),s(t.xy.add(Vi(0,g)),t.z),s(t.xy.add(Vi(p,g)),t.z),s(t.xy.add(Vi(a,d)),t.z),s(t.xy.add(Vi(0,d)),t.z),s(t.xy.add(Vi(l,d)),t.z)).mul(1/17)})),Sx=Ei((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Bu(e,t).compare(r),i=Gl("mapSize","vec2",r).setGroup(on),n=Vi(1).div(i),o=n.x,a=n.y,u=t.xy,l=Uo(u.mul(i).add(.5));return u.subAssign(l.mul(n)),jn(s(u,t.z),s(u.add(Vi(o,0)),t.z),s(u.add(Vi(0,a)),t.z),s(u.add(n),t.z),fa(s(u.add(Vi(o.negate(),0)),t.z),s(u.add(Vi(o.mul(2),0)),t.z),l.x),fa(s(u.add(Vi(o.negate(),a)),t.z),s(u.add(Vi(o.mul(2),a)),t.z),l.x),fa(s(u.add(Vi(0,a.negate())),t.z),s(u.add(Vi(0,a.mul(2))),t.z),l.y),fa(s(u.add(Vi(o,a.negate())),t.z),s(u.add(Vi(o,a.mul(2))),t.z),l.y),fa(fa(s(u.add(Vi(o.negate(),a.negate())),t.z),s(u.add(Vi(o.mul(2),a.negate())),t.z),l.x),fa(s(u.add(Vi(o.negate(),a.mul(2))),t.z),s(u.add(Vi(o.mul(2),a.mul(2))),t.z),l.x),l.y)).mul(1/9)})),Ax=Ei((({depthTexture:e,shadowCoord:t})=>{const r=Pi(1).toVar(),s=Bu(e).sample(t.xy).rg,i=sa(t.z,s.x);return Bi(i.notEqual(Pi(1)),(()=>{const e=t.z.sub(s.x),n=ta(0,s.y.mul(s.y));let o=n.div(n.add(e.mul(e)));o=ya(qn(o,.3).div(.95-.3)),r.assign(ya(ta(i,o)))})),r})),Rx=Ei((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Pi(0).toVar(),n=Pi(0).toVar(),o=e.lessThanEqual(Pi(1)).select(Pi(0),Pi(2).div(e.sub(1))),a=e.lessThanEqual(Pi(1)).select(Pi(0),Pi(-1));yc({start:Ii(0),end:Ii(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Pi(e).mul(o)),l=s.sample(jn(Pc.xy,Vi(0,u).mul(t)).div(r)).x;i.addAssign(l),n.addAssign(l.mul(l))})),i.divAssign(e),n.divAssign(e);const u=Eo(n.sub(i.mul(i)));return Vi(i,u)})),Cx=Ei((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Pi(0).toVar(),n=Pi(0).toVar(),o=e.lessThanEqual(Pi(1)).select(Pi(0),Pi(2).div(e.sub(1))),a=e.lessThanEqual(Pi(1)).select(Pi(0),Pi(-1));yc({start:Ii(0),end:Ii(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Pi(e).mul(o)),l=s.sample(jn(Pc.xy,Vi(u,0).mul(t)).div(r));i.addAssign(l.x),n.addAssign(jn(l.y.mul(l.y),l.x.mul(l.x)))})),i.divAssign(e),n.divAssign(e);const u=Eo(n.sub(i.mul(i)));return Vi(i,u)})),Ex=[vx,Nx,Sx,Ax];let wx;const Mx=new mf;class Bx extends ux{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.isShadowNode=!0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){const n=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});return n.select(o,Pi(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=Gl("bias","float",r).setGroup(on);let n,o=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)o=o.xyz.div(o.w),n=o.z,s.coordinateSystem===l&&(n=n.mul(2).sub(1));else{const e=o.w;o=o.xy.div(e);const t=Gl("near","float",r.camera).setGroup(on),s=Gl("far","float",r.camera).setGroup(on);n=Jc(e.negate(),t,s)}return o=zi(o.x,o.y.oneMinus(),n.add(i)),o}getShadowFilterFn(e){return Ex[e]}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,n=new B(s.mapSize.width,s.mapSize.height);n.compareFunction=Ce;const o=e.createRenderTarget(s.mapSize.width,s.mapSize.height);if(o.depthTexture=n,s.camera.updateProjectionMatrix(),i===Ee){n.compareFunction=null,this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:we,type:xe}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:we,type:xe});const t=Bu(n),r=Bu(this.vsmShadowMapVertical.texture),i=Gl("blurSamples","float",s).setGroup(on),o=Gl("radius","float",s).setGroup(on),a=Gl("mapSize","vec2",s).setGroup(on);let u=this.vsmMaterialVertical||(this.vsmMaterialVertical=new lh);u.fragmentNode=Rx({samples:i,radius:o,size:a,shadowPass:t}).context(e.getSharedContext()),u.name="VSMVertical",u=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new lh),u.fragmentNode=Cx({samples:i,radius:o,size:a,shadowPass:r}).context(e.getSharedContext()),u.name="VSMHorizontal"}const a=Gl("intensity","float",s).setGroup(on),u=Gl("normalBias","float",s).setGroup(on),l=Jy(r).mul(lx.add(Cl.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===Ee?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:o.texture,depthTexture:h,shadowCoord:d,shadow:s}),g=Bu(o.texture,d),m=fa(1,p.rgb.mix(g,1),a.mul(g.a)).toVar();return this.shadowMap=o,this.shadow.map=o,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return Ei((()=>{let t=this._node;return this.setupShadowPosition(e),null===t&&(this._node=t=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(t=e.material.receivedShadowNode(t)),t}))()}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),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:o}=e,a=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u,s.camera.layers.mask=o.layers.mask;const l=i.getRenderObjectFunction(),d=i.getMRT(),c=!!d&&d.has("velocity");wx=fx(i,n,wx),n.overrideMaterial=_x(r),i.setRenderObjectFunction(((e,t,r,n,u,l,...d)=>{(!0===e.castShadow||e.receiveShadow&&a===Ee)&&(c&&(Ss(e).useVelocity=!0),e.onBeforeShadow(i,e,o,s.camera,n,t.overrideMaterial,l),i.renderObject(e,t,r,n,u,l,...d),e.onAfterShadow(i,e,o,s.camera,n,t.overrideMaterial,l))})),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(l),!0!==r.isPointLight&&a===Ee&&this.vsmPass(i),yx(i,n,wx)}vsmPass(e){const{shadow:t}=this;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height),e.setRenderTarget(this.vsmShadowMapVertical),Mx.material=this.vsmMaterialVertical,Mx.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),Mx.material=this.vsmMaterialHorizontal,Mx.render(e)}dispose(){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),super.dispose()}updateBefore(e){const{shadow:t}=this;(t.needsUpdate||t.autoUpdate)&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const Fx=(e,t)=>Ni(new Bx(e,t));class Ux extends Sc{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||ln(this.color).setGroup(on),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=ws.FRAME}customCacheKey(){return gs(this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}setupShadowNode(){return Fx(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const t=this.light.shadow.shadowNode;let s;s=void 0!==t?Ni(t):this.setupShadowNode(e),this.shadowNode=s,this.shadowColorNode=r=this.colorNode.mul(s),this.baseColorNode=this.colorNode}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)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const Px=Ei((e=>{const{lightDistance:t,cutoffDistance:r,decayExponent:s}=e,i=t.pow(s).max(.01).reciprocal();return r.greaterThan(0).select(i.mul(t.div(r).pow4().oneMinus().clamp().pow2()),i)})),Ix=new e,Lx=Ei((([e,t])=>{const r=e.toVar(),s=Go(r),i=Kn(1,ta(s.x,ta(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=Vi(r.xy).toVar(),o=t.mul(1.5).oneMinus();return Bi(s.z.greaterThanEqual(o),(()=>{Bi(r.z.greaterThan(0),(()=>{n.x.assign(qn(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(o),(()=>{const e=ko(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(o),(()=>{const e=ko(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))})),Vi(.125,.25).mul(n).add(Vi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),Dx=Ei((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>Bu(e,Lx(t,s.y)).compare(r))),Vx=Ei((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=Gl("radius","float",i).setGroup(on),o=Vi(-1,1).mul(n).mul(s.y);return Bu(e,Lx(t.add(o.xyy),s.y)).compare(r).add(Bu(e,Lx(t.add(o.yyy),s.y)).compare(r)).add(Bu(e,Lx(t.add(o.xyx),s.y)).compare(r)).add(Bu(e,Lx(t.add(o.yyx),s.y)).compare(r)).add(Bu(e,Lx(t,s.y)).compare(r)).add(Bu(e,Lx(t.add(o.xxy),s.y)).compare(r)).add(Bu(e,Lx(t.add(o.yxy),s.y)).compare(r)).add(Bu(e,Lx(t.add(o.xxx),s.y)).compare(r)).add(Bu(e,Lx(t.add(o.yxx),s.y)).compare(r)).mul(1/9)})),Ox=Ei((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),o=ln("float").setGroup(on).onRenderUpdate((()=>s.camera.near)),a=ln("float").setGroup(on).onRenderUpdate((()=>s.camera.far)),u=Gl("bias","float",s).setGroup(on),l=ln(s.mapSize).setGroup(on),d=Pi(1).toVar();return Bi(n.sub(a).lessThanEqual(0).and(n.sub(o).greaterThanEqual(0)),(()=>{const r=n.sub(o).div(a.sub(o)).toVar();r.addAssign(u);const c=i.normalize(),h=Vi(1).div(l.mul(Vi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),Gx=new s,kx=new t,zx=new t;class $x extends Bx{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Me?Dx:Vx}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return Ox({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,o=t.getFrameExtents();zx.copy(t.mapSize),zx.multiply(o),r.setSize(zx.width,zx.height),kx.copy(t.mapSize);const a=i.autoClear,u=i.getClearColor(Ix),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;e{const n=i.context.lightingModel,o=t.sub(fl),a=o.normalize(),u=o.length(),l=Px({lightDistance:u,cutoffDistance:r,decayExponent:s}),d=e.mul(l),c=i.context.reflectedLight;n.direct({lightDirection:a,lightColor:d,reflectedLight:c},i.stack,i)}));class Hx extends Ux{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=ln(0).setGroup(on),this.decayExponentNode=ln(2).setGroup(on)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return((e,t)=>Ni(new $x(e,t)))(this.light)}setup(e){super.setup(e),Wx({color:this.colorNode,lightViewPosition:sx(this.light),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode}).append()}}const jx=Ei((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),qx=Ei((([e=Au()],{renderer:t,material:r})=>{const s=Pi(1).toVar(),i=ma(e.mul(2).sub(1));if(r.alphaToCoverage&&t.samples>1){const e=Pi(i.fwidth()).toVar();s.assign(Ta(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();return s})),Xx=Ei((([e,t,r])=>{const s=Pi(r).toVar(),i=Pi(t).toVar(),n=Di(e).toVar();return wa(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Kx=Ei((([e,t])=>{const r=Di(t).toVar(),s=Pi(e).toVar();return wa(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),Yx=Ei((([e])=>{const t=Pi(e).toVar();return Ii(Mo(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),Qx=Ei((([e,t])=>{const r=Pi(e).toVar();return t.assign(Yx(r)),r.sub(Pi(t))})),Zx=Dm([Ei((([e,t,r,s,i,n])=>{const o=Pi(n).toVar(),a=Pi(i).toVar(),u=Pi(s).toVar(),l=Pi(r).toVar(),d=Pi(t).toVar(),c=Pi(e).toVar(),h=Pi(qn(1,a)).toVar();return qn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).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"}]}),Ei((([e,t,r,s,i,n])=>{const o=Pi(n).toVar(),a=Pi(i).toVar(),u=zi(s).toVar(),l=zi(r).toVar(),d=zi(t).toVar(),c=zi(e).toVar(),h=Pi(qn(1,a)).toVar();return qn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).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"}]})]),Jx=Dm([Ei((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Pi(d).toVar(),h=Pi(l).toVar(),p=Pi(u).toVar(),g=Pi(a).toVar(),m=Pi(o).toVar(),f=Pi(n).toVar(),y=Pi(i).toVar(),x=Pi(s).toVar(),b=Pi(r).toVar(),T=Pi(t).toVar(),_=Pi(e).toVar(),v=Pi(qn(1,p)).toVar(),N=Pi(qn(1,h)).toVar();return Pi(qn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]}),Ei((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Pi(d).toVar(),h=Pi(l).toVar(),p=Pi(u).toVar(),g=zi(a).toVar(),m=zi(o).toVar(),f=zi(n).toVar(),y=zi(i).toVar(),x=zi(s).toVar(),b=zi(r).toVar(),T=zi(t).toVar(),_=zi(e).toVar(),v=Pi(qn(1,p)).toVar(),N=Pi(qn(1,h)).toVar();return Pi(qn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]})]),eb=Ei((([e,t,r])=>{const s=Pi(r).toVar(),i=Pi(t).toVar(),n=Li(e).toVar(),o=Li(n.bitAnd(Li(7))).toVar(),a=Pi(Xx(o.lessThan(Li(4)),i,s)).toVar(),u=Pi(Xn(2,Xx(o.lessThan(Li(4)),s,i))).toVar();return Kx(a,Di(o.bitAnd(Li(1)))).add(Kx(u,Di(o.bitAnd(Li(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),tb=Ei((([e,t,r,s])=>{const i=Pi(s).toVar(),n=Pi(r).toVar(),o=Pi(t).toVar(),a=Li(e).toVar(),u=Li(a.bitAnd(Li(15))).toVar(),l=Pi(Xx(u.lessThan(Li(8)),o,n)).toVar(),d=Pi(Xx(u.lessThan(Li(4)),n,Xx(u.equal(Li(12)).or(u.equal(Li(14))),o,i))).toVar();return Kx(l,Di(u.bitAnd(Li(1)))).add(Kx(d,Di(u.bitAnd(Li(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"}]}),rb=Dm([eb,tb]),sb=Ei((([e,t,r])=>{const s=Pi(r).toVar(),i=Pi(t).toVar(),n=Wi(e).toVar();return zi(rb(n.x,i,s),rb(n.y,i,s),rb(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"}]}),ib=Ei((([e,t,r,s])=>{const i=Pi(s).toVar(),n=Pi(r).toVar(),o=Pi(t).toVar(),a=Wi(e).toVar();return zi(rb(a.x,o,n,i),rb(a.y,o,n,i),rb(a.z,o,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"}]}),nb=Dm([sb,ib]),ob=Ei((([e])=>{const t=Pi(e).toVar();return Xn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),ab=Ei((([e])=>{const t=Pi(e).toVar();return Xn(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),ub=Dm([ob,Ei((([e])=>{const t=zi(e).toVar();return Xn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),lb=Dm([ab,Ei((([e])=>{const t=zi(e).toVar();return Xn(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),db=Ei((([e,t])=>{const r=Ii(t).toVar(),s=Li(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Ii(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),cb=Ei((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(db(r,Ii(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(db(e,Ii(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(db(t,Ii(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(db(r,Ii(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(db(e,Ii(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(db(t,Ii(4))),t.addAssign(e)})),hb=Ei((([e,t,r])=>{const s=Li(r).toVar(),i=Li(t).toVar(),n=Li(e).toVar();return s.bitXorAssign(i),s.subAssign(db(i,Ii(14))),n.bitXorAssign(s),n.subAssign(db(s,Ii(11))),i.bitXorAssign(n),i.subAssign(db(n,Ii(25))),s.bitXorAssign(i),s.subAssign(db(i,Ii(16))),n.bitXorAssign(s),n.subAssign(db(s,Ii(4))),i.bitXorAssign(n),i.subAssign(db(n,Ii(14))),s.bitXorAssign(i),s.subAssign(db(i,Ii(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),pb=Ei((([e])=>{const t=Li(e).toVar();return Pi(t).div(Pi(Li(Ii(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),gb=Ei((([e])=>{const t=Pi(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"}]}),mb=Dm([Ei((([e])=>{const t=Ii(e).toVar(),r=Li(Li(1)).toVar(),s=Li(Li(Ii(3735928559)).add(r.shiftLeft(Li(2))).add(Li(13))).toVar();return hb(s.add(Li(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),Ei((([e,t])=>{const r=Ii(t).toVar(),s=Ii(e).toVar(),i=Li(Li(2)).toVar(),n=Li().toVar(),o=Li().toVar(),a=Li().toVar();return n.assign(o.assign(a.assign(Li(Ii(3735928559)).add(i.shiftLeft(Li(2))).add(Li(13))))),n.addAssign(Li(s)),o.addAssign(Li(r)),hb(n,o,a)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Ii(t).toVar(),n=Ii(e).toVar(),o=Li(Li(3)).toVar(),a=Li().toVar(),u=Li().toVar(),l=Li().toVar();return a.assign(u.assign(l.assign(Li(Ii(3735928559)).add(o.shiftLeft(Li(2))).add(Li(13))))),a.addAssign(Li(n)),u.addAssign(Li(i)),l.addAssign(Li(s)),hb(a,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),Ei((([e,t,r,s])=>{const i=Ii(s).toVar(),n=Ii(r).toVar(),o=Ii(t).toVar(),a=Ii(e).toVar(),u=Li(Li(4)).toVar(),l=Li().toVar(),d=Li().toVar(),c=Li().toVar();return l.assign(d.assign(c.assign(Li(Ii(3735928559)).add(u.shiftLeft(Li(2))).add(Li(13))))),l.addAssign(Li(a)),d.addAssign(Li(o)),c.addAssign(Li(n)),cb(l,d,c),l.addAssign(Li(i)),hb(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"}]}),Ei((([e,t,r,s,i])=>{const n=Ii(i).toVar(),o=Ii(s).toVar(),a=Ii(r).toVar(),u=Ii(t).toVar(),l=Ii(e).toVar(),d=Li(Li(5)).toVar(),c=Li().toVar(),h=Li().toVar(),p=Li().toVar();return c.assign(h.assign(p.assign(Li(Ii(3735928559)).add(d.shiftLeft(Li(2))).add(Li(13))))),c.addAssign(Li(l)),h.addAssign(Li(u)),p.addAssign(Li(a)),cb(c,h,p),c.addAssign(Li(o)),h.addAssign(Li(n)),hb(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"}]})]),fb=Dm([Ei((([e,t])=>{const r=Ii(t).toVar(),s=Ii(e).toVar(),i=Li(mb(s,r)).toVar(),n=Wi().toVar();return n.x.assign(i.bitAnd(Ii(255))),n.y.assign(i.shiftRight(Ii(8)).bitAnd(Ii(255))),n.z.assign(i.shiftRight(Ii(16)).bitAnd(Ii(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Ii(t).toVar(),n=Ii(e).toVar(),o=Li(mb(n,i,s)).toVar(),a=Wi().toVar();return a.x.assign(o.bitAnd(Ii(255))),a.y.assign(o.shiftRight(Ii(8)).bitAnd(Ii(255))),a.z.assign(o.shiftRight(Ii(16)).bitAnd(Ii(255))),a})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),yb=Dm([Ei((([e])=>{const t=Vi(e).toVar(),r=Ii().toVar(),s=Ii().toVar(),i=Pi(Qx(t.x,r)).toVar(),n=Pi(Qx(t.y,s)).toVar(),o=Pi(gb(i)).toVar(),a=Pi(gb(n)).toVar(),u=Pi(Zx(rb(mb(r,s),i,n),rb(mb(r.add(Ii(1)),s),i.sub(1),n),rb(mb(r,s.add(Ii(1))),i,n.sub(1)),rb(mb(r.add(Ii(1)),s.add(Ii(1))),i.sub(1),n.sub(1)),o,a)).toVar();return ub(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),Ei((([e])=>{const t=zi(e).toVar(),r=Ii().toVar(),s=Ii().toVar(),i=Ii().toVar(),n=Pi(Qx(t.x,r)).toVar(),o=Pi(Qx(t.y,s)).toVar(),a=Pi(Qx(t.z,i)).toVar(),u=Pi(gb(n)).toVar(),l=Pi(gb(o)).toVar(),d=Pi(gb(a)).toVar(),c=Pi(Jx(rb(mb(r,s,i),n,o,a),rb(mb(r.add(Ii(1)),s,i),n.sub(1),o,a),rb(mb(r,s.add(Ii(1)),i),n,o.sub(1),a),rb(mb(r.add(Ii(1)),s.add(Ii(1)),i),n.sub(1),o.sub(1),a),rb(mb(r,s,i.add(Ii(1))),n,o,a.sub(1)),rb(mb(r.add(Ii(1)),s,i.add(Ii(1))),n.sub(1),o,a.sub(1)),rb(mb(r,s.add(Ii(1)),i.add(Ii(1))),n,o.sub(1),a.sub(1)),rb(mb(r.add(Ii(1)),s.add(Ii(1)),i.add(Ii(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return lb(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),xb=Dm([Ei((([e])=>{const t=Vi(e).toVar(),r=Ii().toVar(),s=Ii().toVar(),i=Pi(Qx(t.x,r)).toVar(),n=Pi(Qx(t.y,s)).toVar(),o=Pi(gb(i)).toVar(),a=Pi(gb(n)).toVar(),u=zi(Zx(nb(fb(r,s),i,n),nb(fb(r.add(Ii(1)),s),i.sub(1),n),nb(fb(r,s.add(Ii(1))),i,n.sub(1)),nb(fb(r.add(Ii(1)),s.add(Ii(1))),i.sub(1),n.sub(1)),o,a)).toVar();return ub(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Ei((([e])=>{const t=zi(e).toVar(),r=Ii().toVar(),s=Ii().toVar(),i=Ii().toVar(),n=Pi(Qx(t.x,r)).toVar(),o=Pi(Qx(t.y,s)).toVar(),a=Pi(Qx(t.z,i)).toVar(),u=Pi(gb(n)).toVar(),l=Pi(gb(o)).toVar(),d=Pi(gb(a)).toVar(),c=zi(Jx(nb(fb(r,s,i),n,o,a),nb(fb(r.add(Ii(1)),s,i),n.sub(1),o,a),nb(fb(r,s.add(Ii(1)),i),n,o.sub(1),a),nb(fb(r.add(Ii(1)),s.add(Ii(1)),i),n.sub(1),o.sub(1),a),nb(fb(r,s,i.add(Ii(1))),n,o,a.sub(1)),nb(fb(r.add(Ii(1)),s,i.add(Ii(1))),n.sub(1),o,a.sub(1)),nb(fb(r,s.add(Ii(1)),i.add(Ii(1))),n,o.sub(1),a.sub(1)),nb(fb(r.add(Ii(1)),s.add(Ii(1)),i.add(Ii(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return lb(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),bb=Dm([Ei((([e])=>{const t=Pi(e).toVar(),r=Ii(Yx(t)).toVar();return pb(mb(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),Ei((([e])=>{const t=Vi(e).toVar(),r=Ii(Yx(t.x)).toVar(),s=Ii(Yx(t.y)).toVar();return pb(mb(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),Ei((([e])=>{const t=zi(e).toVar(),r=Ii(Yx(t.x)).toVar(),s=Ii(Yx(t.y)).toVar(),i=Ii(Yx(t.z)).toVar();return pb(mb(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),Ei((([e])=>{const t=ji(e).toVar(),r=Ii(Yx(t.x)).toVar(),s=Ii(Yx(t.y)).toVar(),i=Ii(Yx(t.z)).toVar(),n=Ii(Yx(t.w)).toVar();return pb(mb(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Tb=Dm([Ei((([e])=>{const t=Pi(e).toVar(),r=Ii(Yx(t)).toVar();return zi(pb(mb(r,Ii(0))),pb(mb(r,Ii(1))),pb(mb(r,Ii(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),Ei((([e])=>{const t=Vi(e).toVar(),r=Ii(Yx(t.x)).toVar(),s=Ii(Yx(t.y)).toVar();return zi(pb(mb(r,s,Ii(0))),pb(mb(r,s,Ii(1))),pb(mb(r,s,Ii(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Ei((([e])=>{const t=zi(e).toVar(),r=Ii(Yx(t.x)).toVar(),s=Ii(Yx(t.y)).toVar(),i=Ii(Yx(t.z)).toVar();return zi(pb(mb(r,s,i,Ii(0))),pb(mb(r,s,i,Ii(1))),pb(mb(r,s,i,Ii(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Ei((([e])=>{const t=ji(e).toVar(),r=Ii(Yx(t.x)).toVar(),s=Ii(Yx(t.y)).toVar(),i=Ii(Yx(t.z)).toVar(),n=Ii(Yx(t.w)).toVar();return zi(pb(mb(r,s,i,n,Ii(0))),pb(mb(r,s,i,n,Ii(1))),pb(mb(r,s,i,n,Ii(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),_b=Ei((([e,t,r,s])=>{const i=Pi(s).toVar(),n=Pi(r).toVar(),o=Ii(t).toVar(),a=zi(e).toVar(),u=Pi(0).toVar(),l=Pi(1).toVar();return yc(o,(()=>{u.addAssign(l.mul(yb(a))),l.mulAssign(i),a.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"}]}),vb=Ei((([e,t,r,s])=>{const i=Pi(s).toVar(),n=Pi(r).toVar(),o=Ii(t).toVar(),a=zi(e).toVar(),u=zi(0).toVar(),l=Pi(1).toVar();return yc(o,(()=>{u.addAssign(l.mul(xb(a))),l.mulAssign(i),a.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"}]}),Nb=Ei((([e,t,r,s])=>{const i=Pi(s).toVar(),n=Pi(r).toVar(),o=Ii(t).toVar(),a=zi(e).toVar();return Vi(_b(a,o,n,i),_b(a.add(zi(Ii(19),Ii(193),Ii(17))),o,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"}]}),Sb=Ei((([e,t,r,s])=>{const i=Pi(s).toVar(),n=Pi(r).toVar(),o=Ii(t).toVar(),a=zi(e).toVar(),u=zi(vb(a,o,n,i)).toVar(),l=Pi(_b(a.add(zi(Ii(19),Ii(193),Ii(17))),o,n,i)).toVar();return ji(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"}]}),Ab=Dm([Ei((([e,t,r,s,i,n,o])=>{const a=Ii(o).toVar(),u=Pi(n).toVar(),l=Ii(i).toVar(),d=Ii(s).toVar(),c=Ii(r).toVar(),h=Ii(t).toVar(),p=Vi(e).toVar(),g=zi(Tb(Vi(h.add(d),c.add(l)))).toVar(),m=Vi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Vi(Vi(Pi(h),Pi(c)).add(m)).toVar(),y=Vi(f.sub(p)).toVar();return Bi(a.equal(Ii(2)),(()=>Go(y.x).add(Go(y.y)))),Bi(a.equal(Ii(3)),(()=>ta(Go(y.x),Go(y.y)))),aa(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"}]}),Ei((([e,t,r,s,i,n,o,a,u])=>{const l=Ii(u).toVar(),d=Pi(a).toVar(),c=Ii(o).toVar(),h=Ii(n).toVar(),p=Ii(i).toVar(),g=Ii(s).toVar(),m=Ii(r).toVar(),f=Ii(t).toVar(),y=zi(e).toVar(),x=zi(Tb(zi(f.add(p),m.add(h),g.add(c)))).toVar();x.subAssign(.5),x.mulAssign(d),x.addAssign(.5);const b=zi(zi(Pi(f),Pi(m),Pi(g)).add(x)).toVar(),T=zi(b.sub(y)).toVar();return Bi(l.equal(Ii(2)),(()=>Go(T.x).add(Go(T.y)).add(Go(T.z)))),Bi(l.equal(Ii(3)),(()=>ta(ta(Go(T.x),Go(T.y)),Go(T.z)))),aa(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"}]})]),Rb=Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Pi(t).toVar(),n=Vi(e).toVar(),o=Ii().toVar(),a=Ii().toVar(),u=Vi(Qx(n.x,o),Qx(n.y,a)).toVar(),l=Pi(1e6).toVar();return yc({start:-1,end:Ii(1),name:"x",condition:"<="},(({x:e})=>{yc({start:-1,end:Ii(1),name:"y",condition:"<="},(({y:t})=>{const r=Pi(Ab(u,e,t,o,a,i,s)).toVar();l.assign(ea(l,r))}))})),Bi(s.equal(Ii(0)),(()=>{l.assign(Eo(l))})),l})).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Cb=Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Pi(t).toVar(),n=Vi(e).toVar(),o=Ii().toVar(),a=Ii().toVar(),u=Vi(Qx(n.x,o),Qx(n.y,a)).toVar(),l=Vi(1e6,1e6).toVar();return yc({start:-1,end:Ii(1),name:"x",condition:"<="},(({x:e})=>{yc({start:-1,end:Ii(1),name:"y",condition:"<="},(({y:t})=>{const r=Pi(Ab(u,e,t,o,a,i,s)).toVar();Bi(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),Bi(s.equal(Ii(0)),(()=>{l.assign(Eo(l))})),l})).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Eb=Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Pi(t).toVar(),n=Vi(e).toVar(),o=Ii().toVar(),a=Ii().toVar(),u=Vi(Qx(n.x,o),Qx(n.y,a)).toVar(),l=zi(1e6,1e6,1e6).toVar();return yc({start:-1,end:Ii(1),name:"x",condition:"<="},(({x:e})=>{yc({start:-1,end:Ii(1),name:"y",condition:"<="},(({y:t})=>{const r=Pi(Ab(u,e,t,o,a,i,s)).toVar();Bi(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)}))}))})),Bi(s.equal(Ii(0)),(()=>{l.assign(Eo(l))})),l})).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),wb=Dm([Rb,Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Pi(t).toVar(),n=zi(e).toVar(),o=Ii().toVar(),a=Ii().toVar(),u=Ii().toVar(),l=zi(Qx(n.x,o),Qx(n.y,a),Qx(n.z,u)).toVar(),d=Pi(1e6).toVar();return yc({start:-1,end:Ii(1),name:"x",condition:"<="},(({x:e})=>{yc({start:-1,end:Ii(1),name:"y",condition:"<="},(({y:t})=>{yc({start:-1,end:Ii(1),name:"z",condition:"<="},(({z:r})=>{const n=Pi(Ab(l,e,t,r,o,a,u,i,s)).toVar();d.assign(ea(d,n))}))}))})),Bi(s.equal(Ii(0)),(()=>{d.assign(Eo(d))})),d})).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Mb=Dm([Cb,Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Pi(t).toVar(),n=zi(e).toVar(),o=Ii().toVar(),a=Ii().toVar(),u=Ii().toVar(),l=zi(Qx(n.x,o),Qx(n.y,a),Qx(n.z,u)).toVar(),d=Vi(1e6,1e6).toVar();return yc({start:-1,end:Ii(1),name:"x",condition:"<="},(({x:e})=>{yc({start:-1,end:Ii(1),name:"y",condition:"<="},(({y:t})=>{yc({start:-1,end:Ii(1),name:"z",condition:"<="},(({z:r})=>{const n=Pi(Ab(l,e,t,r,o,a,u,i,s)).toVar();Bi(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),Bi(s.equal(Ii(0)),(()=>{d.assign(Eo(d))})),d})).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Bb=Dm([Eb,Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Pi(t).toVar(),n=zi(e).toVar(),o=Ii().toVar(),a=Ii().toVar(),u=Ii().toVar(),l=zi(Qx(n.x,o),Qx(n.y,a),Qx(n.z,u)).toVar(),d=zi(1e6,1e6,1e6).toVar();return yc({start:-1,end:Ii(1),name:"x",condition:"<="},(({x:e})=>{yc({start:-1,end:Ii(1),name:"y",condition:"<="},(({y:t})=>{yc({start:-1,end:Ii(1),name:"z",condition:"<="},(({z:r})=>{const n=Pi(Ab(l,e,t,r,o,a,u,i,s)).toVar();Bi(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)}))}))}))})),Bi(s.equal(Ii(0)),(()=>{d.assign(Eo(d))})),d})).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Fb=Ei((([e])=>{const t=e.y,r=e.z,s=zi().toVar();return Bi(t.lessThan(1e-4),(()=>{s.assign(zi(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(Mo(i)).mul(6).toVar();const n=Ii(Ko(i)),o=i.sub(Pi(n)),a=r.mul(t.oneMinus()),u=r.mul(t.mul(o).oneMinus()),l=r.mul(t.mul(o.oneMinus()).oneMinus());Bi(n.equal(Ii(0)),(()=>{s.assign(zi(r,l,a))})).ElseIf(n.equal(Ii(1)),(()=>{s.assign(zi(u,r,a))})).ElseIf(n.equal(Ii(2)),(()=>{s.assign(zi(a,r,l))})).ElseIf(n.equal(Ii(3)),(()=>{s.assign(zi(a,u,r))})).ElseIf(n.equal(Ii(4)),(()=>{s.assign(zi(l,a,r))})).Else((()=>{s.assign(zi(r,a,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Ub=Ei((([e])=>{const t=zi(e).toVar(),r=Pi(t.x).toVar(),s=Pi(t.y).toVar(),i=Pi(t.z).toVar(),n=Pi(ea(r,ea(s,i))).toVar(),o=Pi(ta(r,ta(s,i))).toVar(),a=Pi(o.sub(n)).toVar(),u=Pi().toVar(),l=Pi().toVar(),d=Pi().toVar();return d.assign(o),Bi(o.greaterThan(0),(()=>{l.assign(a.div(o))})).Else((()=>{l.assign(0)})),Bi(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{Bi(r.greaterThanEqual(o),(()=>{u.assign(s.sub(i).div(a))})).ElseIf(s.greaterThanEqual(o),(()=>{u.assign(jn(2,i.sub(r).div(a)))})).Else((()=>{u.assign(jn(4,r.sub(s).div(a)))})),u.mulAssign(1/6),Bi(u.lessThan(0),(()=>{u.addAssign(1)}))})),zi(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),Pb=Ei((([e])=>{const t=zi(e).toVar(),r=Hi(eo(t,zi(.04045))).toVar(),s=zi(t.div(12.92)).toVar(),i=zi(la(ta(t.add(zi(.055)),zi(0)).div(1.055),zi(2.4))).toVar();return fa(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ib=(e,t)=>{e=Pi(e),t=Pi(t);const r=Vi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return Ta(e.sub(r),e.add(r),t)},Lb=(e,t,r,s)=>fa(e,t,r[s].clamp()),Db=(e,t,r,s,i)=>fa(e,t,Ib(r,s[i])),Vb=Ei((([e,t,r])=>{const s=Fo(e).toVar("nDir"),i=qn(Pi(.5).mul(t.sub(r)),gl).div(s).toVar("rbmax"),n=qn(Pi(-.5).mul(t.sub(r)),gl).div(s).toVar("rbmin"),o=zi().toVar("rbminmax");o.x=s.x.greaterThan(Pi(0)).select(i.x,n.x),o.y=s.y.greaterThan(Pi(0)).select(i.y,n.y),o.z=s.z.greaterThan(Pi(0)).select(i.z,n.z);const a=ea(ea(o.x,o.y),o.z).toVar("correction");return gl.add(s.mul(a)).toVar("boxIntersection").sub(r)})),Ob=Ei((([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(Xn(r,r).sub(Xn(s,s)))),n}));var Gb=Object.freeze({__proto__:null,BRDF_GGX:Zh,BRDF_Lambert:Dh,BasicShadowFilter:vx,Break:xc,Const:Da,Continue:()=>bu("continue").append(),DFGApprox:Jh,D_GGX:Kh,Discard:Tu,EPSILON:fo,F_Schlick:Lh,Fn:Ei,INFINITY:yo,If:Bi,Loop:yc,NodeAccess:Bs,NodeShaderStage:Es,NodeType:Ms,NodeUpdateType:ws,PCFShadowFilter:Nx,PCFSoftShadowFilter:Sx,PI:xo,PI2:bo,Return:()=>bu("return").append(),Schlick_to_F0:tp,ScriptableNodeResources:Cy,ShaderNode:vi,TBNViewMatrix:sd,VSMShadowFilter:Ax,V_GGX_SmithCorrelated:qh,Var:La,abs:Go,acesFilmicToneMapping:py,acos:Vo,add:jn,addMethodChaining:Ys,addNodeElement:function(e){console.warn("THREE.TSLBase: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:yy,all:To,alphaT:Sn,and:so,anisotropy:An,anisotropyB:Cn,anisotropyT:Rn,any:_o,append:Fi,arrayBuffer:e=>Ni(new qs(e,"ArrayBuffer")),asin:Do,assign:zn,atan:Oo,atan2:Aa,atomicAdd:(e,t,r=null)=>Yy(Xy.ATOMIC_ADD,e,t,r),atomicAnd:(e,t,r=null)=>Yy(Xy.ATOMIC_AND,e,t,r),atomicFunc:Yy,atomicMax:(e,t,r=null)=>Yy(Xy.ATOMIC_MAX,e,t,r),atomicMin:(e,t,r=null)=>Yy(Xy.ATOMIC_MIN,e,t,r),atomicOr:(e,t,r=null)=>Yy(Xy.ATOMIC_OR,e,t,r),atomicStore:(e,t,r=null)=>Yy(Xy.ATOMIC_STORE,e,t,r),atomicSub:(e,t,r=null)=>Yy(Xy.ATOMIC_SUB,e,t,r),atomicXor:(e,t,r=null)=>Yy(Xy.ATOMIC_XOR,e,t,r),attenuationColor:On,attenuationDistance:Vn,attribute:Su,attributeArray:(e,t="float")=>{const r=_s(t),s=Ts(t),i=new Nf(e,r,s);return Cf(i,t,e)},backgroundBlurriness:Pf,backgroundIntensity:If,backgroundRotation:Lf,batch:hc,billboarding:$m,bitAnd:ao,bitNot:uo,bitOr:lo,bitXor:co,bitangentGeometry:Ql,bitangentLocal:Zl,bitangentView:Jl,bitangentWorld:ed,bitcast:Zo,blendBurn:Hf,blendColor:Kf,blendDodge:jf,blendOverlay:Xf,blendScreen:qf,blur:Jp,bool:Di,buffer:Pu,bufferAttribute:nu,bumpMap:hd,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),Hf(e)),bvec2:ki,bvec3:Hi,bvec4:Ki,bypass:gu,cache:hu,call:Wn,cameraFar:Gu,cameraIndex:Vu,cameraNear:Ou,cameraNormalMatrix:Hu,cameraPosition:ju,cameraProjectionMatrix:ku,cameraProjectionMatrixInverse:zu,cameraViewMatrix:$u,cameraWorldMatrix:Wu,cbrt:ga,cdl:ty,ceil:Bo,checker:jx,cineonToneMapping:cy,clamp:ya,clearcoat:yn,clearcoatRoughness:xn,code:Ty,color:Ui,colorSpaceToWorking:Ya,colorToDirection:e=>Ni(e).mul(2).sub(1),compute:du,cond:Ma,context:Fa,convert:en,convertColorSpace:(e,t,r)=>Ni(new ja(Ni(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():xf(e,...t),cos:Io,cross:ua,cubeTexture:Dl,dFdx:Ho,dFdy:jo,dashSize:Fn,defaultBuildStages:Us,defaultShaderStages:Fs,defined:Ti,degrees:No,deltaTime:Om,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),Uy(e,Fy(t))},densityFogFactor:Fy,depth:th,depthPass:(e,t,r)=>Ni(new ay(ay.DEPTH,e,t,r)),difference:oa,diffuseColor:pn,directPointLight:Wx,directionToColor:bh,dispersion:Gn,distance:na,div:Kn,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),jf(e)),dot:aa,drawIndex:oc,dynamicBufferAttribute:ou,element:Ji,emissive:gn,equal:Qn,equals:Jo,equirectUV:Nh,exp:So,exp2:Ao,expression:bu,faceDirection:Tl,faceForward:_a,faceforward:Ra,float:Pi,floor:Mo,fog:Uy,fract:Uo,frameGroup:nn,frameId:Gm,frontFacing:bl,fwidth:Yo,gain:(e,t)=>e.lessThan(.5)?Bm(e.mul(2),t).div(2):qn(1,Bm(Xn(qn(1,e),2),t).div(2)),gapSize:Un,getConstNodeType:_i,getCurrentStack:Mi,getDirection:Kp,getDistanceAttenuation:Px,getGeometryRoughness:Hh,getNormalFromDepth:_f,getParallaxCorrectNormal:Vb,getRoughness:jh,getScreenPosition:Tf,getShIrradianceAt:Ob,getTextureIndex:Cm,getViewPosition:bf,globalId:zy,glsl:(e,t)=>Ty(e,t,"glsl"),glslFn:(e,t)=>vy(e,t,"glsl"),grayscale:Yf,greaterThan:eo,greaterThanEqual:ro,hash:Mm,highpModelNormalViewMatrix:dl,highpModelViewMatrix:ll,hue:Jf,instance:uc,instanceIndex:rc,instancedArray:(e,t="float")=>{const r=_s(t),s=Ts(t),i=new vf(e,r,s);return Cf(i,t,e)},instancedBufferAttribute:au,instancedDynamicBufferAttribute:uu,instancedMesh:dc,int:Ii,inverseSqrt:wo,inversesqrt:Ca,invocationLocalIndex:nc,invocationSubgroupIndex:ic,ior:In,iridescence:_n,iridescenceIOR:vn,iridescenceThickness:Nn,ivec2:Oi,ivec3:$i,ivec4:qi,js:(e,t)=>Ty(e,t,"js"),label:Ua,length:zo,lengthSq:ma,lessThan:Jn,lessThanEqual:to,lightPosition:tx,lightProjectionUV:ex,lightShadowMatrix:Jy,lightTargetDirection:ix,lightTargetPosition:rx,lightViewPosition:sx,lightingContext:Cc,lights:(e=[])=>Ni(new ax).setLights(e),linearDepth:rh,linearToneMapping:ly,localId:$y,log:Ro,log2:Co,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(Ro(r.div(t)));return Pi(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("TSL.LoopNode: loop() has been renamed to Loop()."),yc(...e)),luminance:ey,mat2:Yi,mat3:Qi,mat4:Zi,matcapUV:Tg,materialAO:Qd,materialAlphaTest:md,materialAnisotropy:Pd,materialAnisotropyVector:Zd,materialAttenuationColor:zd,materialAttenuationDistance:kd,materialClearcoat:Ed,materialClearcoatNormal:Md,materialClearcoatRoughness:wd,materialColor:fd,materialDispersion:Kd,materialEmissive:xd,materialIOR:Gd,materialIridescence:Id,materialIridescenceIOR:Ld,materialIridescenceThickness:Dd,materialLightMap:Yd,materialLineDashOffset:qd,materialLineDashSize:Wd,materialLineGapSize:Hd,materialLineScale:$d,materialLineWidth:jd,materialMetalness:Rd,materialNormal:Cd,materialOpacity:bd,materialPointSize:Xd,materialReference:$l,materialReflectivity:Sd,materialRefractionRatio:Bl,materialRotation:Bd,materialRoughness:Ad,materialSheen:Fd,materialSheenRoughness:Ud,materialShininess:yd,materialSpecular:Td,materialSpecularColor:vd,materialSpecularIntensity:_d,materialSpecularStrength:Nd,materialThickness:Od,materialTransmission:Vd,max:ta,maxMipLevel:wu,mediumpModelViewMatrix:ul,metalness:fn,min:ea,mix:fa,mixElement:Na,mod:ra,modInt:Yn,modelDirection:el,modelNormalMatrix:nl,modelPosition:rl,modelScale:sl,modelViewMatrix:al,modelViewPosition:il,modelViewProjection:Jd,modelWorldMatrix:tl,modelWorldMatrixInverse:ol,morphReference:Nc,mrt:wm,mul:Xn,mx_aastep:Ib,mx_cell_noise_float:(e=Au())=>bb(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>Pi(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=Au(),t=3,r=2,s=.5,i=1)=>_b(e,Ii(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Au(),t=3,r=2,s=.5,i=1)=>Nb(e,Ii(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Au(),t=3,r=2,s=.5,i=1)=>vb(e,Ii(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Au(),t=3,r=2,s=.5,i=1)=>Sb(e,Ii(t),r,s).mul(i),mx_hsvtorgb:Fb,mx_noise_float:(e=Au(),t=1,r=0)=>yb(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Au(),t=1,r=0)=>xb(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Au(),t=1,r=0)=>{e=e.convert("vec2|vec3");return ji(xb(e),yb(e.add(Vi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=Au())=>Lb(e,t,r,"x"),mx_ramptb:(e,t,r=Au())=>Lb(e,t,r,"y"),mx_rgbtohsv:Ub,mx_safepower:(e,t=1)=>(e=Pi(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=Au())=>Db(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Au())=>Db(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:Pb,mx_transform_uv:(e=1,t=0,r=Au())=>r.mul(e).add(t),mx_worley_noise_float:(e=Au(),t=1)=>wb(e.convert("vec2|vec3"),t,Ii(1)),mx_worley_noise_vec2:(e=Au(),t=1)=>Mb(e.convert("vec2|vec3"),t,Ii(1)),mx_worley_noise_vec3:(e=Au(),t=1)=>Bb(e.convert("vec2|vec3"),t,Ii(1)),negate:$o,neutralToneMapping:xy,nodeArray:Ai,nodeImmutable:Ci,nodeObject:Ni,nodeObjects:Si,nodeProxy:Ri,normalFlat:Nl,normalGeometry:_l,normalLocal:vl,normalMap:ud,normalView:Sl,normalWorld:Al,normalize:Fo,not:no,notEqual:Zn,numWorkgroups:Gy,objectDirection:Xu,objectGroup:an,objectPosition:Yu,objectScale:Qu,objectViewPosition:Zu,objectWorldMatrix:Ku,oneMinus:Wo,or:io,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=Vm)=>e.fract(),oscSine:(e=Vm)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=Vm)=>e.fract().round(),oscTriangle:(e=Vm)=>e.add(.5).fract().mul(2).sub(1).abs(),output:Bn,outputStruct:Rm,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),Xf(e)),overloadingFn:Dm,parabola:Bm,parallaxDirection:id,parallaxUV:(e,t)=>e.sub(id.mul(t)),parameter:(e,t)=>Ni(new vm(e,t)),pass:(e,t,r)=>Ni(new ay(ay.COLOR,e,t,r)),passTexture:(e,t)=>Ni(new ny(e,t)),pcurve:(e,t,r)=>la(Kn(la(e,t),jn(la(e,t),la(qn(1,e),r))),1/t),perspectiveDepthToViewZ:Zc,pmremTexture:ig,pointUV:Mf,pointWidth:Pn,positionGeometry:cl,positionLocal:hl,positionPrevious:pl,positionView:fl,positionViewDirection:yl,positionWorld:gl,positionWorldDirection:ml,posterize:sy,pow:la,pow2:da,pow3:ca,pow4:ha,property:cn,radians:vo,rand:va,range:Dy,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),Uy(e,By(t,r))},rangeFogFactor:By,reciprocal:Xo,reference:Gl,referenceBuffer:kl,reflect:ia,reflectVector:Pl,reflectView:Fl,reflector:e=>Ni(new df(e)),refract:ba,refractVector:Il,refractView:Ul,reinhardToneMapping:dy,remainder:go,remap:fu,remapClamp:yu,renderGroup:on,renderOutput:vu,rendererReference:eu,rotate:Sg,rotateUV:km,roughness:mn,round:qo,rtt:xf,sRGBTransferEOTF:za,sRGBTransferOETF:$a,sampler:e=>(!0===e.isNode?e:Bu(e)).convert("sampler"),saturate:xa,saturation:Qf,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),qf(e)),screenCoordinate:Pc,screenSize:Uc,screenUV:Fc,scriptable:wy,scriptableValue:Sy,select:wa,setCurrentStack:wi,shaderStages:Ps,shadow:Fx,shadowPositionWorld:lx,shapeCircle:qx,sharedUniformGroup:sn,sheen:bn,sheenRoughness:Tn,shiftLeft:ho,shiftRight:po,shininess:Mn,sign:ko,sin:Po,sinc:(e,t)=>Po(xo.mul(t.mul(e).sub(1))).div(xo.mul(t.mul(e).sub(1))),skinning:e=>Ni(new gc(e)),skinningReference:mc,smoothstep:Ta,smoothstepElement:Sa,specularColor:En,specularF90:wn,spherizeUV:zm,split:(e,t)=>Ni(new $s(Ni(e),t)),spritesheetUV:jm,sqrt:Eo,stack:Sm,step:sa,storage:Cf,storageBarrier:()=>Hy("storage").append(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),Cf(e,t,r).setPBO(!0)),storageTexture:Vf,string:(e="")=>Ni(new qs(e,"string")),sub:qn,subgroupIndex:sc,subgroupSize:Wy,tan:Lo,tangentGeometry:Wl,tangentLocal:Hl,tangentView:jl,tangentWorld:ql,temp:Va,texture:Bu,texture3D:Pg,textureBarrier:()=>Hy("texture").append(),textureBicubic:bp,textureCubeUV:Yp,textureLoad:Fu,textureSize:Cu,textureStore:(e,t,r)=>{const s=Vf(e,t,r);return null!==r&&s.append(),s},thickness:Dn,time:Vm,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),Om.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),Vm.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),Vm.mul(e)),toOutputColorSpace:qa,toWorkingColorSpace:Xa,toneMapping:ru,toneMappingExposure:su,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Ni(new uy(t,r,Ni(s),Ni(i),Ni(n))),transformDirection:pa,transformNormal:wl,transformNormalToView:Ml,transformedBentNormalView:nd,transformedBitangentView:td,transformedBitangentWorld:rd,transformedClearcoatNormalView:El,transformedNormalView:Rl,transformedNormalWorld:Cl,transformedTangentView:Xl,transformedTangentWorld:Kl,transmission:Ln,transpose:Qo,triNoise3D:Pm,triplanarTexture:(...e)=>Xm(...e),triplanarTextures:Xm,trunc:Ko,tslFn:(...e)=>(console.warn("TSL.ShaderNode: tslFn() has been renamed to Fn()."),Ei(...e)),uint:Li,uniform:ln,uniformArray:Du,uniformGroup:rn,uniforms:(e,t)=>(console.warn("TSL.UniformArrayNode: uniforms() has been renamed to uniformArray()."),Ni(new Lu(e,t))),userData:(e,t,r)=>Ni(new Of(e,t,r)),uv:Au,uvec2:Gi,uvec3:Wi,uvec4:Xi,varying:Ga,varyingProperty:hn,vec2:Vi,vec3:zi,vec4:ji,vectorComponents:Is,velocity:Wf,vertexColor:e=>Ni(new Ef(e)),vertexIndex:tc,vertexStage:ka,vibrance:Zf,viewZToLogarithmicDepth:Jc,viewZToOrthographicDepth:Yc,viewZToPerspectiveDepth:Qc,viewport:Ic,viewportBottomLeft:kc,viewportCoordinate:Dc,viewportDepthTexture:Xc,viewportLinearDepth:sh,viewportMipTexture:Hc,viewportResolution:Oc,viewportSafeUV:Wm,viewportSharedTexture:fh,viewportSize:Lc,viewportTexture:Wc,viewportTopLeft:Gc,viewportUV:Vc,wgsl:(e,t)=>Ty(e,t,"wgsl"),wgslFn:(e,t)=>vy(e,t,"wgsl"),workgroupArray:(e,t)=>Ni(new qy("Workgroup",e,t)),workgroupBarrier:()=>Hy("workgroup").append(),workgroupId:ky,workingToColorSpace:Ka,xor:oo});const kb=new _m;class zb extends zg{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(kb,Re),kb.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(kb,Re),kb.a=1,n=!0;else if(!0===i.isNode){const r=this.get(e),n=i;kb.copy(s._clearColor);let o=r.backgroundMesh;if(void 0===o){const e=Fa(ji(n).mul(If),{getUV:()=>Lf.mul(Al),getTextureLevel:()=>Pf});let t=Jd;t=t.setZ(t.w);const s=new lh;s.name="Background.material",s.side=T,s.depthTest=!1,s.depthWrite=!1,s.fog=!1,s.lights=!1,s.vertexNode=t,s.colorNode=e,r.backgroundMeshNode=e,r.backgroundMesh=o=new G(new Be(1,32,32),s),o.frustumCulled=!1,o.name="Background.mesh",o.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)}}const a=n.getCacheKey();r.backgroundCacheKey!==a&&(r.backgroundMeshNode.node=ji(n).mul(If),r.backgroundMeshNode.needsUpdate=!0,o.material.needsUpdate=!0,r.backgroundCacheKey=a),t.unshift(o,o.geometry,o.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const o=s.xr.getEnvironmentBlendMode();if("additive"===o?kb.set(0,0,0,1):"alpha-blend"===o&&kb.set(0,0,0,0),!0===s.autoClear||!0===n){const e=r.clearColorValue;e.r=kb.r,e.g=kb.g,e.b=kb.b,e.a=kb.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(e.r*=e.a,e.g*=e.a,e.b*=e.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 $b=0;class Wb{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=$b++}}class Hb{constructor(e,t,r,s,i,n,o,a,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=o,this.updateAfterNodes=a,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 Wb(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class jb{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class qb{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}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 Xb{constructor(e,t,r=!1){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r}}class Kb extends Xb{constructor(e,t){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0}}class Yb{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let Qb=0;class Zb{constructor(e=null){this.id=Qb++,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 Jb extends Ds{static get type(){return"StructTypeNode"}constructor(e,t){super(),this.name=e,this.types=t,this.isStructTypeNode=!0}getMemberTypes(){return this.types}}class eT{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class tT extends eT{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class rT extends eT{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class sT extends eT{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class iT extends eT{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class nT extends eT{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class oT extends eT{constructor(e,t=new i){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class aT extends eT{constructor(e,t=new n){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class uT extends tT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class lT extends rT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class dT extends sT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class cT extends iT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class hT extends nT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class pT extends oT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class gT extends aT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const mT=[.125,.215,.35,.446,.526,.582],fT=20,yT=new Te(-1,1,1,-1,0,1),xT=new Ue(90,1),bT=new e;let TT=null,_T=0,vT=0;const NT=(1+Math.sqrt(5))/2,ST=1/NT,AT=[new r(-NT,ST,0),new r(NT,ST,0),new r(-ST,0,NT),new r(ST,0,NT),new r(0,NT,-ST),new r(0,NT,ST),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],RT=new WeakMap,CT=[3,1,5,0,4,2],ET=Kp(Au(),Su("faceIndex")).normalize(),wT=zi(ET.x,ET.y,ET.z);class MT{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=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=null){if(this._setSize(256),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=i||this._allocateTargets();return this.fromSceneAsync(e,t,r,s,n),n}TT=this._renderer.getRenderTarget(),_T=this._renderer.getActiveCubeFace(),vT=this._renderer.getActiveMipmapLevel();const n=i||this._allocateTargets();return n.depthBuffer=!0,this._sceneToCubeUV(e,r,s,n),t>0&&this._blur(n,0,0,t),this._applyPMREM(n),this._cleanup(n),n}async fromSceneAsync(e,t=0,r=.1,s=100,i=null){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=PT(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=IT(),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===_||e.mapping===v?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._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=mT[a-e+4-1]:0===a&&(u=0),s.push(u);const l=1/(o-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,x=new Float32Array(m*g*p),b=new Float32Array(f*g*p),T=new Float32Array(y*g*p);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=CT[e];x.set(s,m*g*i),b.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new _e;_.setAttribute("position",new Ne(x,m)),_.setAttribute("uv",new Ne(b,f)),_.setAttribute("faceIndex",new Ne(T,y)),t.push(_),i.push(new G(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=Du(new Array(fT).fill(0)),n=ln(new r(0,1,0)),o=ln(0),a=Pi(fT),u=ln(0),l=ln(1),d=Bu(null),c=ln(0),h=Pi(1/t),p=Pi(1/s),g=Pi(e),m={n:a,latitudinal:u,weights:i,poleAxis:n,outputDirection:wT,dTheta:o,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=UT("blur");return f.fragmentNode=Jp({...m,latitudinal:u.equal(1)}),RT.set(f,m),f}(i,e,t)}return i}async _compileMaterial(e){const t=new G(this._lodPlanes[0],e);await this._renderer.compile(t,yT)}_sceneToCubeUV(e,t,r,s){const i=xT;i.near=t,i.far=r;const n=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],a=this._renderer,u=a.autoClear;a.getClearColor(bT),a.autoClear=!1;let l=this._backgroundBox;if(null===l){const e=new Y({name:"PMREM.Background",side:T,depthWrite:!1,depthTest:!1});l=new G(new O,e)}let d=!1;const c=e.background;c?c.isColor&&(l.material.color.copy(c),e.background=null,d=!0):(l.material.color.copy(bT),d=!0),a.setRenderTarget(s),a.clear(),d&&a.render(l,i);for(let t=0;t<6;t++){const r=t%3;0===r?(i.up.set(0,n[t],0),i.lookAt(o[t],0,0)):1===r?(i.up.set(0,0,n[t]),i.lookAt(0,o[t],0)):(i.up.set(0,n[t],0),i.lookAt(0,0,o[t]));const u=this._cubeSize;FT(s,r*u,t>2?u:0,u,u),a.render(e,i)}a.autoClear=u,e.background=c}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===_||e.mapping===v;s?null===this._cubemapMaterial&&(this._cubemapMaterial=PT(e)):null===this._equirectMaterial&&(this._equirectMaterial=IT(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const o=this._cubeSize;FT(t,0,0,3*o,2*o),r.setRenderTarget(t),r.render(n,yT)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;tfT&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;ey-4?s-y+4:0),4*(this._cubeSize-x),3*x,2*x),a.setRenderTarget(t),a.render(l,yT)}}function BT(e,t,r){const s=new me(e,t,r);return s.texture.mapping=Fe,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function FT(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function UT(e){const t=new lh;return t.depthTest=!1,t.depthWrite=!1,t.blending=L,t.name=`PMREM_${e}`,t}function PT(e){const t=UT("cubemap");return t.fragmentNode=Dl(e,wT),t}function IT(e){const t=UT("equirect");return t.fragmentNode=Bu(e,Nh(wT),0),t}const LT=new WeakMap,DT=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),VT=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class OT{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.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.flow={code:""},this.chaining=[],this.stack=Sm(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new Zb,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.useComparisonMethod=!1}getBindGroupsCache(){let e=LT.get(this.renderer);return void 0===e&&(e=new Dg,LT.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new me(e,t,r)}createCubeRenderTarget(e,t){return new Sh(e,t)}createPMREMGenerator(){return new MT(this.renderer)}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 Wb(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new Wb(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 Ps)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}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")}( ${VT(n.r)}, ${VT(n.g)}, ${VT(n.b)} )`;const o=this.getTypeLength(i),a=this.getComponentType(i),u=e=>this.generateConst(a,e);if(2===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(o>4&&n&&(n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(o>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 jb(e,t);return 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||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===b)return"int";if(t===x)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;const r=bs(e);return("float"===t?"":t[0])+r}getTypeFromArray(e){return DT.get(e.constructor)}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 De||!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")}addStack(){return this.stack=Sm(this.stack),this.stacks.push(Mi()||this.stack),wi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,wi(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);return void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={}),s[t]}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);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new jb("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e,r);let i=s.structType;if(void 0===i){const e=this.structs.index++;i=new Jb("StructType"+e,t),this.structs[r].push(i),s.structType=i}return i}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 o=this.uniforms.index++;n=new qb(s||"nodeUniform"+o,t,e),this.uniforms[r].push(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);let o=n.variable;if(void 0===o){const e=i?"_const":"_var",a=this.vars[s]||(this.vars[s]=[]),u=this.vars[e]||(this.vars[e]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+u,this.vars[e]++),o=new Xb(t,r,i),i||a.push(o),n.variable=o}return o}isDeterministic(e){return e.isMathNode?this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode)):e.isOperatorNode?this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode)):!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this)){const s=this.getDataFromNode(e,"any");let i=s.varying;if(void 0===i){const e=this.varyings,n=e.length;null===t&&(t="nodeVarying"+n),i=new Kb(t,r),e.push(i),s.varying=i}return i}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 Yb("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}buildFunctionNode(e){const t=new _y,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 vm(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.cache,n=this.buildStage,o=this.stack,a={code:""};this.flow=a,this.vars={},this.cache=new Zb,this.stack=Sm();for(const r of Us)this.setBuildStage(r),a.result=e.build(this,t);return a.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.cache=i,this.stack=o,this.setBuildStage(n),a}getFunctionOperator(){return null}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.shaderStage;this.setShaderStage(e);const n=this.flowChildNode(t,r);return null!==s&&(n.code+=`${this.tab+s} = ${n.result};\n`),this.flowCode[e]=this.flowCode[e]+n.code,this.setShaderStage(i),n}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("Abstract function.")}getVar(e,t){return`${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(){console.warn("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(){console.warn("Abstract function.")}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new lh),e.build(this)}else this.addFlow("compute",e);for(const e of Us){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Ps){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}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new uT(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new lT(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new dT(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new cT(e);if("color"===t)return new hT(e);if("mat3"===t)return new pT(e);if("mat4"===t)return new gT(e);throw new Error(`Uniform "${t}" not declared.`)}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?this.format(`${e}.${"xyz".slice(0,i)}`,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${Ve} - Node System\n`}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}}class GT{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={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===ws.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===ws.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===ws.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===ws.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===ws.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===ws.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===ws.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===ws.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===ws.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 kT{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}kT.isNodeFunctionInput=!0;class zT extends Ux{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setup(e){super.setup(e);const t=e.context.lightingModel,r=this.colorNode,s=ix(this.light),i=e.context.reflectedLight;t.direct({lightDirection:s,lightColor:r,reflectedLight:i},e.stack,e)}}const $T=new n,WT=new n;let HT=null;class jT extends Ux{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=ln(new r).setGroup(on),this.halfWidth=ln(new r).setGroup(on),this.updateType=ws.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;WT.identity(),$T.copy(t.matrixWorld),$T.premultiply(r),WT.extractRotation($T),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(WT),this.halfHeight.value.applyMatrix4(WT)}setup(e){let t,r;super.setup(e),e.isAvailable("float32Filterable")?(t=Bu(HT.LTC_FLOAT_1),r=Bu(HT.LTC_FLOAT_2)):(t=Bu(HT.LTC_HALF_1),r=Bu(HT.LTC_HALF_2));const{colorNode:s,light:i}=this,n=e.context.lightingModel,o=sx(i),a=e.context.reflectedLight;n.directRectArea({lightColor:s,lightPosition:o,halfWidth:this.halfWidth,halfHeight:this.halfHeight,reflectedLight:a,ltc_1:t,ltc_2:r},e.stack,e)}static setLTC(e){HT=e}}class qT extends Ux{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=ln(0).setGroup(on),this.penumbraCosNode=ln(0).setGroup(on),this.cutoffDistanceNode=ln(0).setGroup(on),this.decayExponentNode=ln(0).setGroup(on)}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){const{coneCosNode:t,penumbraCosNode:r}=this;return Ta(t,r,e)}setup(e){super.setup(e);const t=e.context.lightingModel,{colorNode:r,cutoffDistanceNode:s,decayExponentNode:i,light:n}=this,o=sx(n).sub(fl),a=o.normalize(),u=a.dot(ix(n)),l=this.getSpotAttenuation(u),d=o.length(),c=Px({lightDistance:d,cutoffDistance:s,decayExponent:i});let h=r.mul(l).mul(c);if(n.map){const e=ex(n),t=Bu(n.map,e.xy).onRenderUpdate((()=>n.map));h=e.mul(2).sub(1).abs().lessThan(1).all().select(h.mul(t),h)}const p=e.context.reflectedLight;t.direct({lightDirection:a,lightColor:h,reflectedLight:p},e.stack,e)}}class XT extends qT{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e){const t=this.light.iesMap;let r=null;if(t&&!0===t.isTexture){const s=e.acos().mul(1/Math.PI);r=Bu(t,Vi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class KT extends Ux{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class YT extends Ux{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=tx(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=ln(new e).setGroup(on)}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=Sl.dot(s).mul(.5).add(.5),n=fa(r,t,i);e.context.irradiance.addAssign(n)}}class QT extends Ux{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=Du(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=Ob(Al,this.lightProbe);e.context.irradiance.addAssign(t)}}class ZT{parseFunction(){console.warn("Abstract function.")}}class JT{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}JT.isNodeFunction=!0;const e_=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,t_=/[a-z_0-9]+/gi,r_="#pragma main";class s_ extends JT{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:o,headerCode:a}=(e=>{const t=(e=e.trim()).indexOf(r_),r=-1!==t?e.slice(t+12):e,s=r.match(e_);if(null!==s&&5===s.length){const i=s[4],n=[];let o=null;for(;null!==(o=t_.exec(i));)n.push(o);const a=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,(()=>{if(!0===r.isCubeTexture||r.mapping===H||r.mapping===j||r.mapping===Fe){if(e.backgroundBlurriness>0||r.mapping===Fe)return ig(r);{let e;return e=!0===r.isCubeTexture?Dl(r):Bu(r),wh(e)}}if(!0===r.isTexture)return Bu(r,Fc.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("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=Gl("color","color",r).setGroup(on),t=Gl("density","float",r).setGroup(on);return Uy(e,Fy(t))}if(r.isFog){const e=Gl("color","color",r).setGroup(on),t=Gl("near","float",r).setGroup(on),s=Gl("far","float",r).setGroup(on);return Uy(e,By(t,s))}console.error("THREE.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?Dl(r):!0===r.isTexture?Bu(r):void console.error("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}hasOutputChange(e){return n_.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=Bu(e,Fc).renderOutput(t.toneMapping,t.currentColorSpace);return n_.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 GT,this.nodeBuilderCache=new Map,this.cacheLib={}}}const l_=new fe;class d_{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new i,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;i=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 o=t[n];o&&o.connect(i)}}function A_(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,o=this._glBaseLayer,a=this.getReferenceSpace(),u=t.getViewerPose(a);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(o.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(e,t,this._renderTarget),n=e.overrideMaterial||r.material,o=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:a,vertexShader:u}=o.getNodeBuilderState();return{fragmentShader:a,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");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 u_(this,r),this._animation=new Lg(this._nodes,this.info),this._attributes=new Xg(r),this._background=new zb(this,this._nodes),this._geometries=new Qg(this._attributes,this.info),this._textures=new Tm(this,r,this.info),this._pipelines=new im(r,this._nodes),this._bindings=new nm(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new kg(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new cm(this.lighting),this._bundles=new p_,this._renderContexts=new xm,this._animation.start(),this._initialized=!0,e()}))),this._initPromise}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,o=this._currentRenderObjectFunction,a=this._compilationPromises,u=!0===e.isScene?e:R_;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new d_),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)})),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=o,this._compilationPromises=a,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init();const r=this._renderScene(e,t);await this.backend.resolveTimestampAsync(r,"render")}async waitForGPU(){await this.backend.waitForGPU()}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,o=this._currentRenderContext,a=this._bundles.get(s,i),u=this.backend.get(a);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(o)||l;if(u.renderContexts.add(o),d){this.backend.beginBundle(o),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=a;const e=n.opaque;!0===this.opaque&&e.length>0&&this._renderObjects(e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(o,a),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=b,p.viewportValue.maxDepth=T,p.viewport=!1===p.viewportValue.equals(E_),p.scissorValue.copy(y).multiplyScalar(x).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(E_),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new d_),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h),M_.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),w_.setFromProjectionMatrix(M_,g);const _=this._renderLists.get(e,t);if(_.begin(),this._projectObject(e,t,0,_,p.clippingContext),_.finish(),!0===this.sortObjects&&_.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=_.occlusionQueryCount,this._background.update(u,_,p),this.backend.beginRender(p);const{bundles:v,lightsNode:N,transparentDoublePass:S,transparent:A,opaque:R}=_;if(v.length>0&&this._renderBundles(v,u,N),!0===this.opaque&&R.length>0&&this._renderObjects(R,t,u,N),!0===this.transparent&&A.length>0&&this._renderTransparents(A,S,t,u,N),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=o,this._currentRenderObjectFunction=a,null!==s){this.setRenderTarget(l,d,c);const e=this._quad;this._nodes.hasOutputChange(h.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(h.texture),e.material.needsUpdate=!0),this._renderScene(e,e.camera,!1)}return u.onAfterRender(this,e,t,h),p}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)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setSize(e,t,r=!0){this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const o=this._viewport;e.isVector4?o.copy(e):o.set(e,t,r,s),o.minDepth=i,o.maxDepth=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)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);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.getForClear(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}if(i.clearColorValue=this._clearColor,this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget){const e=this._quad;this._nodes.hasOutputChange(s.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(s.texture),e.material.needsUpdate=!0),this._renderScene(e,e.camera,!1)}}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return null!==this._renderTarget?h:this.toneMapping}get currentColorSpace(){return null!==this._renderTarget?Re:this.outputColorSpace}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.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}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const t=this._nodes.nodeFrame,r=t.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,t.renderId=this.info.calls;const s=this.backend,i=this._pipelines,n=this._bindings,o=this._nodes,a=Array.isArray(e)?e:[e];if(void 0===a[0]||!0!==a[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of a){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),o.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}o.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),a=i.getForCompute(t,r);s.compute(e,t,r,a)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e),await this.backend.resolveTimestampAsync(e,"compute")}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=B_.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=B_.copy(t).floor()}else t=B_.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)}copyTextureToTexture(e,t,r=null,s=null,i=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,o=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,o)}_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){if(!e.frustumCulled||w_.intersectsSprite(e)){!0===this.sortObjects&&B_.setFromMatrixPosition(e.matrixWorld).applyMatrix4(M_);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,B_.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||w_.intersectsObject(e))){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),B_.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(M_)),Array.isArray(n)){const o=t.groups;for(let a=0,u=o.length;a0){for(const{material:e}of t)e.side=T;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=We;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=le}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,o=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode)),i=e}!0===i.transparent&&i.side===le&&!1===i.forceSinglePass?(i.side=T,this._handleObjectFunction(e,i,t,r,o,n,a,"backSide"),i.side=We,this._handleObjectFunction(e,i,t,r,o,n,a,u),i.side=le):this._handleObjectFunction(e,i,t,r,o,n,a,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,o,a){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,o,a);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,o,a){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,o,a);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)}get compile(){return this.compileAsync}}class U_{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class P_ extends U_{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(qg-e%qg)%qg;var e}get buffer(){return this._buffer}update(){return!0}}class I_ extends P_{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let L_=0;class D_ extends I_{constructor(e,t){super("UniformBuffer_"+L_++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class V_ extends I_{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}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(){let e=0;for(let t=0,r=this.uniforms.length;t0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const o=i.node.precision;if(null!==o&&(t=q_[o]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==b){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=[],r=e.getMemberTypes();for(let e=0;ee*t),1)}u`}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=X_[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)}X_[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} ]`)}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 o=n.uniformGPU;if(void 0===o){const s=e.groupNode,a=s.name,u=this.getBindGroupArray(a,r);if("texture"===t)o=new $_(i.name,i.node,s),u.push(o);else if("cubeTexture"===t)o=new W_(i.name,i.node,s),u.push(o);else if("texture3D"===t)o=new H_(i.name,i.node,s),u.push(o);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new D_(e,s);t.name=e.name,u.push(t),o=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new G_(r+"_"+a,s),e[a]=n,u.push(n)),o=this.getNodeUniform(i,t),n.addUniform(o)}n.uniformGPU=o}return i}}let Q_=null,Z_=null;class J_{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampAsync(){}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return Q_=Q_||new t,this.renderer.getDrawingBufferSize(Q_)}setScissorTest(){}getClearColor(){const e=this.renderer;return Z_=Z_||new _m,e.getClearColor(Z_),Z_.getRGB(Z_,this.renderer.currentColorSpace),Z_}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:rt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${Ve} webgpu`),this.domElement=e),e}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)}dispose(){}}let ev=0;class tv{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 rv{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,o=e.isInterleavedBufferAttribute?e.data:e,a=r.get(o);let u,l=a.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),a.bufferGPU=l,a.bufferType=t,a.version=o.version),i instanceof Float32Array)u=s.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===b,id:ev++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new tv(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),o=n.bufferType,a=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(o,n.bufferGPU),0===a.length)r.bufferSubData(o,0,s);else{for(let e=0,t=a.length;e1?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 uv,lv,dv,cv=!1;class hv{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===cv&&(this._init(),cv=!0)}_init(){const e=this.gl;uv={[gr]:e.REPEAT,[mr]:e.CLAMP_TO_EDGE,[fr]:e.MIRRORED_REPEAT},lv={[yr]:e.NEAREST,[xr]:e.NEAREST_MIPMAP_NEAREST,[Le]:e.NEAREST_MIPMAP_LINEAR,[z]:e.LINEAR,[Ie]:e.LINEAR_MIPMAP_NEAREST,[M]:e.LINEAR_MIPMAP_LINEAR},dv={[br]:e.NEVER,[Tr]:e.ALWAYS,[Ce]:e.LESS,[_r]:e.LEQUAL,[vr]:e.EQUAL,[Nr]:e.GEQUAL,[Sr]:e.GREATER,[Ar]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!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:o}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let a=t;return t===n.RED&&(r===n.FLOAT&&(a=n.R32F),r===n.HALF_FLOAT&&(a=n.R16F),r===n.UNSIGNED_BYTE&&(a=n.R8),r===n.UNSIGNED_SHORT&&(a=n.R16),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.R8UI),r===n.UNSIGNED_SHORT&&(a=n.R16UI),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RG&&(r===n.FLOAT&&(a=n.RG32F),r===n.HALF_FLOAT&&(a=n.RG16F),r===n.UNSIGNED_BYTE&&(a=n.RG8),r===n.UNSIGNED_SHORT&&(a=n.RG16),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RG8UI),r===n.UNSIGNED_SHORT&&(a=n.RG16UI),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(a=n.RGB32F),r===n.HALF_FLOAT&&(a=n.RGB16F),r===n.UNSIGNED_BYTE&&(a=n.RGB8),r===n.UNSIGNED_SHORT&&(a=n.RGB16),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I),r===n.UNSIGNED_BYTE&&(a=s===ze&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(a=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(a=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGB8UI),r===n.UNSIGNED_SHORT&&(a=n.RGB16UI),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(a=n.RGBA32F),r===n.HALF_FLOAT&&(a=n.RGBA16F),r===n.UNSIGNED_BYTE&&(a=n.RGBA8),r===n.UNSIGNED_SHORT&&(a=n.RGBA16),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I),r===n.UNSIGNED_BYTE&&(a=s===ze&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(a=n.RGBA16UI),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_INT&&(a=n.DEPTH24_STENCIL8),r===n.FLOAT&&(a=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(a=n.DEPTH24_STENCIL8),a!==n.R16F&&a!==n.R32F&&a!==n.RG16F&&a!==n.RG32F&&a!==n.RGBA16F&&a!==n.RGBA32F||o.get("EXT_color_buffer_float"),a}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this;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,r.NONE),r.texParameteri(e,r.TEXTURE_WRAP_S,uv[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,uv[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||r.texParameteri(e,r.TEXTURE_WRAP_R,uv[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,lv[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,o=t.minFilter===z&&n?M:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,lv[o]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,dv[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===yr)return;if(t.minFilter!==Le&&t.minFilter!==M)return;if(t.type===E&&!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,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:o,depth:a}=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.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,o,a):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,o,a):e.isVideoTexture||r.texStorage2D(h,i,d,n,o),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:o,glType:a}=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,o,a,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:o,glFormat:a,glType:u,glInternalFormat:l}=this.backend.get(e);if(e.isRenderTargetTexture||void 0===n)return;const d=e=>e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||e instanceof OffscreenCanvas?e:e.data;if(this.backend.state.bindTexture(o,n),this.setTextureParameters(o,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==o||0!==a;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-a-l;s.blitFramebuffer(o,p,o+u,p+l,o,p,o+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,o,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,o,c-l-a,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t){const{gl:r}=this,s=t.renderTarget,{samples:i,depthTexture:n,depthBuffer:o,stencilBuffer:a,width:u,height:l}=s;if(r.bindRenderbuffer(r.RENDERBUFFER,e),o&&!a){let t=r.DEPTH_COMPONENT24;i>0?(n&&n.isDepthTexture&&n.type===r.FLOAT&&(t=r.DEPTH_COMPONENT32F),r.renderbufferStorageMultisample(r.RENDERBUFFER,i,t,u,l)):r.renderbufferStorage(r.RENDERBUFFER,t,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_ATTACHMENT,r.RENDERBUFFER,e)}else o&&a&&(i>0?r.renderbufferStorageMultisample(r.RENDERBUFFER,i,r.DEPTH24_STENCIL8,u,l):r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_STENCIL,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_STENCIL_ATTACHMENT,r.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:o,gl:a}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=a.createFramebuffer();a.bindFramebuffer(a.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?a.TEXTURE_CUBE_MAP_POSITIVE_X+n:a.TEXTURE_2D;a.framebufferTexture2D(a.READ_FRAMEBUFFER,a.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=a.createBuffer();a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.bufferData(a.PIXEL_PACK_BUFFER,g,a.STREAM_READ),a.readPixels(t,r,s,i,l,d,0),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),await o.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.getBufferSubData(a.PIXEL_PACK_BUFFER,0,f),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),a.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}}class pv{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 gv{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 mv={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",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query"};class fv{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:o,index:a}=this;0!==a?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),o.update(i,t,s,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:o,object:a,info:u}=this;0!==r&&(0!==o?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(a,t,i,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:o}=this;if(0===r)return;const a=s.get("WEBGL_multi_draw");if(null===a)for(let s=0;s0)){const e=t.queryQueue.shift();this.initTimestampQuery(e)}}async resolveTimestampAsync(e,t="render"){if(!this.disjoint||!this.trackTimestamp)return;const r=this.get(e);r.gpuQueries||(r.gpuQueries=[]);for(let e=0;e0&&(s.currentOcclusionQueries=s.occlusionQueries,s.currentOcclusionQueryObjects=s.occlusionQueryObjects,s.lastOcclusionObject=null,s.occlusionQueries=new Array(i),s.occlusionQueryObjects=new Array(i),s.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext,n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const o=e.textures;if(null!==o)for(let e=0;e0){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,o=s.msaaFrameBuffer,a=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let o=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?f.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances):this.hasFeature("WEBGL_multi_draw")?f.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):Rr("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):x>1?f.renderInstances(b,y,x):f.render(b,y)};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){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(o,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()}));t.push(i)}else 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"),o=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+o)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:o,vertexShader:a}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,o,a),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,o=s.createProgram(),a=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;emv[t]===e)),r=this.extensions;for(let e=0;e0){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r,\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:vv,stripIndexFormat:Ov},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:vv,stripIndexFormat:Ov},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,o=this.getTransferPipeline(s),a=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:FN,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:FN,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:Uv,storeOp:Bv,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(o,l,d),h(a,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:FN,baseArrayLayer:r});const o=[];for(let a=1;a1;for(let o=0;o]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,QN=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,ZN={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_multisampled_2d:"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 JN extends JT{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:o}=(e=>{const t=(e=e.trim()).match(YN);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=QN.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 eS extends ZT{parseFunction(e){return new JN(e)}}const tS="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},rS={[Bs.READ_ONLY]:"read",[Bs.WRITE_ONLY]:"write",[Bs.READ_WRITE]:"read_write"},sS={[gr]:"repeat",[mr]:"clamp",[fr]:"mirror"},iS={vertex:tS?tS.VERTEX:1,fragment:tS?tS.FRAGMENT:2,compute:tS?tS.COMPUTE:4},nS={instance:!0,swizzleAssign:!1,storageBuffer:!0},oS={"^^":"tsl_xor"},aS={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"},uS={},lS={tsl_xor:new by("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new by("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new by("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new by("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new by("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new by("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new by("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new by("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 by("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 by("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new by("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 by("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new by("\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")},dS={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"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(lS.pow_float=new by("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),lS.pow_vec2=new by("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[lS.pow_float]),lS.pow_vec3=new by("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[lS.pow_float]),lS.pow_vec4=new by("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[lS.pow_float]),dS.pow_float="tsl_pow_float",dS.pow_vec2="tsl_pow_vec2",dS.pow_vec3="tsl_pow_vec3",dS.pow_vec4="tsl_pow_vec4");let cS="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(cS+="diagnostic( off, derivative_uniformity );\n");class hS extends OT{constructor(e,t){super(e,t,new eS),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==y}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r):this.generateTextureLod(e,t,r,s,"0")}_generateVideoSample(e,t,r=this.shaderStage){if("fragment"===r)return`textureSampleBaseClampToEdge( ${e}, ${e}_sampler, vec2( ${t}.x, 1.0 - ${t}.y ) )`;console.error(`WebGPURenderer: THREE.VideoTexture does not support ${r} shader.`)}_generateTextureSampleLevel(e,t,r,s,i,n=this.shaderStage){return"fragment"!==n&&"compute"!==n||!1!==this.isUnfilterable(e)?this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s):`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`}generateWrapFunction(e){const t=`tsl_coord_${sS[e.wrapS]}S_${sS[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=uS[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const o=(e,t)=>{e===gr?(s.push(lS.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===mr?(s.push(lS.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===fr?(s.push(lS.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};o(e.wrapS,"x"),n+=",\n",o(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",o(e.wrapR,"z")),n+="\n\t);\n\n}\n",uS[t]=r=new by(n,s)}return r.build(this),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,o;const{primarySamples:a}=this.renderer.backend.utils.getTextureSampleData(e),u=a>1;o=e.isData3DTexture?"vec3":"vec2",n=u||e.isVideoTexture||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Pa(new xu(`textureDimensions( ${n} )`,o)),s.dimensionsSnippet[r]=i,(e.isDataArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Pa(new xu(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Pa(new xu("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,i),a=e.isData3DTexture?"vec3":"vec2",u=`${a}(${n}(${r}) * ${a}(${o}))`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){return!0===e.isVideoTexture||!0===e.isStorageTexture?`textureLoad( ${t}, ${r} )`:s?`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:`textureLoad( ${t}, ${r}, u32( ${i} ) )`}generateTextureStore(e,t,r,s){return`textureStore( ${t}, ${r}, ${s} )`}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===E||!1===this.isSampleCompare(e)&&e.minFilter===yr&&e.magFilter===yr||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=!0===e.isVideoTexture?this._generateVideoSample(t,r,i):this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i,n=this.shaderStage){let o=null;return o=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),o}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} 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||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?`NodeBuffer_${e.id}.${t}`:e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}_getUniformGroupCount(e){return Object.keys(this.uniforms[e]).length}getFunctionOperator(e){const t=oS[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?Bs.READ_ONLY:e.access}getStorageAccess(e,t){return rS[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 s;const o=e.groupNode,a=o.name,u=this.getBindGroupArray(a,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let n=null;const a=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?n=new $_(i.name,i.node,o,a):"cubeTexture"===t?n=new W_(i.name,i.node,o,a):"texture3D"===t&&(n=new H_(i.name,i.node,o,a)),n.store=!0===e.isStorageTextureNode,n.setVisibility(iS[r]),"fragment"!==r&&"compute"!==r||!1!==this.isUnfilterable(e.value)||!1!==n.store)u.push(n),s=[n];else{const e=new kN(`${i.name}_sampler`,i.node,o);e.setVisibility(iS[r]),u.push(e,n),s=[e,n]}}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const i=new("buffer"===t?D_:WN)(e,o);i.setVisibility(iS[r]),u.push(i),s=i}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new G_(a,o),n.setVisibility(iS[r]),e[a]=n,u.push(n)),s=this.getNodeUniform(i,t),n.addUniform(s)}n.uniformGPU=s}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`)}const s=this.getBuiltins("output");return s&&t.push("\t"+s),t.join(",\n")}getStructs(e){const t=[],r=this.structs[e];for(let e=0,s=r.length;e output : ${i};\n\n`)}return t.join("\n\n")}getVar(e,t){return`var ${t} : ${this.getType(e)}`}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)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;i1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.isDepthTexture)s=`texture_depth${n}_2d`;else if(!0===t.isVideoTexture)s="texture_external";else if(!0===t.isData3DTexture)s="texture_3d";else if(!0===i.node.isStorageTextureNode){s=`texture_storage_2d<${KN(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${o.binding++} ) @group( ${o.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.bufferType),n=t.bufferCount,a=n>0&&"buffer"===i.type?", "+n:"",u=t.isAtomic?`atomic<${r}>`:`${r}`,l=`\t${i.name} : array< ${u}${a} >\n`,d=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";s.push(this._getWGSLStructBinding("NodeBuffer_"+t.id,l,d,o.binding++,o.group))}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:o.binding++,id:o.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let o=r.join("\n");return o+=s.join("\n"),o+=i.join("\n"),o}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){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],o=n.outputNode,a=void 0!==o&&!0===o.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.Vertex = ${i.result};`;else if("fragment"===t)if(a)r.returnType=o.nodeType,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;\n\n",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}null!==this.material?(this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment)):this.computeShader=this._getWGSLComputeCode(e.compute,(this.object.workgroupSize||[64]).join(", "))}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getType(e){return aS[e]||e}isAvailable(e){let t=nS[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),nS[e]=t),t}_getWGSLMethod(e){return void 0!==lS[e]&&this._include(e),dS[e]}_include(e){const t=lS[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\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${cS}\n\n// uniforms\n${e.uniforms}\n\n// structs\n${e.structs}\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){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${t} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x + globalId.y * numWorkgroups.x * u32(${t}) + globalId.z * numWorkgroups.x * numWorkgroups.y * u32(${t});\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 pS{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=Gv.Depth24PlusStencil8:e.depth&&(t=Gv.Depth24Plus),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.samples}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}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?xv:e.isLineSegments||e.isMesh&&!0===t.wireframe?bv:e.isLine?Tv:e.isMesh?_v:void 0}getSampleCount(e){let t=1;return e>1&&(t=Math.pow(2,Math.floor(Math.log2(e))),2===t&&(t=4)),t}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===ge)return Gv.BGRA8Unorm;if(e===xe)return Gv.RGBA16Float;throw new Error("Unsupported outputType")}}const gS=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),mS=new Map([[De,["float16"]]]),fS=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class yS{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 o=s.device;let a=r.array;if(!1===e.normalized)if(a.constructor===Int16Array)a=new Int32Array(a);else if(a.constructor===Uint16Array&&(a=new Uint32Array(a),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=RN)),r.texture.isDepthTexture)s.sampleType=CN;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===b?s.sampleType=EN:e===x?s.sampleType=wN:e===E&&(this.backend.hasFeature("float32-filterable")?s.sampleType=AN:s.sampleType=RN)}r.isSampledCubeTexture?s.viewDimension=PN:r.texture.isDataArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=UN:r.isSampledTexture3D&&(s.viewDimension=IN),e.texture=s}else console.error(`WebGPUBindingUtils: Unsupported binding "${r}".`);s.push(e)}return r.createBindGroupLayout({entries:s})}createBindings(e,t,r,s=0){const{backend:i,bindGroupLayoutCache:n}=this,o=i.get(e);let a,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===o.groups&&(o.groups=[],o.versions=[]),o.versions[r]===s&&(a=o.groups[r])),void 0===a&&(a=this.createBindGroup(e,u),r>0&&(o.groups[r]=a,o.versions[r]=s)),o.group=a,o.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const o=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:o})}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}else if(t.isSampledTexture){const e=r.get(t.texture);let o;if(void 0!==e.externalTexture)o=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(o=e[s],void 0===o){const i=LN;let n;n=t.isSampledCubeTexture?PN:t.isSampledTexture3D?IN:t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?UN:FN,o=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:o})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class bS{constructor(e){this.backend=e}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:o,fragmentProgram:a}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;!0===s.transparent&&s.blending!==L&&(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},A={},R=e.context.depth,C=e.context.stencil;if(!0!==R&&!0!==C||(!0===R&&(A.format=v,A.depthWriteEnabled=s.depthWrite,A.depthCompare=_),!0===C&&(A.stencilFront=m,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),S.depthStencil=A),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise((e=>{l.createRenderPipelineAsync(S).then((t=>{c.pipeline=t,e()}))}));t.push(e)}}createBundleEncoder(e){const t=this.backend,{utils:r,device:s}=t,i=r.getCurrentDepthStencilFormat(e),n={label:"renderBundleEncoder",colorFormats:[r.getCurrentColorFormat(e)],depthStencilFormat:i,sampleCount:this._getSampleCount(e)};return s.createRenderBundleEncoder(n)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),o=[];for(const e of t){const t=r.get(e);o.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:o})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,o=e.blendEquation;if(s===Tt){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,a=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:o;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(o)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(a),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:nN},r={srcFactor:i,dstFactor:n,operation:nN}};if(e.premultipliedAlpha)switch(s){case U:i(qv,Qv,qv,Qv);break;case Nt:i(qv,qv,qv,qv);break;case vt:i(jv,Kv,jv,qv);break;case _t:i(jv,Xv,jv,Yv)}else switch(s){case U:i(Yv,Qv,qv,Qv);break;case Nt:i(Yv,qv,Yv,qv);break;case vt:i(jv,Kv,jv,qv);break;case _t:i(jv,Xv,jv,Xv)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case ot:t=jv;break;case at:t=qv;break;case ut:t=Xv;break;case pt:t=Kv;break;case lt:t=Yv;break;case gt:t=Qv;break;case ct:t=Zv;break;case mt:t=Jv;break;case ht:t=eN;break;case ft:t=tN;break;case dt:t=rN;break;case 211:t=sN;break;case 212:t=iN;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case Pr:t=Nv;break;case Ur:t=Mv;break;case Fr:t=Sv;break;case Br:t=Rv;break;case Mr:t=Av;break;case wr:t=wv;break;case Er:t=Cv;break;case Cr:t=Ev;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case zr:t=hN;break;case kr:t=pN;break;case Gr:t=gN;break;case Or:t=mN;break;case Vr:t=fN;break;case Dr:t=yN;break;case Lr:t=xN;break;case Ir:t=bN;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case st:t=nN;break;case it:t=oN;break;case nt:t=aN;break;case Wr:t=uN;break;case $r:t=lN;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?Vv:Ov),r.side){case We:s.frontFace=Pv,s.cullMode=Dv;break;case T:s.frontFace=Pv,s.cullMode=Lv;break;case le:s.frontFace=Pv,s.cullMode=Iv;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?cN:dN}_getDepthCompare(e){let t;if(!1===e.depthTest)t=Mv;else{const r=e.depthFunc;switch(r){case Bt:t=Nv;break;case Mt:t=Mv;break;case wt:t=Sv;break;case Et:t=Rv;break;case Ct:t=Av;break;case Rt:t=wv;break;case At:t=Cv;break;case St:t=Ev;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class TS extends J_{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.trackTimestamp=!0===e.trackTimestamp,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new pS(this),this.attributeUtils=new yS(this),this.bindingUtils=new xS(this),this.pipelineUtils=new bS(this),this.textureUtils=new XN(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference},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(ON),n=[];for(const e of i)s.features.has(e)&&n.push(e);const o={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(o)}else r=t.device;r.lost.then((t=>{const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}));const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(ON.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),this.updateSize()}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==r.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples||s.loadOp!==t.loadOp){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};r.addEventListener("dispose",e)}const n=e.getCacheKey();let o=i[n];if(void 0===o){const a=e.textures,u=[];let l;for(let s=0;s0&&(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:Fv}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const o=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(),t.currentPass.end(),r>0){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.prepareTimestampBuffer(e,t.encoder),this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;eo?(u.x=Math.min(t.dispatchCount,o),u.y=Math.ceil(t.dispatchCount/o)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.prepareTimestampBuffer(e,t.cmdEncoderGPU),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,context:s,pipeline:i}=e,n=e.getBindings(),o=this.get(s),a=this.get(i).pipeline,u=o.currentSets,l=o.currentPass,d=e.getDrawParameters();if(null===d)return;u.pipeline!==a&&(l.setPipeline(a),u.pipeline=a);const c=u.bindingGroups;for(let e=0,t=n.length;e{if(!0===r.isBatchedMesh){const e=r._multiDrawStarts,t=r._multiDrawCounts,s=r._multiDrawCount,i=r._multiDrawInstances;for(let r=0;r1?0:r;!0===p?l.drawIndexed(t[r],s,e[r]/h.array.BYTES_PER_ELEMENT,0,n):l.draw(t[r],s,e[r],n)}}else if(!0===p){const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndexedIndirect(e,0)}else l.drawIndexed(s,i,n,0,0);t.update(r,s,i)}else{const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndirect(e,0)}else l.draw(s,i,n,0);t.update(r,s,i)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),i=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==i.length){const e=this.get(n),r=[],s=new Uint32Array([0,0,0,0]);for(let t=0,n=i.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new yv(e)));super(new t(e),e),this.library=new vS,this.isWebGPURenderer=!0}}class SS extends is{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class AS{constructor(e,t=ji(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new lh;r.name="PostProcessing",this._quadMesh=new mf(r)}render(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=h,e.outputColorSpace=Re,this._quadMesh.render(e),e.toneMapping=t,e.outputColorSpace=r}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;this._quadMesh.material.fragmentNode=!0===this.outputColorTransform?vu(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=h,e.outputColorSpace=Re,await this._quadMesh.renderAsync(e),e.toneMapping=t,e.outputColorSpace=r}}class RS extends J{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=z,this.minFilter=z,this.isStorageTexture=!0}}class CS extends Nf{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class ES extends ns{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new os(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):console.error(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]?(console.error("THREE.NodeLoader: Node type not found:",e),Pi()):Ni(new this.nodes[e])}}class wS extends as{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 MS extends us{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 ES;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 wS;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}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 null!==e.renderer.nodes.modelViewMatrix||null!==e.renderer.nodes.modelNormalViewMatrix}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){const{object:t,material:r,geometry:s}=e,i=this.getRenderObjectData(e);if(!0!==i.worldMatrix.equals(t.matrixWorld))return i.worldMatrix.copy(t.matrixWorld),!1;const n=i.material;for(const e in n){const t=n[e],s=r[e];if(void 0!==t.equals){if(!1===t.equals(s))return t.copy(s),!1}else if(!0===s.isTexture){if(t.id!==s.id||t.version!==s.version)return t.id=s.id,t.version=s.version,!1}else if(t!==s)return n[e]=s,!1}if(n.transmission>0){const{width:t,height:r}=e.context;if(i.bufferWidth!==t||i.bufferHeight!==r)return i.bufferWidth=t,i.bufferHeight=r,!1}const o=i.geometry,a=s.attributes,u=o.attributes,l=Object.keys(u),d=Object.keys(a);if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(a),!1;for(const e of l){const t=u[e],r=a[e];if(void 0===r)return delete u[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const c=s.index,h=o.indexVersion,p=c?c.version:null;if(h!==p)return o.indexVersion=p,!1;if(o.drawRange.start!==s.drawRange.start||o.drawRange.count!==s.drawRange.count)return o.drawRange.start=s.drawRange.start,o.drawRange.count=s.drawRange.count,!1;if(i.morphTargetInfluences){let e=!1;for(let r=0;r>>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 ps=e=>hs(e),gs=e=>hs(e),ms=(...e)=>hs(e);function fs(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of ys(e))r.push(hs(s.slice(0,-4)),i.getCacheKey(t));return hs(r)}function*ys(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0))).buffer}var Es=Object.freeze({__proto__:null,arrayBufferToBase64:Rs,base64ToArrayBuffer:Cs,getCacheKey:fs,getDataFromObject:As,getLengthFromType:vs,getNodeChildren:ys,getTypeFromLength:Ts,getTypedArrayFromType:_s,getValueFromType:Ss,getValueType:Ns,hash:ms,hashArray:gs,hashString:ps});const ws={VERTEX:"vertex",FRAGMENT:"fragment"},Ms={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Bs={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Fs={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Us=["fragment","vertex"],Ps=["setup","analyze","generate"],Is=[...Us,"compute"],Ls=["x","y","z","w"];let Ds=0;class Vs extends a{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Ms.NONE,this.updateBeforeType=Ms.NONE,this.updateAfterType=Ms.NONE,this.uuid=u.generateUUID(),this.version=0,this.global=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:Ds++})}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.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,Ms.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Ms.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Ms.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of ys(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=ms(fs(this,e),this.customCacheKey()),this._cacheKeyVersion=this.version),this._cacheKey}customCacheKey(){return 0}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return t.outputNode||null}analyze(e){if(1===e.increaseUsage(this)){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);e.addNode(this),e.addChain(this);let s=null;const i=e.getBuildStage();if("setup"===i){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){t.initialized=!0;const r=this.setup(e),s=r&&!0===r.isNode;for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e);s&&r.build(e),t.outputNode=r}}else if("analyze"===i)this.analyze(e);else if("generate"===i){if(1===this.generate.length){const r=this.getNodeType(e),i=e.getDataFromNode(this);s=i.snippet,void 0===s?(s=this.generate(e)||"",i.snippet=s):void 0!==i.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),s=e.format(s,r,t)}else s=this.generate(e,t)||""}return e.removeChain(this),e.addSequentialNode(this),s}getSerializeChildren(){return ys(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(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.6,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 Os extends Vs{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)}generate(e){return`${this.node.build(e)}[ ${this.indexNode.build(e,"uint")} ]`}}class Gs extends Vs{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 ks extends Vs{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),o=e.getPropertyName(n);return e.addLineFlowCode(`${o} = ${i}`,this),s.snippet=i,s.propertyName=o,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class zs extends ks{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=this.nodes,i=e.getComponentType(r),n=[];for(const t of s){let r=t.build(e);const s=e.getComponentType(t.getNodeType(e));s!==i&&(r=e.format(r,s,i)),n.push(r)}const o=`${e.getType(r)}( ${n.join(", ")} )`;return e.format(o,r,t)}}const $s=Ls.join("");class Ws extends Vs{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(Ls.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))}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 o=r.build(e,n);i=this.components.length===s&&this.components===$s.slice(0,this.components.length)?e.format(o,n,t):e.format(`${o}.${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 Hs extends ks{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)),o=e.getTypeFromLength(r.length,n),a=s.build(e,o),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),Js=e=>Zs(e).split("").sort().join(""),ei={setup(e,t){const r=t.shift();return e(Ai(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(Ks.assign(r,...e),r);if(Ys.has(t)){const s=Ys.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&Ys.has(t.slice(0,t.length-6))){const s=Ys.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=Zs(t),Si(new Ws(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Js(t.slice(3).toLowerCase()),r=>Si(new Hs(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Js(t.slice(4).toLowerCase()),()=>Si(new js(Si(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Si(new Ws(e,t));if(!0===/^\d+$/.test(t))return Si(new Os(r,new Xs(Number(t),"uint")))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},ti=new WeakMap,ri=new WeakMap,si=function(e,t=null){for(const r in e)e[r]=Si(e[r],t);return e},ii=function(e,t=null){const r=e.length;for(let s=0;sSi(null!==s?Object.assign(e,s):e);return null===t?(...t)=>i(new e(...Ri(t))):null!==r?(r=Si(r),(...s)=>i(new e(t,...Ri(s),r))):(...r)=>i(new e(t,...Ri(r)))},oi=function(e,...t){return Si(new e(...Ri(t)))};class ai extends Vs{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t);if(s.onceOutput)return s.onceOutput;let i=null;if(t.layout){let s=ri.get(e.constructor);void 0===s&&(s=new WeakMap,ri.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=Si(e.buildFunctionNode(t)),s.set(t,n)),null!==e.currentFunctionNode&&e.currentFunctionNode.includes.push(n),i=Si(n.call(r))}else{const s=t.jsFunc,n=null!==r||s.length>1?s(r||[],e):s(e);i=Si(n)}return t.once&&(s.onceOutput=i),i}getOutputNode(e){const t=e.getNodeProperties(this);return null===t.outputNode&&(t.outputNode=this.setupOutput(e)),t.outputNode}setup(e){return this.getOutputNode(e)}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}generate(e,t){return this.getOutputNode(e).build(e,t)}}class ui extends Vs{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return Ai(e),Si(new ai(this,e))}setup(){return this.call()}}const li=[!1,!0],di=[0,1,2,3],ci=[-1,-2],hi=[.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],pi=new Map;for(const e of li)pi.set(e,new Xs(e));const gi=new Map;for(const e of di)gi.set(e,new Xs(e,"uint"));const mi=new Map([...gi].map((e=>new Xs(e.value,"int"))));for(const e of ci)mi.set(e,new Xs(e,"int"));const fi=new Map([...mi].map((e=>new Xs(e.value))));for(const e of hi)fi.set(e,new Xs(e));for(const e of hi)fi.set(-e,new Xs(-e));const yi={bool:pi,uint:gi,ints:mi,float:fi},xi=new Map([...pi,...fi]),bi=(e,t)=>xi.has(e)?xi.get(e):!0===e.isNode?e:new Xs(e,t),Ti=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[Ss(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Si(t.get(r[0]));if(1===r.length){const t=bi(r[0],e);return(e=>{try{return e.getNodeType()}catch(e){return}})(t)===e?Si(t):Si(new Gs(t,e))}const s=r.map((e=>bi(e)));return Si(new zs(s,e))}},_i=e=>"object"==typeof e&&null!==e?e.value:e,vi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Ni(e,t){return new Proxy(new ui(e,t),ei)}const Si=(e,t=null)=>function(e,t=null){const r=Ns(e);if("node"===r){let t=ti.get(e);return void 0===t&&(t=new Proxy(e,ei),ti.set(e,t),ti.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Si(bi(e,t)):"shader"===r?wi(e):e}(e,t),Ai=(e,t=null)=>new si(e,t),Ri=(e,t=null)=>new ii(e,t),Ci=(...e)=>new ni(...e),Ei=(...e)=>new oi(...e),wi=(e,t)=>{const r=new Ni(e,t),s=(...e)=>{let t;return Ai(e),t=e[0]&&e[0].isNode?[...e]:e[0],r.call(t)};return s.shaderNode=r,s.setLayout=e=>(r.setLayout(e),s),s.once=()=>(r.once=!0,s),s};Qs("toGlobal",(e=>(e.global=!0,e)));const Mi=e=>{Ks=e},Bi=()=>Ks,Fi=(...e)=>Ks.If(...e);function Ui(e){return Ks&&Ks.add(e),e}Qs("append",Ui);const Pi=new Ti("color"),Ii=new Ti("float",yi.float),Li=new Ti("int",yi.ints),Di=new Ti("uint",yi.uint),Vi=new Ti("bool",yi.bool),Oi=new Ti("vec2"),Gi=new Ti("ivec2"),ki=new Ti("uvec2"),zi=new Ti("bvec2"),$i=new Ti("vec3"),Wi=new Ti("ivec3"),Hi=new Ti("uvec3"),ji=new Ti("bvec3"),qi=new Ti("vec4"),Xi=new Ti("ivec4"),Ki=new Ti("uvec4"),Yi=new Ti("bvec4"),Qi=new Ti("mat2"),Zi=new Ti("mat3"),Ji=new Ti("mat4");Qs("toColor",Pi),Qs("toFloat",Ii),Qs("toInt",Li),Qs("toUint",Di),Qs("toBool",Vi),Qs("toVec2",Oi),Qs("toIVec2",Gi),Qs("toUVec2",ki),Qs("toBVec2",zi),Qs("toVec3",$i),Qs("toIVec3",Wi),Qs("toUVec3",Hi),Qs("toBVec3",ji),Qs("toVec4",qi),Qs("toIVec4",Xi),Qs("toUVec4",Ki),Qs("toBVec4",Yi),Qs("toMat2",Qi),Qs("toMat3",Zi),Qs("toMat4",Ji);const en=Ci(Os),tn=(e,t)=>Si(new Gs(Si(e),t));Qs("element",en),Qs("convert",tn);class rn extends ks{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getNodeType(e){return null===this.nodeType&&(this.nodeType=this.values[0].getNodeType(e)),this.nodeType}getElementType(e){return this.getNodeType(e)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const sn=(...e)=>{let t;if(1===e.length){const r=e[0];t=new rn(null,r.length,r)}else{const r=e[0],s=e[1];t=new rn(r,s)}return Si(t)};Qs("toArray",((e,t)=>sn(Array(t).fill(e))));class nn extends Vs{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 on=e=>new nn(e),an=(e,t=0)=>new nn(e,!0,t),un=an("frame"),ln=an("render"),dn=on("object");class cn extends qs{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=dn}label(e){return this.name=e,this}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate((t=>{const s=e(t,r);void 0!==s&&(this.value=s)}),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),o=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),a=e.getPropertyName(o);return void 0!==e.context.label&&delete e.context.label,e.format(a,r,t)}}const hn=(e,t)=>{const r=vi(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return Si(new cn(s,r))};class pn extends Vs{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0}getHash(e){return this.name||super.getHash(e)}isGlobal(){return!0}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 gn=(e,t)=>Si(new pn(e,t)),mn=(e,t)=>Si(new pn(e,t,!0)),fn=Ei(pn,"vec4","DiffuseColor"),yn=Ei(pn,"vec3","EmissiveColor"),xn=Ei(pn,"float","Roughness"),bn=Ei(pn,"float","Metalness"),Tn=Ei(pn,"float","Clearcoat"),_n=Ei(pn,"float","ClearcoatRoughness"),vn=Ei(pn,"vec3","Sheen"),Nn=Ei(pn,"float","SheenRoughness"),Sn=Ei(pn,"float","Iridescence"),An=Ei(pn,"float","IridescenceIOR"),Rn=Ei(pn,"float","IridescenceThickness"),Cn=Ei(pn,"float","AlphaT"),En=Ei(pn,"float","Anisotropy"),wn=Ei(pn,"vec3","AnisotropyT"),Mn=Ei(pn,"vec3","AnisotropyB"),Bn=Ei(pn,"color","SpecularColor"),Fn=Ei(pn,"float","SpecularF90"),Un=Ei(pn,"float","Shininess"),Pn=Ei(pn,"vec4","Output"),In=Ei(pn,"float","dashSize"),Ln=Ei(pn,"float","gapSize"),Dn=Ei(pn,"float","pointWidth"),Vn=Ei(pn,"float","IOR"),On=Ei(pn,"float","Transmission"),Gn=Ei(pn,"float","Thickness"),kn=Ei(pn,"float","AttenuationDistance"),zn=Ei(pn,"color","AttenuationColor"),$n=Ei(pn,"float","Dispersion");class Wn extends ks{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t}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 Ls.join("").slice(0,r)!==t.components}return!1}generate(e,t){const{targetNode:r,sourceNode:s}=this,i=this.needsSplitAssign(e),n=r.getNodeType(e),o=r.context({assign:!0}).build(e),a=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=o);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${a}`,this);const u=r.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))for(let e=0;e(t=t.length>1||t[0]&&!0===t[0].isNode?Ri(t):Ai(t[0]),Si(new jn(Si(e),t)));Qs("call",qn);class Xn extends ks{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Xn(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"=="===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("<"===r||">"===r||"<="===r||">="===r){const r=t?e.getTypeLength(t):Math.max(e.getTypeLength(n),e.getTypeLength(o));return r>1?`bvec${r}`:"bool"}if(e.isMatrix(n)){if("float"===o)return n;if(e.isVector(o))return e.getVectorFromMatrix(n);if(e.isMatrix(o))return n}else if(e.isMatrix(o)){if("float"===n)return o;if(e.isVector(n))return e.getVectorFromMatrix(o)}return e.getTypeLength(o)>e.getTypeLength(n)?o:n}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e,t);let o=null,a=null;"void"!==n?(o=s.getNodeType(e),a=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r?e.isVector(o)?a=o:o!==a&&(o=a="float"):">>"===r||"<<"===r?(o=n,a=e.changeComponentType(a,"uint")):e.isMatrix(o)?"float"===a?a="float":e.isVector(a)?a=e.getVectorFromMatrix(o):e.isMatrix(a)||(o=a=n):o=e.isMatrix(a)?"float"===o?"float":e.isVector(o)?e.getVectorFromMatrix(a):a=n:a=n):o=a=n;const u=s.build(e,o),l=void 0!==i?i.build(e,a):null,d=e.getTypeLength(t),c=e.getFunctionOperator(r);return"void"!==t?"<"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} < ${l} )`,n,t):"<="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} <= ${l} )`,n,t):">"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} > ${l} )`,n,t):">="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} >= ${l} )`,n,t):"!"===r||"~"===r?e.format(`(${r}${u})`,o,t):c?e.format(`${c}( ${u}, ${l} )`,n,t):e.isMatrix(o)&&"float"===a?e.format(`( ${l} ${r} ${u} )`,n,t):"float"===o&&e.isMatrix(a)?e.format(`${u} ${r} ${l}`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t):"void"!==o?c?e.format(`${c}( ${u}, ${l} )`,n,t):e.isMatrix(o)&&"float"===a?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t):void 0}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const Kn=Ci(Xn,"+"),Yn=Ci(Xn,"-"),Qn=Ci(Xn,"*"),Zn=Ci(Xn,"/"),Jn=Ci(Xn,"%"),eo=Ci(Xn,"=="),to=Ci(Xn,"!="),ro=Ci(Xn,"<"),so=Ci(Xn,">"),io=Ci(Xn,"<="),no=Ci(Xn,">="),oo=Ci(Xn,"&&"),ao=Ci(Xn,"||"),uo=Ci(Xn,"!"),lo=Ci(Xn,"^^"),co=Ci(Xn,"&"),ho=Ci(Xn,"~"),po=Ci(Xn,"|"),go=Ci(Xn,"^"),mo=Ci(Xn,"<<"),fo=Ci(Xn,">>");Qs("add",Kn),Qs("sub",Yn),Qs("mul",Qn),Qs("div",Zn),Qs("modInt",Jn),Qs("equal",eo),Qs("notEqual",to),Qs("lessThan",ro),Qs("greaterThan",so),Qs("lessThanEqual",io),Qs("greaterThanEqual",no),Qs("and",oo),Qs("or",ao),Qs("not",uo),Qs("xor",lo),Qs("bitAnd",co),Qs("bitNot",ho),Qs("bitOr",po),Qs("bitXor",go),Qs("shiftLeft",mo),Qs("shiftRight",fo);const yo=(...e)=>(console.warn("TSL.OperatorNode: .remainder() has been renamed to .modInt()."),Jn(...e));Qs("remainder",yo);class xo extends ks{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){super(),this.method=e,this.aNode=t,this.bNode=r,this.cNode=s,this.isMathNode=!0}getInputType(e){const t=this.aNode.getNodeType(e),r=this.bNode?this.bNode.getNodeType(e):null,s=this.cNode?this.cNode.getNodeType(e):null,i=e.isMatrix(t)?0:e.getTypeLength(t),n=e.isMatrix(r)?0:e.getTypeLength(r),o=e.isMatrix(s)?0:e.getTypeLength(s);return i>n&&i>o?t:n>o?r:o>i?s:t}getNodeType(e){const t=this.method;return t===xo.LENGTH||t===xo.DISTANCE||t===xo.DOT?"float":t===xo.CROSS?"vec3":t===xo.ALL?"bool":t===xo.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):t===xo.MOD?this.aNode.getNodeType(e):this.getInputType(e)}generate(e,t){let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,o=this.bNode,a=this.cNode,u=e.renderer.coordinateSystem;if(r===xo.TRANSFORM_DIRECTION){let r=n,s=o;e.isMatrix(r.getNodeType(e))?s=qi($i(s),0):r=qi($i(r),0);const i=Qn(r,s).xyz;return Io(i).build(e,t)}if(r===xo.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===xo.ONE_MINUS)return Yn(1,n).build(e,t);if(r===xo.RECIPROCAL)return Zn(1,n).build(e,t);if(r===xo.DIFFERENCE)return $o(Yn(n,o)).build(e,t);{const c=[];return r===xo.CROSS||r===xo.MOD?c.push(n.build(e,s),o.build(e,s)):u===l&&r===xo.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),o.build(e,i)):u===l&&(r===xo.MIN||r===xo.MAX)||r===xo.MOD?c.push(n.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):r===xo.REFRACT?c.push(n.build(e,i),o.build(e,i),a.build(e,"float")):r===xo.MIX?c.push(n.build(e,i),o.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)):(u===d&&r===xo.ATAN&&null!==o&&(r="atan2"),c.push(n.build(e,i)),null!==o&&c.push(o.build(e,i)),null!==a&&c.push(a.build(e,i))),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}xo.ALL="all",xo.ANY="any",xo.RADIANS="radians",xo.DEGREES="degrees",xo.EXP="exp",xo.EXP2="exp2",xo.LOG="log",xo.LOG2="log2",xo.SQRT="sqrt",xo.INVERSE_SQRT="inversesqrt",xo.FLOOR="floor",xo.CEIL="ceil",xo.NORMALIZE="normalize",xo.FRACT="fract",xo.SIN="sin",xo.COS="cos",xo.TAN="tan",xo.ASIN="asin",xo.ACOS="acos",xo.ATAN="atan",xo.ABS="abs",xo.SIGN="sign",xo.LENGTH="length",xo.NEGATE="negate",xo.ONE_MINUS="oneMinus",xo.DFDX="dFdx",xo.DFDY="dFdy",xo.ROUND="round",xo.RECIPROCAL="reciprocal",xo.TRUNC="trunc",xo.FWIDTH="fwidth",xo.TRANSPOSE="transpose",xo.BITCAST="bitcast",xo.EQUALS="equals",xo.MIN="min",xo.MAX="max",xo.MOD="mod",xo.STEP="step",xo.REFLECT="reflect",xo.DISTANCE="distance",xo.DIFFERENCE="difference",xo.DOT="dot",xo.CROSS="cross",xo.POW="pow",xo.TRANSFORM_DIRECTION="transformDirection",xo.MIX="mix",xo.CLAMP="clamp",xo.REFRACT="refract",xo.SMOOTHSTEP="smoothstep",xo.FACEFORWARD="faceforward";const bo=Ii(1e-6),To=Ii(1e6),_o=Ii(Math.PI),vo=Ii(2*Math.PI),No=Ci(xo,xo.ALL),So=Ci(xo,xo.ANY),Ao=Ci(xo,xo.RADIANS),Ro=Ci(xo,xo.DEGREES),Co=Ci(xo,xo.EXP),Eo=Ci(xo,xo.EXP2),wo=Ci(xo,xo.LOG),Mo=Ci(xo,xo.LOG2),Bo=Ci(xo,xo.SQRT),Fo=Ci(xo,xo.INVERSE_SQRT),Uo=Ci(xo,xo.FLOOR),Po=Ci(xo,xo.CEIL),Io=Ci(xo,xo.NORMALIZE),Lo=Ci(xo,xo.FRACT),Do=Ci(xo,xo.SIN),Vo=Ci(xo,xo.COS),Oo=Ci(xo,xo.TAN),Go=Ci(xo,xo.ASIN),ko=Ci(xo,xo.ACOS),zo=Ci(xo,xo.ATAN),$o=Ci(xo,xo.ABS),Wo=Ci(xo,xo.SIGN),Ho=Ci(xo,xo.LENGTH),jo=Ci(xo,xo.NEGATE),qo=Ci(xo,xo.ONE_MINUS),Xo=Ci(xo,xo.DFDX),Ko=Ci(xo,xo.DFDY),Yo=Ci(xo,xo.ROUND),Qo=Ci(xo,xo.RECIPROCAL),Zo=Ci(xo,xo.TRUNC),Jo=Ci(xo,xo.FWIDTH),ea=Ci(xo,xo.TRANSPOSE),ta=Ci(xo,xo.BITCAST),ra=Ci(xo,xo.EQUALS),sa=Ci(xo,xo.MIN),ia=Ci(xo,xo.MAX),na=Ci(xo,xo.MOD),oa=Ci(xo,xo.STEP),aa=Ci(xo,xo.REFLECT),ua=Ci(xo,xo.DISTANCE),la=Ci(xo,xo.DIFFERENCE),da=Ci(xo,xo.DOT),ca=Ci(xo,xo.CROSS),ha=Ci(xo,xo.POW),pa=Ci(xo,xo.POW,2),ga=Ci(xo,xo.POW,3),ma=Ci(xo,xo.POW,4),fa=Ci(xo,xo.TRANSFORM_DIRECTION),ya=e=>Qn(Wo(e),ha($o(e),1/3)),xa=e=>da(e,e),ba=Ci(xo,xo.MIX),Ta=(e,t=0,r=1)=>Si(new xo(xo.CLAMP,Si(e),Si(t),Si(r))),_a=e=>Ta(e),va=Ci(xo,xo.REFRACT),Na=Ci(xo,xo.SMOOTHSTEP),Sa=Ci(xo,xo.FACEFORWARD),Aa=wi((([e])=>{const t=da(e.xy,Oi(12.9898,78.233)),r=na(t,_o);return Lo(Do(r).mul(43758.5453))})),Ra=(e,t,r)=>ba(t,r,e),Ca=(e,t,r)=>Na(t,r,e),Ea=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),zo(e,t)),wa=Sa,Ma=Fo;Qs("all",No),Qs("any",So),Qs("equals",ra),Qs("radians",Ao),Qs("degrees",Ro),Qs("exp",Co),Qs("exp2",Eo),Qs("log",wo),Qs("log2",Mo),Qs("sqrt",Bo),Qs("inverseSqrt",Fo),Qs("floor",Uo),Qs("ceil",Po),Qs("normalize",Io),Qs("fract",Lo),Qs("sin",Do),Qs("cos",Vo),Qs("tan",Oo),Qs("asin",Go),Qs("acos",ko),Qs("atan",zo),Qs("abs",$o),Qs("sign",Wo),Qs("length",Ho),Qs("lengthSq",xa),Qs("negate",jo),Qs("oneMinus",qo),Qs("dFdx",Xo),Qs("dFdy",Ko),Qs("round",Yo),Qs("reciprocal",Qo),Qs("trunc",Zo),Qs("fwidth",Jo),Qs("atan2",Ea),Qs("min",sa),Qs("max",ia),Qs("mod",na),Qs("step",oa),Qs("reflect",aa),Qs("distance",ua),Qs("dot",da),Qs("cross",ca),Qs("pow",ha),Qs("pow2",pa),Qs("pow3",ga),Qs("pow4",ma),Qs("transformDirection",fa),Qs("mix",Ra),Qs("clamp",Ta),Qs("refract",va),Qs("smoothstep",Ca),Qs("faceForward",Sa),Qs("difference",la),Qs("saturate",_a),Qs("cbrt",ya),Qs("transpose",ea),Qs("rand",Aa);class Ba extends Vs{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 this.setup(e),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.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.getNodeProperties(this);n.condNode=t,n.ifNode=r.context({nodeBlock:r}),n.elseNode=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:o}=e.getNodeProperties(this),a="void"!==t,u=a?gn(r).build(e):"";s.nodeProperty=u;const l=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${l} ) {\n\n`).addFlowTab();let d=n.build(e,r);if(d&&(d=a?u+" = "+d+";":"return "+d+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+d+"\n\n"+e.tab+"}"),null!==o){e.addFlowCode(" else {\n\n").addFlowTab();let t=o.build(e,r);t&&(t=a?u+" = "+t+";":"return "+t+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(u,r,t)}}const Fa=Ci(Ba);Qs("select",Fa);const Ua=(...e)=>(console.warn("TSL.ConditionalNode: cond() has been renamed to select()."),Fa(...e));Qs("cond",Ua);class Pa extends Vs{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){this.node.build(e)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value});const r=this.node.build(e);return e.setContext(t),r}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const Ia=Ci(Pa),La=(e,t)=>Ia(e,{label:t});Qs("context",Ia),Qs("label",La);class Da extends Vs{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}getHash(e){return this.name||super.getHash(e)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let o=!1,a=!1;s&&(o=e.isDeterministic(t),a=n?s:o);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,a),c=e.getPropertyName(d);let h=c;if(a)if(n)h=o?`const ${c}`:`let ${c}`;else{const r=e.getArrayCount(t);h=`const ${e.getVar(d.type,c,r)}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const Va=Ci(Da),Oa=(e,t=null)=>Va(e,t).append(),Ga=(e,t=null)=>Va(e,t,!0).append();Qs("toVar",Oa),Qs("toConst",Ga);const ka=e=>(console.warn('TSL: "temp( node )" is deprecated. Use "Var( node )" or "node.toVar()" instead.'),Va(e));Qs("temp",ka);class za extends Vs{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0}isGlobal(){return!0}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);t.varying=r=e.getVaryingFromNode(this,s,i),t.node=this.node}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e)}analyze(e){return this.setupVarying(e),this.node.analyze(e)}generate(e){const t=e.getNodeProperties(this),r=this.setupVarying(e),s="fragment"===e.shaderStage&&!0===t.reassignPosition&&e.context.needsPositionReassign;if(void 0===t.propertyName||s){const i=this.getNodeType(e),n=e.getPropertyName(r,ws.VERTEX);e.flowNodeFromShaderStage(ws.VERTEX,this.node,i,n),t.propertyName=n,s?t.reassignPosition=!1:void 0===t.reassignPosition&&e.context.isPositionNodeInput&&(t.reassignPosition=!0)}return e.getPropertyName(r)}}const $a=Ci(za),Wa=e=>$a(e);Qs("toVarying",$a),Qs("toVertexStage",Wa),Qs("varying",((...e)=>(console.warn("TSL.VaryingNode: .varying() has been renamed to .toVarying()."),$a(...e)))),Qs("vertexStage",((...e)=>(console.warn("TSL.VaryingNode: .vertexStage() has been renamed to .toVertexStage()."),$a(...e))));const Ha=wi((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return ba(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),ja=wi((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return ba(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),qa="WorkingColorSpace",Xa="OutputColorSpace";class Ka extends ks{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===qa?c.workingColorSpace:t===Xa?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!==c.enabled&&r!==s&&r&&s?(c.getTransfer(r)===h&&(i=qi(Ha(i.rgb),i.a)),c.getPrimaries(r)!==c.getPrimaries(s)&&(i=qi(Zi(c._getMatrix(new n,r,s)).mul(i.rgb),i.a)),c.getTransfer(s)===h&&(i=qi(ja(i.rgb),i.a)),i):i}}const Ya=e=>Si(new Ka(Si(e),qa,Xa)),Qa=e=>Si(new Ka(Si(e),Xa,qa)),Za=(e,t)=>Si(new Ka(Si(e),qa,t)),Ja=(e,t)=>Si(new Ka(Si(e),t,qa));Qs("toOutputColorSpace",Ya),Qs("toWorkingColorSpace",Qa),Qs("workingToColorSpace",Za),Qs("colorSpaceToWorking",Ja);let eu=class extends Os{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 tu extends Vs{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=Ms.OBJECT}setGroup(e){return this.group=e,this}element(e){return Si(new eu(this,Si(e)))}setNodeType(e){const t=hn(null,e).getSelf();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;eSi(new ru(e,t,r));class iu extends ks{static get type(){return"ToneMappingNode"}constructor(e,t=ou,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return ms(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===p)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=qi(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const nu=(e,t,r)=>Si(new iu(e,Si(t),Si(r))),ou=su("toneMappingExposure","float");Qs("toneMapping",((e,t,r)=>nu(t,r,e)));class au extends qs{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=g,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(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=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,o=!0===r.isInterleavedBuffer?r:new m(r,i),a=new y(o,s,n);o.setUsage(this.usage),this.attribute=a,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=$a(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}}const uu=(e,t=null,r=0,s=0)=>Si(new au(e,t,r,s)),lu=(e,t=null,r=0,s=0)=>uu(e,t,r,s).setUsage(f),du=(e,t=null,r=0,s=0)=>uu(e,t,r,s).setInstanced(!0),cu=(e,t=null,r=0,s=0)=>lu(e,t,r,s).setInstanced(!0);Qs("toAttribute",(e=>uu(e.value)));class hu extends Vs{static get type(){return"ComputeNode"}constructor(e,t,r=[64]){super("void"),this.isComputeNode=!0,this.computeNode=e,this.count=t,this.workgroupSize=r,this.dispatchCount=0,this.version=1,this.name="",this.updateBeforeType=Ms.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}label(e){return this.name=e,this}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;eSi(new hu(Si(e),t,r));Qs("compute",pu);class gu extends Vs{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!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}}const mu=(e,t)=>Si(new gu(Si(e),t));Qs("cache",mu);class fu extends Vs{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 yu=Ci(fu);Qs("bypass",yu);class xu extends Vs{static get type(){return"RemapNode"}constructor(e,t,r,s=Ii(0),i=Ii(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 o=e.sub(t).div(r.sub(t));return!0===n&&(o=o.clamp()),o.mul(i.sub(s)).add(s)}}const bu=Ci(xu,null,null,{doClamp:!1}),Tu=Ci(xu);Qs("remap",bu),Qs("remapClamp",Tu);class _u extends Vs{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 vu=Ci(_u),Nu=e=>(e?Fa(e,vu("discard")):vu("discard")).append();Qs("discard",Nu);class Su extends ks{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||p,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||x;return r!==p&&(t=t.toneMapping(r)),s!==x&&s!==c.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const Au=(e,t=null,r=null)=>Si(new Su(Si(e),t,r));Qs("renderOutput",Au);class Ru extends Vs{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 $a(this).build(e,r)}return console.warn(`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 Cu=(e,t)=>Si(new Ru(e,t)),Eu=(e=0)=>Cu("uv"+(e>0?e:""),"vec2");class wu extends Vs{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 Mu=Ci(wu);class Bu extends cn{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Ms.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 Fu=Ci(Bu);class Uu extends cn{static get type(){return"TextureNode"}constructor(e,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.sampler=!0,this.updateMatrix=!1,this.updateType=Ms.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=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===b?"uvec4":this.value.type===T?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Eu(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=hn(this.value.matrix)),this._matrixUniform.mul($i(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?Ms.RENDER:Ms.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Li(Mu(this,this.levelNode).y).sub(t.y).sub(1))),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().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,o,a){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):a?e.generateTextureGrad(u,t,r,a,n):o?e.generateTextureCompare(u,t,r,o,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if("sampler"===t)return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:a,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=a?a.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);o=e.getPropertyName(y);const x=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${o} = ${x}`,this),n.snippet=x,n.propertyName=o}let a=o;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(a=Ja(vu(a,u),r.colorSpace).setup(e).build(e,u)),e.format(a,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){return console.warn("THREE.TextureNode: .uv() has been renamed. Use .sample() instead."),this.sample(e)}sample(e){const t=this.clone();return t.uvNode=Si(e),t.referenceNode=this.getSelf(),Si(t)}blur(e){const t=this.clone();return t.biasNode=Si(e).mul(Fu(t)),t.referenceNode=this.getSelf(),Si(t)}level(e){const t=this.clone();return t.levelNode=Si(e),t.referenceNode=this.getSelf(),Si(t)}size(e){return Mu(this,e)}bias(e){const t=this.clone();return t.biasNode=Si(e),t.referenceNode=this.getSelf(),Si(t)}compare(e){const t=this.clone();return t.compareNode=Si(e),t.referenceNode=this.getSelf(),Si(t)}grad(e,t){const r=this.clone();return r.gradNode=[Si(e),Si(t)],r.referenceNode=this.getSelf(),Si(r)}depth(e){const t=this.clone();return t.depthNode=Si(e),t.referenceNode=this.getSelf(),Si(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()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e}}const Pu=Ci(Uu),Iu=(...e)=>Pu(...e).setSampler(!1);class Lu extends cn{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Du=(e,t,r)=>Si(new Lu(e,t,r));class Vu extends Os{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 Ou extends Lu{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Ns(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Ms.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;rSi(new Ou(e,t)),ku=hn(0,"uint").setGroup(an("cameraIndex")).toVarying("v_cameraIndex"),zu=hn("float").label("cameraNear").setGroup(ln).onRenderUpdate((({camera:e})=>e.near)),$u=hn("float").label("cameraFar").setGroup(ln).onRenderUpdate((({camera:e})=>e.far)),Wu=wi((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Gu(r).setGroup(ln).label("cameraProjectionMatrices").element(ku).toVar("cameraProjectionMatrix")}else t=hn("mat4").label("cameraProjectionMatrix").setGroup(ln).onRenderUpdate((({camera:e})=>e.projectionMatrix));return t})).once()(),Hu=hn("mat4").label("cameraProjectionMatrixInverse").setGroup(ln).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse)),ju=wi((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Gu(r).setGroup(ln).label("cameraViewMatrices").element(ku).toVar("cameraViewMatrix")}else t=hn("mat4").label("cameraViewMatrix").setGroup(ln).onRenderUpdate((({camera:e})=>e.matrixWorldInverse));return t})).once()(),qu=hn("mat4").label("cameraWorldMatrix").setGroup(ln).onRenderUpdate((({camera:e})=>e.matrixWorld)),Xu=hn("mat3").label("cameraNormalMatrix").setGroup(ln).onRenderUpdate((({camera:e})=>e.normalMatrix)),Ku=hn(new r).label("cameraPosition").setGroup(ln).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld)));class Yu extends Vs{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Ms.OBJECT,this._uniformNode=new cn(null)}getNodeType(){const e=this.scope;return e===Yu.WORLD_MATRIX?"mat4":e===Yu.POSITION||e===Yu.VIEW_POSITION||e===Yu.DIRECTION||e===Yu.SCALE?"vec3":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===Yu.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===Yu.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===Yu.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===Yu.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===Yu.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}}generate(e){const t=this.scope;return t===Yu.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t!==Yu.POSITION&&t!==Yu.VIEW_POSITION&&t!==Yu.DIRECTION&&t!==Yu.SCALE||(this._uniformNode.nodeType="vec3"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}Yu.WORLD_MATRIX="worldMatrix",Yu.POSITION="position",Yu.SCALE="scale",Yu.VIEW_POSITION="viewPosition",Yu.DIRECTION="direction";const Qu=Ci(Yu,Yu.DIRECTION),Zu=Ci(Yu,Yu.WORLD_MATRIX),Ju=Ci(Yu,Yu.POSITION),el=Ci(Yu,Yu.SCALE),tl=Ci(Yu,Yu.VIEW_POSITION);class rl extends Yu{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const sl=Ei(rl,rl.DIRECTION),il=Ei(rl,rl.WORLD_MATRIX),nl=Ei(rl,rl.POSITION),ol=Ei(rl,rl.SCALE),al=Ei(rl,rl.VIEW_POSITION),ul=hn(new n).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),ll=hn(new o).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),dl=wi((e=>e.renderer.nodes.modelViewMatrix||cl)).once()().toVar("modelViewMatrix"),cl=ju.mul(il),hl=wi((e=>(e.context.isHighPrecisionModelViewMatrix=!0,hn("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highpModelViewMatrix"),pl=wi((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return hn("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highpModelNormalViewMatrix"),gl=Cu("position","vec3"),ml=gl.toVarying("positionLocal"),fl=gl.toVarying("positionPrevious"),yl=il.mul(ml).xyz.toVarying("v_positionWorld").context({needsPositionReassign:!0}),xl=ml.transformDirection(il).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection").context({needsPositionReassign:!0}),bl=wi((e=>e.context.setupPositionView()),"vec3").once()().toVarying("v_positionView").context({needsPositionReassign:!0}),Tl=bl.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class _l extends Vs{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===l&&r.side===_?"false":e.getFrontFacing()}}const vl=Ei(_l),Nl=Ii(vl).mul(2).sub(1),Sl=Cu("normal","vec3"),Al=wi((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('TSL.NormalNode: Vertex attribute "normal" not found on geometry.'),$i(0,1,0)):Sl),"vec3").once()().toVar("normalLocal"),Rl=bl.dFdx().cross(bl.dFdy()).normalize().toVar("normalFlat"),Cl=wi((e=>{let t;return t=!0===e.material.flatShading?Rl:$a(Ul(Al),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),El=$a(Cl.transformDirection(ju),"v_normalWorld").normalize().toVar("normalWorld"),wl=wi((e=>e.context.setupNormal().context({getUV:null})),"vec3").once()().mul(Nl).toVar("transformedNormalView"),Ml=wl.transformDirection(ju).toVar("transformedNormalWorld"),Bl=wi((e=>e.context.setupClearcoatNormal().context({getUV:null})),"vec3").once()().mul(Nl).toVar("transformedClearcoatNormalView"),Fl=wi((([e,t=il])=>{const r=Zi(t),s=e.div($i(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),Ul=wi((([e],t)=>{const r=t.renderer.nodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=ul.mul(e);return ju.transformDirection(s)})),Pl=hn(0).onReference((({material:e})=>e)).onRenderUpdate((({material:e})=>e.refractionRatio)),Il=Tl.negate().reflect(wl),Ll=Tl.negate().refract(wl,Pl),Dl=Il.transformDirection(ju).toVar("reflectVector"),Vl=Ll.transformDirection(ju).toVar("reflectVector");class Ol extends Uu{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===v?Dl:e.mapping===N?Vl:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),$i(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==d&&r.isRenderTargetTexture?t:$i(t.x.negate(),t.yz)}generateUV(e,t){return t.build(e,"vec3")}}const Gl=Ci(Ol);class kl extends Os{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 zl extends Vs{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=Ms.OBJECT}element(e){return Si(new kl(this,Si(e)))}setGroup(e){return this.group=e,this}label(e){return this.name=e,this}setNodeType(e){let t=null;t=null!==this.count?Du(null,e,this.count):Array.isArray(this.getValueFromReference())?Gu(null,e):"texture"===e?Pu(null):"cubeTexture"===e?Gl(null):hn(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.label(this.name),this.node=t.getSelf()}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;eSi(new zl(e,t,r)),Wl=(e,t,r,s)=>Si(new zl(e,t,s,r));class Hl extends zl{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 jl=(e,t,r=null)=>Si(new Hl(e,t,r)),ql=wi((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),Cu("tangent","vec4"))))(),Xl=ql.xyz.toVar("tangentLocal"),Kl=dl.mul(qi(Xl,0)).xyz.toVarying("v_tangentView").normalize().toVar("tangentView"),Yl=Kl.transformDirection(ju).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Ql=Kl.toVar("transformedTangentView"),Zl=Ql.transformDirection(ju).normalize().toVar("transformedTangentWorld"),Jl=e=>e.mul(ql.w).xyz,ed=$a(Jl(Sl.cross(ql)),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),td=$a(Jl(Al.cross(Xl)),"v_bitangentLocal").normalize().toVar("bitangentLocal"),rd=$a(Jl(Cl.cross(Kl)),"v_bitangentView").normalize().toVar("bitangentView"),sd=$a(Jl(El.cross(Yl)),"v_bitangentWorld").normalize().toVar("bitangentWorld"),id=Jl(wl.cross(Ql)).normalize().toVar("transformedBitangentView"),nd=id.transformDirection(ju).normalize().toVar("transformedBitangentWorld"),od=Zi(Kl,rd,Cl),ad=Tl.mul(od),ud=(()=>{let e=Mn.cross(Tl);return e=e.cross(Mn).normalize(),e=ba(e,wl,En.mul(xn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),ld=wi((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),o=t.dFdy(),a=i.dFdx(),u=i.dFdy(),l=r,d=o.cross(l),c=l.cross(n),h=d.mul(a.x).add(c.mul(u.x)),p=d.mul(a.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=Nl.mul(g.inverseSqrt());return Kn(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class dd extends ks{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=S}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=$i(s.xy.mul(r),s.z));let i=null;if(t===A)i=Ul(s);else if(t===S){i=!0===e.hasGeometryAttribute("tangent")?od.mul(s).normalize():ld({eye_pos:bl,surf_norm:Cl,mapN:s,uv:Eu()})}return i}}const cd=Ci(dd),hd=wi((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||Eu()),forceUVContext:!0}),s=Ii(r((e=>e)));return Oi(Ii(r((e=>e.add(e.dFdx())))).sub(s),Ii(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),pd=wi((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,o=t.dFdy().normalize().cross(n),a=n.cross(i),u=i.dot(o).mul(Nl),l=u.sign().mul(s.x.mul(o).add(s.y.mul(a)));return u.abs().mul(r).sub(l).normalize()}));class gd extends ks{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=hd({textureNode:this.textureNode,bumpScale:e});return pd({surf_pos:bl,surf_norm:Cl,dHdxy:t})}}const md=Ci(gd),fd=new Map;class yd extends Vs{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=fd.get(e);return void 0===r&&(r=jl(e,t),fd.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===yd.COLOR){const e=void 0!==t.color?this.getColor(r):$i();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===yd.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===yd.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:Ii(1);else if(r===yd.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===yd.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===yd.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===yd.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===yd.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===yd.NORMAL)t.normalMap?(s=cd(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?md(this.getTexture("bump").r,this.getFloat("bumpScale")):Cl;else if(r===yd.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===yd.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===yd.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?cd(this.getTexture(r),this.getCache(r+"Scale","vec2")):Cl;else if(r===yd.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===yd.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===yd.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Qi(tc.x,tc.y,tc.y.negate(),tc.x).mul(e.rg.mul(2).sub(Oi(1)).normalize().mul(e.b))}else s=tc;else if(r===yd.IRIDESCENCE_THICKNESS){const e=$l("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=$l("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===yd.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===yd.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===yd.IOR)s=this.getFloat(r);else if(r===yd.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===yd.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}yd.ALPHA_TEST="alphaTest",yd.COLOR="color",yd.OPACITY="opacity",yd.SHININESS="shininess",yd.SPECULAR="specular",yd.SPECULAR_STRENGTH="specularStrength",yd.SPECULAR_INTENSITY="specularIntensity",yd.SPECULAR_COLOR="specularColor",yd.REFLECTIVITY="reflectivity",yd.ROUGHNESS="roughness",yd.METALNESS="metalness",yd.NORMAL="normal",yd.CLEARCOAT="clearcoat",yd.CLEARCOAT_ROUGHNESS="clearcoatRoughness",yd.CLEARCOAT_NORMAL="clearcoatNormal",yd.EMISSIVE="emissive",yd.ROTATION="rotation",yd.SHEEN="sheen",yd.SHEEN_ROUGHNESS="sheenRoughness",yd.ANISOTROPY="anisotropy",yd.IRIDESCENCE="iridescence",yd.IRIDESCENCE_IOR="iridescenceIOR",yd.IRIDESCENCE_THICKNESS="iridescenceThickness",yd.IOR="ior",yd.TRANSMISSION="transmission",yd.THICKNESS="thickness",yd.ATTENUATION_DISTANCE="attenuationDistance",yd.ATTENUATION_COLOR="attenuationColor",yd.LINE_SCALE="scale",yd.LINE_DASH_SIZE="dashSize",yd.LINE_GAP_SIZE="gapSize",yd.LINE_WIDTH="linewidth",yd.LINE_DASH_OFFSET="dashOffset",yd.POINT_SIZE="size",yd.DISPERSION="dispersion",yd.LIGHT_MAP="light",yd.AO="ao";const xd=Ei(yd,yd.ALPHA_TEST),bd=Ei(yd,yd.COLOR),Td=Ei(yd,yd.SHININESS),_d=Ei(yd,yd.EMISSIVE),vd=Ei(yd,yd.OPACITY),Nd=Ei(yd,yd.SPECULAR),Sd=Ei(yd,yd.SPECULAR_INTENSITY),Ad=Ei(yd,yd.SPECULAR_COLOR),Rd=Ei(yd,yd.SPECULAR_STRENGTH),Cd=Ei(yd,yd.REFLECTIVITY),Ed=Ei(yd,yd.ROUGHNESS),wd=Ei(yd,yd.METALNESS),Md=Ei(yd,yd.NORMAL),Bd=Ei(yd,yd.CLEARCOAT),Fd=Ei(yd,yd.CLEARCOAT_ROUGHNESS),Ud=Ei(yd,yd.CLEARCOAT_NORMAL),Pd=Ei(yd,yd.ROTATION),Id=Ei(yd,yd.SHEEN),Ld=Ei(yd,yd.SHEEN_ROUGHNESS),Dd=Ei(yd,yd.ANISOTROPY),Vd=Ei(yd,yd.IRIDESCENCE),Od=Ei(yd,yd.IRIDESCENCE_IOR),Gd=Ei(yd,yd.IRIDESCENCE_THICKNESS),kd=Ei(yd,yd.TRANSMISSION),zd=Ei(yd,yd.THICKNESS),$d=Ei(yd,yd.IOR),Wd=Ei(yd,yd.ATTENUATION_DISTANCE),Hd=Ei(yd,yd.ATTENUATION_COLOR),jd=Ei(yd,yd.LINE_SCALE),qd=Ei(yd,yd.LINE_DASH_SIZE),Xd=Ei(yd,yd.LINE_GAP_SIZE),Kd=Ei(yd,yd.LINE_WIDTH),Yd=Ei(yd,yd.LINE_DASH_OFFSET),Qd=Ei(yd,yd.POINT_SIZE),Zd=Ei(yd,yd.DISPERSION),Jd=Ei(yd,yd.LIGHT_MAP),ec=Ei(yd,yd.AO),tc=hn(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))})),rc=wi((e=>e.context.setupModelViewProjection()),"vec4").once()().toVarying("v_modelViewProjection");class sc extends Vs{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===sc.VERTEX)s=e.getVertexIndex();else if(r===sc.INSTANCE)s=e.getInstanceIndex();else if(r===sc.DRAW)s=e.getDrawIndex();else if(r===sc.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===sc.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==sc.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=$a(this).build(e,t)}return i}}sc.VERTEX="vertex",sc.INSTANCE="instance",sc.SUBGROUP="subgroup",sc.INVOCATION_LOCAL="invocationLocal",sc.INVOCATION_SUBGROUP="invocationSubgroup",sc.DRAW="draw";const ic=Ei(sc,sc.VERTEX),nc=Ei(sc,sc.INSTANCE),oc=Ei(sc,sc.SUBGROUP),ac=Ei(sc,sc.INVOCATION_SUBGROUP),uc=Ei(sc,sc.INVOCATION_LOCAL),lc=Ei(sc,sc.DRAW);class dc extends Vs{static get type(){return"InstanceNode"}constructor(e,t,r){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Ms.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=Du(r.array,"mat4",Math.max(t,1)).element(nc);else{const e=new R(r.array,16,1);this.buffer=e;const t=r.usage===f?cu:du,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=Ji(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new C(s.array,3),t=s.usage===f?cu:du;this.bufferColor=e,n=$i(t(e,"vec3",3,0)),this.instanceColorNode=n}const o=i.mul(ml).xyz;if(ml.assign(o),e.hasGeometryAttribute("normal")){const e=Fl(Al,i);Al.assign(e)}null!==this.instanceColorNode&&mn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==f&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==f&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const cc=Ci(dc);class hc extends dc{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const pc=Ci(hc);class gc extends Vs{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=nc:this.batchingIdNode=lc);const t=wi((([e])=>{const t=Mu(Iu(this.batchMesh._indirectTexture),0),r=Li(e).modInt(Li(t)),s=Li(e).div(Li(t));return Iu(this.batchMesh._indirectTexture,Gi(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Li(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=Mu(Iu(s),0),n=Ii(r).mul(4).toInt().toVar(),o=n.modInt(i),a=n.div(Li(i)),u=Ji(Iu(s,Gi(o,a)),Iu(s,Gi(o.add(1),a)),Iu(s,Gi(o.add(2),a)),Iu(s,Gi(o.add(3),a))),l=this.batchMesh._colorsTexture;if(null!==l){const e=wi((([e])=>{const t=Mu(Iu(l),0).x,r=e,s=r.modInt(t),i=r.div(t);return Iu(l,Gi(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);mn("vec3","vBatchColor").assign(t)}const d=Zi(u);ml.assign(u.mul(ml));const c=Al.div($i(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;Al.assign(h),e.hasGeometryAttribute("tangent")&&Xl.mulAssign(d)}}const mc=Ci(gc),fc=new WeakMap;class yc extends Vs{static get type(){return"SkinningNode"}constructor(e,t=!1){let r,s,i;super("void"),this.skinnedMesh=e,this.useReference=t,this.updateType=Ms.OBJECT,this.skinIndexNode=Cu("skinIndex","uvec4"),this.skinWeightNode=Cu("skinWeight","vec4"),t?(r=$l("bindMatrix","mat4"),s=$l("bindMatrixInverse","mat4"),i=Wl("skeleton.boneMatrices","mat4",e.skeleton.bones.length)):(r=hn(e.bindMatrix,"mat4"),s=hn(e.bindMatrixInverse,"mat4"),i=Du(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length)),this.bindMatrixNode=r,this.bindMatrixInverseNode=s,this.boneMatricesNode=i,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=ml){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=Kn(o.mul(s.x).mul(d),a.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=Al){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=Kn(s.x.mul(o),s.y.mul(a),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=Wl("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,fl)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===As(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&fl.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(ml.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();Al.assign(t),e.hasGeometryAttribute("tangent")&&Xl.assign(t)}}generate(e,t){if("void"!==t)return ml.build(e,t)}update(e){const t=(this.useReference?e.object:this.skinnedMesh).skeleton;fc.get(t)!==e.frameId&&(fc.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const xc=e=>Si(new yc(e,!0));class bc extends Vs{static get type(){return"LoopNode"}constructor(e=[]){super(),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(n)?">=":"<"));const d={start:i,end:n,condition:u},c=d.start,h=d.end;let p="",g="",m="";l||(l="int"===a||"uint"===a?u.includes("<")?"++":"--":u.includes("<")?"+= 1.":"-= 1."),p+=e.getVar(a,o)+" = "+c,g+=o+" "+u+" "+h,m+=o+" "+l;const f=`for ( ${p}; ${g}; ${m} )`;e.addFlowCode((0===t?"\n":"")+e.tab+f+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tSi(new bc(Ri(e,"int"))).append(),_c=()=>vu("break").append(),vc=new WeakMap,Nc=new s,Sc=wi((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const o=Li(ic).mul(r).add(n),a=o.div(s),u=o.sub(a.mul(s));return Iu(e,Gi(u,a)).depth(i).mul(t)}));class Ac extends Vs{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=hn(1),this.updateType=Ms.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,o=void 0!==n?n.length:0,{texture:a,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,o=void 0!==n?n.length:0;let a=vc.get(e);if(void 0===a||a.count!==o){void 0!==a&&a.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*o),f=new E(m,h,p,o);f.type=w,f.needsUpdate=!0;const y=4*c;for(let b=0;b{const t=Ii(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Iu(this.mesh.morphTexture,Gi(Li(e).add(1),Li(nc))).r):t.assign($l("morphTargetInfluences","float").element(e).toVar()),!0===s&&ml.addAssign(Sc({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Li(0)})),!0===i&&Al.addAssign(Sc({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Li(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 Rc=Ci(Ac);class Cc extends Vs{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Ec extends Cc{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class wc extends Pa{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:$i().toVar("directDiffuse"),directSpecular:$i().toVar("directSpecular"),indirectDiffuse:$i().toVar("indirectDiffuse"),indirectSpecular:$i().toVar("indirectSpecular")};return{radiance:$i().toVar("radiance"),irradiance:$i().toVar("irradiance"),iblIrradiance:$i().toVar("iblIrradiance"),ambientOcclusion:Ii(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 Mc=Ci(wc);class Bc extends Cc{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let Fc,Uc;class Pc extends Vs{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===Pc.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Ms.NONE;return this.scope!==Pc.SIZE&&this.scope!==Pc.VIEWPORT||(e=Ms.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Pc.VIEWPORT?null!==t?Uc.copy(t.viewport):(e.getViewport(Uc),Uc.multiplyScalar(e.getPixelRatio())):null!==t?(Fc.width=t.width,Fc.height=t.height):e.getDrawingBufferSize(Fc)}setup(){const e=this.scope;let r=null;return r=e===Pc.SIZE?hn(Fc||(Fc=new t)):e===Pc.VIEWPORT?hn(Uc||(Uc=new s)):Oi(Dc.div(Lc)),r}generate(e){if(this.scope===Pc.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Lc).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Pc.COORDINATE="coordinate",Pc.VIEWPORT="viewport",Pc.SIZE="size",Pc.UV="uv";const Ic=Ei(Pc,Pc.UV),Lc=Ei(Pc,Pc.SIZE),Dc=Ei(Pc,Pc.COORDINATE),Vc=Ei(Pc,Pc.VIEWPORT),Oc=Vc.zw,Gc=Dc.sub(Vc.xy),kc=Gc.div(Oc),zc=wi((()=>(console.warn('TSL.ViewportNode: "viewportResolution" is deprecated. Use "screenSize" instead.'),Lc)),"vec2").once()(),$c=wi((()=>(console.warn('TSL.ViewportNode: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),Ic)),"vec2").once()(),Wc=wi((()=>(console.warn('TSL.ViewportNode: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),Ic.flipY())),"vec2").once()(),Hc=new t;class jc extends Uu{static get type(){return"ViewportTextureNode"}constructor(e=Ic,t=null,r=null){null===r&&((r=new M).minFilter=B),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=Ms.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(Hc);const r=this.value;r.image.width===Hc.width&&r.image.height===Hc.height||(r.image.width=Hc.width,r.image.height=Hc.height,r.needsUpdate=!0);const s=r.generateMipmaps;r.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(r),r.generateMipmaps=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const qc=Ci(jc),Xc=Ci(jc,null,null,{generateMipmaps:!0});let Kc=null;class Yc extends jc{static get type(){return"ViewportDepthTextureNode"}constructor(e=Ic,t=null){null===Kc&&(Kc=new F),super(e,t,Kc)}}const Qc=Ci(Yc);class Zc extends Vs{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===Zc.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Zc.DEPTH_BASE)null!==r&&(s=sh().assign(r));else if(t===Zc.DEPTH)s=e.isPerspectiveCamera?eh(bl.z,zu,$u):Jc(bl.z,zu,$u);else if(t===Zc.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=th(r,zu,$u);s=Jc(e,zu,$u)}else s=r;else s=Jc(bl.z,zu,$u);return s}}Zc.DEPTH_BASE="depthBase",Zc.DEPTH="depth",Zc.LINEAR_DEPTH="linearDepth";const Jc=(e,t,r)=>e.add(t).div(t.sub(r)),eh=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),th=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),rh=(e,t,r)=>{t=t.max(1e-6).toVar();const s=Mo(e.negate().div(t)),i=Mo(r.div(t));return s.div(i)},sh=Ci(Zc,Zc.DEPTH_BASE),ih=Ei(Zc,Zc.DEPTH),nh=Ci(Zc,Zc.LINEAR_DEPTH),oh=nh(Qc());ih.assign=e=>sh(e);const ah=Ci(class extends Vs{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}});class uh extends Vs{static get type(){return"ClippingNode"}constructor(e=uh.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===uh.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===uh.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return wi((()=>{const r=Ii().toVar("distanceToPlane"),s=Ii().toVar("distanceToGradient"),i=Ii(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Gu(t);Tc(n,(({i:t})=>{const n=e.element(t);r.assign(bl.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(Na(s.negate(),s,r))}))}const o=e.length;if(o>0){const t=Gu(e),n=Ii(1).toVar("intersectionClipOpacity");Tc(o,(({i:e})=>{const i=t.element(e);r.assign(bl.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(Na(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}fn.a.mulAssign(i),fn.a.equal(0).discard()}))()}setupDefault(e,t){return wi((()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Gu(t);Tc(r,(({i:t})=>{const r=e.element(t);bl.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=Gu(e),r=Vi(!0).toVar("clipped");Tc(s,(({i:e})=>{const s=t.element(e);r.assign(bl.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),wi((()=>{const s=Gu(e),i=ah(t.getClipDistance());Tc(r,(({i:e})=>{const t=s.element(e),r=bl.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}uh.ALPHA_TO_COVERAGE="alphaToCoverage",uh.DEFAULT="default",uh.HARDWARE="hardware";const lh=wi((([e])=>Lo(Qn(1e4,Do(Qn(17,e.x).add(Qn(.1,e.y)))).mul(Kn(.1,$o(Do(Qn(13,e.y).add(e.x)))))))),dh=wi((([e])=>lh(Oi(lh(e.xy),e.z)))),ch=wi((([e])=>{const t=ia(Ho(Xo(e.xyz)),Ho(Ko(e.xyz))),r=Ii(1).div(Ii(.05).mul(t)).toVar("pixScale"),s=Oi(Eo(Uo(Mo(r))),Eo(Po(Mo(r)))),i=Oi(dh(Uo(s.x.mul(e.xyz))),dh(Uo(s.y.mul(e.xyz)))),n=Lo(Mo(r)),o=Kn(Qn(n.oneMinus(),i.x),Qn(n,i.y)),a=sa(n,n.oneMinus()),u=$i(o.mul(o).div(Qn(2,a).mul(Yn(1,a))),o.sub(Qn(.5,a)).div(Yn(1,a)),Yn(1,Yn(1,o).mul(Yn(1,o)).div(Qn(2,a).mul(Yn(1,a))))),l=o.lessThan(a.oneMinus()).select(o.lessThan(a).select(u.x,u.y),u.z);return Ta(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class hh extends U{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.positionNode=null,this.geometryNode=null,this.depthNode=null,this.shadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null}customProgramCacheKey(){return this.type+fs(this)}build(e){this.setup(e)}setupObserver(e){return new cs(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=this.vertexNode||this.setupVertex(e);let i;e.stack.outputNode=s,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const n=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!==n&&e.stack.add(n);const o=qi(s,fn.a).max(0);if(i=this.setupOutput(e,o),Pn.assign(i),null!==this.outputNode&&(i=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(i=e,null!==r&&(i=e.merge(r))):null!==r&&(i=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=qi(t)),i=this.setupOutput(e,t)}e.stack.outputNode=i,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.samples;this.alphaToCoverage&&t>1?s=Si(new uh(uh.ALPHA_TO_COVERAGE)):e.stack.add(Si(new uh))}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.add(Si(new uh(uh.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?rh(bl.z,zu,$u):Jc(bl.z,zu,$u))}null!==s&&ih.assign(s).append()}setupPositionView(){return dl.mul(ml).xyz}setupModelViewProjection(){return Wu.mul(bl)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),rc}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&Rc(t).append(),!0===t.isSkinnedMesh&&xc(t).append(),this.displacementMap){const e=jl("displacementMap","texture"),t=jl("displacementScale","float"),r=jl("displacementBias","float");ml.addAssign(Al.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&mc(t).append(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&pc(t).append(),null!==this.positionNode&&ml.assign(this.positionNode.context({isPositionNodeInput:!0})),ml}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?qi(this.colorNode):bd;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=qi(r.xyz.mul(Cu("color","vec3")),r.a)),e.instanceColor){r=mn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=mn("vec3","vBatchColor").mul(r)}fn.assign(r);const s=this.opacityNode?Ii(this.opacityNode):vd;if(fn.a.assign(fn.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?Ii(this.alphaTestNode):xd;fn.a.lessThanEqual(e).discard()}!0===this.alphaHash&&fn.a.lessThan(ch(ml)).discard(),!1===this.transparent&&this.blending===P&&!1===this.alphaToCoverage&&fn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?$i(0):fn.rgb}setupNormal(){return this.normalNode?$i(this.normalNode):Md}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?jl("envMap","cubeTexture"):jl("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Bc(Jd)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:ec;t.push(new Ec(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}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 o=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e);o=Mc(n,t,r,s)}else null!==r&&(o=$i(null!==s?ba(o,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(yn.assign($i(i||_d)),o=o.add(yn)),o}setupOutput(e,t){if(!0===this.fog){const r=e.fogNode;r&&(Pn.assign(t),t=qi(r))}return 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=U.prototype.toJSON.call(this,e),s=ys(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,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.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.shadowPositionNode=e.shadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const ph=new I;class gh extends hh{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(ph),this.setValues(e)}}const mh=new L;class fh extends hh{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(mh),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?Ii(this.offsetNode):Yd,t=this.dashScaleNode?Ii(this.dashScaleNode):jd,r=this.dashSizeNode?Ii(this.dashSizeNode):qd,s=this.gapSizeNode?Ii(this.gapSizeNode):Xd;In.assign(r),Ln.assign(s);const i=$a(Cu("lineDistance").mul(t));(e?i.add(e):i).mod(In.add(Ln)).greaterThan(In).discard()}}let yh=null;class xh extends jc{static get type(){return"ViewportSharedTextureNode"}constructor(e=Ic,t=null){null===yh&&(yh=new M),super(e,t,yh)}updateReference(){return this}}const bh=Ci(xh),Th=new L;class _h extends hh{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(Th),this.useColor=e.vertexColors,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=D,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,o=wi((({start:e,end:t})=>{const r=Wu.element(2).element(2),s=Wu.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return qi(ba(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=wi((()=>{const e=Cu("instanceStart"),t=Cu("instanceEnd"),r=qi(dl.mul(qi(e,1))).toVar("start"),s=qi(dl.mul(qi(t,1))).toVar("end");if(i){const e=this.dashScaleNode?Ii(this.dashScaleNode):jd,t=this.offsetNode?Ii(this.offsetNode):Yd,r=Cu("instanceDistanceStart"),s=Cu("instanceDistanceEnd");let i=gl.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),mn("float","lineDistance").assign(i)}n&&(mn("vec3","worldStart").assign(r.xyz),mn("vec3","worldEnd").assign(s.xyz));const a=Vc.z.div(Vc.w),u=Wu.element(2).element(3).equal(-1);Fi(u,(()=>{Fi(r.z.lessThan(0).and(s.z.greaterThan(0)),(()=>{s.assign(o({start:r,end:s}))})).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(o({start:s,end:r}))}))}));const l=Wu.mul(r),d=Wu.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(a)),p.assign(p.normalize());const g=qi().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=ba(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),o=e.cross(n),a=mn("vec4","worldPos");a.assign(gl.y.lessThan(.5).select(r,s));const u=Kd.mul(.5);a.addAssign(qi(gl.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(a.addAssign(qi(gl.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),a.addAssign(qi(o.mul(u),0)),Fi(gl.y.greaterThan(1).or(gl.y.lessThan(0)),(()=>{a.subAssign(qi(o.mul(2).mul(u),0))}))),g.assign(Wu.mul(a));const l=$i().toVar();l.assign(gl.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Oi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(a)),e.x.assign(e.x.div(a)),e.assign(gl.x.lessThan(0).select(e.negate(),e)),Fi(gl.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(gl.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(Kd)),e.assign(e.div(Vc.w)),g.assign(gl.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(qi(e,0,0)))}return g}))();const a=wi((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),o=t.sub(e),a=i.dot(n),u=n.dot(o),l=i.dot(o),d=n.dot(n),c=o.dot(o).mul(d).sub(u.mul(u)),h=a.mul(u).sub(l.mul(d)).div(c).clamp(),p=a.add(u.mul(h)).div(d).clamp();return Oi(h,p)}));if(this.colorNode=wi((()=>{const e=Eu();if(i){const t=this.dashSizeNode?Ii(this.dashSizeNode):qd,r=this.gapSizeNode?Ii(this.gapSizeNode):Xd;In.assign(t),Ln.assign(r);const s=mn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(In.add(Ln)).greaterThan(In).discard()}const o=Ii(1).toVar("alpha");if(n){const e=mn("vec3","worldStart"),s=mn("vec3","worldEnd"),n=mn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=a({p1:e,p2:s,p3:$i(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Kd);if(!i)if(r&&t.samples>1){const e=h.fwidth();o.assign(Na(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){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=Ii(s.fwidth()).toVar("dlen");Fi(e.y.abs().greaterThan(1),(()=>{o.assign(Na(i.oneMinus(),i.add(1),s).oneMinus())}))}else Fi(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=Cu("instanceColorStart"),t=Cu("instanceColorEnd");u=gl.y.lessThan(.5).select(e,t).mul(bd)}else u=bd;return qi(u,o)}))(),this.transparent){const e=this.opacityNode?Ii(this.opacityNode):vd;this.outputNode=qi(this.colorNode.rgb.mul(e).add(bh().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 vh=e=>Si(e).mul(.5).add(.5),Nh=new V;class Sh extends hh{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Nh),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?Ii(this.opacityNode):vd;fn.assign(qi(vh(wl),e))}}class Ah extends ks{static get type(){return"EquirectUVNode"}constructor(e=xl){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,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 Oi(t,r)}}const Rh=Ci(Ah);class Ch extends O{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 G(5,5,5),n=Rh(xl),o=new hh;o.colorNode=Pu(t,n,0),o.side=_,o.blending=D;const a=new k(i,o),u=new z;u.add(a),t.minFilter===B&&(t.minFilter=$);const l=new W(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,a.geometry.dispose(),a.material.dispose(),this}}const Eh=new WeakMap;class wh extends ks{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=Gl();const t=new H;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Ms.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===j||r===q){if(Eh.has(e)){const t=Eh.get(e);Bh(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Ch(r.height);s.fromEquirectangularTexture(t,e),Bh(s.texture,e.mapping),this._cubeTexture=s.texture,Eh.set(e,s.texture),e.addEventListener("dispose",Mh)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function Mh(e){const t=e.target;t.removeEventListener("dispose",Mh);const r=Eh.get(t);void 0!==r&&(Eh.delete(t),r.dispose())}function Bh(e,t){t===j?e.mapping=v:t===q&&(e.mapping=N)}const Fh=Ci(wh);class Uh extends Cc{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=Fh(this.envNode)}}class Ph extends Cc{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=Ii(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class Ih{start(){}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class Lh extends Ih{constructor(){super()}indirect(e,t,r){const s=e.ambientOcclusion,i=e.reflectedLight,n=r.context.irradianceLightMap;i.indirectDiffuse.assign(qi(0)),n?i.indirectDiffuse.addAssign(n):i.indirectDiffuse.addAssign(qi(1,1,1,0)),i.indirectDiffuse.mulAssign(s),i.indirectDiffuse.mulAssign(fn.rgb)}finish(e,t,r){const s=r.material,i=e.outgoingLight,n=r.context.environment;if(n)switch(s.combine){case Y:i.rgb.assign(ba(i.rgb,i.rgb.mul(n.rgb),Rd.mul(Cd)));break;case K:i.rgb.assign(ba(i.rgb,n.rgb,Rd.mul(Cd)));break;case X:i.rgb.addAssign(n.rgb.mul(Rd.mul(Cd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",s.combine)}}}const Dh=new Q;class Vh extends hh{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Dh),this.setValues(e)}setupNormal(){return Cl}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Uh(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Ph(Jd)),t}setupOutgoingLight(){return fn.rgb}setupLightingModel(){return new Lh}}const Oh=wi((({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))})),Gh=wi((e=>e.diffuseColor.mul(1/Math.PI))),kh=wi((({dotNH:e})=>Un.mul(Ii(.5)).add(1).mul(Ii(1/Math.PI)).mul(e.pow(Un)))),zh=wi((({lightDirection:e})=>{const t=e.add(Tl).normalize(),r=wl.dot(t).clamp(),s=Tl.dot(t).clamp(),i=Oh({f0:Bn,f90:1,dotVH:s}),n=Ii(.25),o=kh({dotNH:r});return i.mul(n).mul(o)}));class $h extends Lh{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=wl.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Gh({diffuseColor:fn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(zh({lightDirection:e})).mul(Rd))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Gh({diffuseColor:fn}))),r.indirectDiffuse.mulAssign(e)}}const Wh=new Z;class Hh extends hh{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Wh),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Uh(t):null}setupLightingModel(){return new $h(!1)}}const jh=new J;class qh extends hh{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(jh),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Uh(t):null}setupLightingModel(){return new $h}setupVariants(){const e=(this.shininessNode?Ii(this.shininessNode):Td).max(1e-4);Un.assign(e);const t=this.specularNode||Nd;Bn.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Xh=wi((e=>{if(!1===e.geometry.hasAttribute("normal"))return Ii(0);const t=Cl.dFdx().abs().max(Cl.dFdy().abs());return t.x.max(t.y).max(t.z)})),Kh=wi((e=>{const{roughness:t}=e,r=Xh();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),Yh=wi((({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 Zn(.5,i.add(n).max(bo))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Qh=wi((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:o,dotNL:a})=>{const u=a.mul($i(e.mul(r),t.mul(s),o).length()),l=o.mul($i(e.mul(i),t.mul(n),a).length());return Zn(.5,u.add(l)).saturate()})).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"}]}),Zh=wi((({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"}]}),Jh=Ii(1/Math.PI),ep=wi((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),o=$i(t.mul(s),e.mul(i),n.mul(r)),a=o.dot(o),u=n.div(a);return Jh.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"}]}),tp=wi((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:o,USE_ANISOTROPY:a}=e,u=e.normalView||wl,l=i.pow2(),d=t.add(Tl).normalize(),c=u.dot(t).clamp(),h=u.dot(Tl).clamp(),p=u.dot(d).clamp(),g=Tl.dot(d).clamp();let m,f,y=Oh({f0:r,f90:s,dotVH:g});if(_i(o)&&(y=Sn.mix(y,n)),_i(a)){const e=wn.dot(t),r=wn.dot(Tl),s=wn.dot(d),i=Mn.dot(t),n=Mn.dot(Tl),o=Mn.dot(d);m=Qh({alphaT:Cn,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=ep({alphaT:Cn,alphaB:l,dotNH:p,dotTH:s,dotBH:o})}else m=Yh({alpha:l,dotNL:c,dotNV:h}),f=Zh({alpha:l,dotNH:p});return y.mul(m).mul(f)})),rp=wi((({roughness:e,dotNV:t})=>{const r=qi(-1,-.0275,-.572,.022),s=qi(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return Oi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),sp=wi((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=rp({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),ip=wi((({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($i(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"}]}),np=wi((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=Ii(1).div(r),i=t.pow2().oneMinus().max(.0078125);return Ii(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"}]}),op=wi((({dotNV:e,dotNL:t})=>Ii(1).div(Ii(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),ap=wi((({lightDirection:e})=>{const t=e.add(Tl).normalize(),r=wl.dot(e).clamp(),s=wl.dot(Tl).clamp(),i=wl.dot(t).clamp(),n=np({roughness:Nn,dotNH:i}),o=op({dotNV:s,dotNL:r});return vn.mul(n).mul(o)})),up=wi((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Oi(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"}]}),lp=wi((({f:e})=>{const t=e.length();return ia(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),dp=wi((({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(),o=i.div(n),a=r.greaterThan(0).select(o,ia(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(o));return e.cross(t).mul(a)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),cp=wi((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:o,p3:a})=>{const u=n.sub(i).toVar(),l=a.sub(i).toVar(),d=u.cross(l),c=$i().toVar();return Fi(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(Zi(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(o.sub(r)).normalize().toVar(),m=d.mul(a.sub(r)).normalize().toVar(),f=$i(0).toVar();f.addAssign(dp({v1:h,v2:p})),f.addAssign(dp({v1:p,v2:g})),f.addAssign(dp({v1:g,v2:m})),f.addAssign(dp({v1:m,v2:h})),c.assign($i(lp({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"}]}),hp=1/6,pp=e=>Qn(hp,Qn(e,Qn(e,e.negate().add(3)).sub(3)).add(1)),gp=e=>Qn(hp,Qn(e,Qn(e,Qn(3,e).sub(6))).add(4)),mp=e=>Qn(hp,Qn(e,Qn(e,Qn(-3,e).add(3)).add(3)).add(1)),fp=e=>Qn(hp,ha(e,3)),yp=e=>pp(e).add(gp(e)),xp=e=>mp(e).add(fp(e)),bp=e=>Kn(-1,gp(e).div(pp(e).add(gp(e)))),Tp=e=>Kn(1,fp(e).div(mp(e).add(fp(e)))),_p=(e,t,r)=>{const s=e.uvNode,i=Qn(s,t.zw).add(.5),n=Uo(i),o=Lo(i),a=yp(o.x),u=xp(o.x),l=bp(o.x),d=Tp(o.x),c=bp(o.y),h=Tp(o.y),p=Oi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Oi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Oi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Oi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=yp(o.y).mul(Kn(a.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),x=xp(o.y).mul(Kn(a.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(x)},vp=wi((([e,t=Ii(3)])=>{const r=Oi(e.size(Li(t))),s=Oi(e.size(Li(t.add(1)))),i=Zn(1,r),n=Zn(1,s),o=_p(e,qi(i,r),Uo(t)),a=_p(e,qi(n,s),Po(t));return Lo(t).mix(o,a)})),Np=wi((([e,t,r,s,i])=>{const n=$i(va(t.negate(),Io(e),Zn(1,s))),o=$i(Ho(i[0].xyz),Ho(i[1].xyz),Ho(i[2].xyz));return Io(n).mul(r.mul(o))})).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"}]}),Sp=wi((([e,t])=>e.mul(Ta(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),Ap=Xc(),Rp=Xc(),Cp=wi((([e,t,r],{material:s})=>{const i=(s.side===_?Ap:Rp).sample(e),n=Mo(Lc.x).mul(Sp(t,r));return vp(i,n)})),Ep=wi((([e,t,r])=>(Fi(r.notEqual(0),(()=>{const s=wo(t).negate().div(r);return Co(s.negate().mul(e))})),$i(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),wp=wi((([e,t,r,s,i,n,o,a,u,l,d,c,h,p,g])=>{let m,f;if(g){m=qi().toVar(),f=$i().toVar();const i=d.sub(1).mul(g.mul(.025)),n=$i(d.sub(i),d,d.add(i));Tc({start:0,end:3},(({i:i})=>{const d=n.element(i),g=Np(e,t,c,d,a),y=o.add(g),x=l.mul(u.mul(qi(y,1))),b=Oi(x.xy.div(x.w)).toVar();b.addAssign(1),b.divAssign(2),b.assign(Oi(b.x,b.y.oneMinus()));const T=Cp(b,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Ep(Ho(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=Np(e,t,c,d,a),n=o.add(i),g=l.mul(u.mul(qi(n,1))),y=Oi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Oi(y.x,y.y.oneMinus())),m=Cp(y,r,d),f=s.mul(Ep(Ho(i),h,p))}const y=f.rgb.mul(m.rgb),x=e.dot(t).clamp(),b=$i(sp({dotNV:x,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return qi(b.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),Mp=Zi(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Bp=(e,t)=>e.sub(t).div(e.add(t)).pow2(),Fp=wi((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=ba(e,t,Na(0,.03,s)),o=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();Fi(o.lessThan(0),(()=>$i(1)));const a=o.sqrt(),u=Bp(n,e),l=Oh({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=Ii(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return $i(1).add(t).div($i(1).sub(t))})(i.clamp(0,.9999)),g=Bp(p,n.toVec3()),m=Oh({f0:g,f90:1,dotVH:a}),f=$i(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,a,2),x=$i(h).add(f),b=l.mul(m).clamp(1e-5,.9999),T=b.sqrt(),_=d.pow2().mul(m).div($i(1).sub(b)),v=l.add(_).toVar(),N=_.sub(d).toVar();return Tc({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=$i(54856e-17,44201e-17,52481e-17),i=$i(1681e3,1795300,2208400),n=$i(43278e5,93046e5,66121e5),o=Ii(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let a=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return a=$i(a.x.add(o),a.y,a.z).div(1.0685e-7),Mp.mul(a)})(Ii(e).mul(y),Ii(e).mul(x)).mul(2);v.addAssign(N.mul(t))})),v.max($i(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"}]}),Up=wi((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=Fa(r.lessThan(.25),Ii(-339.2).mul(i).add(Ii(161.4).mul(r)).sub(25.9),Ii(-8.48).mul(i).add(Ii(14.3).mul(r)).sub(9.95)),o=Fa(r.lessThan(.25),Ii(44).mul(i).sub(Ii(23.7).mul(r)).add(3.26),Ii(1.97).mul(i).sub(Ii(3.27).mul(r)).add(.72));return Fa(r.lessThan(.25),0,Ii(.1).mul(r).sub(.025)).add(n.mul(s).add(o).exp()).mul(1/Math.PI).saturate()})),Pp=$i(.04),Ip=Ii(1);class Lp extends Ih{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}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=$i().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=$i().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=$i().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=$i().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=$i().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=wl.dot(Tl).clamp();this.iridescenceFresnel=Fp({outsideIOR:Ii(1),eta2:An,cosTheta1:e,thinFilmThickness:Rn,baseF0:Bn}),this.iridescenceF0=ip({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=yl,r=Ku.sub(yl).normalize(),s=Ml;e.backdrop=wp(s,r,xn,fn,Bn,Fn,t,il,ju,Wu,Vn,Gn,zn,kn,this.dispersion?$n:null),e.backdropAlpha=On,fn.a.mulAssign(ba(1,e.backdrop.a,On))}}computeMultiscattering(e,t,r){const s=wl.dot(Tl).clamp(),i=rp({roughness:xn,dotNV:s}),n=(this.iridescenceF0?Sn.mix(Bn,this.iridescenceF0):Bn).mul(i.x).add(r.mul(i.y)),o=i.x.add(i.y).oneMinus(),a=Bn.add(Bn.oneMinus().mul(.047619)),u=n.mul(a).div(o.mul(a).oneMinus());e.addAssign(n),t.addAssign(u.mul(o))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=wl.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(ap({lightDirection:e}))),!0===this.clearcoat){const r=Bl.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(tp({lightDirection:e,f0:Pp,f90:Ip,roughness:_n,normalView:Bl})))}r.directDiffuse.addAssign(s.mul(Gh({diffuseColor:fn.rgb}))),r.directSpecular.addAssign(s.mul(tp({lightDirection:e,f0:Bn,f90:1,roughness:xn,iridescence:this.iridescence,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:o}){const a=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=wl,h=Tl,p=bl.toVar(),g=up({N:c,V:h,roughness:xn}),m=n.sample(g).toVar(),f=o.sample(g).toVar(),y=Zi($i(m.x,0,m.y),$i(0,1,0),$i(m.z,0,m.w)).toVar(),x=Bn.mul(f.x).add(Bn.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(x).mul(cp({N:c,V:h,P:p,mInv:y,p0:a,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(fn).mul(cp({N:c,V:h,P:p,mInv:Zi(1,0,0,0,1,0,0,0,1),p0:a,p1:u,p2:l,p3:d})))}indirect(e,t,r){this.indirectDiffuse(e,t,r),this.indirectSpecular(e,t,r),this.ambientOcclusion(e,t,r)}indirectDiffuse({irradiance:e,reflectedLight:t}){t.indirectDiffuse.addAssign(e.mul(Gh({diffuseColor:fn})))}indirectSpecular({radiance:e,iblIrradiance:t,reflectedLight:r}){if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(t.mul(vn,Up({normal:wl,viewDir:Tl,roughness:Nn}))),!0===this.clearcoat){const e=Bl.dot(Tl).clamp(),t=sp({dotNV:e,specularColor:Pp,specularF90:Ip,roughness:_n});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const s=$i().toVar("singleScattering"),i=$i().toVar("multiScattering"),n=t.mul(1/Math.PI);this.computeMultiscattering(s,i,Fn);const o=s.add(i),a=fn.mul(o.r.max(o.g).max(o.b).oneMinus());r.indirectSpecular.addAssign(e.mul(s)),r.indirectSpecular.addAssign(i.mul(n)),r.indirectDiffuse.addAssign(a.mul(n))}ambientOcclusion({ambientOcclusion:e,reflectedLight:t}){const r=wl.dot(Tl).clamp().add(e),s=xn.mul(-16).oneMinus().negate().exp2(),i=e.sub(r.pow(s).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(e),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(e),t.indirectDiffuse.mulAssign(e),t.indirectSpecular.mulAssign(i)}finish(e){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Bl.dot(Tl).clamp(),r=Oh({dotVH:e,f0:Pp,f90:Ip}),s=t.mul(Tn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(Tn));t.assign(s)}if(!0===this.sheen){const e=vn.r.max(vn.g).max(vn.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const Dp=Ii(1),Vp=Ii(-2),Op=Ii(.8),Gp=Ii(-1),kp=Ii(.4),zp=Ii(2),$p=Ii(.305),Wp=Ii(3),Hp=Ii(.21),jp=Ii(4),qp=Ii(4),Xp=Ii(16),Kp=wi((([e])=>{const t=$i($o(e)).toVar(),r=Ii(-1).toVar();return Fi(t.x.greaterThan(t.z),(()=>{Fi(t.x.greaterThan(t.y),(()=>{r.assign(Fa(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(Fa(e.y.greaterThan(0),1,4))}))})).Else((()=>{Fi(t.z.greaterThan(t.y),(()=>{r.assign(Fa(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(Fa(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Yp=wi((([e,t])=>{const r=Oi().toVar();return Fi(t.equal(0),(()=>{r.assign(Oi(e.z,e.y).div($o(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(Oi(e.x.negate(),e.z.negate()).div($o(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(Oi(e.x.negate(),e.y).div($o(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(Oi(e.z.negate(),e.y).div($o(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(Oi(e.x.negate(),e.z).div($o(e.y)))})).Else((()=>{r.assign(Oi(e.x,e.y).div($o(e.z)))})),Qn(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Qp=wi((([e])=>{const t=Ii(0).toVar();return Fi(e.greaterThanEqual(Op),(()=>{t.assign(Dp.sub(e).mul(Gp.sub(Vp)).div(Dp.sub(Op)).add(Vp))})).ElseIf(e.greaterThanEqual(kp),(()=>{t.assign(Op.sub(e).mul(zp.sub(Gp)).div(Op.sub(kp)).add(Gp))})).ElseIf(e.greaterThanEqual($p),(()=>{t.assign(kp.sub(e).mul(Wp.sub(zp)).div(kp.sub($p)).add(zp))})).ElseIf(e.greaterThanEqual(Hp),(()=>{t.assign($p.sub(e).mul(jp.sub(Wp)).div($p.sub(Hp)).add(Wp))})).Else((()=>{t.assign(Ii(-2).mul(Mo(Qn(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Zp=wi((([e,t])=>{const r=e.toVar();r.assign(Qn(2,r).sub(1));const s=$i(r,1).toVar();return Fi(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"}]}),Jp=wi((([e,t,r,s,i,n])=>{const o=Ii(r),a=$i(t),u=Ta(Qp(o),Vp,n),l=Lo(u),d=Uo(u),c=$i(eg(e,a,d,s,i,n)).toVar();return Fi(l.notEqual(0),(()=>{const t=$i(eg(e,a,d.add(1),s,i,n)).toVar();c.assign(ba(c,t,l))})),c})),eg=wi((([e,t,r,s,i,n])=>{const o=Ii(r).toVar(),a=$i(t),u=Ii(Kp(a)).toVar(),l=Ii(ia(qp.sub(o),0)).toVar();o.assign(ia(o,qp));const d=Ii(Eo(o)).toVar(),c=Oi(Yp(a,u).mul(d.sub(2)).add(1)).toVar();return Fi(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(Qn(3,Xp))),c.y.addAssign(Qn(4,Eo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(Oi(),Oi())})),tg=wi((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:a})=>{const u=Vo(s),l=r.mul(u).add(i.cross(r).mul(Do(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return eg(e,l,t,n,o,a)})),rg=wi((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:o,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=$i(Fa(t,r,ca(r,s))).toVar();Fi(No(h.equals($i(0))),(()=>{h.assign($i(s.z,0,s.x.negate()))})),h.assign(Io(h));const p=$i().toVar();return p.addAssign(i.element(Li(0)).mul(tg({theta:0,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),Tc({start:Li(1),end:e},(({i:e})=>{Fi(e.greaterThanEqual(n),(()=>{_c()}));const t=Ii(o.mul(Ii(e))).toVar();p.addAssign(i.element(e).mul(tg({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(tg({theta:t,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),qi(p,1)}));let sg=null;const ig=new WeakMap;function ng(e){let t=ig.get(e);if((void 0!==t?t.pmremVersion:-1)!==e.pmremVersion){const r=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(r))return null;t=sg.fromEquirectangular(e,t)}t.pmremVersion=e.pmremVersion,ig.set(e,t)}return t.texture}class og extends ks{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 ee;s.isRenderTargetTexture=!0,this._texture=Pu(s),this._width=hn(0),this._height=hn(0),this._maxMip=hn(0),this.updateBeforeType=Ms.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(){let e=this._pmrem;const t=e?e.pmremVersion:-1,r=this._value;t!==r.pmremVersion&&(e=!0===r.isPMREMTexture?r:ng(r),null!==e&&(this._pmrem=e,this.updateFromTexture(e)))}setup(e){null===sg&&(sg=e.createPMREMGenerator()),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this));const r=this.value;e.renderer.coordinateSystem===l&&!0!==r.isPMREMTexture&&!0===r.isRenderTargetTexture&&(t=$i(t.x.negate(),t.yz)),t=$i(t.x,t.y.negate(),t.z);let s=this.levelNode;return null===s&&e.context.getTextureLevel&&(s=e.context.getTextureLevel(this)),Jp(this._texture,t,s,this._width,this._height,this._maxMip)}}const ag=Ci(og),ug=new WeakMap;class lg extends Cc{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=ug.get(e);void 0===s&&(s=ag(e),ug.set(e,s)),r=s}const s=t.envMap?$l("envMapIntensity","float",e.material):$l("environmentIntensity","float",e.scene),i=!0===t.useAnisotropy||t.anisotropy>0?ud:wl,n=r.context(dg(xn,i)).mul(s),o=r.context(cg(Ml)).mul(Math.PI).mul(s),a=mu(n),u=mu(o);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(u);const l=e.context.lightingModel.clearcoatRadiance;if(l){const e=r.context(dg(_n,Bl)).mul(s),t=mu(e);l.addAssign(t)}}}const dg=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Tl.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(ju)),r),getTextureLevel:()=>e}},cg=e=>({getUV:()=>e,getTextureLevel:()=>Ii(1)}),hg=new te;class pg extends hh{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(hg),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new lg(t):null}setupLightingModel(){return new Lp}setupSpecular(){const e=ba($i(.04),fn.rgb,bn);Bn.assign(e),Fn.assign(1)}setupVariants(){const e=this.metalnessNode?Ii(this.metalnessNode):wd;bn.assign(e);let t=this.roughnessNode?Ii(this.roughnessNode):Ed;t=Kh({roughness:t}),xn.assign(t),this.setupSpecular(),fn.assign(qi(fn.rgb.mul(e.oneMinus()),fn.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const gg=new re;class mg extends pg{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(gg),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?Ii(this.iorNode):$d;Vn.assign(e),Bn.assign(ba(sa(pa(Vn.sub(1).div(Vn.add(1))).mul(Ad),$i(1)).mul(Sd),fn.rgb,bn)),Fn.assign(ba(Sd,1,bn))}setupLightingModel(){return new Lp(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?Ii(this.clearcoatNode):Bd,t=this.clearcoatRoughnessNode?Ii(this.clearcoatRoughnessNode):Fd;Tn.assign(e),_n.assign(Kh({roughness:t}))}if(this.useSheen){const e=this.sheenNode?$i(this.sheenNode):Id,t=this.sheenRoughnessNode?Ii(this.sheenRoughnessNode):Ld;vn.assign(e),Nn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?Ii(this.iridescenceNode):Vd,t=this.iridescenceIORNode?Ii(this.iridescenceIORNode):Od,r=this.iridescenceThicknessNode?Ii(this.iridescenceThicknessNode):Gd;Sn.assign(e),An.assign(t),Rn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Oi(this.anisotropyNode):Dd).toVar();En.assign(e.length()),Fi(En.equal(0),(()=>{e.assign(Oi(1,0))})).Else((()=>{e.divAssign(Oi(En)),En.assign(En.saturate())})),Cn.assign(En.pow2().mix(xn.pow2(),1)),wn.assign(od[0].mul(e.x).add(od[1].mul(e.y))),Mn.assign(od[1].mul(e.x).sub(od[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?Ii(this.transmissionNode):kd,t=this.thicknessNode?Ii(this.thicknessNode):zd,r=this.attenuationDistanceNode?Ii(this.attenuationDistanceNode):Wd,s=this.attenuationColorNode?$i(this.attenuationColorNode):Hd;if(On.assign(e),Gn.assign(t),kn.assign(r),zn.assign(s),this.useDispersion){const e=this.dispersionNode?Ii(this.dispersionNode):Zd;$n.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?$i(this.clearcoatNormalNode):Ud}setup(e){e.context.setupClearcoatNormal=()=>this.setupClearcoatNormal(e),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 fg extends Lp{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,o=!1){super(e,t,r,s,i,n),this.useSSS=o}direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){if(!0===this.useSSS){const s=i.material,{thicknessColorNode:n,thicknessDistortionNode:o,thicknessAmbientNode:a,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=s,c=e.add(wl.mul(o)).normalize(),h=Ii(Tl.dot(c.negate()).saturate().pow(l).mul(d)),p=$i(h.add(a).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i)}}class yg extends mg{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=Ii(.1),this.thicknessAmbientNode=Ii(0),this.thicknessAttenuationNode=Ii(.1),this.thicknessPowerNode=Ii(2),this.thicknessScaleNode=Ii(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new fg(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 xg=wi((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Oi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=jl("gradientMap","texture").context({getUV:()=>i});return $i(e.r)}{const e=i.fwidth().mul(.5);return ba($i(.7),$i(1),Na(Ii(.7).sub(e.x),Ii(.7).add(e.x),i.x))}}));class bg extends Ih{direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){const n=xg({normal:Sl,lightDirection:e,builder:i}).mul(t);r.directDiffuse.addAssign(n.mul(Gh({diffuseColor:fn.rgb})))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Gh({diffuseColor:fn}))),r.indirectDiffuse.mulAssign(e)}}const Tg=new se;class _g extends hh{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Tg),this.setValues(e)}setupLightingModel(){return new bg}}class vg extends ks{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=$i(Tl.z,0,Tl.x.negate()).normalize(),t=Tl.cross(e);return Oi(e.dot(wl),t.dot(wl)).mul(.495).add(.5)}}const Ng=Ei(vg),Sg=new ie;class Ag extends hh{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Sg),this.setValues(e)}setupVariants(e){const t=Ng;let r;r=e.material.matcap?jl("matcap","texture").context({getUV:()=>t}):$i(ba(.2,.8,t.y)),fn.rgb.mulAssign(r.rgb)}}class Rg extends ks{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 Qi(e,s,s.negate(),e).mul(r)}{const e=t,s=Ji(qi(1,0,0,0),qi(0,Vo(e.x),Do(e.x).negate(),0),qi(0,Do(e.x),Vo(e.x),0),qi(0,0,0,1)),i=Ji(qi(Vo(e.y),0,Do(e.y),0),qi(0,1,0,0),qi(Do(e.y).negate(),0,Vo(e.y),0),qi(0,0,0,1)),n=Ji(qi(Vo(e.z),Do(e.z).negate(),0,0),qi(Do(e.z),Vo(e.z),0,0),qi(0,0,1,0),qi(0,0,0,1));return s.mul(i).mul(n).mul(qi(r,1)).xyz}}}const Cg=Ci(Rg),Eg=new ne;class wg extends hh{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.setDefaultValues(Eg),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:o}=this,a=dl.mul($i(i||0));let u=Oi(il[0].xyz.length(),il[1].xyz.length());if(null!==o&&(u=u.mul(Ii(o))),!1===s)if(r.isPerspectiveCamera)u=u.mul(a.z.negate());else{const e=Ii(2).div(Wu.element(1).element(1));u=u.mul(e.mul(2))}let l=gl.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Si(new tu(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=Ii(n||Pd),c=Cg(l,d);return qi(a.xy.add(c),a.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 Mg=new oe;class Bg extends wg{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Mg),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return dl.mul($i(e||ml)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=gl.xy.toVar(),o=Vc.z.div(Vc.w);if(r&&r.isNode){const e=Ii(r);n.assign(Cg(n,e))}let a=null!==i?Oi(i):Qd;return!0===this.sizeAttenuation&&(a=a.mul(a.div(bl.z.negate()))),s&&s.isNode&&(a=a.mul(Oi(s))),n.mulAssign(a.mul(2)),n.assign(n.div(Vc.z)),n.y.assign(n.y.mul(o)),n.assign(n.mul(t.w)),t.addAssign(qi(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class Fg extends Ih{constructor(){super(),this.shadowNode=Ii(1).toVar("shadowMask")}direct({shadowMask:e}){this.shadowNode.mulAssign(e)}finish(e){fn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(fn.rgb)}}const Ug=new ae;class Pg extends hh{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Ug),this.setValues(e)}setupLightingModel(){return new Fg}}const Ig=wi((({texture:e,uv:t})=>{const r=1e-4,s=$i().toVar();return Fi(t.x.lessThan(r),(()=>{s.assign($i(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign($i(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign($i(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign($i(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign($i(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign($i(0,0,-1))})).Else((()=>{const r=.01,i=e.sample(t.add($i(-.01,0,0))).r.sub(e.sample(t.add($i(r,0,0))).r),n=e.sample(t.add($i(0,-.01,0))).r.sub(e.sample(t.add($i(0,r,0))).r),o=e.sample(t.add($i(0,0,-.01))).r.sub(e.sample(t.add($i(0,0,r))).r);s.assign($i(i,n,o))})),s.normalize()}));class Lg extends Uu{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return $i(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(Li(Mu(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return Ig({texture:this,uv:e})}}const Dg=Ci(Lg);class Vg extends hh{static get type(){return"VolumeNodeMaterial"}constructor(t){super(),this.isVolumeNodeMaterial=!0,this.base=new e(16777215),this.map=null,this.steps=100,this.testNode=null,this.setValues(t)}setup(e){const t=Dg(this.map,null,0),r=wi((({orig:e,dir:t})=>{const r=$i(-.5),s=$i(.5),i=t.reciprocal(),n=r.sub(e).mul(i),o=s.sub(e).mul(i),a=sa(n,o),u=ia(n,o),l=ia(a.x,ia(a.y,a.z)),d=sa(u.x,sa(u.y,u.z));return Oi(l,d)}));this.fragmentNode=wi((()=>{const e=$a($i(ll.mul(qi(Ku,1)))),s=$a(gl.sub(e)).normalize(),i=Oi(r({orig:e,dir:s})).toVar();i.x.greaterThan(i.y).discard(),i.assign(Oi(ia(i.x,0),i.y));const n=$i(e.add(i.x.mul(s))).toVar(),o=$i(s.abs().reciprocal()).toVar(),a=Ii(sa(o.x,sa(o.y,o.z))).toVar("delta");a.divAssign(jl("steps","float"));const u=qi(jl("base","color"),0).toVar();return Tc({type:"float",start:i.x,end:i.y,update:"+= delta"},(()=>{const e=gn("float","d").assign(t.sample(n.add(.5)).r);null!==this.testNode?this.testNode({map:t,mapValue:e,probe:n,finalColor:u}).append():(u.a.assign(1),_c()),n.addAssign(s.mul(a))})),u.a.equal(0).discard(),qi(u)}))(),super.setup(e)}}class Og{constructor(e,t){this.nodes=e,this.info=t,this._context=self,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,null!==this._animationLoop&&this._animationLoop(t,r)};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 Gg{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.material.addEventListener("dispose",this.onMaterialDispose)}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)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set;for(const i of e){const e=i.node&&i.node.attribute?i.node.attribute:t.getAttribute(i.name);if(void 0===e)continue;r.push(e);const n=e.isInterleavedBufferAttribute?e.data:e;s.add(n)}return this.attributes=r,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}),o=this.getIndex(),a=null!==o,u=r.isInstancedBufferGeometry?r.instanceCount:e.count>1?e.count:1;if(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;a?p=o.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&&(r+=e.uuid+","),r+=e.receiveShadow+",",ps(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}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=ms(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=ms(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const $g=[];class Wg{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,o,a){const u=this.getChainMap(a);$g[0]=e,$g[1]=t,$g[2]=n,$g[3]=i;let l=u.get($g);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,o,a),u.set($g,l)):(l.updateClipping(o),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,o,a)):l.version=t.version)),$g.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Gg)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,o,a,u,l,d){const c=this.getChainMap(d),h=new zg(e,t,r,s,i,n,o,a,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Hg{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 jg=1,qg=2,Xg=3,Kg=4,Yg=16;class Qg extends Hg{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return void 0!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===jg?this.backend.createAttribute(e):t===qg?this.backend.createIndexAttribute(e):t===Xg?this.backend.createStorageAttribute(e):t===Kg&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version=0;--t)if(e[t]>=65535)return!0;return!1}(t)?ue:le)(t,1);return i.version=Zg(e),i}class em extends Hg{constructor(e,t){super(),this.attributes=e,this.info=t,this.wireframes=new WeakMap,this.attributeCall=new WeakMap}has(e){const t=e.geometry;return super.has(t)&&!0===this.get(t).initialized}updateForRender(e){!1===this.has(e)&&this.initGeometry(e),this.updateAttributes(e)}initGeometry(e){const t=e.geometry;this.get(t).initialized=!0,this.info.memory.geometries++;const r=()=>{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)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,Xg):this.updateAttribute(e,jg);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,qg);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Kg)}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}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=Jg(t),e.set(t,r)):r.version!==Zg(t)&&(this.attributes.delete(r),r=Jg(t),e.set(t,r)),s=r}return s}}class tm{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):console.error("THREE.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 rm{constructor(e){this.cacheKey=e,this.usedTimes=0}}class sm extends rm{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class im extends rm{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let nm=0;class om{constructor(e,t,r,s=null,i=null){this.id=nm++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class am extends Hg{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 o=this.programs.compute.get(n.computeShader);void 0===o&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),o=new om(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,o),r.createProgram(o));const a=this._getComputeCacheKey(e,o);let u=this.caches.get(a);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,o,a,t)),u.usedTimes++,o.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(),o=e.material?e.material.name:"";let a=this.programs.vertex.get(n.vertexShader);void 0===a&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),a=new om(n.vertexShader,"vertex",o),this.programs.vertex.set(n.vertexShader,a),r.createProgram(a));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new om(n.fragmentShader,"fragment",o),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,a,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,a,u,l,t)):e.pipeline=d,d.usedTimes++,a.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 im(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 sm(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 um extends Hg{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))}_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.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Kg:Xg;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,o=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampler)t.update();else if(t.isSampledTexture){const e=this.textures.get(t.texture);t.needsBindingsUpdate(e.generation)&&(s=!0);const a=t.update(),u=t.texture;a&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,o+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,a,u,t.textureNode.value,s),this.textures.updateTexture(u),s=!0),!0===u.isStorageTexture){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}}!0===s&&this.backend.updateBindings(e,t,i?n:0,o)}}function lm(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.z!==t.z?e.z-t.z:e.id-t.id}function dm(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 cm(e){return(e.transmission>0||e.transmissionNode)&&e.side===de&&!1===e.forceSinglePass}class hm{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,o){let a=this.renderItems[this.renderItemsIndex];return void 0===a?(a={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:o},this.renderItems[this.renderItemsIndex]=a):(a.id=e.id,a.object=e,a.geometry=t,a.material=r,a.groupOrder=s,a.renderOrder=e.renderOrder,a.z=i,a.group=n,a.clippingContext=o),this.renderItemsIndex++,a}push(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(cm(r)&&this.transparentDoublePass.push(a),this.transparent.push(a)):this.opaque.push(a)}unshift(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===r.transparent||r.transmission>0?(cm(r)&&this.transparentDoublePass.unshift(a),this.transparent.unshift(a)):this.opaque.unshift(a)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||lm),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||dm),this.transparent.length>1&&this.transparent.sort(t||dm)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=o.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 F,l.format=e.stencilBuffer?he:pe,l.type=e.stencilBuffer?ge:b,l.image.width=a,l.image.height=u,i[t]=l),r.width===o.width&&o.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=a,l.image.height=u)),r.width=o.width,r.height=o.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&&!0===e.hasExternalTextures)l&&!0===e.autoAllocateDepthBuffer&&this.updateTexture(l,h);else{for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.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),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e),this.info.memory.textures--};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=vm){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),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.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return this.isEnvironmentTexture(e)||!0===e.isCompressedTexture||e.generateMipmaps}isEnvironmentTexture(e){const t=e.mapping;return t===j||t===q||t===v||t===N}_destroyTexture(e){this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e)}}class Sm extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class Am extends pn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class Rm extends Vs{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new Ni(t);return this._currentCond=Fa(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new Ni(t),s=Fa(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new Ni(e),this}build(e,...t){const r=Bi();Mi(this);for(const t of this.nodes)t.build(e,"void");return Mi(r),this.outputNode?this.outputNode.build(e,...t):super.build(e,...t)}else(...e){return console.warn("TSL.StackNode: .else() has been renamed to .Else()."),this.Else(...e)}elseif(...e){return console.warn("TSL.StackNode: .elseif() has been renamed to .ElseIf()."),this.ElseIf(...e)}}const Cm=Ci(Rm);class Em extends Vs{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}setup(e){super.setup(e);const t=this.members,r=[];for(let s=0;s{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)})),Pm=(e,t)=>ha(Qn(4,e.mul(Yn(1,e))),t),Im=wi((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Lm=wi((([e])=>$i(Im(e.z.add(Im(e.y.mul(1)))),Im(e.z.add(Im(e.x.mul(1)))),Im(e.y.add(Im(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Dm=wi((([e,t,r])=>{const s=$i(e).toVar(),i=Ii(1.4).toVar(),n=Ii(0).toVar(),o=$i(s).toVar();return Tc({start:Ii(0),end:Ii(3),type:"float",condition:"<="},(()=>{const e=$i(Lm(o.mul(2))).toVar();s.addAssign(e.add(r.mul(Ii(.1).mul(t)))),o.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const a=Ii(Im(s.z.add(Im(s.x.add(Im(s.y)))))).toVar();n.addAssign(a.div(i)),o.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class Vm extends Vs{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;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 o=n.inputs;if(t.length===o.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const Om=Ci(Vm),Gm=e=>(...t)=>Om(e,...t),km=hn(0).setGroup(ln).onRenderUpdate((e=>e.time)),zm=hn(0).setGroup(ln).onRenderUpdate((e=>e.deltaTime)),$m=hn(0,"uint").setGroup(ln).onRenderUpdate((e=>e.frameId)),Wm=wi((([e,t,r=Oi(.5)])=>Cg(e.sub(r),t).add(r))),Hm=wi((([e,t,r=Oi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),jm=wi((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=il.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=il;const i=ju.mul(s);return _i(t)&&(i[0][0]=il[0].length(),i[0][1]=0,i[0][2]=0),_i(r)&&(i[1][0]=0,i[1][1]=il[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,Wu.mul(i).mul(ml)})),qm=wi((([e=null])=>{const t=nh();return nh(Qc(e)).sub(t).lessThan(0).select(Ic,e)}));class Xm extends Vs{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Eu(),r=Ii(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),o=n.mod(s),a=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=Oi(o,a);return t.add(l).mul(u)}}const Km=Ci(Xm);class Ym extends Vs{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=Ii(1),i=ml,n=Al){super("vec4"),this.textureXNode=e,this.textureYNode=t,this.textureZNode=r,this.scaleNode=s,this.positionNode=i,this.normalNode=n}setup(){const{textureXNode:e,textureYNode:t,textureZNode:r,scaleNode:s,positionNode:i,normalNode:n}=this;let o=n.abs().normalize();o=o.div(o.dot($i(1)));const a=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=Pu(d,a).mul(o.x),g=Pu(c,u).mul(o.y),m=Pu(h,l).mul(o.z);return Kn(p,g,m)}}const Qm=Ci(Ym),Zm=new ye,Jm=new r,ef=new r,tf=new r,rf=new o,sf=new r(0,0,-1),nf=new s,of=new r,af=new r,uf=new s,lf=new t,df=new fe,cf=Ic.flipX();df.depthTexture=new F(1,1);let hf=!1;class pf extends Uu{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||df.texture,cf),this._reflectorBaseNode=e.reflector||new gf(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=Si(new pf({defaultTexture:df.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._reflectorBaseNode=this._reflectorBaseNode,e}}class gf extends Vs{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new xe,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:o=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=o,this.updateBeforeType=n?Ms.RENDER:Ms.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new WeakMap}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(lf),e.setSize(Math.round(lf.width*r),Math.round(lf.height*r))}setup(e){return this._updateResolution(df,e.renderer),super.setup(e)}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 fe(0,0,{type:be}),!0===this.generateMipmaps&&(t.texture.minFilter=Te,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new F),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&hf)return!1;hf=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,o=this.getVirtualCamera(r),a=this.getRenderTarget(o);if(s.getDrawingBufferSize(lf),this._updateResolution(a,s),ef.setFromMatrixPosition(n.matrixWorld),tf.setFromMatrixPosition(r.matrixWorld),rf.extractRotation(n.matrixWorld),Jm.set(0,0,1),Jm.applyMatrix4(rf),of.subVectors(ef,tf),of.dot(Jm)>0)return;of.reflect(Jm).negate(),of.add(ef),rf.extractRotation(r.matrixWorld),sf.set(0,0,-1),sf.applyMatrix4(rf),sf.add(tf),af.subVectors(ef,sf),af.reflect(Jm).negate(),af.add(ef),o.coordinateSystem=r.coordinateSystem,o.position.copy(of),o.up.set(0,1,0),o.up.applyMatrix4(rf),o.up.reflect(Jm),o.lookAt(af),o.near=r.near,o.far=r.far,o.updateMatrixWorld(),o.projectionMatrix.copy(r.projectionMatrix),Zm.setFromNormalAndCoplanarPoint(Jm,ef),Zm.applyMatrix4(o.matrixWorldInverse),nf.set(Zm.normal.x,Zm.normal.y,Zm.normal.z,Zm.constant);const u=o.projectionMatrix;uf.x=(Math.sign(nf.x)+u.elements[8])/u.elements[0],uf.y=(Math.sign(nf.y)+u.elements[9])/u.elements[5],uf.z=-1,uf.w=(1+u.elements[10])/u.elements[14],nf.multiplyScalar(1/nf.dot(uf));u.elements[2]=nf.x,u.elements[6]=nf.y,u.elements[10]=s.coordinateSystem===d?nf.z-0:nf.z+1-0,u.elements[14]=nf.w,this.textureNode.value=a.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=a.depthTexture),i.visible=!1;const l=s.getRenderTarget(),c=s.getMRT(),h=s.autoClear;s.setMRT(null),s.setRenderTarget(a),s.autoClear=!0,s.render(t,o),s.setMRT(c),s.setRenderTarget(l),s.autoClear=h,i.visible=!0,hf=!1}}const mf=new _e(-1,1,1,-1,0,1);class ff extends ve{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Ne([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Ne(t,2))}}const yf=new ff;class xf extends k{constructor(e=null){super(yf,e),this.camera=mf,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,mf)}render(e){e.render(this,mf)}}const bf=new t;class Tf extends Uu{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new fe(t,r,s);super(i.texture,Eu()),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 xf(new hh),this.updateBeforeType=Ms.RENDER}get autoSize(){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.autoSize){this.pixelRatio=e.getPixelRatio();const t=e.getSize(bf);this.setSize(t.width,t.height)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new Uu(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const _f=(e,...t)=>Si(new Tf(Si(e),...t)),vf=wi((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===d?(e=Oi(e.x,e.y.oneMinus()).mul(2).sub(1),i=qi($i(e,t),1)):i=qi($i(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=qi(r.mul(i));return n.xyz.div(n.w)})),Nf=wi((([e,t])=>{const r=t.mul(qi(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Oi(s.x,s.y.oneMinus())})),Sf=wi((([e,t,r])=>{const s=Mu(Iu(t)),i=Gi(e.mul(s)).toVar(),n=Iu(t,i).toVar(),o=Iu(t,i.sub(Gi(2,0))).toVar(),a=Iu(t,i.sub(Gi(1,0))).toVar(),u=Iu(t,i.add(Gi(1,0))).toVar(),l=Iu(t,i.add(Gi(2,0))).toVar(),d=Iu(t,i.add(Gi(0,2))).toVar(),c=Iu(t,i.add(Gi(0,1))).toVar(),h=Iu(t,i.sub(Gi(0,1))).toVar(),p=Iu(t,i.sub(Gi(0,2))).toVar(),g=$o(Yn(Ii(2).mul(a).sub(o),n)).toVar(),m=$o(Yn(Ii(2).mul(u).sub(l),n)).toVar(),f=$o(Yn(Ii(2).mul(c).sub(d),n)).toVar(),y=$o(Yn(Ii(2).mul(h).sub(p),n)).toVar(),x=vf(e,n,r).toVar(),b=g.lessThan(m).select(x.sub(vf(e.sub(Oi(Ii(1).div(s.x),0)),a,r)),x.negate().add(vf(e.add(Oi(Ii(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(x.sub(vf(e.add(Oi(0,Ii(1).div(s.y))),c,r)),x.negate().add(vf(e.sub(Oi(0,Ii(1).div(s.y))),h,r)));return Io(ca(b,T))}));class Af extends C{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class Rf extends Se{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class Cf extends Os{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}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 Ef=Ci(Cf);class wf extends Lu{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(t=Ts(e.itemSize),r=e.count),super(e,t,r),this.isStorageBufferNode=!0,this.access=Fs.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 Ef(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Fs.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=uu(this.value),this._varying=$a(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}generate(e){if(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 Mf=(e,t=null,r=0)=>Si(new wf(e,t,r));class Bf extends Ru{static get type(){return"VertexColorNode"}constructor(e=0){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}}class Ff extends Vs{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const Uf=Ei(Ff),Pf=new Re,If=new o;class Lf extends Vs{static get type(){return"SceneNode"}constructor(e=Lf.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===Lf.BACKGROUND_BLURRINESS?s=$l("backgroundBlurriness","float",r):t===Lf.BACKGROUND_INTENSITY?s=$l("backgroundIntensity","float",r):t===Lf.BACKGROUND_ROTATION?s=hn("mat4").label("backgroundRotation").setGroup(ln).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Ae?(Pf.copy(r.backgroundRotation),Pf.x*=-1,Pf.y*=-1,Pf.z*=-1,If.makeRotationFromEuler(Pf)):If.identity(),If})):console.error("THREE.SceneNode: Unknown scope:",t),s}}Lf.BACKGROUND_BLURRINESS="backgroundBlurriness",Lf.BACKGROUND_INTENSITY="backgroundIntensity",Lf.BACKGROUND_ROTATION="backgroundRotation";const Df=Ei(Lf,Lf.BACKGROUND_BLURRINESS),Vf=Ei(Lf,Lf.BACKGROUND_INTENSITY),Of=Ei(Lf,Lf.BACKGROUND_ROTATION);class Gf extends Uu{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=Fs.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);e.getNodeProperties(this).storeNode=this.storeNode}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Fs.READ_WRITE)}toReadOnly(){return this.setAccess(Fs.READ_ONLY)}toWriteOnly(){return this.setAccess(Fs.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),o=s.build(e,"vec4"),a=e.generateTextureStore(e,i,n,o);e.addLineFlowCode(a,this)}}const kf=Ci(Gf);class zf extends zl{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 $f=new WeakMap;class Wf extends ks{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Ms.OBJECT,this.updateAfterType=Ms.OBJECT,this.previousModelWorldMatrix=hn(new o),this.previousProjectionMatrix=hn(new o).setGroup(ln),this.previousCameraViewMatrix=hn(new o)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=jf(r);this.previousModelWorldMatrix.value.copy(s);const i=Hf(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new o,i.previousCameraViewMatrix=new o,i.currentProjectionMatrix=new o,i.currentCameraViewMatrix=new o,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}){jf(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?Wu:hn(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(dl).mul(ml),s=this.previousProjectionMatrix.mul(t).mul(fl),i=r.xy.div(r.w),n=s.xy.div(s.w);return Yn(i,n)}}function Hf(e){let t=$f.get(e);return void 0===t&&(t={},$f.set(e,t)),t}function jf(e,t=0){const r=Hf(e);let s=r[t];return void 0===s&&(r[t]=s=new o),s}const qf=Ei(Wf),Xf=wi((([e,t])=>sa(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Kf=wi((([e,t])=>sa(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Yf=wi((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Qf=wi((([e,t])=>ba(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),oa(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Zf=wi((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return qi(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"}]}),Jf=wi((([e])=>sy(e.rgb))),ey=wi((([e,t=Ii(1)])=>t.mix(sy(e.rgb),e.rgb))),ty=wi((([e,t=Ii(1)])=>{const r=Kn(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 ba(e.rgb,s,i)})),ry=wi((([e,t=Ii(1)])=>{const r=$i(.57735,.57735,.57735),s=t.cos();return $i(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(da(r,e.rgb).mul(s.oneMinus())))))})),sy=(e,t=$i(c.getLuminanceCoefficients(new r)))=>da(e,t),iy=wi((([e,t=$i(1),s=$i(0),i=$i(1),n=Ii(1),o=$i(c.getLuminanceCoefficients(new r,Ce))])=>{const a=e.rgb.dot($i(o)),u=ia(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return Fi(u.r.greaterThan(0),(()=>{u.r.assign(l.r)})),Fi(u.g.greaterThan(0),(()=>{u.g.assign(l.g)})),Fi(u.b.greaterThan(0),(()=>{u.b.assign(l.b)})),u.assign(a.add(u.sub(a).mul(n))),qi(u.rgb,e.a)}));class ny extends ks{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 oy=Ci(ny),ay=new t;class uy extends Uu{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return e.object.isQuadMesh&&this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class ly extends uy{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(){return new this.constructor(this.passNode,this.textureName,this.previousTexture)}}class dy extends ks{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 F;i.isRenderTargetTexture=!0,i.name="depth";const n=new fe(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:be,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=hn(0),this._cameraFar=hn(0),this._mrt=null,this.isPassNode=!0,this.updateBeforeType=Ms.FRAME}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}isGlobal(){return!0}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=Si(new ly(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=Si(new ly(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=th(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=Jc(i,r,s)}return t}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,!0===e.backend.isWebGLBackend&&(this.renderTarget.samples=0),this.scope===dy.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r,camera:s}=this;this._pixelRatio=t.getPixelRatio();const i=t.getSize(ay);this.setSize(i.width,i.height);const n=t.getRenderTarget(),o=t.getMRT();this._cameraNear.value=s.near,this._cameraFar.value=s.far;for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(n),t.setMRT(o)}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio,s=this._height*this._pixelRatio;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}dy.COLOR="color",dy.DEPTH="depth";class cy extends dy{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(dy.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction(((e,r,s,i,n,o,a,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,o,a,u)}t.renderObject(e,r,s,i,n,o,a,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new hh;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=_;const t=Al.negate(),r=Wu.mul(dl),s=Ii(1),i=r.mul(qi(ml,1)),n=r.mul(qi(ml.add(t),1)),o=Io(i.sub(n));return e.vertexNode=i.add(o.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=qi(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 hy=wi((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),py=wi((([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"}]}),gy=wi((([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"}]}),my=wi((([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)})),fy=wi((([e,t])=>{const r=Zi(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Zi(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=my(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),yy=Zi($i(1.6605,-.1246,-.0182),$i(-.5876,1.1329,-.1006),$i(-.0728,-.0083,1.1187)),xy=Zi($i(.6274,.0691,.0164),$i(.3293,.9195,.088),$i(.0433,.0113,.8956)),by=wi((([e])=>{const t=$i(e).toVar(),r=$i(t.mul(t)).toVar(),s=$i(r.mul(r)).toVar();return Ii(15.5).mul(s.mul(r)).sub(Qn(40.14,s.mul(t))).add(Qn(31.96,s).sub(Qn(6.868,r.mul(t))).add(Qn(.4298,r).add(Qn(.1191,t).sub(.00232))))})),Ty=wi((([e,t])=>{const r=$i(e).toVar(),s=Zi($i(.856627153315983,.137318972929847,.11189821299995),$i(.0951212405381588,.761241990602591,.0767994186031903),$i(.0482516061458583,.101439036467562,.811302368396859)),i=Zi($i(1.1271005818144368,-.1413297634984383,-.14132976349843826),$i(-.11060664309660323,1.157823702216272,-.11060664309660294),$i(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=Ii(-12.47393),o=Ii(4.026069);return r.mulAssign(t),r.assign(xy.mul(r)),r.assign(s.mul(r)),r.assign(ia(r,1e-10)),r.assign(Mo(r)),r.assign(r.sub(n).div(o.sub(n))),r.assign(Ta(r,0,1)),r.assign(by(r)),r.assign(i.mul(r)),r.assign(ha(ia($i(0),r),$i(2.2))),r.assign(yy.mul(r)),r.assign(Ta(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),_y=wi((([e,t])=>{const r=Ii(.76),s=Ii(.15);e=e.mul(t);const i=sa(e.r,sa(e.g,e.b)),n=Fa(i.lessThan(.08),i.sub(Qn(6.25,i.mul(i))),.04);e.subAssign(n);const o=ia(e.r,ia(e.g,e.b));Fi(o.lessThan(r),(()=>e));const a=Yn(1,r),u=Yn(1,a.mul(a).div(o.add(a.sub(r))));e.mulAssign(u.div(o));const l=Yn(1,Zn(1,s.mul(o.sub(u)).add(1)));return ba(e,$i(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class vy extends Vs{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.code=e,this.includes=t,this.language=r}isGlobal(){return!0}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 Ny=Ci(vy);class Sy extends vy{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}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 o=e.getPropertyName(n),a=this.getNodeFunction(e).getCode(o);return n.code=a+"\n","property"===t?o:e.format(`${o}()`,i,t)}}const Ay=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Ry extends Vs{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new a,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:Ii()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Rs(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?Cs(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 Cy=Ci(Ry);class Ey 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 wy{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 My=new Ey;class By extends Vs{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new Ey,this._output=Cy(),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]=Cy(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]=Cy(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 wy(this),t=My.get("THREE"),r=My.get("TSL"),s=this.getMethod(),i=[e,this._local,My,()=>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:Ii()}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=[ps(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return gs(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 Fy=Ci(By);function Uy(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||bl.z).negate()}const Py=wi((([e,t],r)=>{const s=Uy(r);return Na(e,t,s)})),Iy=wi((([e],t)=>{const r=Uy(t);return e.mul(e,r,r).negate().exp().oneMinus()})),Ly=wi((([e,t])=>qi(t.toFloat().mix(Pn.rgb,e.toVec3()),Pn.a)));let Dy=null,Vy=null;class Oy extends Vs{static get type(){return"RangeNode"}constructor(e=Ii(),t=Ii()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(Ns(this.minNode.value)),r=e.getTypeLength(Ns(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,o=e.getTypeLength(Ns(i)),a=e.getTypeLength(Ns(n));Dy=Dy||new s,Vy=Vy||new s,Dy.setScalar(0),Vy.setScalar(0),1===o?Dy.setScalar(i):i.isColor?Dy.set(i.r,i.g,i.b,1):Dy.set(i.x,i.y,i.z||0,i.w||0),1===a?Vy.setScalar(n):n.isColor?Vy.set(n.r,n.g,n.b,1):Vy.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;eSi(new ky(e,t)),$y=zy("numWorkgroups","uvec3"),Wy=zy("workgroupId","uvec3"),Hy=zy("globalId","uvec3"),jy=zy("localId","uvec3"),qy=zy("subgroupSize","uint");const Xy=Ci(class extends Vs{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 Ky extends Os{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 Yy extends Vs{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e}label(e){return this.name=e,this}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Si(new Ky(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class Qy extends ks{static get type(){return"AtomicFunctionNode"}constructor(e,t,r,s=null){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.storeNode=s}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=this.method,r=this.getNodeType(e),s=this.getInputType(e),i=this.pointerNode,n=this.valueNode,o=[];o.push(`&${i.build(e,s)}`),null!==n&&o.push(n.build(e,s));const a=`${e.getMethod(t,r)}( ${o.join(", ")} )`;if(null!==this.storeNode){const t=this.storeNode.build(e,s);e.addLineFlowCode(`${t} = ${a}`,this)}else e.addLineFlowCode(a,this)}}Qy.ATOMIC_LOAD="atomicLoad",Qy.ATOMIC_STORE="atomicStore",Qy.ATOMIC_ADD="atomicAdd",Qy.ATOMIC_SUB="atomicSub",Qy.ATOMIC_MAX="atomicMax",Qy.ATOMIC_MIN="atomicMin",Qy.ATOMIC_AND="atomicAnd",Qy.ATOMIC_OR="atomicOr",Qy.ATOMIC_XOR="atomicXor";const Zy=Ci(Qy),Jy=(e,t,r,s=null)=>{const i=Zy(e,t,r,s);return i.append(),i};let ex;function tx(e){ex=ex||new WeakMap;let t=ex.get(e);return void 0===t&&ex.set(e,t={}),t}function rx(e){const t=tx(e);return t.shadowMatrix||(t.shadowMatrix=hn("mat4").setGroup(ln).onRenderUpdate((()=>(!0!==e.castShadow&&e.shadow.updateMatrices(e),e.shadow.matrix))))}function sx(e){const t=tx(e);if(void 0===t.projectionUV){const r=rx(e).mul(yl);t.projectionUV=r.xyz.div(r.w)}return t.projectionUV}function ix(e){const t=tx(e);return t.position||(t.position=hn(new r).setGroup(ln).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function nx(e){const t=tx(e);return t.targetPosition||(t.targetPosition=hn(new r).setGroup(ln).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function ox(e){const t=tx(e);return t.viewPosition||(t.viewPosition=hn(new r).setGroup(ln).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const ax=e=>ju.transformDirection(ix(e).sub(nx(e))),ux=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},lx=new WeakMap;class dx extends Vs{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=$i().toVar("totalDiffuse"),this.totalSpecularNode=$i().toVar("totalSpecular"),this.outgoingLightNode=$i().toVar("outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=[],t=this._lights;for(let r=0;re.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Si(e));else{let s=null;if(null!==r&&(s=ux(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;lx.has(e)?s=lx.get(e):(s=Si(new r(e)),lx.set(e,s)),t.push(s)}}this._lightNodes=t}setupLights(e,t){for(const r of t)r.build(e)}setup(e){null===this._lightNodes&&this.setupLightsNode(e);const t=e.context,r=t.lightingModel;let s=this.outgoingLightNode;if(r){const{_lightNodes:i,totalDiffuseNode:n,totalSpecularNode:o}=this;t.outgoingLight=s;const a=e.addStack();e.getDataFromNode(this).nodes=a.nodes,r.start(t,a,e),this.setupLights(e,i),r.indirect(t,a,e);const{backdrop:u,backdropAlpha:l}=t,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=t.reflectedLight;let g=d.add(h);null!==u&&(g=$i(null!==l?l.mix(g,u):u),t.material.transparent=!0),n.assign(g),o.assign(c.add(p)),s.assign(n.add(o)),r.finish(t,a,e),s=s.bypass(e.removeStack())}return s}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 cx extends Vs{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Ms.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({material:e}){hx.assign(e.shadowPositionNode||yl)}dispose(){this.updateBeforeType=Ms.NONE}}const hx=$i().toVar("shadowPositionWorld");function px(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 gx(e,t){return t=px(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function mx(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 fx(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function yx(e,t){return t=fx(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function xx(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function bx(e,t,r){return r=yx(t,r=gx(e,r))}function Tx(e,t,r){mx(e,r),xx(t,r)}var _x=Object.freeze({__proto__:null,resetRendererAndSceneState:bx,resetRendererState:gx,resetSceneState:yx,restoreRendererAndSceneState:Tx,restoreRendererState:mx,restoreSceneState:xx,saveRendererAndSceneState:function(e,t,r={}){return r=fx(t,r=px(e,r))},saveRendererState:px,saveSceneState:fx});const vx=new WeakMap,Nx=wi((([e,t,r])=>{let s=yl.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),Sx=e=>{let t=vx.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=$l("near","float",t).setGroup(ln),s=$l("far","float",t).setGroup(ln),i=Ju(e);return Nx(i,r,s)})(e):null;t=new hh,t.colorNode=qi(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,vx.set(e,t)}return t},Ax=wi((({depthTexture:e,shadowCoord:t})=>Pu(e,t.xy).compare(t.z))),Rx=wi((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Pu(e,t).compare(r),i=$l("mapSize","vec2",r).setGroup(ln),n=$l("radius","float",r).setGroup(ln),o=Oi(1).div(i),a=o.x.negate().mul(n),u=o.y.negate().mul(n),l=o.x.mul(n),d=o.y.mul(n),c=a.div(2),h=u.div(2),p=l.div(2),g=d.div(2);return Kn(s(t.xy.add(Oi(a,u)),t.z),s(t.xy.add(Oi(0,u)),t.z),s(t.xy.add(Oi(l,u)),t.z),s(t.xy.add(Oi(c,h)),t.z),s(t.xy.add(Oi(0,h)),t.z),s(t.xy.add(Oi(p,h)),t.z),s(t.xy.add(Oi(a,0)),t.z),s(t.xy.add(Oi(c,0)),t.z),s(t.xy,t.z),s(t.xy.add(Oi(p,0)),t.z),s(t.xy.add(Oi(l,0)),t.z),s(t.xy.add(Oi(c,g)),t.z),s(t.xy.add(Oi(0,g)),t.z),s(t.xy.add(Oi(p,g)),t.z),s(t.xy.add(Oi(a,d)),t.z),s(t.xy.add(Oi(0,d)),t.z),s(t.xy.add(Oi(l,d)),t.z)).mul(1/17)})),Cx=wi((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Pu(e,t).compare(r),i=$l("mapSize","vec2",r).setGroup(ln),n=Oi(1).div(i),o=n.x,a=n.y,u=t.xy,l=Lo(u.mul(i).add(.5));return u.subAssign(l.mul(n)),Kn(s(u,t.z),s(u.add(Oi(o,0)),t.z),s(u.add(Oi(0,a)),t.z),s(u.add(n),t.z),ba(s(u.add(Oi(o.negate(),0)),t.z),s(u.add(Oi(o.mul(2),0)),t.z),l.x),ba(s(u.add(Oi(o.negate(),a)),t.z),s(u.add(Oi(o.mul(2),a)),t.z),l.x),ba(s(u.add(Oi(0,a.negate())),t.z),s(u.add(Oi(0,a.mul(2))),t.z),l.y),ba(s(u.add(Oi(o,a.negate())),t.z),s(u.add(Oi(o,a.mul(2))),t.z),l.y),ba(ba(s(u.add(Oi(o.negate(),a.negate())),t.z),s(u.add(Oi(o.mul(2),a.negate())),t.z),l.x),ba(s(u.add(Oi(o.negate(),a.mul(2))),t.z),s(u.add(Oi(o.mul(2),a.mul(2))),t.z),l.x),l.y)).mul(1/9)})),Ex=wi((({depthTexture:e,shadowCoord:t})=>{const r=Ii(1).toVar(),s=Pu(e).sample(t.xy).rg,i=oa(t.z,s.x);return Fi(i.notEqual(Ii(1)),(()=>{const e=t.z.sub(s.x),n=ia(0,s.y.mul(s.y));let o=n.div(n.add(e.mul(e)));o=Ta(Yn(o,.3).div(.95-.3)),r.assign(Ta(ia(i,o)))})),r})),wx=wi((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Ii(0).toVar(),n=Ii(0).toVar(),o=e.lessThanEqual(Ii(1)).select(Ii(0),Ii(2).div(e.sub(1))),a=e.lessThanEqual(Ii(1)).select(Ii(0),Ii(-1));Tc({start:Li(0),end:Li(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Ii(e).mul(o)),l=s.sample(Kn(Dc.xy,Oi(0,u).mul(t)).div(r)).x;i.addAssign(l),n.addAssign(l.mul(l))})),i.divAssign(e),n.divAssign(e);const u=Bo(n.sub(i.mul(i)));return Oi(i,u)})),Mx=wi((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Ii(0).toVar(),n=Ii(0).toVar(),o=e.lessThanEqual(Ii(1)).select(Ii(0),Ii(2).div(e.sub(1))),a=e.lessThanEqual(Ii(1)).select(Ii(0),Ii(-1));Tc({start:Li(0),end:Li(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Ii(e).mul(o)),l=s.sample(Kn(Dc.xy,Oi(u,0).mul(t)).div(r));i.addAssign(l.x),n.addAssign(Kn(l.y.mul(l.y),l.x.mul(l.x)))})),i.divAssign(e),n.divAssign(e);const u=Bo(n.sub(i.mul(i)));return Oi(i,u)})),Bx=[Ax,Rx,Cx,Ex];let Fx;const Ux=new xf;class Px extends cx{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.isShadowNode=!0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){const n=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});return n.select(o,Ii(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=$l("bias","float",r).setGroup(ln);let n,o=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)o=o.xyz.div(o.w),n=o.z,s.coordinateSystem===d&&(n=n.mul(2).sub(1));else{const e=o.w;o=o.xy.div(e);const t=$l("near","float",r.camera).setGroup(ln),s=$l("far","float",r.camera).setGroup(ln);n=rh(e.negate(),t,s)}return o=$i(o.x,o.y.oneMinus(),n.add(i)),o}getShadowFilterFn(e){return Bx[e]}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,n=new F(s.mapSize.width,s.mapSize.height);n.compareFunction=Ee;const o=e.createRenderTarget(s.mapSize.width,s.mapSize.height);if(o.depthTexture=n,s.camera.updateProjectionMatrix(),i===we){n.compareFunction=null,this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Me,type:be}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Me,type:be});const t=Pu(n),r=Pu(this.vsmShadowMapVertical.texture),i=$l("blurSamples","float",s).setGroup(ln),o=$l("radius","float",s).setGroup(ln),a=$l("mapSize","vec2",s).setGroup(ln);let u=this.vsmMaterialVertical||(this.vsmMaterialVertical=new hh);u.fragmentNode=wx({samples:i,radius:o,size:a,shadowPass:t}).context(e.getSharedContext()),u.name="VSMVertical",u=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new hh),u.fragmentNode=Mx({samples:i,radius:o,size:a,shadowPass:r}).context(e.getSharedContext()),u.name="VSMHorizontal"}const a=$l("intensity","float",s).setGroup(ln),u=$l("normalBias","float",s).setGroup(ln),l=rx(r).mul(hx.add(Ml.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===we?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:o.texture,depthTexture:h,shadowCoord:d,shadow:s}),g=Pu(o.texture,d),m=ba(1,p.rgb.mix(g,1),a.mul(g.a)).toVar();return this.shadowMap=o,this.shadow.map=o,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return wi((()=>{let t=this._node;return this.setupShadowPosition(e),null===t&&(this._node=t=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(t=e.material.receivedShadowNode(t)),t}))()}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),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:o}=e,a=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u,s.camera.layers.mask=o.layers.mask;const l=i.getRenderObjectFunction(),d=i.getMRT(),c=!!d&&d.has("velocity");Fx=bx(i,n,Fx),n.overrideMaterial=Sx(r),i.setRenderObjectFunction(((e,t,r,n,u,l,...d)=>{(!0===e.castShadow||e.receiveShadow&&a===we)&&(c&&(As(e).useVelocity=!0),e.onBeforeShadow(i,e,o,s.camera,n,t.overrideMaterial,l),i.renderObject(e,t,r,n,u,l,...d),e.onAfterShadow(i,e,o,s.camera,n,t.overrideMaterial,l))})),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(l),!0!==r.isPointLight&&a===we&&this.vsmPass(i),Tx(i,n,Fx)}vsmPass(e){const{shadow:t}=this;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height),e.setRenderTarget(this.vsmShadowMapVertical),Ux.material=this.vsmMaterialVertical,Ux.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),Ux.material=this.vsmMaterialHorizontal,Ux.render(e)}dispose(){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),super.dispose()}updateBefore(e){const{shadow:t}=this;(t.needsUpdate||t.autoUpdate)&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const Ix=(e,t)=>Si(new Px(e,t));class Lx extends Cc{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||hn(this.color).setGroup(ln),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Ms.FRAME}customCacheKey(){return ms(this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}setupShadowNode(){return Ix(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const t=this.light.shadow.shadowNode;let s;s=void 0!==t?Si(t):this.setupShadowNode(e),this.shadowNode=s,this.shadowColorNode=r=this.colorNode.mul(s),this.baseColorNode=this.colorNode}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)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const Dx=wi((e=>{const{lightDistance:t,cutoffDistance:r,decayExponent:s}=e,i=t.pow(s).max(.01).reciprocal();return r.greaterThan(0).select(i.mul(t.div(r).pow4().oneMinus().clamp().pow2()),i)})),Vx=new e,Ox=wi((([e,t])=>{const r=e.toVar(),s=$o(r),i=Zn(1,ia(s.x,ia(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=Oi(r.xy).toVar(),o=t.mul(1.5).oneMinus();return Fi(s.z.greaterThanEqual(o),(()=>{Fi(r.z.greaterThan(0),(()=>{n.x.assign(Yn(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(o),(()=>{const e=Wo(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(o),(()=>{const e=Wo(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))})),Oi(.125,.25).mul(n).add(Oi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),Gx=wi((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>Pu(e,Ox(t,s.y)).compare(r))),kx=wi((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=$l("radius","float",i).setGroup(ln),o=Oi(-1,1).mul(n).mul(s.y);return Pu(e,Ox(t.add(o.xyy),s.y)).compare(r).add(Pu(e,Ox(t.add(o.yyy),s.y)).compare(r)).add(Pu(e,Ox(t.add(o.xyx),s.y)).compare(r)).add(Pu(e,Ox(t.add(o.yyx),s.y)).compare(r)).add(Pu(e,Ox(t,s.y)).compare(r)).add(Pu(e,Ox(t.add(o.xxy),s.y)).compare(r)).add(Pu(e,Ox(t.add(o.yxy),s.y)).compare(r)).add(Pu(e,Ox(t.add(o.xxx),s.y)).compare(r)).add(Pu(e,Ox(t.add(o.yxx),s.y)).compare(r)).mul(1/9)})),zx=wi((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),o=hn("float").setGroup(ln).onRenderUpdate((()=>s.camera.near)),a=hn("float").setGroup(ln).onRenderUpdate((()=>s.camera.far)),u=$l("bias","float",s).setGroup(ln),l=hn(s.mapSize).setGroup(ln),d=Ii(1).toVar();return Fi(n.sub(a).lessThanEqual(0).and(n.sub(o).greaterThanEqual(0)),(()=>{const r=n.sub(o).div(a.sub(o)).toVar();r.addAssign(u);const c=i.normalize(),h=Oi(1).div(l.mul(Oi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),$x=new s,Wx=new t,Hx=new t;class jx extends Px{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Be?Gx:kx}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return zx({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,o=t.getFrameExtents();Hx.copy(t.mapSize),Hx.multiply(o),r.setSize(Hx.width,Hx.height),Wx.copy(t.mapSize);const a=i.autoClear,u=i.getClearColor(Vx),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;e{const n=i.context.lightingModel,o=t.sub(bl),a=o.normalize(),u=o.length(),l=Dx({lightDistance:u,cutoffDistance:r,decayExponent:s}),d=e.mul(l),c=i.context.reflectedLight;n.direct({lightDirection:a,lightColor:d,reflectedLight:c},i.stack,i)}));class Xx extends Lx{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=hn(0).setGroup(ln),this.decayExponentNode=hn(2).setGroup(ln)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return((e,t)=>Si(new jx(e,t)))(this.light)}setup(e){super.setup(e),qx({color:this.colorNode,lightViewPosition:ox(this.light),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode}).append()}}const Kx=wi((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),Yx=wi((([e=Eu()],{renderer:t,material:r})=>{const s=Ii(1).toVar(),i=xa(e.mul(2).sub(1));if(r.alphaToCoverage&&t.samples>1){const e=Ii(i.fwidth()).toVar();s.assign(Na(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();return s})),Qx=wi((([e,t,r])=>{const s=Ii(r).toVar(),i=Ii(t).toVar(),n=Vi(e).toVar();return Fa(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Zx=wi((([e,t])=>{const r=Vi(t).toVar(),s=Ii(e).toVar();return Fa(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),Jx=wi((([e])=>{const t=Ii(e).toVar();return Li(Uo(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),eb=wi((([e,t])=>{const r=Ii(e).toVar();return t.assign(Jx(r)),r.sub(Ii(t))})),tb=Gm([wi((([e,t,r,s,i,n])=>{const o=Ii(n).toVar(),a=Ii(i).toVar(),u=Ii(s).toVar(),l=Ii(r).toVar(),d=Ii(t).toVar(),c=Ii(e).toVar(),h=Ii(Yn(1,a)).toVar();return Yn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).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"}]}),wi((([e,t,r,s,i,n])=>{const o=Ii(n).toVar(),a=Ii(i).toVar(),u=$i(s).toVar(),l=$i(r).toVar(),d=$i(t).toVar(),c=$i(e).toVar(),h=Ii(Yn(1,a)).toVar();return Yn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).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"}]})]),rb=Gm([wi((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Ii(d).toVar(),h=Ii(l).toVar(),p=Ii(u).toVar(),g=Ii(a).toVar(),m=Ii(o).toVar(),f=Ii(n).toVar(),y=Ii(i).toVar(),x=Ii(s).toVar(),b=Ii(r).toVar(),T=Ii(t).toVar(),_=Ii(e).toVar(),v=Ii(Yn(1,p)).toVar(),N=Ii(Yn(1,h)).toVar();return Ii(Yn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]}),wi((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Ii(d).toVar(),h=Ii(l).toVar(),p=Ii(u).toVar(),g=$i(a).toVar(),m=$i(o).toVar(),f=$i(n).toVar(),y=$i(i).toVar(),x=$i(s).toVar(),b=$i(r).toVar(),T=$i(t).toVar(),_=$i(e).toVar(),v=Ii(Yn(1,p)).toVar(),N=Ii(Yn(1,h)).toVar();return Ii(Yn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]})]),sb=wi((([e,t,r])=>{const s=Ii(r).toVar(),i=Ii(t).toVar(),n=Di(e).toVar(),o=Di(n.bitAnd(Di(7))).toVar(),a=Ii(Qx(o.lessThan(Di(4)),i,s)).toVar(),u=Ii(Qn(2,Qx(o.lessThan(Di(4)),s,i))).toVar();return Zx(a,Vi(o.bitAnd(Di(1)))).add(Zx(u,Vi(o.bitAnd(Di(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),ib=wi((([e,t,r,s])=>{const i=Ii(s).toVar(),n=Ii(r).toVar(),o=Ii(t).toVar(),a=Di(e).toVar(),u=Di(a.bitAnd(Di(15))).toVar(),l=Ii(Qx(u.lessThan(Di(8)),o,n)).toVar(),d=Ii(Qx(u.lessThan(Di(4)),n,Qx(u.equal(Di(12)).or(u.equal(Di(14))),o,i))).toVar();return Zx(l,Vi(u.bitAnd(Di(1)))).add(Zx(d,Vi(u.bitAnd(Di(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"}]}),nb=Gm([sb,ib]),ob=wi((([e,t,r])=>{const s=Ii(r).toVar(),i=Ii(t).toVar(),n=Hi(e).toVar();return $i(nb(n.x,i,s),nb(n.y,i,s),nb(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"}]}),ab=wi((([e,t,r,s])=>{const i=Ii(s).toVar(),n=Ii(r).toVar(),o=Ii(t).toVar(),a=Hi(e).toVar();return $i(nb(a.x,o,n,i),nb(a.y,o,n,i),nb(a.z,o,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"}]}),ub=Gm([ob,ab]),lb=wi((([e])=>{const t=Ii(e).toVar();return Qn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),db=wi((([e])=>{const t=Ii(e).toVar();return Qn(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),cb=Gm([lb,wi((([e])=>{const t=$i(e).toVar();return Qn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),hb=Gm([db,wi((([e])=>{const t=$i(e).toVar();return Qn(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),pb=wi((([e,t])=>{const r=Li(t).toVar(),s=Di(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Li(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),gb=wi((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(pb(r,Li(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(pb(e,Li(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(pb(t,Li(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(pb(r,Li(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(pb(e,Li(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(pb(t,Li(4))),t.addAssign(e)})),mb=wi((([e,t,r])=>{const s=Di(r).toVar(),i=Di(t).toVar(),n=Di(e).toVar();return s.bitXorAssign(i),s.subAssign(pb(i,Li(14))),n.bitXorAssign(s),n.subAssign(pb(s,Li(11))),i.bitXorAssign(n),i.subAssign(pb(n,Li(25))),s.bitXorAssign(i),s.subAssign(pb(i,Li(16))),n.bitXorAssign(s),n.subAssign(pb(s,Li(4))),i.bitXorAssign(n),i.subAssign(pb(n,Li(14))),s.bitXorAssign(i),s.subAssign(pb(i,Li(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),fb=wi((([e])=>{const t=Di(e).toVar();return Ii(t).div(Ii(Di(Li(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),yb=wi((([e])=>{const t=Ii(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"}]}),xb=Gm([wi((([e])=>{const t=Li(e).toVar(),r=Di(Di(1)).toVar(),s=Di(Di(Li(3735928559)).add(r.shiftLeft(Di(2))).add(Di(13))).toVar();return mb(s.add(Di(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),wi((([e,t])=>{const r=Li(t).toVar(),s=Li(e).toVar(),i=Di(Di(2)).toVar(),n=Di().toVar(),o=Di().toVar(),a=Di().toVar();return n.assign(o.assign(a.assign(Di(Li(3735928559)).add(i.shiftLeft(Di(2))).add(Di(13))))),n.addAssign(Di(s)),o.addAssign(Di(r)),mb(n,o,a)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),wi((([e,t,r])=>{const s=Li(r).toVar(),i=Li(t).toVar(),n=Li(e).toVar(),o=Di(Di(3)).toVar(),a=Di().toVar(),u=Di().toVar(),l=Di().toVar();return a.assign(u.assign(l.assign(Di(Li(3735928559)).add(o.shiftLeft(Di(2))).add(Di(13))))),a.addAssign(Di(n)),u.addAssign(Di(i)),l.addAssign(Di(s)),mb(a,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),wi((([e,t,r,s])=>{const i=Li(s).toVar(),n=Li(r).toVar(),o=Li(t).toVar(),a=Li(e).toVar(),u=Di(Di(4)).toVar(),l=Di().toVar(),d=Di().toVar(),c=Di().toVar();return l.assign(d.assign(c.assign(Di(Li(3735928559)).add(u.shiftLeft(Di(2))).add(Di(13))))),l.addAssign(Di(a)),d.addAssign(Di(o)),c.addAssign(Di(n)),gb(l,d,c),l.addAssign(Di(i)),mb(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"}]}),wi((([e,t,r,s,i])=>{const n=Li(i).toVar(),o=Li(s).toVar(),a=Li(r).toVar(),u=Li(t).toVar(),l=Li(e).toVar(),d=Di(Di(5)).toVar(),c=Di().toVar(),h=Di().toVar(),p=Di().toVar();return c.assign(h.assign(p.assign(Di(Li(3735928559)).add(d.shiftLeft(Di(2))).add(Di(13))))),c.addAssign(Di(l)),h.addAssign(Di(u)),p.addAssign(Di(a)),gb(c,h,p),c.addAssign(Di(o)),h.addAssign(Di(n)),mb(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"}]})]),bb=Gm([wi((([e,t])=>{const r=Li(t).toVar(),s=Li(e).toVar(),i=Di(xb(s,r)).toVar(),n=Hi().toVar();return n.x.assign(i.bitAnd(Li(255))),n.y.assign(i.shiftRight(Li(8)).bitAnd(Li(255))),n.z.assign(i.shiftRight(Li(16)).bitAnd(Li(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),wi((([e,t,r])=>{const s=Li(r).toVar(),i=Li(t).toVar(),n=Li(e).toVar(),o=Di(xb(n,i,s)).toVar(),a=Hi().toVar();return a.x.assign(o.bitAnd(Li(255))),a.y.assign(o.shiftRight(Li(8)).bitAnd(Li(255))),a.z.assign(o.shiftRight(Li(16)).bitAnd(Li(255))),a})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Tb=Gm([wi((([e])=>{const t=Oi(e).toVar(),r=Li().toVar(),s=Li().toVar(),i=Ii(eb(t.x,r)).toVar(),n=Ii(eb(t.y,s)).toVar(),o=Ii(yb(i)).toVar(),a=Ii(yb(n)).toVar(),u=Ii(tb(nb(xb(r,s),i,n),nb(xb(r.add(Li(1)),s),i.sub(1),n),nb(xb(r,s.add(Li(1))),i,n.sub(1)),nb(xb(r.add(Li(1)),s.add(Li(1))),i.sub(1),n.sub(1)),o,a)).toVar();return cb(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),wi((([e])=>{const t=$i(e).toVar(),r=Li().toVar(),s=Li().toVar(),i=Li().toVar(),n=Ii(eb(t.x,r)).toVar(),o=Ii(eb(t.y,s)).toVar(),a=Ii(eb(t.z,i)).toVar(),u=Ii(yb(n)).toVar(),l=Ii(yb(o)).toVar(),d=Ii(yb(a)).toVar(),c=Ii(rb(nb(xb(r,s,i),n,o,a),nb(xb(r.add(Li(1)),s,i),n.sub(1),o,a),nb(xb(r,s.add(Li(1)),i),n,o.sub(1),a),nb(xb(r.add(Li(1)),s.add(Li(1)),i),n.sub(1),o.sub(1),a),nb(xb(r,s,i.add(Li(1))),n,o,a.sub(1)),nb(xb(r.add(Li(1)),s,i.add(Li(1))),n.sub(1),o,a.sub(1)),nb(xb(r,s.add(Li(1)),i.add(Li(1))),n,o.sub(1),a.sub(1)),nb(xb(r.add(Li(1)),s.add(Li(1)),i.add(Li(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return hb(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),_b=Gm([wi((([e])=>{const t=Oi(e).toVar(),r=Li().toVar(),s=Li().toVar(),i=Ii(eb(t.x,r)).toVar(),n=Ii(eb(t.y,s)).toVar(),o=Ii(yb(i)).toVar(),a=Ii(yb(n)).toVar(),u=$i(tb(ub(bb(r,s),i,n),ub(bb(r.add(Li(1)),s),i.sub(1),n),ub(bb(r,s.add(Li(1))),i,n.sub(1)),ub(bb(r.add(Li(1)),s.add(Li(1))),i.sub(1),n.sub(1)),o,a)).toVar();return cb(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),wi((([e])=>{const t=$i(e).toVar(),r=Li().toVar(),s=Li().toVar(),i=Li().toVar(),n=Ii(eb(t.x,r)).toVar(),o=Ii(eb(t.y,s)).toVar(),a=Ii(eb(t.z,i)).toVar(),u=Ii(yb(n)).toVar(),l=Ii(yb(o)).toVar(),d=Ii(yb(a)).toVar(),c=$i(rb(ub(bb(r,s,i),n,o,a),ub(bb(r.add(Li(1)),s,i),n.sub(1),o,a),ub(bb(r,s.add(Li(1)),i),n,o.sub(1),a),ub(bb(r.add(Li(1)),s.add(Li(1)),i),n.sub(1),o.sub(1),a),ub(bb(r,s,i.add(Li(1))),n,o,a.sub(1)),ub(bb(r.add(Li(1)),s,i.add(Li(1))),n.sub(1),o,a.sub(1)),ub(bb(r,s.add(Li(1)),i.add(Li(1))),n,o.sub(1),a.sub(1)),ub(bb(r.add(Li(1)),s.add(Li(1)),i.add(Li(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return hb(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),vb=Gm([wi((([e])=>{const t=Ii(e).toVar(),r=Li(Jx(t)).toVar();return fb(xb(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),wi((([e])=>{const t=Oi(e).toVar(),r=Li(Jx(t.x)).toVar(),s=Li(Jx(t.y)).toVar();return fb(xb(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),wi((([e])=>{const t=$i(e).toVar(),r=Li(Jx(t.x)).toVar(),s=Li(Jx(t.y)).toVar(),i=Li(Jx(t.z)).toVar();return fb(xb(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),wi((([e])=>{const t=qi(e).toVar(),r=Li(Jx(t.x)).toVar(),s=Li(Jx(t.y)).toVar(),i=Li(Jx(t.z)).toVar(),n=Li(Jx(t.w)).toVar();return fb(xb(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Nb=Gm([wi((([e])=>{const t=Ii(e).toVar(),r=Li(Jx(t)).toVar();return $i(fb(xb(r,Li(0))),fb(xb(r,Li(1))),fb(xb(r,Li(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),wi((([e])=>{const t=Oi(e).toVar(),r=Li(Jx(t.x)).toVar(),s=Li(Jx(t.y)).toVar();return $i(fb(xb(r,s,Li(0))),fb(xb(r,s,Li(1))),fb(xb(r,s,Li(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),wi((([e])=>{const t=$i(e).toVar(),r=Li(Jx(t.x)).toVar(),s=Li(Jx(t.y)).toVar(),i=Li(Jx(t.z)).toVar();return $i(fb(xb(r,s,i,Li(0))),fb(xb(r,s,i,Li(1))),fb(xb(r,s,i,Li(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),wi((([e])=>{const t=qi(e).toVar(),r=Li(Jx(t.x)).toVar(),s=Li(Jx(t.y)).toVar(),i=Li(Jx(t.z)).toVar(),n=Li(Jx(t.w)).toVar();return $i(fb(xb(r,s,i,n,Li(0))),fb(xb(r,s,i,n,Li(1))),fb(xb(r,s,i,n,Li(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Sb=wi((([e,t,r,s])=>{const i=Ii(s).toVar(),n=Ii(r).toVar(),o=Li(t).toVar(),a=$i(e).toVar(),u=Ii(0).toVar(),l=Ii(1).toVar();return Tc(o,(()=>{u.addAssign(l.mul(Tb(a))),l.mulAssign(i),a.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"}]}),Ab=wi((([e,t,r,s])=>{const i=Ii(s).toVar(),n=Ii(r).toVar(),o=Li(t).toVar(),a=$i(e).toVar(),u=$i(0).toVar(),l=Ii(1).toVar();return Tc(o,(()=>{u.addAssign(l.mul(_b(a))),l.mulAssign(i),a.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"}]}),Rb=wi((([e,t,r,s])=>{const i=Ii(s).toVar(),n=Ii(r).toVar(),o=Li(t).toVar(),a=$i(e).toVar();return Oi(Sb(a,o,n,i),Sb(a.add($i(Li(19),Li(193),Li(17))),o,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"}]}),Cb=wi((([e,t,r,s])=>{const i=Ii(s).toVar(),n=Ii(r).toVar(),o=Li(t).toVar(),a=$i(e).toVar(),u=$i(Ab(a,o,n,i)).toVar(),l=Ii(Sb(a.add($i(Li(19),Li(193),Li(17))),o,n,i)).toVar();return qi(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"}]}),Eb=Gm([wi((([e,t,r,s,i,n,o])=>{const a=Li(o).toVar(),u=Ii(n).toVar(),l=Li(i).toVar(),d=Li(s).toVar(),c=Li(r).toVar(),h=Li(t).toVar(),p=Oi(e).toVar(),g=$i(Nb(Oi(h.add(d),c.add(l)))).toVar(),m=Oi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Oi(Oi(Ii(h),Ii(c)).add(m)).toVar(),y=Oi(f.sub(p)).toVar();return Fi(a.equal(Li(2)),(()=>$o(y.x).add($o(y.y)))),Fi(a.equal(Li(3)),(()=>ia($o(y.x),$o(y.y)))),da(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"}]}),wi((([e,t,r,s,i,n,o,a,u])=>{const l=Li(u).toVar(),d=Ii(a).toVar(),c=Li(o).toVar(),h=Li(n).toVar(),p=Li(i).toVar(),g=Li(s).toVar(),m=Li(r).toVar(),f=Li(t).toVar(),y=$i(e).toVar(),x=$i(Nb($i(f.add(p),m.add(h),g.add(c)))).toVar();x.subAssign(.5),x.mulAssign(d),x.addAssign(.5);const b=$i($i(Ii(f),Ii(m),Ii(g)).add(x)).toVar(),T=$i(b.sub(y)).toVar();return Fi(l.equal(Li(2)),(()=>$o(T.x).add($o(T.y)).add($o(T.z)))),Fi(l.equal(Li(3)),(()=>ia(ia($o(T.x),$o(T.y)),$o(T.z)))),da(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"}]})]),wb=wi((([e,t,r])=>{const s=Li(r).toVar(),i=Ii(t).toVar(),n=Oi(e).toVar(),o=Li().toVar(),a=Li().toVar(),u=Oi(eb(n.x,o),eb(n.y,a)).toVar(),l=Ii(1e6).toVar();return Tc({start:-1,end:Li(1),name:"x",condition:"<="},(({x:e})=>{Tc({start:-1,end:Li(1),name:"y",condition:"<="},(({y:t})=>{const r=Ii(Eb(u,e,t,o,a,i,s)).toVar();l.assign(sa(l,r))}))})),Fi(s.equal(Li(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"}]}),Mb=wi((([e,t,r])=>{const s=Li(r).toVar(),i=Ii(t).toVar(),n=Oi(e).toVar(),o=Li().toVar(),a=Li().toVar(),u=Oi(eb(n.x,o),eb(n.y,a)).toVar(),l=Oi(1e6,1e6).toVar();return Tc({start:-1,end:Li(1),name:"x",condition:"<="},(({x:e})=>{Tc({start:-1,end:Li(1),name:"y",condition:"<="},(({y:t})=>{const r=Ii(Eb(u,e,t,o,a,i,s)).toVar();Fi(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),Fi(s.equal(Li(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"}]}),Bb=wi((([e,t,r])=>{const s=Li(r).toVar(),i=Ii(t).toVar(),n=Oi(e).toVar(),o=Li().toVar(),a=Li().toVar(),u=Oi(eb(n.x,o),eb(n.y,a)).toVar(),l=$i(1e6,1e6,1e6).toVar();return Tc({start:-1,end:Li(1),name:"x",condition:"<="},(({x:e})=>{Tc({start:-1,end:Li(1),name:"y",condition:"<="},(({y:t})=>{const r=Ii(Eb(u,e,t,o,a,i,s)).toVar();Fi(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)}))}))})),Fi(s.equal(Li(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"}]}),Fb=Gm([wb,wi((([e,t,r])=>{const s=Li(r).toVar(),i=Ii(t).toVar(),n=$i(e).toVar(),o=Li().toVar(),a=Li().toVar(),u=Li().toVar(),l=$i(eb(n.x,o),eb(n.y,a),eb(n.z,u)).toVar(),d=Ii(1e6).toVar();return Tc({start:-1,end:Li(1),name:"x",condition:"<="},(({x:e})=>{Tc({start:-1,end:Li(1),name:"y",condition:"<="},(({y:t})=>{Tc({start:-1,end:Li(1),name:"z",condition:"<="},(({z:r})=>{const n=Ii(Eb(l,e,t,r,o,a,u,i,s)).toVar();d.assign(sa(d,n))}))}))})),Fi(s.equal(Li(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"}]})]),Ub=Gm([Mb,wi((([e,t,r])=>{const s=Li(r).toVar(),i=Ii(t).toVar(),n=$i(e).toVar(),o=Li().toVar(),a=Li().toVar(),u=Li().toVar(),l=$i(eb(n.x,o),eb(n.y,a),eb(n.z,u)).toVar(),d=Oi(1e6,1e6).toVar();return Tc({start:-1,end:Li(1),name:"x",condition:"<="},(({x:e})=>{Tc({start:-1,end:Li(1),name:"y",condition:"<="},(({y:t})=>{Tc({start:-1,end:Li(1),name:"z",condition:"<="},(({z:r})=>{const n=Ii(Eb(l,e,t,r,o,a,u,i,s)).toVar();Fi(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),Fi(s.equal(Li(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"}]})]),Pb=Gm([Bb,wi((([e,t,r])=>{const s=Li(r).toVar(),i=Ii(t).toVar(),n=$i(e).toVar(),o=Li().toVar(),a=Li().toVar(),u=Li().toVar(),l=$i(eb(n.x,o),eb(n.y,a),eb(n.z,u)).toVar(),d=$i(1e6,1e6,1e6).toVar();return Tc({start:-1,end:Li(1),name:"x",condition:"<="},(({x:e})=>{Tc({start:-1,end:Li(1),name:"y",condition:"<="},(({y:t})=>{Tc({start:-1,end:Li(1),name:"z",condition:"<="},(({z:r})=>{const n=Ii(Eb(l,e,t,r,o,a,u,i,s)).toVar();Fi(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)}))}))}))})),Fi(s.equal(Li(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"}]})]),Ib=wi((([e])=>{const t=e.y,r=e.z,s=$i().toVar();return Fi(t.lessThan(1e-4),(()=>{s.assign($i(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(Uo(i)).mul(6).toVar();const n=Li(Zo(i)),o=i.sub(Ii(n)),a=r.mul(t.oneMinus()),u=r.mul(t.mul(o).oneMinus()),l=r.mul(t.mul(o.oneMinus()).oneMinus());Fi(n.equal(Li(0)),(()=>{s.assign($i(r,l,a))})).ElseIf(n.equal(Li(1)),(()=>{s.assign($i(u,r,a))})).ElseIf(n.equal(Li(2)),(()=>{s.assign($i(a,r,l))})).ElseIf(n.equal(Li(3)),(()=>{s.assign($i(a,u,r))})).ElseIf(n.equal(Li(4)),(()=>{s.assign($i(l,a,r))})).Else((()=>{s.assign($i(r,a,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Lb=wi((([e])=>{const t=$i(e).toVar(),r=Ii(t.x).toVar(),s=Ii(t.y).toVar(),i=Ii(t.z).toVar(),n=Ii(sa(r,sa(s,i))).toVar(),o=Ii(ia(r,ia(s,i))).toVar(),a=Ii(o.sub(n)).toVar(),u=Ii().toVar(),l=Ii().toVar(),d=Ii().toVar();return d.assign(o),Fi(o.greaterThan(0),(()=>{l.assign(a.div(o))})).Else((()=>{l.assign(0)})),Fi(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{Fi(r.greaterThanEqual(o),(()=>{u.assign(s.sub(i).div(a))})).ElseIf(s.greaterThanEqual(o),(()=>{u.assign(Kn(2,i.sub(r).div(a)))})).Else((()=>{u.assign(Kn(4,r.sub(s).div(a)))})),u.mulAssign(1/6),Fi(u.lessThan(0),(()=>{u.addAssign(1)}))})),$i(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),Db=wi((([e])=>{const t=$i(e).toVar(),r=ji(so(t,$i(.04045))).toVar(),s=$i(t.div(12.92)).toVar(),i=$i(ha(ia(t.add($i(.055)),$i(0)).div(1.055),$i(2.4))).toVar();return ba(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Vb=(e,t)=>{e=Ii(e),t=Ii(t);const r=Oi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return Na(e.sub(r),e.add(r),t)},Ob=(e,t,r,s)=>ba(e,t,r[s].clamp()),Gb=(e,t,r,s,i)=>ba(e,t,Vb(r,s[i])),kb=wi((([e,t,r])=>{const s=Io(e).toVar("nDir"),i=Yn(Ii(.5).mul(t.sub(r)),yl).div(s).toVar("rbmax"),n=Yn(Ii(-.5).mul(t.sub(r)),yl).div(s).toVar("rbmin"),o=$i().toVar("rbminmax");o.x=s.x.greaterThan(Ii(0)).select(i.x,n.x),o.y=s.y.greaterThan(Ii(0)).select(i.y,n.y),o.z=s.z.greaterThan(Ii(0)).select(i.z,n.z);const a=sa(sa(o.x,o.y),o.z).toVar("correction");return yl.add(s.mul(a)).toVar("boxIntersection").sub(r)})),zb=wi((([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(Qn(r,r).sub(Qn(s,s)))),n}));var $b=Object.freeze({__proto__:null,BRDF_GGX:tp,BRDF_Lambert:Gh,BasicShadowFilter:Ax,Break:_c,Const:Ga,Continue:()=>vu("continue").append(),DFGApprox:rp,D_GGX:Zh,Discard:Nu,EPSILON:bo,F_Schlick:Oh,Fn:wi,INFINITY:To,If:Fi,Loop:Tc,NodeAccess:Fs,NodeShaderStage:ws,NodeType:Bs,NodeUpdateType:Ms,PCFShadowFilter:Rx,PCFSoftShadowFilter:Cx,PI:_o,PI2:vo,Return:()=>vu("return").append(),Schlick_to_F0:ip,ScriptableNodeResources:My,ShaderNode:Ni,TBNViewMatrix:od,VSMShadowFilter:Ex,V_GGX_SmithCorrelated:Yh,Var:Oa,abs:$o,acesFilmicToneMapping:fy,acos:ko,add:Kn,addMethodChaining:Qs,addNodeElement:function(e){console.warn("THREE.TSLBase: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:Ty,all:No,alphaT:Cn,and:oo,anisotropy:En,anisotropyB:Mn,anisotropyT:wn,any:So,append:Ui,array:sn,arrayBuffer:e=>Si(new Xs(e,"ArrayBuffer")),asin:Go,assign:Hn,atan:zo,atan2:Ea,atomicAdd:(e,t,r=null)=>Jy(Qy.ATOMIC_ADD,e,t,r),atomicAnd:(e,t,r=null)=>Jy(Qy.ATOMIC_AND,e,t,r),atomicFunc:Jy,atomicLoad:(e,t=null)=>Jy(Qy.ATOMIC_LOAD,e,null,t),atomicMax:(e,t,r=null)=>Jy(Qy.ATOMIC_MAX,e,t,r),atomicMin:(e,t,r=null)=>Jy(Qy.ATOMIC_MIN,e,t,r),atomicOr:(e,t,r=null)=>Jy(Qy.ATOMIC_OR,e,t,r),atomicStore:(e,t,r=null)=>Jy(Qy.ATOMIC_STORE,e,t,r),atomicSub:(e,t,r=null)=>Jy(Qy.ATOMIC_SUB,e,t,r),atomicXor:(e,t,r=null)=>Jy(Qy.ATOMIC_XOR,e,t,r),attenuationColor:zn,attenuationDistance:kn,attribute:Cu,attributeArray:(e,t="float")=>{const r=vs(t),s=_s(t),i=new Rf(e,r,s);return Mf(i,t,e)},backgroundBlurriness:Df,backgroundIntensity:Vf,backgroundRotation:Of,batch:mc,billboarding:jm,bitAnd:co,bitNot:ho,bitOr:po,bitXor:go,bitangentGeometry:ed,bitangentLocal:td,bitangentView:rd,bitangentWorld:sd,bitcast:ta,blendBurn:Xf,blendColor:Zf,blendDodge:Kf,blendOverlay:Qf,blendScreen:Yf,blur:rg,bool:Vi,buffer:Du,bufferAttribute:uu,bumpMap:md,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),Xf(e)),bvec2:zi,bvec3:ji,bvec4:Yi,bypass:yu,cache:mu,call:qn,cameraFar:$u,cameraIndex:ku,cameraNear:zu,cameraNormalMatrix:Xu,cameraPosition:Ku,cameraProjectionMatrix:Wu,cameraProjectionMatrixInverse:Hu,cameraViewMatrix:ju,cameraWorldMatrix:qu,cbrt:ya,cdl:iy,ceil:Po,checker:Kx,cineonToneMapping:gy,clamp:Ta,clearcoat:Tn,clearcoatRoughness:_n,code:Ny,color:Pi,colorSpaceToWorking:Ja,colorToDirection:e=>Si(e).mul(2).sub(1),compute:pu,cond:Ua,context:Ia,convert:tn,convertColorSpace:(e,t,r)=>Si(new Ka(Si(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():_f(e,...t),cos:Vo,cross:ca,cubeTexture:Gl,dFdx:Xo,dFdy:Ko,dashSize:In,defaultBuildStages:Ps,defaultShaderStages:Us,defined:_i,degrees:Ro,deltaTime:zm,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),Ly(e,Iy(t))},densityFogFactor:Iy,depth:ih,depthPass:(e,t,r)=>Si(new dy(dy.DEPTH,e,t,r)),difference:la,diffuseColor:fn,directPointLight:qx,directionToColor:vh,dispersion:$n,distance:ua,div:Zn,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),Kf(e)),dot:da,drawIndex:lc,dynamicBufferAttribute:lu,element:en,emissive:yn,equal:eo,equals:ra,equirectUV:Rh,exp:Co,exp2:Eo,expression:vu,faceDirection:Nl,faceForward:Sa,faceforward:wa,float:Ii,floor:Uo,fog:Ly,fract:Lo,frameGroup:un,frameId:$m,frontFacing:vl,fwidth:Jo,gain:(e,t)=>e.lessThan(.5)?Pm(e.mul(2),t).div(2):Yn(1,Pm(Qn(Yn(1,e),2),t).div(2)),gapSize:Ln,getConstNodeType:vi,getCurrentStack:Bi,getDirection:Zp,getDistanceAttenuation:Dx,getGeometryRoughness:Xh,getNormalFromDepth:Sf,getParallaxCorrectNormal:kb,getRoughness:Kh,getScreenPosition:Nf,getShIrradianceAt:zb,getTextureIndex:Mm,getViewPosition:vf,globalId:Hy,glsl:(e,t)=>Ny(e,t,"glsl"),glslFn:(e,t)=>Ay(e,t,"glsl"),grayscale:Jf,greaterThan:so,greaterThanEqual:no,hash:Um,highpModelNormalViewMatrix:pl,highpModelViewMatrix:hl,hue:ry,instance:cc,instanceIndex:nc,instancedArray:(e,t="float")=>{const r=vs(t),s=_s(t),i=new Af(e,r,s);return Mf(i,t,e)},instancedBufferAttribute:du,instancedDynamicBufferAttribute:cu,instancedMesh:pc,int:Li,inverseSqrt:Fo,inversesqrt:Ma,invocationLocalIndex:uc,invocationSubgroupIndex:ac,ior:Vn,iridescence:Sn,iridescenceIOR:An,iridescenceThickness:Rn,ivec2:Gi,ivec3:Wi,ivec4:Xi,js:(e,t)=>Ny(e,t,"js"),label:La,length:Ho,lengthSq:xa,lessThan:ro,lessThanEqual:io,lightPosition:ix,lightProjectionUV:sx,lightShadowMatrix:rx,lightTargetDirection:ax,lightTargetPosition:nx,lightViewPosition:ox,lightingContext:Mc,lights:(e=[])=>Si(new dx).setLights(e),linearDepth:nh,linearToneMapping:hy,localId:jy,log:wo,log2:Mo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(wo(r.div(t)));return Ii(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("TSL.LoopNode: loop() has been renamed to Loop()."),Tc(...e)),luminance:sy,mat2:Qi,mat3:Zi,mat4:Ji,matcapUV:Ng,materialAO:ec,materialAlphaTest:xd,materialAnisotropy:Dd,materialAnisotropyVector:tc,materialAttenuationColor:Hd,materialAttenuationDistance:Wd,materialClearcoat:Bd,materialClearcoatNormal:Ud,materialClearcoatRoughness:Fd,materialColor:bd,materialDispersion:Zd,materialEmissive:_d,materialIOR:$d,materialIridescence:Vd,materialIridescenceIOR:Od,materialIridescenceThickness:Gd,materialLightMap:Jd,materialLineDashOffset:Yd,materialLineDashSize:qd,materialLineGapSize:Xd,materialLineScale:jd,materialLineWidth:Kd,materialMetalness:wd,materialNormal:Md,materialOpacity:vd,materialPointSize:Qd,materialReference:jl,materialReflectivity:Cd,materialRefractionRatio:Pl,materialRotation:Pd,materialRoughness:Ed,materialSheen:Id,materialSheenRoughness:Ld,materialShininess:Td,materialSpecular:Nd,materialSpecularColor:Ad,materialSpecularIntensity:Sd,materialSpecularStrength:Rd,materialThickness:zd,materialTransmission:kd,max:ia,maxMipLevel:Fu,mediumpModelViewMatrix:cl,metalness:bn,min:sa,mix:ba,mixElement:Ra,mod:na,modInt:Jn,modelDirection:sl,modelNormalMatrix:ul,modelPosition:nl,modelScale:ol,modelViewMatrix:dl,modelViewPosition:al,modelViewProjection:rc,modelWorldMatrix:il,modelWorldMatrixInverse:ll,morphReference:Rc,mrt:Fm,mul:Qn,mx_aastep:Vb,mx_cell_noise_float:(e=Eu())=>vb(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>Ii(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=Eu(),t=3,r=2,s=.5,i=1)=>Sb(e,Li(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Eu(),t=3,r=2,s=.5,i=1)=>Rb(e,Li(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Eu(),t=3,r=2,s=.5,i=1)=>Ab(e,Li(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Eu(),t=3,r=2,s=.5,i=1)=>Cb(e,Li(t),r,s).mul(i),mx_hsvtorgb:Ib,mx_noise_float:(e=Eu(),t=1,r=0)=>Tb(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Eu(),t=1,r=0)=>_b(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Eu(),t=1,r=0)=>{e=e.convert("vec2|vec3");return qi(_b(e),Tb(e.add(Oi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=Eu())=>Ob(e,t,r,"x"),mx_ramptb:(e,t,r=Eu())=>Ob(e,t,r,"y"),mx_rgbtohsv:Lb,mx_safepower:(e,t=1)=>(e=Ii(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=Eu())=>Gb(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Eu())=>Gb(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:Db,mx_transform_uv:(e=1,t=0,r=Eu())=>r.mul(e).add(t),mx_worley_noise_float:(e=Eu(),t=1)=>Fb(e.convert("vec2|vec3"),t,Li(1)),mx_worley_noise_vec2:(e=Eu(),t=1)=>Ub(e.convert("vec2|vec3"),t,Li(1)),mx_worley_noise_vec3:(e=Eu(),t=1)=>Pb(e.convert("vec2|vec3"),t,Li(1)),negate:jo,neutralToneMapping:_y,nodeArray:Ri,nodeImmutable:Ei,nodeObject:Si,nodeObjects:Ai,nodeProxy:Ci,normalFlat:Rl,normalGeometry:Sl,normalLocal:Al,normalMap:cd,normalView:Cl,normalWorld:El,normalize:Io,not:uo,notEqual:to,numWorkgroups:$y,objectDirection:Qu,objectGroup:dn,objectPosition:Ju,objectScale:el,objectViewPosition:tl,objectWorldMatrix:Zu,oneMinus:qo,or:ao,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=km)=>e.fract(),oscSine:(e=km)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=km)=>e.fract().round(),oscTriangle:(e=km)=>e.add(.5).fract().mul(2).sub(1).abs(),output:Pn,outputStruct:wm,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),Qf(e)),overloadingFn:Gm,parabola:Pm,parallaxDirection:ad,parallaxUV:(e,t)=>e.sub(ad.mul(t)),parameter:(e,t)=>Si(new Am(e,t)),pass:(e,t,r)=>Si(new dy(dy.COLOR,e,t,r)),passTexture:(e,t)=>Si(new uy(e,t)),pcurve:(e,t,r)=>ha(Zn(ha(e,t),Kn(ha(e,t),ha(Yn(1,e),r))),1/t),perspectiveDepthToViewZ:th,pmremTexture:ag,pointUV:Uf,pointWidth:Dn,positionGeometry:gl,positionLocal:ml,positionPrevious:fl,positionView:bl,positionViewDirection:Tl,positionWorld:yl,positionWorldDirection:xl,posterize:oy,pow:ha,pow2:pa,pow3:ga,pow4:ma,property:gn,radians:Ao,rand:Aa,range:Gy,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),Ly(e,Py(t,r))},rangeFogFactor:Py,reciprocal:Qo,reference:$l,referenceBuffer:Wl,reflect:aa,reflectVector:Dl,reflectView:Il,reflector:e=>Si(new pf(e)),refract:va,refractVector:Vl,refractView:Ll,reinhardToneMapping:py,remainder:yo,remap:bu,remapClamp:Tu,renderGroup:ln,renderOutput:Au,rendererReference:su,rotate:Cg,rotateUV:Wm,roughness:xn,round:Yo,rtt:_f,sRGBTransferEOTF:Ha,sRGBTransferOETF:ja,sampler:e=>(!0===e.isNode?e:Pu(e)).convert("sampler"),saturate:_a,saturation:ey,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),Yf(e)),screenCoordinate:Dc,screenSize:Lc,screenUV:Ic,scriptable:Fy,scriptableValue:Cy,select:Fa,setCurrentStack:Mi,shaderStages:Is,shadow:Ix,shadowPositionWorld:hx,shapeCircle:Yx,sharedUniformGroup:an,sheen:vn,sheenRoughness:Nn,shiftLeft:mo,shiftRight:fo,shininess:Un,sign:Wo,sin:Do,sinc:(e,t)=>Do(_o.mul(t.mul(e).sub(1))).div(_o.mul(t.mul(e).sub(1))),skinning:e=>Si(new yc(e)),skinningReference:xc,smoothstep:Na,smoothstepElement:Ca,specularColor:Bn,specularF90:Fn,spherizeUV:Hm,split:(e,t)=>Si(new Ws(Si(e),t)),spritesheetUV:Km,sqrt:Bo,stack:Cm,step:oa,storage:Mf,storageBarrier:()=>Xy("storage").append(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),Mf(e,t,r).setPBO(!0)),storageTexture:kf,string:(e="")=>Si(new Xs(e,"string")),sub:Yn,subgroupIndex:oc,subgroupSize:qy,tan:Oo,tangentGeometry:ql,tangentLocal:Xl,tangentView:Kl,tangentWorld:Yl,temp:ka,texture:Pu,texture3D:Dg,textureBarrier:()=>Xy("texture").append(),textureBicubic:vp,textureCubeUV:Jp,textureLoad:Iu,textureSize:Mu,textureStore:(e,t,r)=>{const s=kf(e,t,r);return null!==r&&s.append(),s},thickness:Gn,time:km,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),zm.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),km.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),km.mul(e)),toOutputColorSpace:Ya,toWorkingColorSpace:Qa,toneMapping:nu,toneMappingExposure:ou,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Si(new cy(t,r,Si(s),Si(i),Si(n))),transformDirection:fa,transformNormal:Fl,transformNormalToView:Ul,transformedBentNormalView:ud,transformedBitangentView:id,transformedBitangentWorld:nd,transformedClearcoatNormalView:Bl,transformedNormalView:wl,transformedNormalWorld:Ml,transformedTangentView:Ql,transformedTangentWorld:Zl,transmission:On,transpose:ea,triNoise3D:Dm,triplanarTexture:(...e)=>Qm(...e),triplanarTextures:Qm,trunc:Zo,tslFn:(...e)=>(console.warn("TSL.ShaderNode: tslFn() has been renamed to Fn()."),wi(...e)),uint:Di,uniform:hn,uniformArray:Gu,uniformGroup:on,uniforms:(e,t)=>(console.warn("TSL.UniformArrayNode: uniforms() has been renamed to uniformArray()."),Si(new Ou(e,t))),userData:(e,t,r)=>Si(new zf(e,t,r)),uv:Eu,uvec2:ki,uvec3:Hi,uvec4:Ki,varying:$a,varyingProperty:mn,vec2:Oi,vec3:$i,vec4:qi,vectorComponents:Ls,velocity:qf,vertexColor:e=>Si(new Bf(e)),vertexIndex:ic,vertexStage:Wa,vibrance:ty,viewZToLogarithmicDepth:rh,viewZToOrthographicDepth:Jc,viewZToPerspectiveDepth:eh,viewport:Vc,viewportBottomLeft:Wc,viewportCoordinate:Gc,viewportDepthTexture:Qc,viewportLinearDepth:oh,viewportMipTexture:Xc,viewportResolution:zc,viewportSafeUV:qm,viewportSharedTexture:bh,viewportSize:Oc,viewportTexture:qc,viewportTopLeft:$c,viewportUV:kc,wgsl:(e,t)=>Ny(e,t,"wgsl"),wgslFn:(e,t)=>Ay(e,t,"wgsl"),workgroupArray:(e,t)=>Si(new Yy("Workgroup",e,t)),workgroupBarrier:()=>Xy("workgroup").append(),workgroupId:Wy,workingToColorSpace:Za,xor:lo});const Wb=new Sm;class Hb extends Hg{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(Wb,Ce),Wb.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(Wb,Ce),Wb.a=1,n=!0;else if(!0===i.isNode){const r=this.get(e),n=i;Wb.copy(s._clearColor);let o=r.backgroundMesh;if(void 0===o){const e=Ia(qi(n).mul(Vf),{getUV:()=>Of.mul(El),getTextureLevel:()=>Df});let t=rc;t=t.setZ(t.w);const s=new hh;s.name="Background.material",s.side=_,s.depthTest=!1,s.depthWrite=!1,s.fog=!1,s.lights=!1,s.vertexNode=t,s.colorNode=e,r.backgroundMeshNode=e,r.backgroundMesh=o=new k(new Fe(1,32,32),s),o.frustumCulled=!1,o.name="Background.mesh",o.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)}}const a=n.getCacheKey();r.backgroundCacheKey!==a&&(r.backgroundMeshNode.node=qi(n).mul(Vf),r.backgroundMeshNode.needsUpdate=!0,o.material.needsUpdate=!0,r.backgroundCacheKey=a),t.unshift(o,o.geometry,o.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const o=s.xr.getEnvironmentBlendMode();if("additive"===o?Wb.set(0,0,0,1):"alpha-blend"===o&&Wb.set(0,0,0,0),!0===s.autoClear||!0===n){const e=r.clearColorValue;e.r=Wb.r,e.g=Wb.g,e.b=Wb.b,e.a=Wb.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(e.r*=e.a,e.g*=e.a,e.b*=e.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 jb=0;class qb{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=jb++}}class Xb{constructor(e,t,r,s,i,n,o,a,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=o,this.updateAfterNodes=a,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 qb(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class Kb{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class Yb{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}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 Qb{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class Zb extends Qb{constructor(e,t){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0}}class Jb{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let eT=0;class tT{constructor(e=null){this.id=eT++,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 rT extends Vs{static get type(){return"StructTypeNode"}constructor(e,t){super(),this.name=e,this.types=t,this.isStructTypeNode=!0}getMemberTypes(){return this.types}}class sT{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class iT extends sT{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class nT extends sT{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class oT extends sT{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class aT extends sT{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class uT extends sT{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class lT extends sT{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=16,this.itemSize=4}}class dT extends sT{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class cT extends sT{constructor(e,t=new o){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class hT extends iT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class pT extends nT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class gT extends oT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class mT extends aT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class fT extends uT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class yT extends lT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class xT extends dT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class bT extends cT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const TT=[.125,.215,.35,.446,.526,.582],_T=20,vT=new _e(-1,1,1,-1,0,1),NT=new Pe(90,1),ST=new e;let AT=null,RT=0,CT=0;const ET=(1+Math.sqrt(5))/2,wT=1/ET,MT=[new r(-ET,wT,0),new r(ET,wT,0),new r(-wT,0,ET),new r(wT,0,ET),new r(0,ET,-wT),new r(0,ET,wT),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],BT=new WeakMap,FT=[3,1,5,0,4,2],UT=Zp(Eu(),Cu("faceIndex")).normalize(),PT=$i(UT.x,UT.y,UT.z);class IT{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=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=null){if(this._setSize(256),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=i||this._allocateTargets();return this.fromSceneAsync(e,t,r,s,n),n}AT=this._renderer.getRenderTarget(),RT=this._renderer.getActiveCubeFace(),CT=this._renderer.getActiveMipmapLevel();const n=i||this._allocateTargets();return n.depthBuffer=!0,this._sceneToCubeUV(e,r,s,n),t>0&&this._blur(n,0,0,t),this._applyPMREM(n),this._cleanup(n),n}async fromSceneAsync(e,t=0,r=.1,s=100,i=null){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=OT(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=GT(),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===v||e.mapping===N?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._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=TT[a-e+4-1]:0===a&&(u=0),s.push(u);const l=1/(o-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,x=new Float32Array(m*g*p),b=new Float32Array(f*g*p),T=new Float32Array(y*g*p);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=FT[e];x.set(s,m*g*i),b.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new ve;_.setAttribute("position",new Se(x,m)),_.setAttribute("uv",new Se(b,f)),_.setAttribute("faceIndex",new Se(T,y)),t.push(_),i.push(new k(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=Gu(new Array(_T).fill(0)),n=hn(new r(0,1,0)),o=hn(0),a=Ii(_T),u=hn(0),l=hn(1),d=Pu(null),c=hn(0),h=Ii(1/t),p=Ii(1/s),g=Ii(e),m={n:a,latitudinal:u,weights:i,poleAxis:n,outputDirection:PT,dTheta:o,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=VT("blur");return f.fragmentNode=rg({...m,latitudinal:u.equal(1)}),BT.set(f,m),f}(i,e,t)}return i}async _compileMaterial(e){const t=new k(this._lodPlanes[0],e);await this._renderer.compile(t,vT)}_sceneToCubeUV(e,t,r,s){const i=NT;i.near=t,i.far=r;const n=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],a=this._renderer,u=a.autoClear;a.getClearColor(ST),a.autoClear=!1;let l=this._backgroundBox;if(null===l){const e=new Q({name:"PMREM.Background",side:_,depthWrite:!1,depthTest:!1});l=new k(new G,e)}let d=!1;const c=e.background;c?c.isColor&&(l.material.color.copy(c),e.background=null,d=!0):(l.material.color.copy(ST),d=!0),a.setRenderTarget(s),a.clear(),d&&a.render(l,i);for(let t=0;t<6;t++){const r=t%3;0===r?(i.up.set(0,n[t],0),i.lookAt(o[t],0,0)):1===r?(i.up.set(0,0,n[t]),i.lookAt(0,o[t],0)):(i.up.set(0,n[t],0),i.lookAt(0,0,o[t]));const u=this._cubeSize;DT(s,r*u,t>2?u:0,u,u),a.render(e,i)}a.autoClear=u,e.background=c}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===v||e.mapping===N;s?null===this._cubemapMaterial&&(this._cubemapMaterial=OT(e)):null===this._equirectMaterial&&(this._equirectMaterial=GT(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const o=this._cubeSize;DT(t,0,0,3*o,2*o),r.setRenderTarget(t),r.render(n,vT)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;t_T&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;e<_T;++e){const t=e/p,r=Math.exp(-t*t/2);m.push(r),0===e?f+=r:ey-4?s-y+4:0),4*(this._cubeSize-x),3*x,2*x),a.setRenderTarget(t),a.render(l,vT)}}function LT(e,t,r){const s=new fe(e,t,r);return s.texture.mapping=Ue,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function DT(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function VT(e){const t=new hh;return t.depthTest=!1,t.depthWrite=!1,t.blending=D,t.name=`PMREM_${e}`,t}function OT(e){const t=VT("cubemap");return t.fragmentNode=Gl(e,PT),t}function GT(e){const t=VT("equirect");return t.fragmentNode=Pu(e,Rh(PT),0),t}const kT=new WeakMap,zT=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),$T=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class WT{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.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.flow={code:""},this.chaining=[],this.stack=Cm(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new tT,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.useComparisonMethod=!1}getBindGroupsCache(){let e=kT.get(this.renderer);return void 0===e&&(e=new Gg,kT.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new fe(e,t,r)}createCubeRenderTarget(e,t){return new Ch(e,t)}createPMREMGenerator(){return new IT(this.renderer)}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 qb(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new qb(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 Is)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}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")}( ${$T(n.r)}, ${$T(n.g)}, ${$T(n.b)} )`;const o=this.getTypeLength(i),a=this.getComponentType(i),u=e=>this.generateConst(a,e);if(2===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(o>4&&n&&(n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(o>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 Kb(e,t);return 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||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===T)return"int";if(t===b)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=Ts(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return zT.get(e.constructor)}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 Ve||!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")}addStack(){return this.stack=Cm(this.stack),this.stacks.push(Bi()||this.stack),Mi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,Mi(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);return void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={}),s[t]}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);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new Kb("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e,r);let i=s.structType;if(void 0===i){const e=this.structs.index++;i=new rT("StructType"+e,t),this.structs[r].push(i),s.structType=i}return i}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 o=this.uniforms.index++;n=new Yb(s||"nodeUniform"+o,t,e),this.uniforms[r].push(n),i.uniform=n}return n}getArrayCount(e){let t=null;return e.isArrayNode?t=e.count:e.isVarNode&&e.node.isArrayNode&&(t=e.node.count),t}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s);let o=n.variable;if(void 0===o){const a=i?"_const":"_var",u=this.vars[s]||(this.vars[s]=[]),l=this.vars[a]||(this.vars[a]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+l,this.vars[a]++);const d=this.getArrayCount(e);o=new Qb(t,r,i,d),i||u.push(o),n.variable=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)){const s=this.getDataFromNode(e,"any");let i=s.varying;if(void 0===i){const e=this.varyings,n=e.length;null===t&&(t="nodeVarying"+n),i=new Zb(t,r),e.push(i),s.varying=i}return i}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 Jb("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}buildFunctionNode(e){const t=new Sy,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 Am(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.cache,n=this.buildStage,o=this.stack,a={code:""};this.flow=a,this.vars={},this.cache=new tT,this.stack=Cm();for(const r of Ps)this.setBuildStage(r),a.result=e.build(this,t);return a.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.cache=i,this.stack=o,this.setBuildStage(n),a}getFunctionOperator(){return null}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.shaderStage;this.setShaderStage(e);const n=this.flowChildNode(t,r);return null!==s&&(n.code+=`${this.tab+s} = ${n.result};\n`),this.flowCode[e]=this.flowCode[e]+n.code,this.setShaderStage(i),n}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("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(){console.warn("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(){console.warn("Abstract function.")}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new hh),e.build(this)}else this.addFlow("compute",e);for(const e of Ps){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Is){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}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new hT(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new pT(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new gT(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new mT(e);if("color"===t)return new fT(e);if("mat2"===t)return new yT(e);if("mat3"===t)return new xT(e);if("mat4"===t)return new bT(e);throw new Error(`Uniform "${t}" not declared.`)}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?this.format(`${e}.${"xyz".slice(0,i)}`,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${Oe} - Node System\n`}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}}class HT{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={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Ms.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===Ms.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===Ms.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Ms.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===Ms.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===Ms.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Ms.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===Ms.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===Ms.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 jT{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}jT.isNodeFunctionInput=!0;class qT extends Lx{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setup(e){super.setup(e);const t=e.context.lightingModel,r=this.colorNode,s=ax(this.light),i=e.context.reflectedLight;t.direct({lightDirection:s,lightColor:r,reflectedLight:i},e.stack,e)}}const XT=new o,KT=new o;let YT=null;class QT extends Lx{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=hn(new r).setGroup(ln),this.halfWidth=hn(new r).setGroup(ln),this.updateType=Ms.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;KT.identity(),XT.copy(t.matrixWorld),XT.premultiply(r),KT.extractRotation(XT),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(KT),this.halfHeight.value.applyMatrix4(KT)}setup(e){let t,r;super.setup(e),e.isAvailable("float32Filterable")?(t=Pu(YT.LTC_FLOAT_1),r=Pu(YT.LTC_FLOAT_2)):(t=Pu(YT.LTC_HALF_1),r=Pu(YT.LTC_HALF_2));const{colorNode:s,light:i}=this,n=e.context.lightingModel,o=ox(i),a=e.context.reflectedLight;n.directRectArea({lightColor:s,lightPosition:o,halfWidth:this.halfWidth,halfHeight:this.halfHeight,reflectedLight:a,ltc_1:t,ltc_2:r},e.stack,e)}static setLTC(e){YT=e}}class ZT extends Lx{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=hn(0).setGroup(ln),this.penumbraCosNode=hn(0).setGroup(ln),this.cutoffDistanceNode=hn(0).setGroup(ln),this.decayExponentNode=hn(0).setGroup(ln)}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){const{coneCosNode:t,penumbraCosNode:r}=this;return Na(t,r,e)}setup(e){super.setup(e);const t=e.context.lightingModel,{colorNode:r,cutoffDistanceNode:s,decayExponentNode:i,light:n}=this,o=ox(n).sub(bl),a=o.normalize(),u=a.dot(ax(n)),l=this.getSpotAttenuation(u),d=o.length(),c=Dx({lightDistance:d,cutoffDistance:s,decayExponent:i});let h=r.mul(l).mul(c);if(n.map){const e=sx(n),t=Pu(n.map,e.xy).onRenderUpdate((()=>n.map));h=e.mul(2).sub(1).abs().lessThan(1).all().select(h.mul(t),h)}const p=e.context.reflectedLight;t.direct({lightDirection:a,lightColor:h,reflectedLight:p},e.stack,e)}}class JT extends ZT{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e){const t=this.light.iesMap;let r=null;if(t&&!0===t.isTexture){const s=e.acos().mul(1/Math.PI);r=Pu(t,Oi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class e_ extends Lx{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class t_ extends Lx{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=ix(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=hn(new e).setGroup(ln)}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=Cl.dot(s).mul(.5).add(.5),n=ba(r,t,i);e.context.irradiance.addAssign(n)}}class r_ extends Lx{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=Gu(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=zb(El,this.lightProbe);e.context.irradiance.addAssign(t)}}class s_{parseFunction(){console.warn("Abstract function.")}}class i_{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}i_.isNodeFunction=!0;const n_=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,o_=/[a-z_0-9]+/gi,a_="#pragma main";class u_ extends i_{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:o,headerCode:a}=(e=>{const t=(e=e.trim()).indexOf(a_),r=-1!==t?e.slice(t+12):e,s=r.match(n_);if(null!==s&&5===s.length){const i=s[4],n=[];let o=null;for(;null!==(o=o_.exec(i));)n.push(o);const a=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,(()=>{if(!0===r.isCubeTexture||r.mapping===j||r.mapping===q||r.mapping===Ue){if(e.backgroundBlurriness>0||r.mapping===Ue)return ag(r);{let e;return e=!0===r.isCubeTexture?Gl(r):Pu(r),Fh(e)}}if(!0===r.isTexture)return Pu(r,Ic.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("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=$l("color","color",r).setGroup(ln),t=$l("density","float",r).setGroup(ln);return Ly(e,Iy(t))}if(r.isFog){const e=$l("color","color",r).setGroup(ln),t=$l("near","float",r).setGroup(ln),s=$l("far","float",r).setGroup(ln);return Ly(e,Py(t,s))}console.error("THREE.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?Gl(r):!0===r.isTexture?Pu(r):void console.error("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}hasOutputChange(e){return d_.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=Pu(e,Ic).renderOutput(t.toneMapping,t.currentColorSpace);return d_.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 HT,this.nodeBuilderCache=new Map,this.cacheLib={}}}const g_=new ye;class m_{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;i=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 o=t[n];o&&o.connect(i)}}function B_(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,o=this._glBaseLayer,a=this.getReferenceSpace(),u=t.getViewerPose(a);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(o.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(e,t,this._renderTarget),n=e.overrideMaterial||r.material,o=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:a,vertexShader:u}=o.getNodeBuilderState();return{fragmentShader:a,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");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 p_(this,r),this._animation=new Og(this._nodes,this.info),this._attributes=new Qg(r),this._background=new Hb(this,this._nodes),this._geometries=new em(this._attributes,this.info),this._textures=new Nm(this,r,this.info),this._pipelines=new am(r,this._nodes),this._bindings=new um(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Wg(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new gm(this.lighting),this._bundles=new x_,this._renderContexts=new _m,this._animation.start(),this._initialized=!0,e()}))),this._initPromise}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,o=this._currentRenderObjectFunction,a=this._compilationPromises,u=!0===e.isScene?e:F_;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new m_),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)})),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=o,this._compilationPromises=a,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init(),this._renderScene(e,t)}async waitForGPU(){await this.backend.waitForGPU()}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,o=this._currentRenderContext,a=this._bundles.get(s,i),u=this.backend.get(a);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(o)||l;if(u.renderContexts.add(o),d){this.backend.beginBundle(o),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=a;const e=n.opaque;!0===this.opaque&&e.length>0&&this._renderObjects(e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(o,a),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=b,p.viewportValue.maxDepth=T,p.viewport=!1===p.viewportValue.equals(P_),p.scissorValue.copy(y).multiplyScalar(x).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(P_),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new m_),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h),L_.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),I_.setFromProjectionMatrix(L_,g);const _=this._renderLists.get(e,t);if(_.begin(),this._projectObject(e,t,0,_,p.clippingContext),_.finish(),!0===this.sortObjects&&_.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=_.occlusionQueryCount,this._background.update(u,_,p),this.backend.beginRender(p);const{bundles:v,lightsNode:N,transparentDoublePass:S,transparent:A,opaque:R}=_;if(v.length>0&&this._renderBundles(v,u,N),!0===this.opaque&&R.length>0&&this._renderObjects(R,t,u,N),!0===this.transparent&&A.length>0&&this._renderTransparents(A,S,t,u,N),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=o,this._currentRenderObjectFunction=a,null!==s){this.setRenderTarget(l,d,c);const e=this._quad;this._nodes.hasOutputChange(h.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(h.texture),e.material.needsUpdate=!0);const t=this.xr.enabled;this.xr.enabled=!1,this._renderScene(e,e.camera,!1),this.xr.enabled=t}return u.onAfterRender(this,e,t,h),p}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)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setSize(e,t,r=!0){this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const o=this._viewport;e.isVector4?o.copy(e):o.set(e,t,r,s),o.minDepth=i,o.maxDepth=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)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);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.getForClear(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}if(i.clearColorValue=this._clearColor,this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget){const e=this._quad;this._nodes.hasOutputChange(s.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(s.texture),e.material.needsUpdate=!0),this._renderScene(e,e.camera,!1)}}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return null!==this._renderTarget&&!0!==this._renderTarget.isXRRenderTarget?p:this.toneMapping}get currentColorSpace(){return null!==this._renderTarget&&!0!==this._renderTarget.isXRRenderTarget?Ce:this.outputColorSpace}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.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}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const t=this._nodes.nodeFrame,r=t.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,t.renderId=this.info.calls;const s=this.backend,i=this._pipelines,n=this._bindings,o=this._nodes,a=Array.isArray(e)?e:[e];if(void 0===a[0]||!0!==a[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of a){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),o.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}o.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),a=i.getForCompute(t,r);s.compute(e,t,r,a)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e)}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=D_.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=D_.copy(t).floor()}else t=D_.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)}copyTextureToTexture(e,t,r=null,s=null,i=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,o=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,o)}_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){if(!e.frustumCulled||I_.intersectsSprite(e)){!0===this.sortObjects&&D_.setFromMatrixPosition(e.matrixWorld).applyMatrix4(L_);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,D_.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||I_.intersectsObject(e))){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),D_.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(L_)),Array.isArray(n)){const o=t.groups;for(let a=0,u=o.length;a0){for(const{material:e}of t)e.side=_;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=He;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=de}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,o=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode)),i=e}!0===i.transparent&&i.side===de&&!1===i.forceSinglePass?(i.side=_,this._handleObjectFunction(e,i,t,r,o,n,a,"backSide"),i.side=He,this._handleObjectFunction(e,i,t,r,o,n,a,u),i.side=de):this._handleObjectFunction(e,i,t,r,o,n,a,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,o,a){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,o,a);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,o,a){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,o,a);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)}get compile(){return this.compileAsync}}class O_{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class G_ extends O_{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(Yg-e%Yg)%Yg;var e}get buffer(){return this._buffer}update(){return!0}}class k_ extends G_{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let z_=0;class $_ extends k_{constructor(e,t){super("UniformBuffer_"+z_++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class W_ extends k_{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}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(){let e=0;for(let t=0,r=this.uniforms.length;t0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const o=i.node.precision;if(null!==o&&(t=J_[o]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==T){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=[],r=e.getMemberTypes();for(let e=0;ee*t),1)}u`}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=ev[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)}ev[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} ]`)}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 o=n.uniformGPU;if(void 0===o){const s=e.groupNode,a=s.name,u=this.getBindGroupArray(a,r);if("texture"===t)o=new K_(i.name,i.node,s),u.push(o);else if("cubeTexture"===t)o=new Y_(i.name,i.node,s),u.push(o);else if("texture3D"===t)o=new Q_(i.name,i.node,s),u.push(o);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new $_(e,s);t.name=e.name,u.push(t),o=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new j_(r+"_"+a,s),e[a]=n,u.push(n)),o=this.getNodeUniform(i,t),n.addUniform(o)}n.uniformGPU=o}return i}}let sv=null,iv=null;class nv{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={render:null,compute:null}}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void st("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return void st(`WebGPURenderer: No timestamp query pool for type '${e}' found.`);const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return sv=sv||new t,this.renderer.getDrawingBufferSize(sv)}setScissorTest(){}getClearColor(){const e=this.renderer;return iv=iv||new Sm,e.getClearColor(iv),iv.getRGB(iv,this.renderer.currentColorSpace),iv}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:it(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${Oe} webgpu`),this.domElement=e),e}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)}dispose(){}}let ov,av,uv=0;class lv{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 dv{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,o=e.isInterleavedBufferAttribute?e.data:e,a=r.get(o);let u,l=a.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),a.bufferGPU=l,a.bufferType=t,a.version=o.version),i instanceof Float32Array)u=s.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===T,id:uv++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new lv(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),o=n.bufferType,a=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(o,n.bufferGPU),0===a.length)r.bufferSubData(o,0,s);else{for(let e=0,t=a.length;e1?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 pv,gv,mv,fv=!1;class yv{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===fv&&(this._init(),fv=!0)}_init(){const e=this.gl;pv={[fr]:e.REPEAT,[yr]:e.CLAMP_TO_EDGE,[xr]:e.MIRRORED_REPEAT},gv={[br]:e.NEAREST,[Tr]:e.NEAREST_MIPMAP_NEAREST,[De]:e.NEAREST_MIPMAP_LINEAR,[$]:e.LINEAR,[Le]:e.LINEAR_MIPMAP_NEAREST,[B]:e.LINEAR_MIPMAP_LINEAR},mv={[_r]:e.NEVER,[vr]:e.ALWAYS,[Ee]:e.LESS,[Nr]:e.LEQUAL,[Sr]:e.EQUAL,[Ar]:e.GEQUAL,[Rr]:e.GREATER,[Cr]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!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:o}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let a=t;return t===n.RED&&(r===n.FLOAT&&(a=n.R32F),r===n.HALF_FLOAT&&(a=n.R16F),r===n.UNSIGNED_BYTE&&(a=n.R8),r===n.UNSIGNED_SHORT&&(a=n.R16),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.R8UI),r===n.UNSIGNED_SHORT&&(a=n.R16UI),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RG&&(r===n.FLOAT&&(a=n.RG32F),r===n.HALF_FLOAT&&(a=n.RG16F),r===n.UNSIGNED_BYTE&&(a=n.RG8),r===n.UNSIGNED_SHORT&&(a=n.RG16),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RG8UI),r===n.UNSIGNED_SHORT&&(a=n.RG16UI),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(a=n.RGB32F),r===n.HALF_FLOAT&&(a=n.RGB16F),r===n.UNSIGNED_BYTE&&(a=n.RGB8),r===n.UNSIGNED_SHORT&&(a=n.RGB16),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I),r===n.UNSIGNED_BYTE&&(a=s===$e&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(a=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(a=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGB8UI),r===n.UNSIGNED_SHORT&&(a=n.RGB16UI),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(a=n.RGBA32F),r===n.HALF_FLOAT&&(a=n.RGBA16F),r===n.UNSIGNED_BYTE&&(a=n.RGBA8),r===n.UNSIGNED_SHORT&&(a=n.RGBA16),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I),r===n.UNSIGNED_BYTE&&(a=s===$e&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(a=n.RGBA16UI),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_INT&&(a=n.DEPTH24_STENCIL8),r===n.FLOAT&&(a=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(a=n.DEPTH24_STENCIL8),a!==n.R16F&&a!==n.R32F&&a!==n.RG16F&&a!==n.RG32F&&a!==n.RGBA16F&&a!==n.RGBA32F||o.get("EXT_color_buffer_float"),a}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this;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,r.NONE),r.texParameteri(e,r.TEXTURE_WRAP_S,pv[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,pv[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||r.texParameteri(e,r.TEXTURE_WRAP_R,pv[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,gv[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,o=t.minFilter===$&&n?B:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,gv[o]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,mv[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===br)return;if(t.minFilter!==De&&t.minFilter!==B)return;if(t.type===w&&!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,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:o,depth:a}=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.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,o,a):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,o,a):e.isVideoTexture||r.texStorage2D(h,i,d,n,o),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:o,glType:a}=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,o,a,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:o,glFormat:a,glType:u,glInternalFormat:l}=this.backend.get(e);if(e.isRenderTargetTexture||void 0===n)return;const d=e=>e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||e instanceof OffscreenCanvas?e:e.data;if(this.backend.state.bindTexture(o,n),this.setTextureParameters(o,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==o||0!==a;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-a-l;s.blitFramebuffer(o,p,o+u,p+l,o,p,o+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,o,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,o,c-l-a,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t){const{gl:r}=this,s=t.renderTarget,{samples:i,depthTexture:n,depthBuffer:o,stencilBuffer:a,width:u,height:l}=s;if(r.bindRenderbuffer(r.RENDERBUFFER,e),o&&!a){let t=r.DEPTH_COMPONENT24;i>0?(n&&n.isDepthTexture&&n.type===r.FLOAT&&(t=r.DEPTH_COMPONENT32F),r.renderbufferStorageMultisample(r.RENDERBUFFER,i,t,u,l)):r.renderbufferStorage(r.RENDERBUFFER,t,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_ATTACHMENT,r.RENDERBUFFER,e)}else o&&a&&(i>0?r.renderbufferStorageMultisample(r.RENDERBUFFER,i,r.DEPTH24_STENCIL8,u,l):r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_STENCIL,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_STENCIL_ATTACHMENT,r.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:o,gl:a}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=a.createFramebuffer();a.bindFramebuffer(a.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?a.TEXTURE_CUBE_MAP_POSITIVE_X+n:a.TEXTURE_2D;a.framebufferTexture2D(a.READ_FRAMEBUFFER,a.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=a.createBuffer();a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.bufferData(a.PIXEL_PACK_BUFFER,g,a.STREAM_READ),a.readPixels(t,r,s,i,l,d,0),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),await o.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.getBufferSubData(a.PIXEL_PACK_BUFFER,0,f),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),a.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}}class xv{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 bv{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 Tv={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",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query"};class _v{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:o,index:a}=this;0!==a?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),o.update(i,t,s,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:o,object:a,info:u}=this;0!==r&&(0!==o?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(a,t,i,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:o}=this;if(0===r)return;const a=s.get("WEBGL_multi_draw");if(null===a)for(let s=0;sthis.maxQueries)return null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e.id,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);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){console.error("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.id);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){console.error("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=[];for(const[t,r]of this.queryStates)if("ended"===r){const r=this.queries[t];e.push(this.resolveQuery(r))}if(0===e.length)return this.lastValue;const t=(await Promise.all(e)).reduce(((e,t)=>e+t),0);return this.lastValue=t,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,t}catch(e){return console.error("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){console.error("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 Sv extends nv{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.trackTimestamp=!0===e.trackTimestamp,this._currentContext=null,this._knownBindings=new WeakSet,this._xrFamebuffer=null}init(e){super.init(e);const t=this.parameters,r=void 0!==t.context?t.context:e.domElement.getContext("webgl2");function s(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=s,e.domElement.addEventListener("webglcontextlost",s,!1),this.gl=r,this.extensions=new xv(this),this.capabilities=new bv(this),this.attributeUtils=new dv(this),this.textureUtils=new yv(this),this.bufferRenderer=new _v(this),this.state=new cv(this),this.utils=new hv(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.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile")}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async waitForGPU(){await this.utils._clientWaitAsync()}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFamebuffer=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}),e.autoAllocateDepthBuffer=!1}}initTimestampQuery(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t]||(this.timestampQueryPool[t]=new Nv(this.gl,t,2048));const r=this.timestampQueryPool[t];null!==r.allocateQueriesForContext(e)&&r.beginQuery(e)}prepareTimestampBuffer(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t].endQuery(e)}getContext(){return this.gl}beginRender(e){const{state:t,gl:r}=this,s=this.get(e);if(this.initTimestampQuery(e),s.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1),e.viewport?this.updateViewport(e):t.viewport(0,0,r.drawingBufferWidth,r.drawingBufferHeight),e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}const i=e.occlusionQueryCount;i>0&&(s.currentOcclusionQueries=s.occlusionQueries,s.currentOcclusionQueryObjects=s.occlusionQueryObjects,s.lastOcclusionObject=null,s.occlusionQueries=new Array(i),s.occlusionQueryObjects=new Array(i),s.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext,n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const o=e.textures;if(null!==o)for(let e=0;e0){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,o=s.msaaFrameBuffer,a=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let o=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?f.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances):this.hasFeature("WEBGL_multi_draw")?f.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):st("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):x>1?f.renderInstances(b,y,x):f.render(b,y)};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){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(o,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()}));t.push(i)}else 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"),o=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+o)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:o,vertexShader:a}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,o,a),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,o=s.createProgram(),a=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;eTv[t]===e)),r=this.extensions;for(let e=0;e0){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r,\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:wv,stripIndexFormat:jv},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:wv,stripIndexFormat:jv},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,o=this.getTransferPipeline(s),a=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:ON,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:ON,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:Gv,storeOp:Vv,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(o,l,d),h(a,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:ON,baseArrayLayer:r});const o=[];for(let a=1;a1;for(let o=0;o]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,iS=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,nS={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_multisampled_2d:"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 oS extends i_{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:o}=(e=>{const t=(e=e.trim()).match(sS);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=iS.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 aS extends s_{parseFunction(e){return new oS(e)}}const uS="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},lS={[Fs.READ_ONLY]:"read",[Fs.WRITE_ONLY]:"write",[Fs.READ_WRITE]:"read_write"},dS={[fr]:"repeat",[yr]:"clamp",[xr]:"mirror"},cS={vertex:uS?uS.VERTEX:1,fragment:uS?uS.FRAGMENT:2,compute:uS?uS.COMPUTE:4},hS={instance:!0,swizzleAssign:!1,storageBuffer:!0},pS={"^^":"tsl_xor"},gS={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"},mS={},fS={tsl_xor:new vy("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new vy("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new vy("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new vy("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new vy("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new vy("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new vy("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new vy("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 vy("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 vy("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new vy("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 vy("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new vy("\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")},yS={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"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(fS.pow_float=new vy("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),fS.pow_vec2=new vy("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[fS.pow_float]),fS.pow_vec3=new vy("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[fS.pow_float]),fS.pow_vec4=new vy("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[fS.pow_float]),yS.pow_float="tsl_pow_float",yS.pow_vec2="tsl_pow_vec2",yS.pow_vec3="tsl_pow_vec3",yS.pow_vec4="tsl_pow_vec4");let xS="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(xS+="diagnostic( off, derivative_uniformity );\n");class bS extends WT{constructor(e,t){super(e,t,new aS),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==x}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r):this.generateTextureLod(e,t,r,s,"0")}_generateVideoSample(e,t,r=this.shaderStage){if("fragment"===r)return`textureSampleBaseClampToEdge( ${e}, ${e}_sampler, vec2( ${t}.x, 1.0 - ${t}.y ) )`;console.error(`WebGPURenderer: THREE.VideoTexture does not support ${r} shader.`)}_generateTextureSampleLevel(e,t,r,s,i,n=this.shaderStage){return"fragment"!==n&&"compute"!==n||!1!==this.isUnfilterable(e)?this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s):`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`}generateWrapFunction(e){const t=`tsl_coord_${dS[e.wrapS]}S_${dS[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=mS[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const o=(e,t)=>{e===fr?(s.push(fS.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===yr?(s.push(fS.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===xr?(s.push(fS.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};o(e.wrapS,"x"),n+=",\n",o(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",o(e.wrapR,"z")),n+="\n\t);\n\n}\n",mS[t]=r=new vy(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,o;const{primarySamples:a}=this.renderer.backend.utils.getTextureSampleData(e),u=a>1;o=e.isData3DTexture?"vec3":"vec2",n=u||e.isVideoTexture||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Da(new _u(`textureDimensions( ${n} )`,o)),s.dimensionsSnippet[r]=i,(e.isDataArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Da(new _u(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Da(new _u("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,i),a=e.isData3DTexture?"vec3":"vec2",u=`${a}(${n}(${r}) * ${a}(${o}))`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){return!0===e.isVideoTexture||!0===e.isStorageTexture?`textureLoad( ${t}, ${r} )`:s?`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:`textureLoad( ${t}, ${r}, u32( ${i} ) )`}generateTextureStore(e,t,r,s){return`textureStore( ${t}, ${r}, ${s} )`}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===w||!1===this.isSampleCompare(e)&&e.minFilter===br&&e.magFilter===br||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=!0===e.isVideoTexture?this._generateVideoSample(t,r,i):this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i,n=this.shaderStage){let o=null;return o=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),o}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} 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||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?`NodeBuffer_${e.id}.${t}`:e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}_getUniformGroupCount(e){return Object.keys(this.uniforms[e]).length}getFunctionOperator(e){const t=pS[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?Fs.READ_ONLY:e.access}getStorageAccess(e,t){return lS[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 s;const o=e.groupNode,a=o.name,u=this.getBindGroupArray(a,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let n=null;const a=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?n=new K_(i.name,i.node,o,a):"cubeTexture"===t?n=new Y_(i.name,i.node,o,a):"texture3D"===t&&(n=new Q_(i.name,i.node,o,a)),n.store=!0===e.isStorageTextureNode,n.setVisibility(cS[r]),"fragment"!==r&&"compute"!==r||!1!==this.isUnfilterable(e.value)||!1!==n.store)u.push(n),s=[n];else{const e=new XN(`${i.name}_sampler`,i.node,o);e.setVisibility(cS[r]),u.push(e,n),s=[e,n]}}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const i=new("buffer"===t?$_:QN)(e,o);i.setVisibility(cS[r]),u.push(i),s=i}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new j_(a,o),n.setVisibility(cS[r]),e[a]=n,u.push(n)),s=this.getNodeUniform(i,t),n.addUniform(s)}n.uniformGPU=s}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`)}const s=this.getBuiltins("output");return s&&t.push("\t"+s),t.join(",\n")}getStructs(e){const t=[],r=this.structs[e];for(let e=0,s=r.length;e output : ${i};\n\n`)}return t.join("\n\n")}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","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;i1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.isDepthTexture)s=`texture_depth${n}_2d`;else if(!0===t.isVideoTexture)s="texture_external";else if(!0===t.isData3DTexture)s="texture_3d";else if(!0===i.node.isStorageTextureNode){s=`texture_storage_2d<${rS(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${o.binding++} ) @group( ${o.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.bufferType),n=t.bufferCount,a=n>0&&"buffer"===i.type?", "+n:"",u=t.isAtomic?`atomic<${r}>`:`${r}`,l=`\t${i.name} : array< ${u}${a} >\n`,d=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";s.push(this._getWGSLStructBinding("NodeBuffer_"+t.id,l,d,o.binding++,o.group))}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:o.binding++,id:o.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let o=r.join("\n");return o+=s.join("\n"),o+=i.join("\n"),o}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){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],o=n.outputNode,a=void 0!==o&&!0===o.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.Vertex = ${i.result};`;else if("fragment"===t)if(a)r.returnType=o.nodeType,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;\n\n",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}null!==this.material?(this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment)):this.computeShader=this._getWGSLComputeCode(e.compute,(this.object.workgroupSize||[64]).join(", "))}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getType(e){return gS[e]||e}isAvailable(e){let t=hS[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),hS[e]=t),t}_getWGSLMethod(e){return void 0!==fS[e]&&this._include(e),yS[e]}_include(e){const t=fS[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\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${xS}\n\n// uniforms\n${e.uniforms}\n\n// structs\n${e.structs}\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){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${t} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x + globalId.y * numWorkgroups.x * u32(${t}) + globalId.z * numWorkgroups.x * numWorkgroups.y * u32(${t});\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 TS{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=qv.Depth24PlusStencil8:e.depth&&(t=qv.Depth24Plus),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.samples}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}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?Av:e.isLineSegments||e.isMesh&&!0===t.wireframe?Rv:e.isLine?Cv:e.isMesh?Ev:void 0}getSampleCount(e){let t=1;return e>1&&(t=Math.pow(2,Math.floor(Math.log2(e))),2===t&&(t=4)),t}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===me)return qv.BGRA8Unorm;if(e===be)return qv.RGBA16Float;throw new Error("Unsupported outputType")}}const _S=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),vS=new Map([[Ve,["float16"]]]),NS=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class SS{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 o=s.device;let a=r.array;if(!1===e.normalized)if(a.constructor===Int16Array)a=new Int32Array(a);else if(a.constructor===Uint16Array&&(a=new Uint32Array(a),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=UN)),r.texture.isDepthTexture)s.sampleType=PN;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===T?s.sampleType=IN:e===b?s.sampleType=LN:e===w&&(this.backend.hasFeature("float32-filterable")?s.sampleType=FN:s.sampleType=UN)}r.isSampledCubeTexture?s.viewDimension=kN:r.texture.isDataArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=GN:r.isSampledTexture3D&&(s.viewDimension=zN),e.texture=s}else console.error(`WebGPUBindingUtils: Unsupported binding "${r}".`);s.push(e)}return r.createBindGroupLayout({entries:s})}createBindings(e,t,r,s=0){const{backend:i,bindGroupLayoutCache:n}=this,o=i.get(e);let a,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===o.groups&&(o.groups=[],o.versions=[]),o.versions[r]===s&&(a=o.groups[r])),void 0===a&&(a=this.createBindGroup(e,u),r>0&&(o.groups[r]=a,o.versions[r]=s)),o.group=a,o.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const o=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:o})}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}else if(t.isSampledTexture){const e=r.get(t.texture);let o;if(void 0!==e.externalTexture)o=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(o=e[s],void 0===o){const i=$N;let n;n=t.isSampledCubeTexture?kN:t.isSampledTexture3D?zN:t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?GN:ON,o=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:o})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class RS{constructor(e){this.backend=e}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:o,fragmentProgram:a}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;!0===s.transparent&&s.blending!==D&&(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},A={},R=e.context.depth,C=e.context.stencil;if(!0!==R&&!0!==C||(!0===R&&(A.format=v,A.depthWriteEnabled=s.depthWrite,A.depthCompare=_),!0===C&&(A.stencilFront=m,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),S.depthStencil=A),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise((e=>{l.createRenderPipelineAsync(S).then((t=>{c.pipeline=t,e()}))}));t.push(e)}}createBundleEncoder(e){const t=this.backend,{utils:r,device:s}=t,i=r.getCurrentDepthStencilFormat(e),n={label:"renderBundleEncoder",colorFormats:[r.getCurrentColorFormat(e)],depthStencilFormat:i,sampleCount:this._getSampleCount(e)};return s.createRenderBundleEncoder(n)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),o=[];for(const e of t){const t=r.get(e);o.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:o})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,o=e.blendEquation;if(s===vt){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,a=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:o;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(o)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(a),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:hN},r={srcFactor:i,dstFactor:n,operation:hN}};if(e.premultipliedAlpha)switch(s){case P:i(eN,iN,eN,iN);break;case At:i(eN,eN,eN,eN);break;case St:i(Jv,rN,Jv,eN);break;case Nt:i(Jv,tN,Jv,sN)}else switch(s){case P:i(sN,iN,eN,iN);break;case At:i(sN,eN,sN,eN);break;case St:i(Jv,rN,Jv,eN);break;case Nt:i(Jv,tN,Jv,tN)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case ut:t=Jv;break;case lt:t=eN;break;case dt:t=tN;break;case mt:t=rN;break;case ct:t=sN;break;case ft:t=iN;break;case pt:t=nN;break;case yt:t=oN;break;case gt:t=aN;break;case xt:t=uN;break;case ht:t=lN;break;case 211:t=dN;break;case 212:t=cN;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case Ir:t=Mv;break;case Pr:t=Dv;break;case Ur:t=Bv;break;case Fr:t=Uv;break;case Br:t=Fv;break;case Mr:t=Lv;break;case wr:t=Pv;break;case Er:t=Iv;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case $r:t=bN;break;case zr:t=TN;break;case kr:t=_N;break;case Gr:t=vN;break;case Or:t=NN;break;case Vr:t=SN;break;case Dr:t=AN;break;case Lr:t=RN;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case nt:t=hN;break;case ot:t=pN;break;case at:t=gN;break;case Hr:t=mN;break;case Wr:t=fN;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?Hv:jv),r.side){case He:s.frontFace=kv,s.cullMode=Wv;break;case _:s.frontFace=kv,s.cullMode=$v;break;case de:s.frontFace=kv,s.cullMode=zv;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?xN:yN}_getDepthCompare(e){let t;if(!1===e.depthTest)t=Dv;else{const r=e.depthFunc;switch(r){case Ut:t=Mv;break;case Ft:t=Dv;break;case Bt:t=Bv;break;case Mt:t=Uv;break;case wt:t=Fv;break;case Et:t=Lv;break;case Ct:t=Pv;break;case Rt:t=Iv;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class CS extends vv{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 st("WebGPUTimestampQueryPool: Maximum number of queries exceeded."),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e.id,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));let o=0;for(const[,t]of e){const e=n[t],r=n[t+1];o+=Number(r-e)/1e6}return this.resultBuffer.unmap(),this.lastValue=o,o}catch(e){return console.error("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){console.error("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){console.error("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 ES extends nv{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.trackTimestamp=!0===e.trackTimestamp,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new TS(this),this.attributeUtils=new SS(this),this.bindingUtils=new AS(this),this.pipelineUtils=new RS(this),this.textureUtils=new tS(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference},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(jN),n=[];for(const e of i)s.features.has(e)&&n.push(e);const o={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(o)}else r=t.device;r.lost.then((t=>{const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}));const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(jN.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),this.updateSize()}get coordinateSystem(){return d}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==r.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples||s.loadOp!==t.loadOp){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};r.addEventListener("dispose",e)}const n=e.getCacheKey();let o=i[n];if(void 0===o){const a=e.textures,u=[];let l;for(let s=0;s0&&(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:Ov}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const o=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(),t.currentPass.end(),r>0){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?(u.x=Math.min(t.dispatchCount,o),u.y=Math.ceil(t.dispatchCount/o)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,context:s,pipeline:i}=e,n=e.getBindings(),o=this.get(s),a=this.get(i).pipeline,u=o.currentSets,l=o.currentPass,d=e.getDrawParameters();if(null===d)return;u.pipeline!==a&&(l.setPipeline(a),u.pipeline=a);const c=u.bindingGroups;for(let e=0,t=n.length;e{if(!0===r.isBatchedMesh){const e=r._multiDrawStarts,t=r._multiDrawCounts,s=r._multiDrawCount,i=r._multiDrawInstances;for(let r=0;r1?0:r;!0===p?l.drawIndexed(t[r],s,e[r]/h.array.BYTES_PER_ELEMENT,0,n):l.draw(t[r],s,e[r],n)}}else if(!0===p){const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndexedIndirect(e,0)}else l.drawIndexed(s,i,n,0,0);t.update(r,s,i)}else{const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndirect(e,0)}else l.draw(s,i,n,0);t.update(r,s,i)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),i=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==i.length){const e=this.get(n),r=[],s=new Uint32Array([0,0,0,0]);for(let t=0,n=i.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new Sv(e)));super(new t(e),e),this.library=new MS,this.isWebGPURenderer=!0}}class FS extends ns{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class US{constructor(e,t=qi(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new hh;r.name="PostProcessing",this._quadMesh=new xf(r)}render(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=Ce,this._quadMesh.render(e),e.toneMapping=t,e.outputColorSpace=r}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;this._quadMesh.material.fragmentNode=!0===this.outputColorTransform?Au(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=Ce,await this._quadMesh.renderAsync(e),e.toneMapping=t,e.outputColorSpace=r}}class PS extends ee{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=$,this.minFilter=$,this.isStorageTexture=!0}}class IS extends Rf{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class LS extends os{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new as(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):console.error(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]?(console.error("THREE.NodeLoader: Node type not found:",e),Ii()):Si(new this.nodes[e])}}class DS extends us{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 VS extends ls{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 LS;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 DS;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t nodeObject( new SplitNode( nodeObject( node addMethodChaining( 'element', element ); addMethodChaining( 'convert', convert ); +/** @module ArrayNode **/ + +/** + * ArrayNode represents a collection of nodes, typically created using the {@link module:TSL~array} function. + * ```js + * const colors = array( [ + * vec3( 1, 0, 0 ), + * vec3( 0, 1, 0 ), + * vec3( 0, 0, 1 ) + * ] ); + * + * const redColor = tintColors.element( 0 ); + * + * @augments Node + */ +class ArrayNode extends TempNode { + + static get type() { + + return 'ArrayNode'; + + } + + /** + * Constructs a new array node. + * + * @param {String} [nodeType] - The data type of the elements. + * @param {Number} [count] - Size of the array. + * @param {Array?} [values=null] - Array default values. + */ + constructor( nodeType, count, values = null ) { + + super( nodeType ); + + /** + * Array size. + * + * @type {Array} + */ + this.count = count; + + /** + * Array default values. + * + * @type {Array} + */ + this.values = values; + + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ + this.isArrayNode = true; + + } + + getNodeType( builder ) { + + if ( this.nodeType === null ) { + + this.nodeType = this.values[ 0 ].getNodeType( builder ); + + } + + return this.nodeType; + + } + + getElementType( builder ) { + + return this.getNodeType( builder ); + + } + + generate( builder ) { + + const type = this.getNodeType( builder ); + + return builder.generateArray( type, this.count, this.values ); + + } + +} + +/** + * TSL function for creating an array node. + * + * @function + * @param {String|Array} nodeTypeOrValues - A string representing the element type (e.g., 'vec3') + * or an array containing the default values (e.g., [ vec3() ]). + * @param {Number?} [count] - Size of the array. + * @returns {ArrayNode} + */ +const array = ( ...params ) => { + + let node; + + if ( params.length === 1 ) { + + const values = params[ 0 ]; + + node = new ArrayNode( null, values.length, values ); + + } else { + + const nodeType = params[ 0 ]; + const count = params[ 1 ]; + + node = new ArrayNode( nodeType, count ); + + } + + return nodeObject( node ); + +}; + +addMethodChaining( 'toArray', ( node, count ) => array( Array( count ).fill( node ) ) ); + /** @module UniformGroupNode **/ /** @@ -4485,23 +4615,39 @@ class OperatorNode extends TempNode { } else { - if ( typeA === 'float' && builder.isMatrix( typeB ) ) { + // Handle matrix operations + if ( builder.isMatrix( typeA ) ) { - return typeB; + if ( typeB === 'float' ) { - } else if ( builder.isMatrix( typeA ) && builder.isVector( typeB ) ) { + return typeA; // matrix * scalar = matrix - // matrix x vector + } else if ( builder.isVector( typeB ) ) { - return builder.getVectorFromMatrix( typeA ); + return builder.getVectorFromMatrix( typeA ); // matrix * vector - } else if ( builder.isVector( typeA ) && builder.isMatrix( typeB ) ) { + } else if ( builder.isMatrix( typeB ) ) { - // vector x matrix + return typeA; // matrix * matrix - return builder.getVectorFromMatrix( typeB ); + } + + } else if ( builder.isMatrix( typeB ) ) { + + if ( typeA === 'float' ) { + + return typeB; // scalar * matrix = matrix - } else if ( builder.getTypeLength( typeB ) > builder.getTypeLength( typeA ) ) { + } else if ( builder.isVector( typeA ) ) { + + return builder.getVectorFromMatrix( typeB ); // vector * matrix + + } + + } + + // Handle non-matrix cases + if ( builder.getTypeLength( typeB ) > builder.getTypeLength( typeA ) ) { // anytype x anytype: use the greater length vector @@ -4549,17 +4695,41 @@ class OperatorNode extends TempNode { typeA = type; typeB = builder.changeComponentType( typeB, 'uint' ); - } else if ( builder.isMatrix( typeA ) && builder.isVector( typeB ) ) { + } else if ( builder.isMatrix( typeA ) ) { + + if ( typeB === 'float' ) { + + // Keep matrix type for typeA, but ensure typeB stays float + typeB = 'float'; + + } else if ( builder.isVector( typeB ) ) { - // matrix x vector + // matrix x vector + typeB = builder.getVectorFromMatrix( typeA ); + + } else if ( builder.isMatrix( typeB ) ) ; else { + + typeA = typeB = type; + + } - typeB = builder.getVectorFromMatrix( typeA ); + } else if ( builder.isMatrix( typeB ) ) { - } else if ( builder.isVector( typeA ) && builder.isMatrix( typeB ) ) { + if ( typeA === 'float' ) { - // vector x matrix + // Keep matrix type for typeB, but ensure typeA stays float + typeA = 'float'; - typeA = builder.getVectorFromMatrix( typeB ); + } else if ( builder.isVector( typeA ) ) { + + // vector x matrix + typeA = builder.getVectorFromMatrix( typeB ); + + } else { + + typeA = typeB = type; + + } } else { @@ -4641,7 +4811,20 @@ class OperatorNode extends TempNode { } else { - return builder.format( `( ${ a } ${ op } ${ b } )`, type, output ); + // Handle matrix operations + if ( builder.isMatrix( typeA ) && typeB === 'float' ) { + + return builder.format( `( ${ b } ${ op } ${ a } )`, type, output ); + + } else if ( typeA === 'float' && builder.isMatrix( typeB ) ) { + + return builder.format( `${ a } ${ op } ${ b }`, type, output ); + + } else { + + return builder.format( `( ${ a } ${ op } ${ b } )`, type, output ); + + } } @@ -4653,7 +4836,15 @@ class OperatorNode extends TempNode { } else { - return builder.format( `${ a } ${ op } ${ b }`, type, output ); + if ( builder.isMatrix( typeA ) && typeB === 'float' ) { + + return builder.format( `${ b } ${ op } ${ a }`, type, output ); + + } else { + + return builder.format( `${ a } ${ op } ${ b }`, type, output ); + + } } @@ -6392,6 +6583,12 @@ class VarNode extends Node { } + getElementType( builder ) { + + return this.node.getElementType( builder ); + + } + getNodeType( builder ) { return this.node.getNodeType( builder ); @@ -6427,8 +6624,6 @@ class VarNode extends Node { if ( shouldTreatAsReadOnly ) { - const type = builder.getType( nodeVar.type ); - if ( isWebGPUBackend ) { declarationPrefix = isDeterministic @@ -6437,7 +6632,9 @@ class VarNode extends Node { } else { - declarationPrefix = `const ${ type } ${ propertyName }`; + const count = builder.getArrayCount( node ); + + declarationPrefix = `const ${ builder.getVar( nodeVar.type, propertyName, count ) }`; } @@ -24268,9 +24465,7 @@ class Info { * @property {Number} triangles - The number of rendered triangle primitives of the current frame. * @property {Number} points - The number of rendered point primitives of the current frame. * @property {Number} lines - The number of rendered line primitives of the current frame. - * @property {Number} previousFrameCalls - The number of render calls of the previous frame. * @property {Number} timestamp - The timestamp of the frame when using `renderer.renderAsync()`. - * @property {Number} timestampCalls - The number of render calls using `renderer.renderAsync()`. */ this.render = { calls: 0, @@ -24280,8 +24475,6 @@ class Info { points: 0, lines: 0, timestamp: 0, - previousFrameCalls: 0, - timestampCalls: 0 }; /** @@ -24291,16 +24484,12 @@ class Info { * @readonly * @property {Number} calls - The number of compute calls since the app has been started. * @property {Number} frameCalls - The number of compute calls of the current frame. - * @property {Number} previousFrameCalls - The number of compute calls of the previous frame. * @property {Number} timestamp - The timestamp of the frame when using `renderer.computeAsync()`. - * @property {Number} timestampCalls - The number of render calls using `renderer.computeAsync()`. */ this.compute = { calls: 0, frameCalls: 0, - timestamp: 0, - previousFrameCalls: 0, - timestampCalls: 0 + timestamp: 0 }; /** @@ -24353,47 +24542,11 @@ class Info { } - /** - * Used by async render methods to updated timestamp metrics. - * - * @param {('render'|'compute')} type - The type of render call. - * @param {Number} time - The duration of the compute/render call in milliseconds. - */ - updateTimestamp( type, time ) { - - if ( this[ type ].timestampCalls === 0 ) { - - this[ type ].timestamp = 0; - - } - - - this[ type ].timestamp += time; - - this[ type ].timestampCalls ++; - - - if ( this[ type ].timestampCalls >= this[ type ].previousFrameCalls ) { - - this[ type ].timestampCalls = 0; - - } - - - } - /** * Resets frame related metrics. */ reset() { - const previousRenderFrameCalls = this.render.frameCalls; - this.render.previousFrameCalls = previousRenderFrameCalls; - - const previousComputeFrameCalls = this.compute.frameCalls; - this.compute.previousFrameCalls = previousComputeFrameCalls; - - this.render.drawCalls = 0; this.render.frameCalls = 0; this.compute.frameCalls = 0; @@ -26347,7 +26500,18 @@ class Textures extends DataMap { const options = { sampleCount }; - if ( ( renderTarget.isXRRenderTarget === true && renderTarget.hasExternalTextures === true ) === false ) { + // when using the WebXR Layers API, the render target uses external textures which + // require no manual updates + + if ( renderTarget.isXRRenderTarget === true && renderTarget.hasExternalTextures === true ) { + + if ( depthTexture && renderTarget.autoAllocateDepthBuffer === true ) { + + this.updateTexture( depthTexture, options ); + + } + + } else { for ( let i = 0; i < textures.length; i ++ ) { @@ -26359,11 +26523,11 @@ class Textures extends DataMap { } - } + if ( depthTexture ) { - if ( depthTexture && renderTarget.autoAllocateDepthBuffer !== false ) { + this.updateTexture( depthTexture, options ); - this.updateTexture( depthTexture, options ); + } } @@ -29473,7 +29637,7 @@ const storageObject = ( value, type, count ) => { // @deprecated, r171 * TSL function for creating a storage buffer node with a configured `StorageBufferAttribute`. * * @function - * @param {Number} count - The data count. + * @param {Number|TypedArray} count - The data count. It is also valid to pass a typed array as an argument. * @param {String} [type='float'] - The data type. * @returns {StorageBufferNode} */ @@ -29493,7 +29657,7 @@ const attributeArray = ( count, type = 'float' ) => { * TSL function for creating a storage buffer node with a configured `StorageInstancedBufferAttribute`. * * @function - * @param {Number} count - The data count. + * @param {Number|TypedArray} count - The data count. It is also valid to pass a typed array as an argument. * @param {String} [type='float'] - The data type. * @returns {StorageBufferNode} */ @@ -33938,7 +34102,13 @@ class AtomicFunctionNode extends TempNode { const params = []; params.push( `&${ a.build( builder, inputType ) }` ); - params.push( b.build( builder, inputType ) ); + + if ( b !== null ) { + + params.push( b.build( builder, inputType ) ); + + + } const methodSnippet = `${ builder.getMethod( method, type ) }( ${params.join( ', ' )} )`; @@ -33999,6 +34169,16 @@ const atomicFunc = ( method, pointerNode, valueNode, storeNode = null ) => { }; +/** + * Loads the value stored in the atomic variable. + * + * @function + * @param {Node} pointerNode - An atomic variable or element of an atomic buffer. + * @param {Node?} [storeNode=null] - A variable storing the return value of an atomic operation, typically the value of the atomic variable before the operation. + * @returns {AtomicFunctionNode} + */ +const atomicLoad = ( pointerNode, storeNode = null ) => atomicFunc( AtomicFunctionNode.ATOMIC_LOAD, pointerNode, null, storeNode ); + /** * Stores a value in the atomic variable. * @@ -37992,6 +38172,7 @@ var TSL = /*#__PURE__*/Object.freeze({ anisotropyT: anisotropyT, any: any, append: append, + array: array, arrayBuffer: arrayBuffer, asin: asin, assign: assign, @@ -38000,6 +38181,7 @@ var TSL = /*#__PURE__*/Object.freeze({ atomicAdd: atomicAdd, atomicAnd: atomicAnd, atomicFunc: atomicFunc, + atomicLoad: atomicLoad, atomicMax: atomicMax, atomicMin: atomicMin, atomicOr: atomicOr, @@ -39037,8 +39219,9 @@ class NodeVar { * @param {String} name - The name of the variable. * @param {String} type - The type of the variable. * @param {Boolean} [readOnly=false] - The read-only flag. + * @param {Number?} [count=null] - The size. */ - constructor( name, type, readOnly = false ) { + constructor( name, type, readOnly = false, count = null ) { /** * This flag can be used for type testing. @@ -39066,10 +39249,17 @@ class NodeVar { /** * The read-only flag. * - * @type {boolean} + * @type {Boolean} */ this.readOnly = readOnly; + /** + * The size. + * + * @type {Number?} + */ + this.count = count; + } } @@ -39549,6 +39739,41 @@ class ColorUniform extends Uniform { } +/** + * Represents a Matrix2 uniform. + * + * @private + * @augments Uniform + */ +class Matrix2Uniform extends Uniform { + + /** + * Constructs a new Number uniform. + * + * @param {String} name - The uniform's name. + * @param {Matrix2} value - The uniform's value. + */ + constructor( name, value = new Matrix2() ) { + + super( name, value ); + + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ + this.isMatrix2Uniform = true; + + this.boundary = 16; + this.itemSize = 4; + + } + +} + + /** * Represents a Matrix3 uniform. * @@ -39872,6 +40097,58 @@ class ColorNodeUniform extends ColorUniform { } + +/** + * A special form of Matrix2 uniform binding type. + * It's value is managed by a node object. + * + * @private + * @augments Matrix2Uniform + */ +class Matrix2NodeUniform extends Matrix2Uniform { + + /** + * Constructs a new node-based Matrix2 uniform. + * + * @param {NodeUniform} nodeUniform - The node uniform. + */ + constructor( nodeUniform ) { + + super( nodeUniform.name, nodeUniform.value ); + + /** + * The node uniform. + * + * @type {NodeUniform} + */ + this.nodeUniform = nodeUniform; + + } + + /** + * Overwritten to return the value of the node uniform. + * + * @return {Matrix2} The value. + */ + getValue() { + + return this.nodeUniform.value; + + } + + /** + * Returns the node uniform data type. + * + * @return {String} The data type. + */ + getType() { + + return this.nodeUniform.type; + + } + +} + /** * A special form of Matrix3 uniform binding type. * It's value is managed by a node object. @@ -41870,6 +42147,55 @@ class NodeBuilder { } + /** + * Generates the array declaration string. + * + * @param {String} type - The type. + * @param {Number?} [count] - The count. + * @return {String} The generated value as a shader string. + */ + generateArrayDeclaration( type, count ) { + + return this.getType( type ) + '[ ' + count + ' ]'; + + } + + /** + * Generates the array shader string for the given type and value. + * + * @param {String} type - The type. + * @param {Number?} [count] - The count. + * @param {Array?} [values=null] - The default values. + * @return {String} The generated value as a shader string. + */ + generateArray( type, count, values = null ) { + + let snippet = this.generateArrayDeclaration( type, count ) + '( '; + + for ( let i = 0; i < count; i ++ ) { + + const value = values ? values[ i ] : null; + + if ( value !== null ) { + + snippet += value.build( this, type ); + + } else { + + snippet += this.generateConst( type ); + + } + + if ( i < count - 1 ) snippet += ', '; + + } + + snippet += ' )'; + + return snippet; + + } + /** * Generates the shader string for the given type and value. * @@ -42137,9 +42463,16 @@ class NodeBuilder { if ( length === 1 ) return componentType; - const baseType = getTypeFromLength( length ); + let baseType = getTypeFromLength( length ); const prefix = componentType === 'float' ? '' : componentType[ 0 ]; + // fix edge case for mat2x2 being same size as vec4 + if ( /mat2/.test( componentType ) === true ) { + + baseType = baseType.replace( 'vec', 'mat' ); + + } + return prefix + baseType; } @@ -42414,6 +42747,23 @@ class NodeBuilder { } + /** + * Returns the array length. + * + * @param {Node} node - The node. + * @return {Number?} The array length. + */ + getArrayCount( node ) { + + let count = null; + + if ( node.isArrayNode ) count = node.count; + else if ( node.isVarNode && node.node.isArrayNode ) count = node.node.count; + + return count; + + } + /** * Returns an instance of {@link NodeVar} for the given variable node. * @@ -42446,7 +42796,11 @@ class NodeBuilder { } - nodeVar = new NodeVar( name, type, readOnly ); + // + + const count = this.getArrayCount( node ); + + nodeVar = new NodeVar( name, type, readOnly, count ); if ( ! readOnly ) { @@ -42481,6 +42835,24 @@ class NodeBuilder { return this.isDeterministic( node.aNode ) && ( node.bNode ? this.isDeterministic( node.bNode ) : true ); + } else if ( node.isArrayNode ) { + + if ( node.values !== null ) { + + for ( const n of node.values ) { + + if ( ! this.isDeterministic( n ) ) { + + return false; + + } + + } + + } + + return true; + } else if ( node.isConstNode ) { return true; @@ -42944,11 +43316,12 @@ class NodeBuilder { * * @param {String} type - The variable's type. * @param {String} name - The variable's name. + * @param {Number?} [count=null] - The array length. * @return {String} The shader string. */ - getVar( type, name ) { + getVar( type, name, count = null ) { - return `${ this.getType( type ) } ${ name }`; + return `${ count !== null ? this.generateArrayDeclaration( type, count ) : this.getType( type ) } ${ name }`; } @@ -43176,6 +43549,7 @@ class NodeBuilder { if ( type === 'vec3' || type === 'ivec3' || type === 'uvec3' ) return new Vector3NodeUniform( uniformNode ); if ( type === 'vec4' || type === 'ivec4' || type === 'uvec4' ) return new Vector4NodeUniform( uniformNode ); if ( type === 'color' ) return new ColorNodeUniform( uniformNode ); + if ( type === 'mat2' ) return new Matrix2NodeUniform( uniformNode ); if ( type === 'mat3' ) return new Matrix3NodeUniform( uniformNode ); if ( type === 'mat4' ) return new Matrix4NodeUniform( uniformNode ); @@ -45860,6 +46234,77 @@ class Lighting extends ChainMap { } +/** + * A special type of render target that is used when rendering + * with the WebXR Device API. + * + * @private + * @augments RenderTarget + */ +class XRRenderTarget extends RenderTarget { + + /** + * Constructs a new XR render target. + * + * @param {Number} [width=1] - The width of the render target. + * @param {Number} [height=1] - The height of the render target. + * @param {Object} [options={}] - The configuration options. + */ + constructor( width = 1, height = 1, options = {} ) { + + super( width, height, options ); + + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ + this.isXRRenderTarget = true; + + /** + * Whether the attachments of the render target + * are defined by external textures. This flag is + * set to `true` when using the WebXR Layers API. + * + * @type {Boolean} + * @default false + */ + this.hasExternalTextures = false; + + /** + * Whether a depth buffer should automatically be allocated + * for this XR render target or not. + * + * Allocating a depth buffer is the default behavior of XR render + * targets. However, when using the WebXR Layers API, this flag + * must be set to `false` when the `ignoreDepthValues` property of + * the projection layers evaluates to `true`. + * + * Reference: {@link https://www.w3.org/TR/webxrlayers-1/#dom-xrprojectionlayer-ignoredepthvalues}. + * + * @type {Boolean} + * @default true + */ + this.autoAllocateDepthBuffer = true; + + } + + copy( source ) { + + super.copy( source ); + + this.hasExternalTextures = source.hasExternalTextures; + this.autoAllocateDepthBuffer = source.autoAllocateDepthBuffer; + + return this; + + } + + +} + const _cameraLPos = /*@__PURE__*/ new Vector3(); const _cameraRPos = /*@__PURE__*/ new Vector3(); @@ -46166,7 +46611,7 @@ class XRManager extends EventDispatcher { this._xrFrame = null; /** - * Whether to use projection layers or not. + * Whether to use the WebXR Layers API or not. * * @private * @type {Boolean} @@ -46474,7 +46919,7 @@ class XRManager extends EventDispatcher { renderer.setPixelRatio( 1 ); renderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false ); - this._xrRenderTarget = new RenderTarget( + this._xrRenderTarget = new XRRenderTarget( glProjLayer.textureWidth, glProjLayer.textureHeight, { @@ -46507,7 +46952,7 @@ class XRManager extends EventDispatcher { renderer.setPixelRatio( 1 ); renderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false ); - this._xrRenderTarget = new RenderTarget( + this._xrRenderTarget = new XRRenderTarget( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, { @@ -46520,8 +46965,6 @@ class XRManager extends EventDispatcher { } - this._xrRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278 - // this.setFoveation( this.getFoveation() ); @@ -46966,7 +47409,7 @@ function onAnimationFrame( time, frame ) { // For side-by-side projection, we only produce a single texture for both eyes. if ( i === 0 ) { - backend.setRenderTargetTextures( + backend.setXRRenderTargetTextures( this._xrRenderTarget, glSubImage.colorTexture, this._glProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture @@ -47947,9 +48390,7 @@ class Renderer { if ( this._initialized === false ) await this.init(); - const renderContext = this._renderScene( scene, camera ); - - await this.backend.resolveTimestampAsync( renderContext, 'render' ); + this._renderScene( scene, camera ); } @@ -48411,7 +48852,11 @@ class Renderer { } + const currentXREnabled = this.xr.enabled; + + this.xr.enabled = false; this._renderScene( quad, quad.camera, false ); + this.xr.enabled = currentXREnabled; } @@ -49009,7 +49454,7 @@ class Renderer { */ get currentToneMapping() { - return this._renderTarget !== null ? NoToneMapping : this.toneMapping; + return ( this._renderTarget !== null && this._renderTarget.isXRRenderTarget !== true ) ? NoToneMapping : this.toneMapping; } @@ -49021,7 +49466,7 @@ class Renderer { */ get currentColorSpace() { - return this._renderTarget !== null ? LinearSRGBColorSpace : this.outputColorSpace; + return ( this._renderTarget !== null && this._renderTarget.isXRRenderTarget !== true ) ? LinearSRGBColorSpace : this.outputColorSpace; } @@ -49043,6 +49488,12 @@ class Renderer { this._renderContexts.dispose(); this._textures.dispose(); + Object.values( this.backend.timestampQueryPool ).forEach( queryPool => { + + if ( queryPool !== null ) queryPool.dispose(); + + } ); + this.setRenderTarget( null ); this.setAnimationLoop( null ); @@ -49230,8 +49681,6 @@ class Renderer { this.compute( computeNodes ); - await this.backend.resolveTimestampAsync( computeNodes, 'compute' ); - } /** @@ -49249,6 +49698,14 @@ class Renderer { } + async resolveTimestampsAsync( type = 'render' ) { + + if ( this._initialized === false ) await this.init(); + + return this.backend.resolveTimestampsAsync( type ); + + } + /** * Checks if the given feature is supported by the selected backend. If the * renderer has not been initialized, this method always returns `false`. @@ -51382,7 +51839,7 @@ ${ flowData.code } for ( const variable of vars ) { - snippets.push( `${ this.getVar( variable.type, variable.name ) };` ); + snippets.push( `${ this.getVar( variable.type, variable.name, variable.count ) };` ); } @@ -52282,6 +52739,16 @@ class Backend { */ this.domElement = null; + /** + * A reference to the timestamp query pool. + * + * @type {{render: TimestampQueryPool?, compute: TimestampQueryPool?}} + */ + this.timestampQueryPool = { + 'render': null, + 'compute': null + }; + } /** @@ -52661,11 +53128,33 @@ class Backend { * * @async * @abstract - * @param {RenderContext} renderContext - The render context. - * @param {String} type - The render context. - * @return {Promise} A Promise that resolves when the time stamp has been computed. + * @param {String} [type='render'] - The type of the time stamp. + * @return {Promise} A Promise that resolves with the time stamp. */ - async resolveTimestampAsync( /*renderContext, type*/ ) { } + async resolveTimestampsAsync( type = 'render' ) { + + if ( ! this.trackTimestamp ) { + + warnOnce( 'WebGPURenderer: Timestamp tracking is disabled.' ); + return; + + } + + const queryPool = this.timestampQueryPool[ type ]; + if ( ! queryPool ) { + + warnOnce( `WebGPURenderer: No timestamp query pool for type '${type}' found.` ); + return; + + } + + const duration = await queryPool.resolveQueriesAsync(); + + this.renderer.info[ type ].timestamp = duration; + + return duration; + + } /** * Can be used to synchronize CPU operations with GPU tasks. So when this method is called, @@ -53165,7 +53654,7 @@ class WebGLAttributeUtils { } -let initialized$1 = false, equationToGL, factorToGL; +let equationToGL, factorToGL; /** * A WebGL 2 backend utility module for managing the WebGL state. @@ -53238,13 +53727,8 @@ class WebGLState { this.currentBoundTextures = {}; this.currentBoundBufferBases = {}; - if ( initialized$1 === false ) { - - this._init(); - - initialized$1 = true; - } + this._init(); } @@ -55941,6 +56425,398 @@ class WebGLBufferRenderer { } +class TimestampQueryPool { + + constructor( maxQueries = 256 ) { + + this.trackTimestamp = true; + this.maxQueries = maxQueries; + this.currentQueryIndex = 0; // how many queries allocated so far + this.queryOffsets = new Map(); // track offsets for different contexts + this.isDisposed = false; + this.lastValue = 0; + this.pendingResolve = false; + + } + + /** + * Allocate queries for a specific renderContext. + * + * @abstract + */ + allocateQueriesForContext( /* renderContext */ ) {} + + /** + * Resolve all timestamps and return data (or process them). + * + * @abstract + * @returns {Promise|Number} The resolved timestamp value. + */ + async resolveQueriesAsync() {} + + /** + * Dispose of the query pool. + * + * @abstract + */ + dispose() {} + +} + +/** + * Manages a pool of WebGL timestamp queries for performance measurement. + * Handles creation, execution, and resolution of timer queries using WebGL extensions. + * @extends TimestampQueryPool + */ +class WebGLTimestampQueryPool extends TimestampQueryPool { + + /** + * Creates a new WebGL timestamp query pool. + * @param {WebGLRenderingContext|WebGL2RenderingContext} gl - The WebGL context. + * @param {string} type - The type identifier for this query pool. + * @param {number} [maxQueries=2048] - Maximum number of queries this pool can hold. + */ + constructor( gl, type, maxQueries = 2048 ) { + + super( maxQueries ); + + this.gl = gl; + this.type = type; + + // Check for timer query extensions + this.ext = gl.getExtension( 'EXT_disjoint_timer_query_webgl2' ) || + gl.getExtension( 'EXT_disjoint_timer_query' ); + + if ( ! this.ext ) { + + console.warn( 'EXT_disjoint_timer_query not supported; timestamps will be disabled.' ); + this.trackTimestamp = false; + return; + + } + + // Create query objects + this.queries = []; + for ( let i = 0; i < this.maxQueries; i ++ ) { + + this.queries.push( gl.createQuery() ); + + } + + this.activeQuery = null; + this.queryStates = new Map(); // Track state of each query: 'inactive', 'started', 'ended' + + } + + /** + * Allocates a pair of queries for a given render context. + * @param {Object} renderContext - The render context to allocate queries for. + * @returns {?number} The base offset for the allocated queries, or null if allocation failed. + */ + allocateQueriesForContext( renderContext ) { + + if ( ! this.trackTimestamp ) return null; + + // Check if we have enough space for a new query pair + if ( this.currentQueryIndex + 2 > this.maxQueries ) { + + return null; + + } + + const baseOffset = this.currentQueryIndex; + this.currentQueryIndex += 2; + + // Initialize query states + this.queryStates.set( baseOffset, 'inactive' ); + this.queryOffsets.set( renderContext.id, baseOffset ); + + return baseOffset; + + } + + /** + * Begins a timestamp query for the specified render context. + * @param {Object} renderContext - The render context to begin timing for. + */ + beginQuery( renderContext ) { + + if ( ! this.trackTimestamp || this.isDisposed ) { + + return; + + } + + const baseOffset = this.queryOffsets.get( renderContext.id ); + if ( baseOffset == null ) { + + return; + + } + + // Don't start a new query if there's an active one + if ( this.activeQuery !== null ) { + + return; + + } + + const query = this.queries[ baseOffset ]; + if ( ! query ) { + + return; + + } + + try { + + // Only begin if query is inactive + if ( this.queryStates.get( baseOffset ) === 'inactive' ) { + + this.gl.beginQuery( this.ext.TIME_ELAPSED_EXT, query ); + this.activeQuery = baseOffset; + this.queryStates.set( baseOffset, 'started' ); + + } + + } catch ( error ) { + + console.error( 'Error in beginQuery:', error ); + this.activeQuery = null; + this.queryStates.set( baseOffset, 'inactive' ); + + } + + } + + /** + * Ends the active timestamp query for the specified render context. + * @param {Object} renderContext - The render context to end timing for. + * @param {string} renderContext.id - Unique identifier for the render context. + */ + endQuery( renderContext ) { + + if ( ! this.trackTimestamp || this.isDisposed ) { + + return; + + } + + const baseOffset = this.queryOffsets.get( renderContext.id ); + if ( baseOffset == null ) { + + return; + + } + + // Only end if this is the active query + if ( this.activeQuery !== baseOffset ) { + + return; + + } + + try { + + this.gl.endQuery( this.ext.TIME_ELAPSED_EXT ); + this.queryStates.set( baseOffset, 'ended' ); + this.activeQuery = null; + + } catch ( error ) { + + console.error( 'Error in endQuery:', error ); + // Reset state on error + this.queryStates.set( baseOffset, 'inactive' ); + this.activeQuery = null; + + } + + } + + /** + * Asynchronously resolves all completed queries and returns the total duration. + * @returns {Promise} The total duration in milliseconds, or the last valid value if resolution fails. + */ + async resolveQueriesAsync() { + + if ( ! this.trackTimestamp || this.pendingResolve ) { + + return this.lastValue; + + } + + this.pendingResolve = true; + + try { + + // Wait for all ended queries to complete + const resolvePromises = []; + + for ( const [ baseOffset, state ] of this.queryStates ) { + + if ( state === 'ended' ) { + + const query = this.queries[ baseOffset ]; + resolvePromises.push( this.resolveQuery( query ) ); + + } + + } + + if ( resolvePromises.length === 0 ) { + + return this.lastValue; + + } + + const results = await Promise.all( resolvePromises ); + const totalDuration = results.reduce( ( acc, val ) => acc + val, 0 ); + + // Store the last valid result + this.lastValue = totalDuration; + + // Reset states + this.currentQueryIndex = 0; + this.queryOffsets.clear(); + this.queryStates.clear(); + this.activeQuery = null; + + return totalDuration; + + } catch ( error ) { + + console.error( 'Error resolving queries:', error ); + return this.lastValue; + + } finally { + + this.pendingResolve = false; + + } + + } + + /** + * Resolves a single query, checking for completion and disjoint operation. + * @private + * @param {WebGLQuery} query - The query object to resolve. + * @returns {Promise} The elapsed time in milliseconds. + */ + async resolveQuery( query ) { + + return new Promise( ( resolve ) => { + + if ( this.isDisposed ) { + + resolve( this.lastValue ); + return; + + } + + let timeoutId; + let isResolved = false; + + const cleanup = () => { + + if ( timeoutId ) { + + clearTimeout( timeoutId ); + timeoutId = null; + + } + + }; + + const finalizeResolution = ( value ) => { + + if ( ! isResolved ) { + + isResolved = true; + cleanup(); + resolve( value ); + + } + + }; + + const checkQuery = () => { + + if ( this.isDisposed ) { + + finalizeResolution( this.lastValue ); + return; + + } + + try { + + // Check if the GPU timer was disjoint (i.e., timing was unreliable) + const disjoint = this.gl.getParameter( this.ext.GPU_DISJOINT_EXT ); + if ( disjoint ) { + + finalizeResolution( this.lastValue ); + return; + + } + + const available = this.gl.getQueryParameter( query, this.gl.QUERY_RESULT_AVAILABLE ); + if ( ! available ) { + + timeoutId = setTimeout( checkQuery, 1 ); + return; + + } + + const elapsed = this.gl.getQueryParameter( query, this.gl.QUERY_RESULT ); + resolve( Number( elapsed ) / 1e6 ); // Convert nanoseconds to milliseconds + + } catch ( error ) { + + console.error( 'Error checking query:', error ); + resolve( this.lastValue ); + + } + + }; + + checkQuery(); + + } ); + + } + + /** + * Releases all resources held by this query pool. + * This includes deleting all query objects and clearing internal state. + */ + dispose() { + + if ( this.isDisposed ) { + + return; + + } + + this.isDisposed = true; + + if ( ! this.trackTimestamp ) return; + + for ( const query of this.queries ) { + + this.gl.deleteQuery( query ); + + } + + this.queries = []; + this.queryStates.clear(); + this.queryOffsets.clear(); + this.lastValue = 0; + this.activeQuery = null; + + } + +} + /** * A backend implementation targeting WebGL 2. * @@ -56250,19 +57126,25 @@ class WebGLBackend extends Backend { } /** - * Configures the render target with external textures. + * Configures the given XR render target with external textures. * - * @param {RenderTarget} renderTarget - The render target. + * This method is only relevant when using the WebXR Layers API. + * + * @param {XRRenderTarget} renderTarget - The XR render target. * @param {WebGLTexture} colorTexture - A native color texture. * @param {WebGLTexture?} [depthTexture=null] - A native depth texture. */ - setRenderTargetTextures( renderTarget, colorTexture, depthTexture = null ) { + setXRRenderTargetTextures( renderTarget, colorTexture, depthTexture = null ) { - this.set( renderTarget.texture, { textureGPU: colorTexture } ); + const gl = this.gl; + + this.set( renderTarget.texture, { textureGPU: colorTexture, glInternalFormat: gl.RGBA8 } ); // see #24698 why RGBA8 and not SRGB8_ALPHA8 is used if ( depthTexture !== null ) { - this.set( renderTarget.depthTexture, { textureGPU: depthTexture } ); + const glInternalFormat = renderTarget.stencilBuffer ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24; + + this.set( renderTarget.depthTexture, { textureGPU: depthTexture, glInternalFormat: glInternalFormat } ); renderTarget.autoAllocateDepthBuffer = false; @@ -56279,29 +57161,22 @@ class WebGLBackend extends Backend { if ( ! this.disjoint || ! this.trackTimestamp ) return; - const renderContextData = this.get( renderContext ); + const type = renderContext.isComputeNode ? 'compute' : 'render'; - if ( this.queryRunning ) { + if ( ! this.timestampQueryPool[ type ] ) { - if ( ! renderContextData.queryQueue ) renderContextData.queryQueue = []; - renderContextData.queryQueue.push( renderContext ); - return; + // TODO: Variable maxQueries? + this.timestampQueryPool[ type ] = new WebGLTimestampQueryPool( this.gl, type, 2048 ); } - if ( renderContextData.activeQuery ) { - - this.gl.endQuery( this.disjoint.TIME_ELAPSED_EXT ); - renderContextData.activeQuery = null; - - } + const timestampQueryPool = this.timestampQueryPool[ type ]; - renderContextData.activeQuery = this.gl.createQuery(); + const baseOffset = timestampQueryPool.allocateQueriesForContext( renderContext ); - if ( renderContextData.activeQuery !== null ) { + if ( baseOffset !== null ) { - this.gl.beginQuery( this.disjoint.TIME_ELAPSED_EXT, renderContextData.activeQuery ); - this.queryRunning = true; + timestampQueryPool.beginQuery( renderContext ); } @@ -56318,64 +57193,13 @@ class WebGLBackend extends Backend { if ( ! this.disjoint || ! this.trackTimestamp ) return; - const renderContextData = this.get( renderContext ); - - if ( renderContextData.activeQuery ) { - - this.gl.endQuery( this.disjoint.TIME_ELAPSED_EXT ); - - if ( ! renderContextData.gpuQueries ) renderContextData.gpuQueries = []; - renderContextData.gpuQueries.push( { query: renderContextData.activeQuery } ); - renderContextData.activeQuery = null; - this.queryRunning = false; + const type = renderContext.isComputeNode ? 'compute' : 'render'; + const timestampQueryPool = this.timestampQueryPool[ type ]; - if ( renderContextData.queryQueue && renderContextData.queryQueue.length > 0 ) { - - const nextRenderContext = renderContextData.queryQueue.shift(); - this.initTimestampQuery( nextRenderContext ); - - } - - } + timestampQueryPool.endQuery( renderContext ); } - /** - * Resolves the time stamp for the given render context and type. - * - * @async - * @param {RenderContext} renderContext - The render context. - * @param {String} type - The render context. - * @return {Promise} A Promise that resolves when the time stamp has been computed. - */ - async resolveTimestampAsync( renderContext, type = 'render' ) { - - if ( ! this.disjoint || ! this.trackTimestamp ) return; - - const renderContextData = this.get( renderContext ); - - if ( ! renderContextData.gpuQueries ) renderContextData.gpuQueries = []; - - for ( let i = 0; i < renderContextData.gpuQueries.length; i ++ ) { - - const queryInfo = renderContextData.gpuQueries[ i ]; - const available = this.gl.getQueryParameter( queryInfo.query, this.gl.QUERY_RESULT_AVAILABLE ); - const disjoint = this.gl.getParameter( this.disjoint.GPU_DISJOINT_EXT ); - - if ( available && ! disjoint ) { - - const elapsed = this.gl.getQueryParameter( queryInfo.query, this.gl.QUERY_RESULT ); - const duration = Number( elapsed ) / 1000000; // Convert nanoseconds to milliseconds - this.gl.deleteQuery( queryInfo.query ); - renderContextData.gpuQueries.splice( i, 1 ); // Remove the processed query - i --; - this.renderer.info.updateTimestamp( type, duration ); - - } - - } - - } /** * Returns the backend's rendering context. @@ -57856,7 +58680,7 @@ class WebGLBackend extends Backend { const isRenderTarget3D = renderTarget.isRenderTarget3D === true; const isRenderTargetArray = renderTarget.isRenderTargetArray === true; const isXRRenderTarget = renderTarget.isXRRenderTarget === true; - const hasExternalTextures = renderTarget.hasExternalTextures === true; + const hasExternalTextures = ( isXRRenderTarget === true && renderTarget.hasExternalTextures === true ); let msaaFb = renderTargetContextData.msaaFrameBuffer; let depthRenderbuffer = renderTargetContextData.depthRenderbuffer; @@ -58283,6 +59107,9 @@ class WebGLBackend extends Backend { */ dispose() { + const extension = this.extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.loseContext(); + this.renderer.domElement.removeEventListener( 'webglcontextlost', this._onContextLost ); } @@ -61228,6 +62055,19 @@ class WGSLNodeBuilder extends NodeBuilder { } + /** + * Generates the array declaration string. + * + * @param {String} type - The type. + * @param {Number?} [count] - The count. + * @return {String} The generated value as a shader string. + */ + generateArrayDeclaration( type, count ) { + + return `array< ${ this.getType( type ) }, ${ count } >`; + + } + /** * Generates a WGSL variable that holds the texture dimension of the given texture. * It also returns information about the the number of layers (elements) of an arrayed @@ -62304,11 +63144,24 @@ ${ flowData.code } * * @param {String} type - The variable's type. * @param {String} name - The variable's name. + * @param {Number?} [count=null] - The array length. * @return {String} The WGSL snippet that defines a variable. */ - getVar( type, name ) { + getVar( type, name, count = null ) { - return `var ${ name } : ${ this.getType( type ) }`; + let snippet = `var ${ name } : `; + + if ( count !== null ) { + + snippet += this.generateArrayDeclaration( type, count ); + + } else { + + snippet += this.getType( type ); + + } + + return snippet; } @@ -62327,7 +63180,7 @@ ${ flowData.code } for ( const variable of vars ) { - snippets.push( `\t${ this.getVar( variable.type, variable.name ) };` ); + snippets.push( `\t${ this.getVar( variable.type, variable.name, variable.count ) };` ); } @@ -64721,6 +65574,276 @@ class WebGPUPipelineUtils { } +/** + * Manages a pool of WebGPU timestamp queries for performance measurement. + * Extends the base TimestampQueryPool to provide WebGPU-specific implementation. + * @extends TimestampQueryPool + */ +class WebGPUTimestampQueryPool extends TimestampQueryPool { + + /** + * Creates a new WebGPU timestamp query pool. + * @param {GPUDevice} device - The WebGPU device to create queries on. + * @param {string} type - The type identifier for this query pool. + * @param {number} [maxQueries=2048] - Maximum number of queries this pool can hold. + */ + constructor( device, type, maxQueries = 2048 ) { + + super( maxQueries ); + this.device = device; + this.type = type; + + this.querySet = this.device.createQuerySet( { + type: 'timestamp', + count: this.maxQueries, + label: `queryset_global_timestamp_${type}` + } ); + + const bufferSize = this.maxQueries * 8; + this.resolveBuffer = this.device.createBuffer( { + label: `buffer_timestamp_resolve_${type}`, + size: bufferSize, + usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC + } ); + + this.resultBuffer = this.device.createBuffer( { + label: `buffer_timestamp_result_${type}`, + size: bufferSize, + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ + } ); + + } + + /** + * Allocates a pair of queries for a given render context. + * @param {Object} renderContext - The render context to allocate queries for. + * @returns {?number} The base offset for the allocated queries, or null if allocation failed. + */ + allocateQueriesForContext( renderContext ) { + + if ( ! this.trackTimestamp || this.isDisposed ) return null; + + if ( this.currentQueryIndex + 2 > this.maxQueries ) { + + warnOnce( 'WebGPUTimestampQueryPool: Maximum number of queries exceeded.' ); + return null; + + } + + const baseOffset = this.currentQueryIndex; + this.currentQueryIndex += 2; + + this.queryOffsets.set( renderContext.id, baseOffset ); + return baseOffset; + + } + + /** + * Asynchronously resolves all pending queries and returns the total duration. + * If there's already a pending resolve operation, returns that promise instead. + * @returns {Promise} The total duration in milliseconds, or the last valid value if resolution fails. + */ + async resolveQueriesAsync() { + + if ( ! this.trackTimestamp || this.currentQueryIndex === 0 || this.isDisposed ) { + + return this.lastValue; + + } + + if ( this.pendingResolve ) { + + return this.pendingResolve; + + } + + this.pendingResolve = this._resolveQueries(); + + try { + + const result = await this.pendingResolve; + return result; + + } finally { + + this.pendingResolve = null; + + } + + } + + /** + * Internal method to resolve queries and calculate total duration. + * @private + * @returns {Promise} The total duration in milliseconds. + */ + async _resolveQueries() { + + if ( this.isDisposed ) { + + return this.lastValue; + + } + + try { + + if ( this.resultBuffer.mapState !== 'unmapped' ) { + + return this.lastValue; + + } + + const currentOffsets = new Map( this.queryOffsets ); + const queryCount = this.currentQueryIndex; + const bytesUsed = queryCount * 8; + + // Reset state before GPU work + this.currentQueryIndex = 0; + this.queryOffsets.clear(); + + const commandEncoder = this.device.createCommandEncoder(); + + commandEncoder.resolveQuerySet( + this.querySet, + 0, + queryCount, + this.resolveBuffer, + 0 + ); + + commandEncoder.copyBufferToBuffer( + this.resolveBuffer, + 0, + this.resultBuffer, + 0, + bytesUsed + ); + + const commandBuffer = commandEncoder.finish(); + this.device.queue.submit( [ commandBuffer ] ); + + if ( this.resultBuffer.mapState !== 'unmapped' ) { + + return this.lastValue; + + } + + // Create and track the mapping operation + await this.resultBuffer.mapAsync( GPUMapMode.READ, 0, bytesUsed ); + + if ( this.isDisposed ) { + + if ( this.resultBuffer.mapState === 'mapped' ) { + + this.resultBuffer.unmap(); + + } + + return this.lastValue; + + } + + const times = new BigUint64Array( this.resultBuffer.getMappedRange( 0, bytesUsed ) ); + let totalDuration = 0; + + for ( const [ , baseOffset ] of currentOffsets ) { + + const startTime = times[ baseOffset ]; + const endTime = times[ baseOffset + 1 ]; + const duration = Number( endTime - startTime ) / 1e6; + totalDuration += duration; + + } + + this.resultBuffer.unmap(); + this.lastValue = totalDuration; + + return totalDuration; + + } catch ( error ) { + + console.error( 'Error resolving queries:', error ); + if ( this.resultBuffer.mapState === 'mapped' ) { + + this.resultBuffer.unmap(); + + } + + return this.lastValue; + + } + + } + + async dispose() { + + if ( this.isDisposed ) { + + return; + + } + + this.isDisposed = true; + + // Wait for pending resolve operation + if ( this.pendingResolve ) { + + try { + + await this.pendingResolve; + + } catch ( error ) { + + console.error( 'Error waiting for pending resolve:', error ); + + } + + } + + // Ensure buffer is unmapped before destroying + if ( this.resultBuffer && this.resultBuffer.mapState === 'mapped' ) { + + try { + + this.resultBuffer.unmap(); + + } catch ( error ) { + + console.error( 'Error unmapping buffer:', error ); + + } + + } + + // Destroy resources + if ( this.querySet ) { + + this.querySet.destroy(); + this.querySet = null; + + } + + if ( this.resolveBuffer ) { + + this.resolveBuffer.destroy(); + this.resolveBuffer = null; + + } + + if ( this.resultBuffer ) { + + this.resultBuffer.destroy(); + this.resultBuffer = null; + + } + + this.queryOffsets.clear(); + this.pendingResolve = null; + + } + +} + /*// debugger tools import 'https://greggman.github.io/webgpu-avoid-redundant-state-setting/webgpu-check-redundant-state-setting.js'; //*/ @@ -65427,8 +66550,6 @@ class WebGPUBackend extends Backend { } - this.prepareTimestampBuffer( renderContext, renderContextData.encoder ); - this.device.queue.submit( [ renderContextData.encoder.finish() ] ); @@ -65765,8 +66886,6 @@ class WebGPUBackend extends Backend { groupData.passEncoderGPU.end(); - this.prepareTimestampBuffer( computeGroup, groupData.cmdEncoderGPU ); - this.device.queue.submit( [ groupData.cmdEncoderGPU.finish() ] ); } @@ -66243,106 +67362,27 @@ class WebGPUBackend extends Backend { if ( ! this.trackTimestamp ) return; - const renderContextData = this.get( renderContext ); - - // init query set if not exists + const type = renderContext.isComputeNode ? 'compute' : 'render'; - if ( ! renderContextData.timestampQuerySet ) { + if ( ! this.timestampQueryPool[ type ] ) { - const type = renderContext.isComputeNode ? 'compute' : 'render'; - - renderContextData.timestampQuerySet = this.device.createQuerySet( { type: 'timestamp', count: 2, label: `timestamp_${type}_${renderContext.id}` } ); + // TODO: Variable maxQueries? + this.timestampQueryPool[ type ] = new WebGPUTimestampQueryPool( this.device, type, 2048 ); } - // augment descriptor + const timestampQueryPool = this.timestampQueryPool[ type ]; - descriptor.timestampWrites = { - querySet: renderContextData.timestampQuerySet, - beginningOfPassWriteIndex: 0, // Write timestamp in index 0 when pass begins. - endOfPassWriteIndex: 1, // Write timestamp in index 1 when pass ends. - }; + const baseOffset = timestampQueryPool.allocateQueriesForContext( renderContext ); - } - - /** - * Prepares the timestamp buffer. - * - * @param {RenderContext} renderContext - The render context. - * @param {GPUCommandEncoder} encoder - The command encoder. - */ - prepareTimestampBuffer( renderContext, encoder ) { - - if ( ! this.trackTimestamp ) return; - - const renderContextData = this.get( renderContext ); - - - const size = 2 * BigUint64Array.BYTES_PER_ELEMENT; - - if ( renderContextData.currentTimestampQueryBuffers === undefined ) { - - renderContextData.currentTimestampQueryBuffers = { - resolveBuffer: this.device.createBuffer( { - label: 'timestamp resolve buffer', - size: size, - usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC, - } ), - resultBuffer: this.device.createBuffer( { - label: 'timestamp result buffer', - size: size, - usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ, - } ) - }; - - } - - const { resolveBuffer, resultBuffer } = renderContextData.currentTimestampQueryBuffers; - - - encoder.resolveQuerySet( renderContextData.timestampQuerySet, 0, 2, resolveBuffer, 0 ); - - if ( resultBuffer.mapState === 'unmapped' ) { - - encoder.copyBufferToBuffer( resolveBuffer, 0, resultBuffer, 0, size ); - - } + descriptor.timestampWrites = { + querySet: timestampQueryPool.querySet, + beginningOfPassWriteIndex: baseOffset, + endOfPassWriteIndex: baseOffset + 1, + }; } - /** - * Resolves the time stamp for the given render context and type. - * - * @async - * @param {RenderContext} renderContext - The render context. - * @param {String} type - The render context. - * @return {Promise} A Promise that resolves when the time stamp has been computed. - */ - async resolveTimestampAsync( renderContext, type = 'render' ) { - - if ( ! this.trackTimestamp ) return; - - const renderContextData = this.get( renderContext ); - - if ( renderContextData.currentTimestampQueryBuffers === undefined ) return; - - const { resultBuffer } = renderContextData.currentTimestampQueryBuffers; - - if ( resultBuffer.mapState === 'unmapped' ) { - - await resultBuffer.mapAsync( GPUMapMode.READ ); - - const times = new BigUint64Array( resultBuffer.getMappedRange() ); - const duration = Number( times[ 1 ] - times[ 0 ] ) / 1000000; - - - this.renderer.info.updateTimestamp( type, duration ); - - resultBuffer.unmap(); - - } - - } // node builder @@ -67767,4 +68807,4 @@ class ClippingGroup extends Group { } -export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayCamera, ArrayElementNode, AssignNode, AttributeNode, BackSide, BasicEnvironmentNode, BasicShadowMap, BatchNode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CacheNode, Camera, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, CodeNode, Color, ColorManagement, ColorSpaceNode, ComputeNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, DataArrayTexture, DataTexture, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectUVNode, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExpressionNode, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, 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, Loader, LoopNode, LuminanceAlphaFormat, LuminanceFormat, MRTNode, MatcapUVNode, Material, MaterialLoader, MaterialNode, MaterialReferenceNode, MathUtils, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, 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, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalMapNode, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, OutputStructNode, PCFShadowMap, PMREMGenerator, PMREMNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PointLight, PointLightNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, PosterizeNode, PropertyNode, QuadMesh, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, 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_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, SceneNode, ScreenNode, ScriptableNode, ScriptableValueNode, SetNode, ShadowBaseNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SpriteSheetUVNode, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StaticDrawUsage, StorageArrayElementNode, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, ToneMappingNode, ToonOutlinePassNode, TriplanarTexturesNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnsignedByteType, 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, shaderStages, vectorComponents }; +export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayCamera, ArrayElementNode, ArrayNode, AssignNode, AttributeNode, BackSide, BasicEnvironmentNode, BasicShadowMap, BatchNode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CacheNode, Camera, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, CodeNode, Color, ColorManagement, ColorSpaceNode, ComputeNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, DataArrayTexture, DataTexture, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectUVNode, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExpressionNode, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, 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, Loader, LoopNode, LuminanceAlphaFormat, LuminanceFormat, MRTNode, MatcapUVNode, Material, MaterialLoader, MaterialNode, MaterialReferenceNode, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, 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, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalMapNode, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, OutputStructNode, PCFShadowMap, PMREMGenerator, PMREMNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PointLight, PointLightNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, PosterizeNode, PropertyNode, QuadMesh, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, 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_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, SceneNode, ScreenNode, ScriptableNode, ScriptableValueNode, SetNode, ShadowBaseNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SpriteSheetUVNode, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StaticDrawUsage, StorageArrayElementNode, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, ToneMappingNode, ToonOutlinePassNode, TriplanarTexturesNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnsignedByteType, 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, shaderStages, vectorComponents }; diff --git a/build/three.webgpu.nodes.min.js b/build/three.webgpu.nodes.min.js index 630ac6ce8b4ffb..c0d8915e8b7896 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,Matrix3 as i,Matrix4 as n,EventDispatcher as o,MathUtils as a,WebGLCoordinateSystem as u,WebGPUCoordinateSystem as l,ColorManagement as d,SRGBTransfer as c,NoToneMapping as h,StaticDrawUsage as p,InterleavedBuffer as g,DynamicDrawUsage as m,InterleavedBufferAttribute as f,NoColorSpace as y,UnsignedIntType as x,IntType as b,BackSide as T,CubeReflectionMapping as _,CubeRefractionMapping as v,TangentSpaceNormalMap as N,ObjectSpaceNormalMap as S,InstancedInterleavedBuffer as A,InstancedBufferAttribute as R,DataArrayTexture as C,FloatType as E,FramebufferTexture as w,LinearMipmapLinearFilter as M,DepthTexture as B,Material as F,NormalBlending as U,LineBasicMaterial as P,LineDashedMaterial as I,NoBlending as L,MeshNormalMaterial as D,WebGLCubeRenderTarget as V,BoxGeometry as O,Mesh as G,Scene as k,LinearFilter as z,CubeCamera as $,CubeTexture as W,EquirectangularReflectionMapping as H,EquirectangularRefractionMapping as j,AddOperation as q,MixOperation as X,MultiplyOperation as K,MeshBasicMaterial as Y,MeshLambertMaterial as Q,MeshPhongMaterial as Z,Texture as J,MeshStandardMaterial as ee,MeshPhysicalMaterial as te,MeshToonMaterial as re,MeshMatcapMaterial as se,SpriteMaterial as ie,PointsMaterial as ne,ShadowMaterial as oe,Uint32BufferAttribute as ae,Uint16BufferAttribute as ue,DoubleSide as le,Camera as de,DepthStencilFormat as ce,DepthFormat as he,UnsignedInt248Type as pe,UnsignedByteType as ge,RenderTarget as me,Plane as fe,Object3D as ye,HalfFloatType as xe,LinearMipMapLinearFilter as be,OrthographicCamera as Te,BufferGeometry as _e,Float32BufferAttribute as ve,BufferAttribute as Ne,UVMapping as Se,Euler as Ae,LinearSRGBColorSpace as Re,LessCompare as Ce,VSMShadowMap as Ee,RGFormat as we,BasicShadowMap as Me,SphereGeometry as Be,CubeUVReflectionMapping as Fe,PerspectiveCamera as Ue,RGBAFormat as Pe,LinearMipmapNearestFilter as Ie,NearestMipmapLinearFilter as Le,Float16BufferAttribute as De,REVISION as Ve,ArrayCamera as Oe,WebXRController as Ge,RAD2DEG as ke,SRGBColorSpace as ze,PCFShadowMap as $e,FrontSide as We,Frustum as He,DataTexture as je,RedIntegerFormat as qe,RedFormat as Xe,RGIntegerFormat as Ke,RGBIntegerFormat as Ye,RGBFormat as Qe,RGBAIntegerFormat as Ze,UnsignedShortType as Je,ByteType as et,ShortType as tt,createCanvasElement as rt,AddEquation as st,SubtractEquation as it,ReverseSubtractEquation as nt,ZeroFactor as ot,OneFactor as at,SrcColorFactor as ut,SrcAlphaFactor as lt,SrcAlphaSaturateFactor as dt,DstColorFactor as ct,DstAlphaFactor as ht,OneMinusSrcColorFactor as pt,OneMinusSrcAlphaFactor as gt,OneMinusDstColorFactor as mt,OneMinusDstAlphaFactor as ft,CullFaceNone as yt,CullFaceBack as xt,CullFaceFront as bt,CustomBlending as Tt,MultiplyBlending as _t,SubtractiveBlending as vt,AdditiveBlending as Nt,NotEqualDepth as St,GreaterDepth as At,GreaterEqualDepth as Rt,EqualDepth as Ct,LessEqualDepth as Et,LessDepth as wt,AlwaysDepth as Mt,NeverDepth as Bt,UnsignedShort4444Type as Ft,UnsignedShort5551Type as Ut,UnsignedInt5999Type as Pt,AlphaFormat as It,LuminanceFormat as Lt,LuminanceAlphaFormat as Dt,RGB_S3TC_DXT1_Format as Vt,RGBA_S3TC_DXT1_Format as Ot,RGBA_S3TC_DXT3_Format as Gt,RGBA_S3TC_DXT5_Format as kt,RGB_PVRTC_4BPPV1_Format as zt,RGB_PVRTC_2BPPV1_Format as $t,RGBA_PVRTC_4BPPV1_Format as Wt,RGBA_PVRTC_2BPPV1_Format as Ht,RGB_ETC1_Format as jt,RGB_ETC2_Format as qt,RGBA_ETC2_EAC_Format as Xt,RGBA_ASTC_4x4_Format as Kt,RGBA_ASTC_5x4_Format as Yt,RGBA_ASTC_5x5_Format as Qt,RGBA_ASTC_6x5_Format as Zt,RGBA_ASTC_6x6_Format as Jt,RGBA_ASTC_8x5_Format as er,RGBA_ASTC_8x6_Format as tr,RGBA_ASTC_8x8_Format as rr,RGBA_ASTC_10x5_Format as sr,RGBA_ASTC_10x6_Format as ir,RGBA_ASTC_10x8_Format as nr,RGBA_ASTC_10x10_Format as or,RGBA_ASTC_12x10_Format as ar,RGBA_ASTC_12x12_Format as ur,RGBA_BPTC_Format as lr,RED_RGTC1_Format as dr,SIGNED_RED_RGTC1_Format as cr,RED_GREEN_RGTC2_Format as hr,SIGNED_RED_GREEN_RGTC2_Format as pr,RepeatWrapping as gr,ClampToEdgeWrapping as mr,MirroredRepeatWrapping as fr,NearestFilter as yr,NearestMipmapNearestFilter as xr,NeverCompare as br,AlwaysCompare as Tr,LessEqualCompare as _r,EqualCompare as vr,GreaterEqualCompare as Nr,GreaterCompare as Sr,NotEqualCompare as Ar,warnOnce as Rr,NotEqualStencilFunc as Cr,GreaterStencilFunc as Er,GreaterEqualStencilFunc as wr,EqualStencilFunc as Mr,LessEqualStencilFunc as Br,LessStencilFunc as Fr,AlwaysStencilFunc as Ur,NeverStencilFunc as Pr,DecrementWrapStencilOp as Ir,IncrementWrapStencilOp as Lr,DecrementStencilOp as Dr,IncrementStencilOp as Vr,InvertStencilOp as Or,ReplaceStencilOp as Gr,ZeroStencilOp as kr,KeepStencilOp as zr,MaxEquation as $r,MinEquation as Wr,SpotLight as Hr,PointLight as jr,DirectionalLight as qr,RectAreaLight as Xr,AmbientLight as Kr,HemisphereLight as Yr,LightProbe as Qr,LinearToneMapping as Zr,ReinhardToneMapping as Jr,CineonToneMapping as es,ACESFilmicToneMapping as ts,AgXToneMapping as rs,NeutralToneMapping as ss,Group as is,Loader as ns,FileLoader as os,MaterialLoader as as,ObjectLoader as us}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,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,ConstantAlphaFactor,ConstantColorFactor,Controls,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CustomToneMapping,CylinderGeometry,Cylindrical,Data3DTexture,DataTextureLoader,DataUtils,DefaultLoadingManager,DetachedBindMode,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,ExtrudeGeometry,Fog,FogExp2,GLBufferAttribute,GLSL1,GLSL3,GridHelper,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,InstancedBufferGeometry,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,KeyframeTrack,LOD,LatheGeometry,Layers,Light,Line,Line3,LineCurve,LineCurve3,LineLoop,LineSegments,LinearInterpolant,LinearMipMapNearestFilter,LinearTransfer,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,Matrix2,MeshDepthMaterial,MeshDistanceMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NormalAnimationBlendMode,NumberKeyframeTrack,OctahedronGeometry,OneMinusConstantAlphaFactor,OneMinusConstantColorFactor,PCFSoftShadowMap,Path,PlaneGeometry,PlaneHelper,PointLightHelper,Points,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,Quaternion,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGB_BPTC_SIGNED_Format,RGB_BPTC_UNSIGNED_Format,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RenderTarget3D,RenderTargetArray,RingGeometry,ShaderMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Sphere,Spherical,SphericalHarmonics3,SplineCurve,SpotLightHelper,Sprite,StaticCopyUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGLRenderTarget,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding}from"./three.core.min.js";const ls=["alphaMap","alphaTest","anisotropy","anisotropyMap","anisotropyRotation","aoMap","attenuationColor","attenuationDistance","bumpMap","clearcoat","clearcoatMap","clearcoatNormalMap","clearcoatNormalScale","clearcoatRoughness","color","dispersion","displacementMap","emissive","emissiveMap","envMap","gradientMap","ior","iridescence","iridescenceIOR","iridescenceMap","iridescenceThicknessMap","lightMap","map","matcap","metalness","metalnessMap","normalMap","normalScale","opacity","roughness","roughnessMap","sheen","sheenColor","sheenColorMap","sheenRoughnessMap","shininess","specular","specularColor","specularColorMap","specularIntensity","specularIntensityMap","specularMap","thickness","transmission","transmissionMap"];class ds{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=ls,this.renderId=0}firstInitialization(e){return!1===this.renderObjects.has(e)&&(this.getRenderObjectData(e),!0)}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:{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}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 null!==e.renderer.nodes.modelViewMatrix||null!==e.renderer.nodes.modelNormalViewMatrix}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){const{object:t,material:r,geometry:s}=e,i=this.getRenderObjectData(e);if(!0!==i.worldMatrix.equals(t.matrixWorld))return i.worldMatrix.copy(t.matrixWorld),!1;const n=i.material;for(const e in n){const t=n[e],s=r[e];if(void 0!==t.equals){if(!1===t.equals(s))return t.copy(s),!1}else if(!0===s.isTexture){if(t.id!==s.id||t.version!==s.version)return t.id=s.id,t.version=s.version,!1}else if(t!==s)return n[e]=s,!1}if(n.transmission>0){const{width:t,height:r}=e.context;if(i.bufferWidth!==t||i.bufferHeight!==r)return i.bufferWidth=t,i.bufferHeight=r,!1}const o=i.geometry,a=s.attributes,u=o.attributes,l=Object.keys(u),d=Object.keys(a);if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(a),!1;for(const e of l){const t=u[e],r=a[e];if(void 0===r)return delete u[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const c=s.index,h=o.indexVersion,p=c?c.version:null;if(h!==p)return o.indexVersion=p,!1;if(o.drawRange.start!==s.drawRange.start||o.drawRange.count!==s.drawRange.count)return o.drawRange.start=s.drawRange.start,o.drawRange.count=s.drawRange.count,!1;if(i.morphTargetInfluences){let e=!1;for(let r=0;r>>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 hs=e=>cs(e),ps=e=>cs(e),gs=(...e)=>cs(e);function ms(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of fs(e))r.push(cs(s.slice(0,-4)),i.getCacheKey(t));return cs(r)}function*fs(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0))).buffer}var Cs=Object.freeze({__proto__:null,arrayBufferToBase64:As,base64ToArrayBuffer:Rs,getCacheKey:ms,getDataFromObject:Ss,getLengthFromType:_s,getNodeChildren:fs,getTypeFromLength:bs,getTypedArrayFromType:Ts,getValueFromType:Ns,getValueType:vs,hash:gs,hashArray:ps,hashString:hs});const Es={VERTEX:"vertex",FRAGMENT:"fragment"},ws={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Ms={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Bs={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Fs=["fragment","vertex"],Us=["setup","analyze","generate"],Ps=[...Fs,"compute"],Is=["x","y","z","w"];let Ls=0;class Ds extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=ws.NONE,this.updateBeforeType=ws.NONE,this.updateAfterType=ws.NONE,this.uuid=a.generateUUID(),this.version=0,this.global=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:Ls++})}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.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,ws.FRAME)}onRenderUpdate(e){return this.onUpdate(e,ws.RENDER)}onObjectUpdate(e){return this.onUpdate(e,ws.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of fs(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=gs(ms(this,e),this.customCacheKey()),this._cacheKeyVersion=this.version),this._cacheKey}customCacheKey(){return 0}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return t.outputNode||null}analyze(e){if(1===e.increaseUsage(this)){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);e.addNode(this),e.addChain(this);let s=null;const i=e.getBuildStage();if("setup"===i){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){t.initialized=!0;const r=this.setup(e),s=r&&!0===r.isNode;for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e);s&&r.build(e),t.outputNode=r}}else if("analyze"===i)this.analyze(e);else if("generate"===i){if(1===this.generate.length){const r=this.getNodeType(e),i=e.getDataFromNode(this);s=i.snippet,void 0===s?(s=this.generate(e)||"",i.snippet=s):void 0!==i.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),s=e.format(s,r,t)}else s=this.generate(e,t)||""}return e.removeChain(this),e.addSequentialNode(this),s}getSerializeChildren(){return fs(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(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.6,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 Vs extends Ds{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)}generate(e){return`${this.node.build(e)}[ ${this.indexNode.build(e,"uint")} ]`}}class Os extends Ds{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 Gs extends Ds{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),o=e.getPropertyName(n);return e.addLineFlowCode(`${o} = ${i}`,this),s.snippet=i,s.propertyName=o,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class ks extends Gs{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=this.nodes,i=e.getComponentType(r),n=[];for(const t of s){let r=t.build(e);const s=e.getComponentType(t.getNodeType(e));s!==i&&(r=e.format(r,s,i)),n.push(r)}const o=`${e.getType(r)}( ${n.join(", ")} )`;return e.format(o,r,t)}}const zs=Is.join("");class $s extends Ds{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(Is.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))}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 o=r.build(e,n);i=this.components.length===s&&this.components===zs.slice(0,this.components.length)?e.format(o,n,t):e.format(`${o}.${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 Ws extends Gs{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)),o=e.getTypeFromLength(r.length,n),a=s.build(e,o),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),Zs=e=>Qs(e).split("").sort().join(""),Js={setup(e,t){const r=t.shift();return e(Si(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(Xs.assign(r,...e),r);if(Ks.has(t)){const s=Ks.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&Ks.has(t.slice(0,t.length-6))){const s=Ks.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=Qs(t),Ni(new $s(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Zs(t.slice(3).toLowerCase()),r=>Ni(new Ws(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Zs(t.slice(4).toLowerCase()),()=>Ni(new Hs(Ni(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Ni(new $s(e,t));if(!0===/^\d+$/.test(t))return Ni(new Vs(r,new qs(Number(t),"uint")))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},ei=new WeakMap,ti=new WeakMap,ri=function(e,t=null){for(const r in e)e[r]=Ni(e[r],t);return e},si=function(e,t=null){const r=e.length;for(let s=0;sNi(null!==s?Object.assign(e,s):e);return null===t?(...t)=>i(new e(...Ai(t))):null!==r?(r=Ni(r),(...s)=>i(new e(t,...Ai(s),r))):(...r)=>i(new e(t,...Ai(r)))},ni=function(e,...t){return Ni(new e(...Ai(t)))};class oi extends Ds{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t);if(s.onceOutput)return s.onceOutput;let i=null;if(t.layout){let s=ti.get(e.constructor);void 0===s&&(s=new WeakMap,ti.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=Ni(e.buildFunctionNode(t)),s.set(t,n)),null!==e.currentFunctionNode&&e.currentFunctionNode.includes.push(n),i=Ni(n.call(r))}else{const s=t.jsFunc,n=null!==r||s.length>1?s(r||[],e):s(e);i=Ni(n)}return t.once&&(s.onceOutput=i),i}getOutputNode(e){const t=e.getNodeProperties(this);return null===t.outputNode&&(t.outputNode=this.setupOutput(e)),t.outputNode}setup(e){return this.getOutputNode(e)}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}generate(e,t){return this.getOutputNode(e).build(e,t)}}class ai extends Ds{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return Si(e),Ni(new oi(this,e))}setup(){return this.call()}}const ui=[!1,!0],li=[0,1,2,3],di=[-1,-2],ci=[.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],hi=new Map;for(const e of ui)hi.set(e,new qs(e));const pi=new Map;for(const e of li)pi.set(e,new qs(e,"uint"));const gi=new Map([...pi].map((e=>new qs(e.value,"int"))));for(const e of di)gi.set(e,new qs(e,"int"));const mi=new Map([...gi].map((e=>new qs(e.value))));for(const e of ci)mi.set(e,new qs(e));for(const e of ci)mi.set(-e,new qs(-e));const fi={bool:hi,uint:pi,ints:gi,float:mi},yi=new Map([...hi,...mi]),xi=(e,t)=>yi.has(e)?yi.get(e):!0===e.isNode?e:new qs(e,t),bi=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[Ns(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Ni(t.get(r[0]));if(1===r.length){const t=xi(r[0],e);return(e=>{try{return e.getNodeType()}catch(e){return}})(t)===e?Ni(t):Ni(new Os(t,e))}const s=r.map((e=>xi(e)));return Ni(new ks(s,e))}},Ti=e=>"object"==typeof e&&null!==e?e.value:e,_i=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function vi(e,t){return new Proxy(new ai(e,t),Js)}const Ni=(e,t=null)=>function(e,t=null){const r=vs(e);if("node"===r){let t=ei.get(e);return void 0===t&&(t=new Proxy(e,Js),ei.set(e,t),ei.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Ni(xi(e,t)):"shader"===r?Ei(e):e}(e,t),Si=(e,t=null)=>new ri(e,t),Ai=(e,t=null)=>new si(e,t),Ri=(...e)=>new ii(...e),Ci=(...e)=>new ni(...e),Ei=(e,t)=>{const r=new vi(e,t),s=(...e)=>{let t;return Si(e),t=e[0]&&e[0].isNode?[...e]:e[0],r.call(t)};return s.shaderNode=r,s.setLayout=e=>(r.setLayout(e),s),s.once=()=>(r.once=!0,s),s};Ys("toGlobal",(e=>(e.global=!0,e)));const wi=e=>{Xs=e},Mi=()=>Xs,Bi=(...e)=>Xs.If(...e);function Fi(e){return Xs&&Xs.add(e),e}Ys("append",Fi);const Ui=new bi("color"),Pi=new bi("float",fi.float),Ii=new bi("int",fi.ints),Li=new bi("uint",fi.uint),Di=new bi("bool",fi.bool),Vi=new bi("vec2"),Oi=new bi("ivec2"),Gi=new bi("uvec2"),ki=new bi("bvec2"),zi=new bi("vec3"),$i=new bi("ivec3"),Wi=new bi("uvec3"),Hi=new bi("bvec3"),ji=new bi("vec4"),qi=new bi("ivec4"),Xi=new bi("uvec4"),Ki=new bi("bvec4"),Yi=new bi("mat2"),Qi=new bi("mat3"),Zi=new bi("mat4");Ys("toColor",Ui),Ys("toFloat",Pi),Ys("toInt",Ii),Ys("toUint",Li),Ys("toBool",Di),Ys("toVec2",Vi),Ys("toIVec2",Oi),Ys("toUVec2",Gi),Ys("toBVec2",ki),Ys("toVec3",zi),Ys("toIVec3",$i),Ys("toUVec3",Wi),Ys("toBVec3",Hi),Ys("toVec4",ji),Ys("toIVec4",qi),Ys("toUVec4",Xi),Ys("toBVec4",Ki),Ys("toMat2",Yi),Ys("toMat3",Qi),Ys("toMat4",Zi);const Ji=Ri(Vs),en=(e,t)=>Ni(new Os(Ni(e),t));Ys("element",Ji),Ys("convert",en);class tn extends Ds{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 rn=e=>new tn(e),sn=(e,t=0)=>new tn(e,!0,t),nn=sn("frame"),on=sn("render"),an=rn("object");class un extends js{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=an}label(e){return this.name=e,this}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate((t=>{const s=e(t,r);void 0!==s&&(this.value=s)}),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),o=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),a=e.getPropertyName(o);return void 0!==e.context.label&&delete e.context.label,e.format(a,r,t)}}const ln=(e,t)=>{const r=_i(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return Ni(new un(s,r))};class dn extends Ds{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0}getHash(e){return this.name||super.getHash(e)}isGlobal(){return!0}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 cn=(e,t)=>Ni(new dn(e,t)),hn=(e,t)=>Ni(new dn(e,t,!0)),pn=Ci(dn,"vec4","DiffuseColor"),gn=Ci(dn,"vec3","EmissiveColor"),mn=Ci(dn,"float","Roughness"),fn=Ci(dn,"float","Metalness"),yn=Ci(dn,"float","Clearcoat"),xn=Ci(dn,"float","ClearcoatRoughness"),bn=Ci(dn,"vec3","Sheen"),Tn=Ci(dn,"float","SheenRoughness"),_n=Ci(dn,"float","Iridescence"),vn=Ci(dn,"float","IridescenceIOR"),Nn=Ci(dn,"float","IridescenceThickness"),Sn=Ci(dn,"float","AlphaT"),An=Ci(dn,"float","Anisotropy"),Rn=Ci(dn,"vec3","AnisotropyT"),Cn=Ci(dn,"vec3","AnisotropyB"),En=Ci(dn,"color","SpecularColor"),wn=Ci(dn,"float","SpecularF90"),Mn=Ci(dn,"float","Shininess"),Bn=Ci(dn,"vec4","Output"),Fn=Ci(dn,"float","dashSize"),Un=Ci(dn,"float","gapSize"),Pn=Ci(dn,"float","pointWidth"),In=Ci(dn,"float","IOR"),Ln=Ci(dn,"float","Transmission"),Dn=Ci(dn,"float","Thickness"),Vn=Ci(dn,"float","AttenuationDistance"),On=Ci(dn,"color","AttenuationColor"),Gn=Ci(dn,"float","Dispersion");class kn extends Gs{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t}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 Is.join("").slice(0,r)!==t.components}return!1}generate(e,t){const{targetNode:r,sourceNode:s}=this,i=this.needsSplitAssign(e),n=r.getNodeType(e),o=r.context({assign:!0}).build(e),a=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=o);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${a}`,this);const u=r.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))for(let e=0;e(t=t.length>1||t[0]&&!0===t[0].isNode?Ai(t):Si(t[0]),Ni(new $n(Ni(e),t)));Ys("call",Wn);class Hn extends Gs{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Hn(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"=="===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("<"===r||">"===r||"<="===r||">="===r){const r=t?e.getTypeLength(t):Math.max(e.getTypeLength(n),e.getTypeLength(o));return r>1?`bvec${r}`:"bool"}return"float"===n&&e.isMatrix(o)?o:e.isMatrix(n)&&e.isVector(o)?e.getVectorFromMatrix(n):e.isVector(n)&&e.isMatrix(o)?e.getVectorFromMatrix(o):e.getTypeLength(o)>e.getTypeLength(n)?o:n}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e,t);let o=null,a=null;"void"!==n?(o=s.getNodeType(e),a=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r?e.isVector(o)?a=o:o!==a&&(o=a="float"):">>"===r||"<<"===r?(o=n,a=e.changeComponentType(a,"uint")):e.isMatrix(o)&&e.isVector(a)?a=e.getVectorFromMatrix(o):o=e.isVector(o)&&e.isMatrix(a)?e.getVectorFromMatrix(a):a=n):o=a=n;const u=s.build(e,o),l=void 0!==i?i.build(e,a):null,d=e.getTypeLength(t),c=e.getFunctionOperator(r);return"void"!==t?"<"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} < ${l} )`,n,t):"<="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} <= ${l} )`,n,t):">"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} > ${l} )`,n,t):">="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} >= ${l} )`,n,t):"!"===r||"~"===r?e.format(`(${r}${u})`,o,t):c?e.format(`${c}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t):"void"!==o?c?e.format(`${c}( ${u}, ${l} )`,n,t):e.format(`${u} ${r} ${l}`,n,t):void 0}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const jn=Ri(Hn,"+"),qn=Ri(Hn,"-"),Xn=Ri(Hn,"*"),Kn=Ri(Hn,"/"),Yn=Ri(Hn,"%"),Qn=Ri(Hn,"=="),Zn=Ri(Hn,"!="),Jn=Ri(Hn,"<"),eo=Ri(Hn,">"),to=Ri(Hn,"<="),ro=Ri(Hn,">="),so=Ri(Hn,"&&"),io=Ri(Hn,"||"),no=Ri(Hn,"!"),oo=Ri(Hn,"^^"),ao=Ri(Hn,"&"),uo=Ri(Hn,"~"),lo=Ri(Hn,"|"),co=Ri(Hn,"^"),ho=Ri(Hn,"<<"),po=Ri(Hn,">>");Ys("add",jn),Ys("sub",qn),Ys("mul",Xn),Ys("div",Kn),Ys("modInt",Yn),Ys("equal",Qn),Ys("notEqual",Zn),Ys("lessThan",Jn),Ys("greaterThan",eo),Ys("lessThanEqual",to),Ys("greaterThanEqual",ro),Ys("and",so),Ys("or",io),Ys("not",no),Ys("xor",oo),Ys("bitAnd",ao),Ys("bitNot",uo),Ys("bitOr",lo),Ys("bitXor",co),Ys("shiftLeft",ho),Ys("shiftRight",po);const go=(...e)=>(console.warn("TSL.OperatorNode: .remainder() has been renamed to .modInt()."),Yn(...e));Ys("remainder",go);class mo extends Gs{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){super(),this.method=e,this.aNode=t,this.bNode=r,this.cNode=s,this.isMathNode=!0}getInputType(e){const t=this.aNode.getNodeType(e),r=this.bNode?this.bNode.getNodeType(e):null,s=this.cNode?this.cNode.getNodeType(e):null,i=e.isMatrix(t)?0:e.getTypeLength(t),n=e.isMatrix(r)?0:e.getTypeLength(r),o=e.isMatrix(s)?0:e.getTypeLength(s);return i>n&&i>o?t:n>o?r:o>i?s:t}getNodeType(e){const t=this.method;return t===mo.LENGTH||t===mo.DISTANCE||t===mo.DOT?"float":t===mo.CROSS?"vec3":t===mo.ALL?"bool":t===mo.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):t===mo.MOD?this.aNode.getNodeType(e):this.getInputType(e)}generate(e,t){let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,o=this.bNode,a=this.cNode,d=e.renderer.coordinateSystem;if(r===mo.TRANSFORM_DIRECTION){let r=n,s=o;e.isMatrix(r.getNodeType(e))?s=ji(zi(s),0):r=ji(zi(r),0);const i=Xn(r,s).xyz;return Fo(i).build(e,t)}if(r===mo.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===mo.ONE_MINUS)return qn(1,n).build(e,t);if(r===mo.RECIPROCAL)return Kn(1,n).build(e,t);if(r===mo.DIFFERENCE)return Go(qn(n,o)).build(e,t);{const c=[];return r===mo.CROSS||r===mo.MOD?c.push(n.build(e,s),o.build(e,s)):d===u&&r===mo.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),o.build(e,i)):d===u&&(r===mo.MIN||r===mo.MAX)||r===mo.MOD?c.push(n.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):r===mo.REFRACT?c.push(n.build(e,i),o.build(e,i),a.build(e,"float")):r===mo.MIX?c.push(n.build(e,i),o.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)):(d===l&&r===mo.ATAN&&null!==o&&(r="atan2"),c.push(n.build(e,i)),null!==o&&c.push(o.build(e,i)),null!==a&&c.push(a.build(e,i))),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}mo.ALL="all",mo.ANY="any",mo.RADIANS="radians",mo.DEGREES="degrees",mo.EXP="exp",mo.EXP2="exp2",mo.LOG="log",mo.LOG2="log2",mo.SQRT="sqrt",mo.INVERSE_SQRT="inversesqrt",mo.FLOOR="floor",mo.CEIL="ceil",mo.NORMALIZE="normalize",mo.FRACT="fract",mo.SIN="sin",mo.COS="cos",mo.TAN="tan",mo.ASIN="asin",mo.ACOS="acos",mo.ATAN="atan",mo.ABS="abs",mo.SIGN="sign",mo.LENGTH="length",mo.NEGATE="negate",mo.ONE_MINUS="oneMinus",mo.DFDX="dFdx",mo.DFDY="dFdy",mo.ROUND="round",mo.RECIPROCAL="reciprocal",mo.TRUNC="trunc",mo.FWIDTH="fwidth",mo.TRANSPOSE="transpose",mo.BITCAST="bitcast",mo.EQUALS="equals",mo.MIN="min",mo.MAX="max",mo.MOD="mod",mo.STEP="step",mo.REFLECT="reflect",mo.DISTANCE="distance",mo.DIFFERENCE="difference",mo.DOT="dot",mo.CROSS="cross",mo.POW="pow",mo.TRANSFORM_DIRECTION="transformDirection",mo.MIX="mix",mo.CLAMP="clamp",mo.REFRACT="refract",mo.SMOOTHSTEP="smoothstep",mo.FACEFORWARD="faceforward";const fo=Pi(1e-6),yo=Pi(1e6),xo=Pi(Math.PI),bo=Pi(2*Math.PI),To=Ri(mo,mo.ALL),_o=Ri(mo,mo.ANY),vo=Ri(mo,mo.RADIANS),No=Ri(mo,mo.DEGREES),So=Ri(mo,mo.EXP),Ao=Ri(mo,mo.EXP2),Ro=Ri(mo,mo.LOG),Co=Ri(mo,mo.LOG2),Eo=Ri(mo,mo.SQRT),wo=Ri(mo,mo.INVERSE_SQRT),Mo=Ri(mo,mo.FLOOR),Bo=Ri(mo,mo.CEIL),Fo=Ri(mo,mo.NORMALIZE),Uo=Ri(mo,mo.FRACT),Po=Ri(mo,mo.SIN),Io=Ri(mo,mo.COS),Lo=Ri(mo,mo.TAN),Do=Ri(mo,mo.ASIN),Vo=Ri(mo,mo.ACOS),Oo=Ri(mo,mo.ATAN),Go=Ri(mo,mo.ABS),ko=Ri(mo,mo.SIGN),zo=Ri(mo,mo.LENGTH),$o=Ri(mo,mo.NEGATE),Wo=Ri(mo,mo.ONE_MINUS),Ho=Ri(mo,mo.DFDX),jo=Ri(mo,mo.DFDY),qo=Ri(mo,mo.ROUND),Xo=Ri(mo,mo.RECIPROCAL),Ko=Ri(mo,mo.TRUNC),Yo=Ri(mo,mo.FWIDTH),Qo=Ri(mo,mo.TRANSPOSE),Zo=Ri(mo,mo.BITCAST),Jo=Ri(mo,mo.EQUALS),ea=Ri(mo,mo.MIN),ta=Ri(mo,mo.MAX),ra=Ri(mo,mo.MOD),sa=Ri(mo,mo.STEP),ia=Ri(mo,mo.REFLECT),na=Ri(mo,mo.DISTANCE),oa=Ri(mo,mo.DIFFERENCE),aa=Ri(mo,mo.DOT),ua=Ri(mo,mo.CROSS),la=Ri(mo,mo.POW),da=Ri(mo,mo.POW,2),ca=Ri(mo,mo.POW,3),ha=Ri(mo,mo.POW,4),pa=Ri(mo,mo.TRANSFORM_DIRECTION),ga=e=>Xn(ko(e),la(Go(e),1/3)),ma=e=>aa(e,e),fa=Ri(mo,mo.MIX),ya=(e,t=0,r=1)=>Ni(new mo(mo.CLAMP,Ni(e),Ni(t),Ni(r))),xa=e=>ya(e),ba=Ri(mo,mo.REFRACT),Ta=Ri(mo,mo.SMOOTHSTEP),_a=Ri(mo,mo.FACEFORWARD),va=Ei((([e])=>{const t=aa(e.xy,Vi(12.9898,78.233)),r=ra(t,xo);return Uo(Po(r).mul(43758.5453))})),Na=(e,t,r)=>fa(t,r,e),Sa=(e,t,r)=>Ta(t,r,e),Aa=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),Oo(e,t)),Ra=_a,Ca=wo;Ys("all",To),Ys("any",_o),Ys("equals",Jo),Ys("radians",vo),Ys("degrees",No),Ys("exp",So),Ys("exp2",Ao),Ys("log",Ro),Ys("log2",Co),Ys("sqrt",Eo),Ys("inverseSqrt",wo),Ys("floor",Mo),Ys("ceil",Bo),Ys("normalize",Fo),Ys("fract",Uo),Ys("sin",Po),Ys("cos",Io),Ys("tan",Lo),Ys("asin",Do),Ys("acos",Vo),Ys("atan",Oo),Ys("abs",Go),Ys("sign",ko),Ys("length",zo),Ys("lengthSq",ma),Ys("negate",$o),Ys("oneMinus",Wo),Ys("dFdx",Ho),Ys("dFdy",jo),Ys("round",qo),Ys("reciprocal",Xo),Ys("trunc",Ko),Ys("fwidth",Yo),Ys("atan2",Aa),Ys("min",ea),Ys("max",ta),Ys("mod",ra),Ys("step",sa),Ys("reflect",ia),Ys("distance",na),Ys("dot",aa),Ys("cross",ua),Ys("pow",la),Ys("pow2",da),Ys("pow3",ca),Ys("pow4",ha),Ys("transformDirection",pa),Ys("mix",Na),Ys("clamp",ya),Ys("refract",ba),Ys("smoothstep",Sa),Ys("faceForward",_a),Ys("difference",oa),Ys("saturate",xa),Ys("cbrt",ga),Ys("transpose",Qo),Ys("rand",va);class Ea extends Ds{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 this.setup(e),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.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.getNodeProperties(this);n.condNode=t,n.ifNode=r.context({nodeBlock:r}),n.elseNode=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:o}=e.getNodeProperties(this),a="void"!==t,u=a?cn(r).build(e):"";s.nodeProperty=u;const l=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${l} ) {\n\n`).addFlowTab();let d=n.build(e,r);if(d&&(d=a?u+" = "+d+";":"return "+d+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+d+"\n\n"+e.tab+"}"),null!==o){e.addFlowCode(" else {\n\n").addFlowTab();let t=o.build(e,r);t&&(t=a?u+" = "+t+";":"return "+t+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(u,r,t)}}const wa=Ri(Ea);Ys("select",wa);const Ma=(...e)=>(console.warn("TSL.ConditionalNode: cond() has been renamed to select()."),wa(...e));Ys("cond",Ma);class Ba extends Ds{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){this.node.build(e)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value});const r=this.node.build(e);return e.setContext(t),r}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const Fa=Ri(Ba),Ua=(e,t)=>Fa(e,{label:t});Ys("context",Fa),Ys("label",Ua);class Pa extends Ds{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}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let o=!1,a=!1;s&&(o=e.isDeterministic(t),a=n?s:o);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,a),c=e.getPropertyName(d);let h=c;if(a){const t=e.getType(d.type);h=n?o?`const ${c}`:`let ${c}`:`const ${t} ${c}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const Ia=Ri(Pa),La=(e,t=null)=>Ia(e,t).append(),Da=(e,t=null)=>Ia(e,t,!0).append();Ys("toVar",La),Ys("toConst",Da);const Va=e=>(console.warn('TSL: "temp( node )" is deprecated. Use "Var( node )" or "node.toVar()" instead.'),Ia(e));Ys("temp",Va);class Oa extends Ds{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0}isGlobal(){return!0}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);t.varying=r=e.getVaryingFromNode(this,s,i),t.node=this.node}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e)}analyze(e){return this.setupVarying(e),this.node.analyze(e)}generate(e){const t=e.getNodeProperties(this),r=this.setupVarying(e),s="fragment"===e.shaderStage&&!0===t.reassignPosition&&e.context.needsPositionReassign;if(void 0===t.propertyName||s){const i=this.getNodeType(e),n=e.getPropertyName(r,Es.VERTEX);e.flowNodeFromShaderStage(Es.VERTEX,this.node,i,n),t.propertyName=n,s?t.reassignPosition=!1:void 0===t.reassignPosition&&e.context.isPositionNodeInput&&(t.reassignPosition=!0)}return e.getPropertyName(r)}}const Ga=Ri(Oa),ka=e=>Ga(e);Ys("toVarying",Ga),Ys("toVertexStage",ka),Ys("varying",((...e)=>(console.warn("TSL.VaryingNode: .varying() has been renamed to .toVarying()."),Ga(...e)))),Ys("vertexStage",((...e)=>(console.warn("TSL.VaryingNode: .vertexStage() has been renamed to .toVertexStage()."),Ga(...e))));const za=Ei((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return fa(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),$a=Ei((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return fa(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Wa="WorkingColorSpace",Ha="OutputColorSpace";class ja extends Gs{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===Wa?d.workingColorSpace:t===Ha?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 n=t;return!1!==d.enabled&&r!==s&&r&&s?(d.getTransfer(r)===c&&(n=ji(za(n.rgb),n.a)),d.getPrimaries(r)!==d.getPrimaries(s)&&(n=ji(Qi(d._getMatrix(new i,r,s)).mul(n.rgb),n.a)),d.getTransfer(s)===c&&(n=ji($a(n.rgb),n.a)),n):n}}const qa=e=>Ni(new ja(Ni(e),Wa,Ha)),Xa=e=>Ni(new ja(Ni(e),Ha,Wa)),Ka=(e,t)=>Ni(new ja(Ni(e),Wa,t)),Ya=(e,t)=>Ni(new ja(Ni(e),t,Wa));Ys("toOutputColorSpace",qa),Ys("toWorkingColorSpace",Xa),Ys("workingToColorSpace",Ka),Ys("colorSpaceToWorking",Ya);let Qa=class extends Vs{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 Za extends Ds{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=ws.OBJECT}setGroup(e){return this.group=e,this}element(e){return Ni(new Qa(this,Ni(e)))}setNodeType(e){const t=ln(null,e).getSelf();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;eNi(new Ja(e,t,r));class tu extends Gs{static get type(){return"ToneMappingNode"}constructor(e,t=su,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return gs(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===h)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=ji(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const ru=(e,t,r)=>Ni(new tu(e,Ni(t),Ni(r))),su=eu("toneMappingExposure","float");Ys("toneMapping",((e,t,r)=>ru(t,r,e)));class iu extends js{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=p,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(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=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,o=!0===r.isInterleavedBuffer?r:new g(r,i),a=new f(o,s,n);o.setUsage(this.usage),this.attribute=a,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=Ga(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}}const nu=(e,t=null,r=0,s=0)=>Ni(new iu(e,t,r,s)),ou=(e,t=null,r=0,s=0)=>nu(e,t,r,s).setUsage(m),au=(e,t=null,r=0,s=0)=>nu(e,t,r,s).setInstanced(!0),uu=(e,t=null,r=0,s=0)=>ou(e,t,r,s).setInstanced(!0);Ys("toAttribute",(e=>nu(e.value)));class lu extends Ds{static get type(){return"ComputeNode"}constructor(e,t,r=[64]){super("void"),this.isComputeNode=!0,this.computeNode=e,this.count=t,this.workgroupSize=r,this.dispatchCount=0,this.version=1,this.name="",this.updateBeforeType=ws.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}label(e){return this.name=e,this}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;eNi(new lu(Ni(e),t,r));Ys("compute",du);class cu extends Ds{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!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}}const hu=(e,t)=>Ni(new cu(Ni(e),t));Ys("cache",hu);class pu extends Ds{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 gu=Ri(pu);Ys("bypass",gu);class mu extends Ds{static get type(){return"RemapNode"}constructor(e,t,r,s=Pi(0),i=Pi(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 o=e.sub(t).div(r.sub(t));return!0===n&&(o=o.clamp()),o.mul(i.sub(s)).add(s)}}const fu=Ri(mu,null,null,{doClamp:!1}),yu=Ri(mu);Ys("remap",fu),Ys("remapClamp",yu);class xu extends Ds{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 bu=Ri(xu),Tu=e=>(e?wa(e,bu("discard")):bu("discard")).append();Ys("discard",Tu);class _u extends Gs{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||h,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||y;return r!==h&&(t=t.toneMapping(r)),s!==y&&s!==d.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const vu=(e,t=null,r=null)=>Ni(new _u(Ni(e),t,r));Ys("renderOutput",vu);class Nu extends Ds{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 Ga(this).build(e,r)}return console.warn(`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 Su=(e,t)=>Ni(new Nu(e,t)),Au=(e=0)=>Su("uv"+(e>0?e:""),"vec2");class Ru extends Ds{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 Cu=Ri(Ru);class Eu extends un{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=ws.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 wu=Ri(Eu);class Mu extends un{static get type(){return"TextureNode"}constructor(e,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.sampler=!0,this.updateMatrix=!1,this.updateType=ws.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=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===x?"uvec4":this.value.type===b?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Au(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=ln(this.value.matrix)),this._matrixUniform.mul(zi(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?ws.RENDER:ws.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Ii(Cu(this,this.levelNode).y).sub(t.y).sub(1))),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().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,o,a){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):a?e.generateTextureGrad(u,t,r,a,n):o?e.generateTextureCompare(u,t,r,o,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if("sampler"===t)return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:a,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=a?a.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);o=e.getPropertyName(y);const x=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${o} = ${x}`,this),n.snippet=x,n.propertyName=o}let a=o;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(a=Ya(bu(a,u),r.colorSpace).setup(e).build(e,u)),e.format(a,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){return console.warn("THREE.TextureNode: .uv() has been renamed. Use .sample() instead."),this.sample(e)}sample(e){const t=this.clone();return t.uvNode=Ni(e),t.referenceNode=this.getSelf(),Ni(t)}blur(e){const t=this.clone();return t.biasNode=Ni(e).mul(wu(t)),t.referenceNode=this.getSelf(),Ni(t)}level(e){const t=this.clone();return t.levelNode=Ni(e),t.referenceNode=this.getSelf(),Ni(t)}size(e){return Cu(this,e)}bias(e){const t=this.clone();return t.biasNode=Ni(e),t.referenceNode=this.getSelf(),Ni(t)}compare(e){const t=this.clone();return t.compareNode=Ni(e),t.referenceNode=this.getSelf(),Ni(t)}grad(e,t){const r=this.clone();return r.gradNode=[Ni(e),Ni(t)],r.referenceNode=this.getSelf(),Ni(r)}depth(e){const t=this.clone();return t.depthNode=Ni(e),t.referenceNode=this.getSelf(),Ni(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()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e}}const Bu=Ri(Mu),Fu=(...e)=>Bu(...e).setSampler(!1);class Uu extends un{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Pu=(e,t,r)=>Ni(new Uu(e,t,r));class Iu extends Vs{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 Lu extends Uu{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?vs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=ws.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;rNi(new Lu(e,t)),Vu=ln(0,"uint").setGroup(sn("cameraIndex")).toVarying("v_cameraIndex"),Ou=ln("float").label("cameraNear").setGroup(on).onRenderUpdate((({camera:e})=>e.near)),Gu=ln("float").label("cameraFar").setGroup(on).onRenderUpdate((({camera:e})=>e.far)),ku=Ei((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Du(r).setGroup(on).label("cameraProjectionMatrices").element(Vu).toVar("cameraProjectionMatrix")}else t=ln("mat4").label("cameraProjectionMatrix").setGroup(on).onRenderUpdate((({camera:e})=>e.projectionMatrix));return t})).once()(),zu=ln("mat4").label("cameraProjectionMatrixInverse").setGroup(on).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse)),$u=Ei((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Du(r).setGroup(on).label("cameraViewMatrices").element(Vu).toVar("cameraViewMatrix")}else t=ln("mat4").label("cameraViewMatrix").setGroup(on).onRenderUpdate((({camera:e})=>e.matrixWorldInverse));return t})).once()(),Wu=ln("mat4").label("cameraWorldMatrix").setGroup(on).onRenderUpdate((({camera:e})=>e.matrixWorld)),Hu=ln("mat3").label("cameraNormalMatrix").setGroup(on).onRenderUpdate((({camera:e})=>e.normalMatrix)),ju=ln(new r).label("cameraPosition").setGroup(on).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld)));class qu extends Ds{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=ws.OBJECT,this._uniformNode=new un(null)}getNodeType(){const e=this.scope;return e===qu.WORLD_MATRIX?"mat4":e===qu.POSITION||e===qu.VIEW_POSITION||e===qu.DIRECTION||e===qu.SCALE?"vec3":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===qu.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===qu.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===qu.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===qu.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===qu.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}}generate(e){const t=this.scope;return t===qu.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t!==qu.POSITION&&t!==qu.VIEW_POSITION&&t!==qu.DIRECTION&&t!==qu.SCALE||(this._uniformNode.nodeType="vec3"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}qu.WORLD_MATRIX="worldMatrix",qu.POSITION="position",qu.SCALE="scale",qu.VIEW_POSITION="viewPosition",qu.DIRECTION="direction";const Xu=Ri(qu,qu.DIRECTION),Ku=Ri(qu,qu.WORLD_MATRIX),Yu=Ri(qu,qu.POSITION),Qu=Ri(qu,qu.SCALE),Zu=Ri(qu,qu.VIEW_POSITION);class Ju extends qu{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const el=Ci(Ju,Ju.DIRECTION),tl=Ci(Ju,Ju.WORLD_MATRIX),rl=Ci(Ju,Ju.POSITION),sl=Ci(Ju,Ju.SCALE),il=Ci(Ju,Ju.VIEW_POSITION),nl=ln(new i).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),ol=ln(new n).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),al=Ei((e=>e.renderer.nodes.modelViewMatrix||ul)).once()().toVar("modelViewMatrix"),ul=$u.mul(tl),ll=Ei((e=>(e.context.isHighPrecisionModelViewMatrix=!0,ln("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highpModelViewMatrix"),dl=Ei((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return ln("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highpModelNormalViewMatrix"),cl=Su("position","vec3"),hl=cl.toVarying("positionLocal"),pl=cl.toVarying("positionPrevious"),gl=tl.mul(hl).xyz.toVarying("v_positionWorld").context({needsPositionReassign:!0}),ml=hl.transformDirection(tl).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection").context({needsPositionReassign:!0}),fl=Ei((e=>e.context.setupPositionView()),"vec3").once()().toVarying("v_positionView").context({needsPositionReassign:!0}),yl=fl.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class xl extends Ds{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===u&&r.side===T?"false":e.getFrontFacing()}}const bl=Ci(xl),Tl=Pi(bl).mul(2).sub(1),_l=Su("normal","vec3"),vl=Ei((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('TSL.NormalNode: Vertex attribute "normal" not found on geometry.'),zi(0,1,0)):_l),"vec3").once()().toVar("normalLocal"),Nl=fl.dFdx().cross(fl.dFdy()).normalize().toVar("normalFlat"),Sl=Ei((e=>{let t;return t=!0===e.material.flatShading?Nl:Ga(Ml(vl),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),Al=Ga(Sl.transformDirection($u),"v_normalWorld").normalize().toVar("normalWorld"),Rl=Ei((e=>e.context.setupNormal().context({getUV:null})),"vec3").once()().mul(Tl).toVar("transformedNormalView"),Cl=Rl.transformDirection($u).toVar("transformedNormalWorld"),El=Ei((e=>e.context.setupClearcoatNormal().context({getUV:null})),"vec3").once()().mul(Tl).toVar("transformedClearcoatNormalView"),wl=Ei((([e,t=tl])=>{const r=Qi(t),s=e.div(zi(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),Ml=Ei((([e],t)=>{const r=t.renderer.nodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=nl.mul(e);return $u.transformDirection(s)})),Bl=ln(0).onReference((({material:e})=>e)).onRenderUpdate((({material:e})=>e.refractionRatio)),Fl=yl.negate().reflect(Rl),Ul=yl.negate().refract(Rl,Bl),Pl=Fl.transformDirection($u).toVar("reflectVector"),Il=Ul.transformDirection($u).toVar("reflectVector");class Ll extends Mu{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===_?Pl:e.mapping===v?Il:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),zi(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==l&&r.isRenderTargetTexture?t:zi(t.x.negate(),t.yz)}generateUV(e,t){return t.build(e,"vec3")}}const Dl=Ri(Ll);class Vl extends Vs{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 Ol extends Ds{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=ws.OBJECT}element(e){return Ni(new Vl(this,Ni(e)))}setGroup(e){return this.group=e,this}label(e){return this.name=e,this}setNodeType(e){let t=null;t=null!==this.count?Pu(null,e,this.count):Array.isArray(this.getValueFromReference())?Du(null,e):"texture"===e?Bu(null):"cubeTexture"===e?Dl(null):ln(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.label(this.name),this.node=t.getSelf()}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;eNi(new Ol(e,t,r)),kl=(e,t,r,s)=>Ni(new Ol(e,t,s,r));class zl extends Ol{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 $l=(e,t,r=null)=>Ni(new zl(e,t,r)),Wl=Ei((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),Su("tangent","vec4"))))(),Hl=Wl.xyz.toVar("tangentLocal"),jl=al.mul(ji(Hl,0)).xyz.toVarying("v_tangentView").normalize().toVar("tangentView"),ql=jl.transformDirection($u).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Xl=jl.toVar("transformedTangentView"),Kl=Xl.transformDirection($u).normalize().toVar("transformedTangentWorld"),Yl=e=>e.mul(Wl.w).xyz,Ql=Ga(Yl(_l.cross(Wl)),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Zl=Ga(Yl(vl.cross(Hl)),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Jl=Ga(Yl(Sl.cross(jl)),"v_bitangentView").normalize().toVar("bitangentView"),ed=Ga(Yl(Al.cross(ql)),"v_bitangentWorld").normalize().toVar("bitangentWorld"),td=Yl(Rl.cross(Xl)).normalize().toVar("transformedBitangentView"),rd=td.transformDirection($u).normalize().toVar("transformedBitangentWorld"),sd=Qi(jl,Jl,Sl),id=yl.mul(sd),nd=(()=>{let e=Cn.cross(yl);return e=e.cross(Cn).normalize(),e=fa(e,Rl,An.mul(mn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),od=Ei((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),o=t.dFdy(),a=i.dFdx(),u=i.dFdy(),l=r,d=o.cross(l),c=l.cross(n),h=d.mul(a.x).add(c.mul(u.x)),p=d.mul(a.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=Tl.mul(g.inverseSqrt());return jn(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class ad extends Gs{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=N}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=zi(s.xy.mul(r),s.z));let i=null;if(t===S)i=Ml(s);else if(t===N){i=!0===e.hasGeometryAttribute("tangent")?sd.mul(s).normalize():od({eye_pos:fl,surf_norm:Sl,mapN:s,uv:Au()})}return i}}const ud=Ri(ad),ld=Ei((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||Au()),forceUVContext:!0}),s=Pi(r((e=>e)));return Vi(Pi(r((e=>e.add(e.dFdx())))).sub(s),Pi(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),dd=Ei((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,o=t.dFdy().normalize().cross(n),a=n.cross(i),u=i.dot(o).mul(Tl),l=u.sign().mul(s.x.mul(o).add(s.y.mul(a)));return u.abs().mul(r).sub(l).normalize()}));class cd extends Gs{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=ld({textureNode:this.textureNode,bumpScale:e});return dd({surf_pos:fl,surf_norm:Sl,dHdxy:t})}}const hd=Ri(cd),pd=new Map;class gd extends Ds{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=pd.get(e);return void 0===r&&(r=$l(e,t),pd.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===gd.COLOR){const e=void 0!==t.color?this.getColor(r):zi();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===gd.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===gd.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:Pi(1);else if(r===gd.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===gd.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===gd.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===gd.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===gd.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===gd.NORMAL)t.normalMap?(s=ud(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?hd(this.getTexture("bump").r,this.getFloat("bumpScale")):Sl;else if(r===gd.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===gd.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===gd.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?ud(this.getTexture(r),this.getCache(r+"Scale","vec2")):Sl;else if(r===gd.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===gd.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===gd.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Yi(Zd.x,Zd.y,Zd.y.negate(),Zd.x).mul(e.rg.mul(2).sub(Vi(1)).normalize().mul(e.b))}else s=Zd;else if(r===gd.IRIDESCENCE_THICKNESS){const e=Gl("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=Gl("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===gd.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===gd.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===gd.IOR)s=this.getFloat(r);else if(r===gd.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===gd.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}gd.ALPHA_TEST="alphaTest",gd.COLOR="color",gd.OPACITY="opacity",gd.SHININESS="shininess",gd.SPECULAR="specular",gd.SPECULAR_STRENGTH="specularStrength",gd.SPECULAR_INTENSITY="specularIntensity",gd.SPECULAR_COLOR="specularColor",gd.REFLECTIVITY="reflectivity",gd.ROUGHNESS="roughness",gd.METALNESS="metalness",gd.NORMAL="normal",gd.CLEARCOAT="clearcoat",gd.CLEARCOAT_ROUGHNESS="clearcoatRoughness",gd.CLEARCOAT_NORMAL="clearcoatNormal",gd.EMISSIVE="emissive",gd.ROTATION="rotation",gd.SHEEN="sheen",gd.SHEEN_ROUGHNESS="sheenRoughness",gd.ANISOTROPY="anisotropy",gd.IRIDESCENCE="iridescence",gd.IRIDESCENCE_IOR="iridescenceIOR",gd.IRIDESCENCE_THICKNESS="iridescenceThickness",gd.IOR="ior",gd.TRANSMISSION="transmission",gd.THICKNESS="thickness",gd.ATTENUATION_DISTANCE="attenuationDistance",gd.ATTENUATION_COLOR="attenuationColor",gd.LINE_SCALE="scale",gd.LINE_DASH_SIZE="dashSize",gd.LINE_GAP_SIZE="gapSize",gd.LINE_WIDTH="linewidth",gd.LINE_DASH_OFFSET="dashOffset",gd.POINT_SIZE="size",gd.DISPERSION="dispersion",gd.LIGHT_MAP="light",gd.AO="ao";const md=Ci(gd,gd.ALPHA_TEST),fd=Ci(gd,gd.COLOR),yd=Ci(gd,gd.SHININESS),xd=Ci(gd,gd.EMISSIVE),bd=Ci(gd,gd.OPACITY),Td=Ci(gd,gd.SPECULAR),_d=Ci(gd,gd.SPECULAR_INTENSITY),vd=Ci(gd,gd.SPECULAR_COLOR),Nd=Ci(gd,gd.SPECULAR_STRENGTH),Sd=Ci(gd,gd.REFLECTIVITY),Ad=Ci(gd,gd.ROUGHNESS),Rd=Ci(gd,gd.METALNESS),Cd=Ci(gd,gd.NORMAL),Ed=Ci(gd,gd.CLEARCOAT),wd=Ci(gd,gd.CLEARCOAT_ROUGHNESS),Md=Ci(gd,gd.CLEARCOAT_NORMAL),Bd=Ci(gd,gd.ROTATION),Fd=Ci(gd,gd.SHEEN),Ud=Ci(gd,gd.SHEEN_ROUGHNESS),Pd=Ci(gd,gd.ANISOTROPY),Id=Ci(gd,gd.IRIDESCENCE),Ld=Ci(gd,gd.IRIDESCENCE_IOR),Dd=Ci(gd,gd.IRIDESCENCE_THICKNESS),Vd=Ci(gd,gd.TRANSMISSION),Od=Ci(gd,gd.THICKNESS),Gd=Ci(gd,gd.IOR),kd=Ci(gd,gd.ATTENUATION_DISTANCE),zd=Ci(gd,gd.ATTENUATION_COLOR),$d=Ci(gd,gd.LINE_SCALE),Wd=Ci(gd,gd.LINE_DASH_SIZE),Hd=Ci(gd,gd.LINE_GAP_SIZE),jd=Ci(gd,gd.LINE_WIDTH),qd=Ci(gd,gd.LINE_DASH_OFFSET),Xd=Ci(gd,gd.POINT_SIZE),Kd=Ci(gd,gd.DISPERSION),Yd=Ci(gd,gd.LIGHT_MAP),Qd=Ci(gd,gd.AO),Zd=ln(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))})),Jd=Ei((e=>e.context.setupModelViewProjection()),"vec4").once()().toVarying("v_modelViewProjection");class ec extends Ds{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===ec.VERTEX)s=e.getVertexIndex();else if(r===ec.INSTANCE)s=e.getInstanceIndex();else if(r===ec.DRAW)s=e.getDrawIndex();else if(r===ec.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===ec.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==ec.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Ga(this).build(e,t)}return i}}ec.VERTEX="vertex",ec.INSTANCE="instance",ec.SUBGROUP="subgroup",ec.INVOCATION_LOCAL="invocationLocal",ec.INVOCATION_SUBGROUP="invocationSubgroup",ec.DRAW="draw";const tc=Ci(ec,ec.VERTEX),rc=Ci(ec,ec.INSTANCE),sc=Ci(ec,ec.SUBGROUP),ic=Ci(ec,ec.INVOCATION_SUBGROUP),nc=Ci(ec,ec.INVOCATION_LOCAL),oc=Ci(ec,ec.DRAW);class ac extends Ds{static get type(){return"InstanceNode"}constructor(e,t,r){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=ws.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=Pu(r.array,"mat4",Math.max(t,1)).element(rc);else{const e=new A(r.array,16,1);this.buffer=e;const t=r.usage===m?uu:au,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=Zi(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new R(s.array,3),t=s.usage===m?uu:au;this.bufferColor=e,n=zi(t(e,"vec3",3,0)),this.instanceColorNode=n}const o=i.mul(hl).xyz;if(hl.assign(o),e.hasGeometryAttribute("normal")){const e=wl(vl,i);vl.assign(e)}null!==this.instanceColorNode&&hn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==m&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==m&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const uc=Ri(ac);class lc extends ac{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const dc=Ri(lc);class cc extends Ds{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=rc:this.batchingIdNode=oc);const t=Ei((([e])=>{const t=Cu(Fu(this.batchMesh._indirectTexture),0),r=Ii(e).modInt(Ii(t)),s=Ii(e).div(Ii(t));return Fu(this.batchMesh._indirectTexture,Oi(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Ii(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=Cu(Fu(s),0),n=Pi(r).mul(4).toInt().toVar(),o=n.modInt(i),a=n.div(Ii(i)),u=Zi(Fu(s,Oi(o,a)),Fu(s,Oi(o.add(1),a)),Fu(s,Oi(o.add(2),a)),Fu(s,Oi(o.add(3),a))),l=this.batchMesh._colorsTexture;if(null!==l){const e=Ei((([e])=>{const t=Cu(Fu(l),0).x,r=e,s=r.modInt(t),i=r.div(t);return Fu(l,Oi(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);hn("vec3","vBatchColor").assign(t)}const d=Qi(u);hl.assign(u.mul(hl));const c=vl.div(zi(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;vl.assign(h),e.hasGeometryAttribute("tangent")&&Hl.mulAssign(d)}}const hc=Ri(cc),pc=new WeakMap;class gc extends Ds{static get type(){return"SkinningNode"}constructor(e,t=!1){let r,s,i;super("void"),this.skinnedMesh=e,this.useReference=t,this.updateType=ws.OBJECT,this.skinIndexNode=Su("skinIndex","uvec4"),this.skinWeightNode=Su("skinWeight","vec4"),t?(r=Gl("bindMatrix","mat4"),s=Gl("bindMatrixInverse","mat4"),i=kl("skeleton.boneMatrices","mat4",e.skeleton.bones.length)):(r=ln(e.bindMatrix,"mat4"),s=ln(e.bindMatrixInverse,"mat4"),i=Pu(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length)),this.bindMatrixNode=r,this.bindMatrixInverseNode=s,this.boneMatricesNode=i,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=hl){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=jn(o.mul(s.x).mul(d),a.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=vl){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=jn(s.x.mul(o),s.y.mul(a),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=kl("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,pl)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===Ss(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&pl.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(hl.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();vl.assign(t),e.hasGeometryAttribute("tangent")&&Hl.assign(t)}}generate(e,t){if("void"!==t)return hl.build(e,t)}update(e){const t=(this.useReference?e.object:this.skinnedMesh).skeleton;pc.get(t)!==e.frameId&&(pc.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const mc=e=>Ni(new gc(e,!0));class fc extends Ds{static get type(){return"LoopNode"}constructor(e=[]){super(),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(n)?">=":"<"));const d={start:i,end:n,condition:u},c=d.start,h=d.end;let p="",g="",m="";l||(l="int"===a||"uint"===a?u.includes("<")?"++":"--":u.includes("<")?"+= 1.":"-= 1."),p+=e.getVar(a,o)+" = "+c,g+=o+" "+u+" "+h,m+=o+" "+l;const f=`for ( ${p}; ${g}; ${m} )`;e.addFlowCode((0===t?"\n":"")+e.tab+f+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tNi(new fc(Ai(e,"int"))).append(),xc=()=>bu("break").append(),bc=new WeakMap,Tc=new s,_c=Ei((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const o=Ii(tc).mul(r).add(n),a=o.div(s),u=o.sub(a.mul(s));return Fu(e,Oi(u,a)).depth(i).mul(t)}));class vc extends Ds{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=ln(1),this.updateType=ws.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,o=void 0!==n?n.length:0,{texture:a,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,o=void 0!==n?n.length:0;let a=bc.get(e);if(void 0===a||a.count!==o){void 0!==a&&a.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*o),f=new C(m,h,p,o);f.type=E,f.needsUpdate=!0;const y=4*c;for(let b=0;b{const t=Pi(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Fu(this.mesh.morphTexture,Oi(Ii(e).add(1),Ii(rc))).r):t.assign(Gl("morphTargetInfluences","float").element(e).toVar()),!0===s&&hl.addAssign(_c({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Ii(0)})),!0===i&&vl.addAssign(_c({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Ii(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 Nc=Ri(vc);class Sc extends Ds{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Ac extends Sc{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class Rc extends Ba{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:zi().toVar("directDiffuse"),directSpecular:zi().toVar("directSpecular"),indirectDiffuse:zi().toVar("indirectDiffuse"),indirectSpecular:zi().toVar("indirectSpecular")};return{radiance:zi().toVar("radiance"),irradiance:zi().toVar("irradiance"),iblIrradiance:zi().toVar("iblIrradiance"),ambientOcclusion:Pi(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 Cc=Ri(Rc);class Ec extends Sc{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let wc,Mc;class Bc extends Ds{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===Bc.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=ws.NONE;return this.scope!==Bc.SIZE&&this.scope!==Bc.VIEWPORT||(e=ws.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Bc.VIEWPORT?null!==t?Mc.copy(t.viewport):(e.getViewport(Mc),Mc.multiplyScalar(e.getPixelRatio())):null!==t?(wc.width=t.width,wc.height=t.height):e.getDrawingBufferSize(wc)}setup(){const e=this.scope;let r=null;return r=e===Bc.SIZE?ln(wc||(wc=new t)):e===Bc.VIEWPORT?ln(Mc||(Mc=new s)):Vi(Pc.div(Uc)),r}generate(e){if(this.scope===Bc.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Uc).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Bc.COORDINATE="coordinate",Bc.VIEWPORT="viewport",Bc.SIZE="size",Bc.UV="uv";const Fc=Ci(Bc,Bc.UV),Uc=Ci(Bc,Bc.SIZE),Pc=Ci(Bc,Bc.COORDINATE),Ic=Ci(Bc,Bc.VIEWPORT),Lc=Ic.zw,Dc=Pc.sub(Ic.xy),Vc=Dc.div(Lc),Oc=Ei((()=>(console.warn('TSL.ViewportNode: "viewportResolution" is deprecated. Use "screenSize" instead.'),Uc)),"vec2").once()(),Gc=Ei((()=>(console.warn('TSL.ViewportNode: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),Fc)),"vec2").once()(),kc=Ei((()=>(console.warn('TSL.ViewportNode: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),Fc.flipY())),"vec2").once()(),zc=new t;class $c extends Mu{static get type(){return"ViewportTextureNode"}constructor(e=Fc,t=null,r=null){null===r&&((r=new w).minFilter=M),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=ws.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(zc);const r=this.value;r.image.width===zc.width&&r.image.height===zc.height||(r.image.width=zc.width,r.image.height=zc.height,r.needsUpdate=!0);const s=r.generateMipmaps;r.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(r),r.generateMipmaps=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const Wc=Ri($c),Hc=Ri($c,null,null,{generateMipmaps:!0});let jc=null;class qc extends $c{static get type(){return"ViewportDepthTextureNode"}constructor(e=Fc,t=null){null===jc&&(jc=new B),super(e,t,jc)}}const Xc=Ri(qc);class Kc extends Ds{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===Kc.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Kc.DEPTH_BASE)null!==r&&(s=eh().assign(r));else if(t===Kc.DEPTH)s=e.isPerspectiveCamera?Qc(fl.z,Ou,Gu):Yc(fl.z,Ou,Gu);else if(t===Kc.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Zc(r,Ou,Gu);s=Yc(e,Ou,Gu)}else s=r;else s=Yc(fl.z,Ou,Gu);return s}}Kc.DEPTH_BASE="depthBase",Kc.DEPTH="depth",Kc.LINEAR_DEPTH="linearDepth";const Yc=(e,t,r)=>e.add(t).div(t.sub(r)),Qc=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Zc=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Jc=(e,t,r)=>{t=t.max(1e-6).toVar();const s=Co(e.negate().div(t)),i=Co(r.div(t));return s.div(i)},eh=Ri(Kc,Kc.DEPTH_BASE),th=Ci(Kc,Kc.DEPTH),rh=Ri(Kc,Kc.LINEAR_DEPTH),sh=rh(Xc());th.assign=e=>eh(e);const ih=Ri(class extends Ds{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}});class nh extends Ds{static get type(){return"ClippingNode"}constructor(e=nh.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===nh.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===nh.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return Ei((()=>{const r=Pi().toVar("distanceToPlane"),s=Pi().toVar("distanceToGradient"),i=Pi(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Du(t);yc(n,(({i:t})=>{const n=e.element(t);r.assign(fl.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(Ta(s.negate(),s,r))}))}const o=e.length;if(o>0){const t=Du(e),n=Pi(1).toVar("intersectionClipOpacity");yc(o,(({i:e})=>{const i=t.element(e);r.assign(fl.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(Ta(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}pn.a.mulAssign(i),pn.a.equal(0).discard()}))()}setupDefault(e,t){return Ei((()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Du(t);yc(r,(({i:t})=>{const r=e.element(t);fl.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=Du(e),r=Di(!0).toVar("clipped");yc(s,(({i:e})=>{const s=t.element(e);r.assign(fl.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),Ei((()=>{const s=Du(e),i=ih(t.getClipDistance());yc(r,(({i:e})=>{const t=s.element(e),r=fl.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}nh.ALPHA_TO_COVERAGE="alphaToCoverage",nh.DEFAULT="default",nh.HARDWARE="hardware";const oh=Ei((([e])=>Uo(Xn(1e4,Po(Xn(17,e.x).add(Xn(.1,e.y)))).mul(jn(.1,Go(Po(Xn(13,e.y).add(e.x)))))))),ah=Ei((([e])=>oh(Vi(oh(e.xy),e.z)))),uh=Ei((([e])=>{const t=ta(zo(Ho(e.xyz)),zo(jo(e.xyz))),r=Pi(1).div(Pi(.05).mul(t)).toVar("pixScale"),s=Vi(Ao(Mo(Co(r))),Ao(Bo(Co(r)))),i=Vi(ah(Mo(s.x.mul(e.xyz))),ah(Mo(s.y.mul(e.xyz)))),n=Uo(Co(r)),o=jn(Xn(n.oneMinus(),i.x),Xn(n,i.y)),a=ea(n,n.oneMinus()),u=zi(o.mul(o).div(Xn(2,a).mul(qn(1,a))),o.sub(Xn(.5,a)).div(qn(1,a)),qn(1,qn(1,o).mul(qn(1,o)).div(Xn(2,a).mul(qn(1,a))))),l=o.lessThan(a.oneMinus()).select(o.lessThan(a).select(u.x,u.y),u.z);return ya(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class lh extends F{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.positionNode=null,this.geometryNode=null,this.depthNode=null,this.shadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null}customProgramCacheKey(){return this.type+ms(this)}build(e){this.setup(e)}setupObserver(e){return new ds(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=this.vertexNode||this.setupVertex(e);let i;e.stack.outputNode=s,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const n=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!==n&&e.stack.add(n);const o=ji(s,pn.a).max(0);if(i=this.setupOutput(e,o),Bn.assign(i),null!==this.outputNode&&(i=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(i=e,null!==r&&(i=e.merge(r))):null!==r&&(i=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=ji(t)),i=this.setupOutput(e,t)}e.stack.outputNode=i,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.samples;this.alphaToCoverage&&t>1?s=Ni(new nh(nh.ALPHA_TO_COVERAGE)):e.stack.add(Ni(new nh))}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.add(Ni(new nh(nh.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?Jc(fl.z,Ou,Gu):Yc(fl.z,Ou,Gu))}null!==s&&th.assign(s).append()}setupPositionView(){return al.mul(hl).xyz}setupModelViewProjection(){return ku.mul(fl)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),Jd}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&Nc(t).append(),!0===t.isSkinnedMesh&&mc(t).append(),this.displacementMap){const e=$l("displacementMap","texture"),t=$l("displacementScale","float"),r=$l("displacementBias","float");hl.addAssign(vl.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&hc(t).append(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&dc(t).append(),null!==this.positionNode&&hl.assign(this.positionNode.context({isPositionNodeInput:!0})),hl}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?ji(this.colorNode):fd;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=ji(r.xyz.mul(Su("color","vec3")),r.a)),e.instanceColor){r=hn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=hn("vec3","vBatchColor").mul(r)}pn.assign(r);const s=this.opacityNode?Pi(this.opacityNode):bd;if(pn.a.assign(pn.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?Pi(this.alphaTestNode):md;pn.a.lessThanEqual(e).discard()}!0===this.alphaHash&&pn.a.lessThan(uh(hl)).discard(),!1===this.transparent&&this.blending===U&&!1===this.alphaToCoverage&&pn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?zi(0):pn.rgb}setupNormal(){return this.normalNode?zi(this.normalNode):Cd}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?$l("envMap","cubeTexture"):$l("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Ec(Yd)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:Qd;t.push(new Ac(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}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 o=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e);o=Cc(n,t,r,s)}else null!==r&&(o=zi(null!==s?fa(o,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(gn.assign(zi(i||xd)),o=o.add(gn)),o}setupOutput(e,t){if(!0===this.fog){const r=e.fogNode;r&&(Bn.assign(t),t=ji(r))}return 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=F.prototype.toJSON.call(this,e),s=fs(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,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.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.shadowPositionNode=e.shadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const dh=new P;class ch extends lh{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(dh),this.setValues(e)}}const hh=new I;class ph extends lh{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(hh),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?Pi(this.offsetNode):qd,t=this.dashScaleNode?Pi(this.dashScaleNode):$d,r=this.dashSizeNode?Pi(this.dashSizeNode):Wd,s=this.gapSizeNode?Pi(this.gapSizeNode):Hd;Fn.assign(r),Un.assign(s);const i=Ga(Su("lineDistance").mul(t));(e?i.add(e):i).mod(Fn.add(Un)).greaterThan(Fn).discard()}}let gh=null;class mh extends $c{static get type(){return"ViewportSharedTextureNode"}constructor(e=Fc,t=null){null===gh&&(gh=new w),super(e,t,gh)}updateReference(){return this}}const fh=Ri(mh),yh=new I;class xh extends lh{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(yh),this.useColor=e.vertexColors,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=L,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,o=Ei((({start:e,end:t})=>{const r=ku.element(2).element(2),s=ku.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return ji(fa(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=Ei((()=>{const e=Su("instanceStart"),t=Su("instanceEnd"),r=ji(al.mul(ji(e,1))).toVar("start"),s=ji(al.mul(ji(t,1))).toVar("end");if(i){const e=this.dashScaleNode?Pi(this.dashScaleNode):$d,t=this.offsetNode?Pi(this.offsetNode):qd,r=Su("instanceDistanceStart"),s=Su("instanceDistanceEnd");let i=cl.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),hn("float","lineDistance").assign(i)}n&&(hn("vec3","worldStart").assign(r.xyz),hn("vec3","worldEnd").assign(s.xyz));const a=Ic.z.div(Ic.w),u=ku.element(2).element(3).equal(-1);Bi(u,(()=>{Bi(r.z.lessThan(0).and(s.z.greaterThan(0)),(()=>{s.assign(o({start:r,end:s}))})).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(o({start:s,end:r}))}))}));const l=ku.mul(r),d=ku.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(a)),p.assign(p.normalize());const g=ji().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=fa(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),o=e.cross(n),a=hn("vec4","worldPos");a.assign(cl.y.lessThan(.5).select(r,s));const u=jd.mul(.5);a.addAssign(ji(cl.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(a.addAssign(ji(cl.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),a.addAssign(ji(o.mul(u),0)),Bi(cl.y.greaterThan(1).or(cl.y.lessThan(0)),(()=>{a.subAssign(ji(o.mul(2).mul(u),0))}))),g.assign(ku.mul(a));const l=zi().toVar();l.assign(cl.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Vi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(a)),e.x.assign(e.x.div(a)),e.assign(cl.x.lessThan(0).select(e.negate(),e)),Bi(cl.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(cl.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(jd)),e.assign(e.div(Ic.w)),g.assign(cl.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(ji(e,0,0)))}return g}))();const a=Ei((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),o=t.sub(e),a=i.dot(n),u=n.dot(o),l=i.dot(o),d=n.dot(n),c=o.dot(o).mul(d).sub(u.mul(u)),h=a.mul(u).sub(l.mul(d)).div(c).clamp(),p=a.add(u.mul(h)).div(d).clamp();return Vi(h,p)}));if(this.colorNode=Ei((()=>{const e=Au();if(i){const t=this.dashSizeNode?Pi(this.dashSizeNode):Wd,r=this.gapSizeNode?Pi(this.gapSizeNode):Hd;Fn.assign(t),Un.assign(r);const s=hn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(Fn.add(Un)).greaterThan(Fn).discard()}const o=Pi(1).toVar("alpha");if(n){const e=hn("vec3","worldStart"),s=hn("vec3","worldEnd"),n=hn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=a({p1:e,p2:s,p3:zi(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(jd);if(!i)if(r&&t.samples>1){const e=h.fwidth();o.assign(Ta(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){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=Pi(s.fwidth()).toVar("dlen");Bi(e.y.abs().greaterThan(1),(()=>{o.assign(Ta(i.oneMinus(),i.add(1),s).oneMinus())}))}else Bi(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=Su("instanceColorStart"),t=Su("instanceColorEnd");u=cl.y.lessThan(.5).select(e,t).mul(fd)}else u=fd;return ji(u,o)}))(),this.transparent){const e=this.opacityNode?Pi(this.opacityNode):bd;this.outputNode=ji(this.colorNode.rgb.mul(e).add(fh().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 bh=e=>Ni(e).mul(.5).add(.5),Th=new D;class _h extends lh{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Th),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?Pi(this.opacityNode):bd;pn.assign(ji(bh(Rl),e))}}class vh extends Gs{static get type(){return"EquirectUVNode"}constructor(e=ml){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,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 Vi(t,r)}}const Nh=Ri(vh);class Sh extends V{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 O(5,5,5),n=Nh(ml),o=new lh;o.colorNode=Bu(t,n,0),o.side=T,o.blending=L;const a=new G(i,o),u=new k;u.add(a),t.minFilter===M&&(t.minFilter=z);const l=new $(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,a.geometry.dispose(),a.material.dispose(),this}}const Ah=new WeakMap;class Rh extends Gs{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=Dl();const t=new W;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=ws.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===H||r===j){if(Ah.has(e)){const t=Ah.get(e);Eh(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Sh(r.height);s.fromEquirectangularTexture(t,e),Eh(s.texture,e.mapping),this._cubeTexture=s.texture,Ah.set(e,s.texture),e.addEventListener("dispose",Ch)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function Ch(e){const t=e.target;t.removeEventListener("dispose",Ch);const r=Ah.get(t);void 0!==r&&(Ah.delete(t),r.dispose())}function Eh(e,t){t===H?e.mapping=_:t===j&&(e.mapping=v)}const wh=Ri(Rh);class Mh extends Sc{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=wh(this.envNode)}}class Bh extends Sc{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=Pi(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class Fh{start(){}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class Uh extends Fh{constructor(){super()}indirect(e,t,r){const s=e.ambientOcclusion,i=e.reflectedLight,n=r.context.irradianceLightMap;i.indirectDiffuse.assign(ji(0)),n?i.indirectDiffuse.addAssign(n):i.indirectDiffuse.addAssign(ji(1,1,1,0)),i.indirectDiffuse.mulAssign(s),i.indirectDiffuse.mulAssign(pn.rgb)}finish(e,t,r){const s=r.material,i=e.outgoingLight,n=r.context.environment;if(n)switch(s.combine){case K:i.rgb.assign(fa(i.rgb,i.rgb.mul(n.rgb),Nd.mul(Sd)));break;case X:i.rgb.assign(fa(i.rgb,n.rgb,Nd.mul(Sd)));break;case q:i.rgb.addAssign(n.rgb.mul(Nd.mul(Sd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",s.combine)}}}const Ph=new Y;class Ih extends lh{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Ph),this.setValues(e)}setupNormal(){return Sl}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Mh(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Bh(Yd)),t}setupOutgoingLight(){return pn.rgb}setupLightingModel(){return new Uh}}const Lh=Ei((({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))})),Dh=Ei((e=>e.diffuseColor.mul(1/Math.PI))),Vh=Ei((({dotNH:e})=>Mn.mul(Pi(.5)).add(1).mul(Pi(1/Math.PI)).mul(e.pow(Mn)))),Oh=Ei((({lightDirection:e})=>{const t=e.add(yl).normalize(),r=Rl.dot(t).clamp(),s=yl.dot(t).clamp(),i=Lh({f0:En,f90:1,dotVH:s}),n=Pi(.25),o=Vh({dotNH:r});return i.mul(n).mul(o)}));class Gh extends Uh{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Rl.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Dh({diffuseColor:pn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(Oh({lightDirection:e})).mul(Nd))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Dh({diffuseColor:pn}))),r.indirectDiffuse.mulAssign(e)}}const kh=new Q;class zh extends lh{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(kh),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Mh(t):null}setupLightingModel(){return new Gh(!1)}}const $h=new Z;class Wh extends lh{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues($h),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Mh(t):null}setupLightingModel(){return new Gh}setupVariants(){const e=(this.shininessNode?Pi(this.shininessNode):yd).max(1e-4);Mn.assign(e);const t=this.specularNode||Td;En.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Hh=Ei((e=>{if(!1===e.geometry.hasAttribute("normal"))return Pi(0);const t=Sl.dFdx().abs().max(Sl.dFdy().abs());return t.x.max(t.y).max(t.z)})),jh=Ei((e=>{const{roughness:t}=e,r=Hh();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),qh=Ei((({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 Kn(.5,i.add(n).max(fo))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Xh=Ei((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:o,dotNL:a})=>{const u=a.mul(zi(e.mul(r),t.mul(s),o).length()),l=o.mul(zi(e.mul(i),t.mul(n),a).length());return Kn(.5,u.add(l)).saturate()})).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"}]}),Kh=Ei((({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"}]}),Yh=Pi(1/Math.PI),Qh=Ei((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),o=zi(t.mul(s),e.mul(i),n.mul(r)),a=o.dot(o),u=n.div(a);return Yh.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"}]}),Zh=Ei((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:o,USE_ANISOTROPY:a}=e,u=e.normalView||Rl,l=i.pow2(),d=t.add(yl).normalize(),c=u.dot(t).clamp(),h=u.dot(yl).clamp(),p=u.dot(d).clamp(),g=yl.dot(d).clamp();let m,f,y=Lh({f0:r,f90:s,dotVH:g});if(Ti(o)&&(y=_n.mix(y,n)),Ti(a)){const e=Rn.dot(t),r=Rn.dot(yl),s=Rn.dot(d),i=Cn.dot(t),n=Cn.dot(yl),o=Cn.dot(d);m=Xh({alphaT:Sn,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=Qh({alphaT:Sn,alphaB:l,dotNH:p,dotTH:s,dotBH:o})}else m=qh({alpha:l,dotNL:c,dotNV:h}),f=Kh({alpha:l,dotNH:p});return y.mul(m).mul(f)})),Jh=Ei((({roughness:e,dotNV:t})=>{const r=ji(-1,-.0275,-.572,.022),s=ji(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return Vi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),ep=Ei((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Jh({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),tp=Ei((({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(zi(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"}]}),rp=Ei((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=Pi(1).div(r),i=t.pow2().oneMinus().max(.0078125);return Pi(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"}]}),sp=Ei((({dotNV:e,dotNL:t})=>Pi(1).div(Pi(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),ip=Ei((({lightDirection:e})=>{const t=e.add(yl).normalize(),r=Rl.dot(e).clamp(),s=Rl.dot(yl).clamp(),i=Rl.dot(t).clamp(),n=rp({roughness:Tn,dotNH:i}),o=sp({dotNV:s,dotNL:r});return bn.mul(n).mul(o)})),np=Ei((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Vi(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"}]}),op=Ei((({f:e})=>{const t=e.length();return ta(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),ap=Ei((({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(),o=i.div(n),a=r.greaterThan(0).select(o,ta(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(o));return e.cross(t).mul(a)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),up=Ei((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:o,p3:a})=>{const u=n.sub(i).toVar(),l=a.sub(i).toVar(),d=u.cross(l),c=zi().toVar();return Bi(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(Qi(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(o.sub(r)).normalize().toVar(),m=d.mul(a.sub(r)).normalize().toVar(),f=zi(0).toVar();f.addAssign(ap({v1:h,v2:p})),f.addAssign(ap({v1:p,v2:g})),f.addAssign(ap({v1:g,v2:m})),f.addAssign(ap({v1:m,v2:h})),c.assign(zi(op({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"}]}),lp=1/6,dp=e=>Xn(lp,Xn(e,Xn(e,e.negate().add(3)).sub(3)).add(1)),cp=e=>Xn(lp,Xn(e,Xn(e,Xn(3,e).sub(6))).add(4)),hp=e=>Xn(lp,Xn(e,Xn(e,Xn(-3,e).add(3)).add(3)).add(1)),pp=e=>Xn(lp,la(e,3)),gp=e=>dp(e).add(cp(e)),mp=e=>hp(e).add(pp(e)),fp=e=>jn(-1,cp(e).div(dp(e).add(cp(e)))),yp=e=>jn(1,pp(e).div(hp(e).add(pp(e)))),xp=(e,t,r)=>{const s=e.uvNode,i=Xn(s,t.zw).add(.5),n=Mo(i),o=Uo(i),a=gp(o.x),u=mp(o.x),l=fp(o.x),d=yp(o.x),c=fp(o.y),h=yp(o.y),p=Vi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Vi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Vi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Vi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=gp(o.y).mul(jn(a.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),x=mp(o.y).mul(jn(a.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(x)},bp=Ei((([e,t=Pi(3)])=>{const r=Vi(e.size(Ii(t))),s=Vi(e.size(Ii(t.add(1)))),i=Kn(1,r),n=Kn(1,s),o=xp(e,ji(i,r),Mo(t)),a=xp(e,ji(n,s),Bo(t));return Uo(t).mix(o,a)})),Tp=Ei((([e,t,r,s,i])=>{const n=zi(ba(t.negate(),Fo(e),Kn(1,s))),o=zi(zo(i[0].xyz),zo(i[1].xyz),zo(i[2].xyz));return Fo(n).mul(r.mul(o))})).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"}]}),_p=Ei((([e,t])=>e.mul(ya(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),vp=Hc(),Np=Hc(),Sp=Ei((([e,t,r],{material:s})=>{const i=(s.side===T?vp:Np).sample(e),n=Co(Uc.x).mul(_p(t,r));return bp(i,n)})),Ap=Ei((([e,t,r])=>(Bi(r.notEqual(0),(()=>{const s=Ro(t).negate().div(r);return So(s.negate().mul(e))})),zi(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),Rp=Ei((([e,t,r,s,i,n,o,a,u,l,d,c,h,p,g])=>{let m,f;if(g){m=ji().toVar(),f=zi().toVar();const i=d.sub(1).mul(g.mul(.025)),n=zi(d.sub(i),d,d.add(i));yc({start:0,end:3},(({i:i})=>{const d=n.element(i),g=Tp(e,t,c,d,a),y=o.add(g),x=l.mul(u.mul(ji(y,1))),b=Vi(x.xy.div(x.w)).toVar();b.addAssign(1),b.divAssign(2),b.assign(Vi(b.x,b.y.oneMinus()));const T=Sp(b,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Ap(zo(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=Tp(e,t,c,d,a),n=o.add(i),g=l.mul(u.mul(ji(n,1))),y=Vi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Vi(y.x,y.y.oneMinus())),m=Sp(y,r,d),f=s.mul(Ap(zo(i),h,p))}const y=f.rgb.mul(m.rgb),x=e.dot(t).clamp(),b=zi(ep({dotNV:x,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return ji(b.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),Cp=Qi(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Ep=(e,t)=>e.sub(t).div(e.add(t)).pow2(),wp=Ei((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=fa(e,t,Ta(0,.03,s)),o=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();Bi(o.lessThan(0),(()=>zi(1)));const a=o.sqrt(),u=Ep(n,e),l=Lh({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=Pi(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return zi(1).add(t).div(zi(1).sub(t))})(i.clamp(0,.9999)),g=Ep(p,n.toVec3()),m=Lh({f0:g,f90:1,dotVH:a}),f=zi(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,a,2),x=zi(h).add(f),b=l.mul(m).clamp(1e-5,.9999),T=b.sqrt(),_=d.pow2().mul(m).div(zi(1).sub(b)),v=l.add(_).toVar(),N=_.sub(d).toVar();return yc({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=zi(54856e-17,44201e-17,52481e-17),i=zi(1681e3,1795300,2208400),n=zi(43278e5,93046e5,66121e5),o=Pi(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let a=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return a=zi(a.x.add(o),a.y,a.z).div(1.0685e-7),Cp.mul(a)})(Pi(e).mul(y),Pi(e).mul(x)).mul(2);v.addAssign(N.mul(t))})),v.max(zi(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"}]}),Mp=Ei((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=wa(r.lessThan(.25),Pi(-339.2).mul(i).add(Pi(161.4).mul(r)).sub(25.9),Pi(-8.48).mul(i).add(Pi(14.3).mul(r)).sub(9.95)),o=wa(r.lessThan(.25),Pi(44).mul(i).sub(Pi(23.7).mul(r)).add(3.26),Pi(1.97).mul(i).sub(Pi(3.27).mul(r)).add(.72));return wa(r.lessThan(.25),0,Pi(.1).mul(r).sub(.025)).add(n.mul(s).add(o).exp()).mul(1/Math.PI).saturate()})),Bp=zi(.04),Fp=Pi(1);class Up extends Fh{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}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=zi().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=zi().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=zi().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=zi().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=zi().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=Rl.dot(yl).clamp();this.iridescenceFresnel=wp({outsideIOR:Pi(1),eta2:vn,cosTheta1:e,thinFilmThickness:Nn,baseF0:En}),this.iridescenceF0=tp({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=gl,r=ju.sub(gl).normalize(),s=Cl;e.backdrop=Rp(s,r,mn,pn,En,wn,t,tl,$u,ku,In,Dn,On,Vn,this.dispersion?Gn:null),e.backdropAlpha=Ln,pn.a.mulAssign(fa(1,e.backdrop.a,Ln))}}computeMultiscattering(e,t,r){const s=Rl.dot(yl).clamp(),i=Jh({roughness:mn,dotNV:s}),n=(this.iridescenceF0?_n.mix(En,this.iridescenceF0):En).mul(i.x).add(r.mul(i.y)),o=i.x.add(i.y).oneMinus(),a=En.add(En.oneMinus().mul(.047619)),u=n.mul(a).div(o.mul(a).oneMinus());e.addAssign(n),t.addAssign(u.mul(o))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Rl.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(ip({lightDirection:e}))),!0===this.clearcoat){const r=El.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Zh({lightDirection:e,f0:Bp,f90:Fp,roughness:xn,normalView:El})))}r.directDiffuse.addAssign(s.mul(Dh({diffuseColor:pn.rgb}))),r.directSpecular.addAssign(s.mul(Zh({lightDirection:e,f0:En,f90:1,roughness:mn,iridescence:this.iridescence,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:o}){const a=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=Rl,h=yl,p=fl.toVar(),g=np({N:c,V:h,roughness:mn}),m=n.sample(g).toVar(),f=o.sample(g).toVar(),y=Qi(zi(m.x,0,m.y),zi(0,1,0),zi(m.z,0,m.w)).toVar(),x=En.mul(f.x).add(En.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(x).mul(up({N:c,V:h,P:p,mInv:y,p0:a,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(pn).mul(up({N:c,V:h,P:p,mInv:Qi(1,0,0,0,1,0,0,0,1),p0:a,p1:u,p2:l,p3:d})))}indirect(e,t,r){this.indirectDiffuse(e,t,r),this.indirectSpecular(e,t,r),this.ambientOcclusion(e,t,r)}indirectDiffuse({irradiance:e,reflectedLight:t}){t.indirectDiffuse.addAssign(e.mul(Dh({diffuseColor:pn})))}indirectSpecular({radiance:e,iblIrradiance:t,reflectedLight:r}){if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(t.mul(bn,Mp({normal:Rl,viewDir:yl,roughness:Tn}))),!0===this.clearcoat){const e=El.dot(yl).clamp(),t=ep({dotNV:e,specularColor:Bp,specularF90:Fp,roughness:xn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const s=zi().toVar("singleScattering"),i=zi().toVar("multiScattering"),n=t.mul(1/Math.PI);this.computeMultiscattering(s,i,wn);const o=s.add(i),a=pn.mul(o.r.max(o.g).max(o.b).oneMinus());r.indirectSpecular.addAssign(e.mul(s)),r.indirectSpecular.addAssign(i.mul(n)),r.indirectDiffuse.addAssign(a.mul(n))}ambientOcclusion({ambientOcclusion:e,reflectedLight:t}){const r=Rl.dot(yl).clamp().add(e),s=mn.mul(-16).oneMinus().negate().exp2(),i=e.sub(r.pow(s).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(e),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(e),t.indirectDiffuse.mulAssign(e),t.indirectSpecular.mulAssign(i)}finish(e){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=El.dot(yl).clamp(),r=Lh({dotVH:e,f0:Bp,f90:Fp}),s=t.mul(yn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(yn));t.assign(s)}if(!0===this.sheen){const e=bn.r.max(bn.g).max(bn.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const Pp=Pi(1),Ip=Pi(-2),Lp=Pi(.8),Dp=Pi(-1),Vp=Pi(.4),Op=Pi(2),Gp=Pi(.305),kp=Pi(3),zp=Pi(.21),$p=Pi(4),Wp=Pi(4),Hp=Pi(16),jp=Ei((([e])=>{const t=zi(Go(e)).toVar(),r=Pi(-1).toVar();return Bi(t.x.greaterThan(t.z),(()=>{Bi(t.x.greaterThan(t.y),(()=>{r.assign(wa(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(wa(e.y.greaterThan(0),1,4))}))})).Else((()=>{Bi(t.z.greaterThan(t.y),(()=>{r.assign(wa(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(wa(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),qp=Ei((([e,t])=>{const r=Vi().toVar();return Bi(t.equal(0),(()=>{r.assign(Vi(e.z,e.y).div(Go(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(Vi(e.x.negate(),e.z.negate()).div(Go(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(Vi(e.x.negate(),e.y).div(Go(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(Vi(e.z.negate(),e.y).div(Go(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(Vi(e.x.negate(),e.z).div(Go(e.y)))})).Else((()=>{r.assign(Vi(e.x,e.y).div(Go(e.z)))})),Xn(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Xp=Ei((([e])=>{const t=Pi(0).toVar();return Bi(e.greaterThanEqual(Lp),(()=>{t.assign(Pp.sub(e).mul(Dp.sub(Ip)).div(Pp.sub(Lp)).add(Ip))})).ElseIf(e.greaterThanEqual(Vp),(()=>{t.assign(Lp.sub(e).mul(Op.sub(Dp)).div(Lp.sub(Vp)).add(Dp))})).ElseIf(e.greaterThanEqual(Gp),(()=>{t.assign(Vp.sub(e).mul(kp.sub(Op)).div(Vp.sub(Gp)).add(Op))})).ElseIf(e.greaterThanEqual(zp),(()=>{t.assign(Gp.sub(e).mul($p.sub(kp)).div(Gp.sub(zp)).add(kp))})).Else((()=>{t.assign(Pi(-2).mul(Co(Xn(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Kp=Ei((([e,t])=>{const r=e.toVar();r.assign(Xn(2,r).sub(1));const s=zi(r,1).toVar();return Bi(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"}]}),Yp=Ei((([e,t,r,s,i,n])=>{const o=Pi(r),a=zi(t),u=ya(Xp(o),Ip,n),l=Uo(u),d=Mo(u),c=zi(Qp(e,a,d,s,i,n)).toVar();return Bi(l.notEqual(0),(()=>{const t=zi(Qp(e,a,d.add(1),s,i,n)).toVar();c.assign(fa(c,t,l))})),c})),Qp=Ei((([e,t,r,s,i,n])=>{const o=Pi(r).toVar(),a=zi(t),u=Pi(jp(a)).toVar(),l=Pi(ta(Wp.sub(o),0)).toVar();o.assign(ta(o,Wp));const d=Pi(Ao(o)).toVar(),c=Vi(qp(a,u).mul(d.sub(2)).add(1)).toVar();return Bi(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(Xn(3,Hp))),c.y.addAssign(Xn(4,Ao(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(Vi(),Vi())})),Zp=Ei((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:a})=>{const u=Io(s),l=r.mul(u).add(i.cross(r).mul(Po(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Qp(e,l,t,n,o,a)})),Jp=Ei((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:o,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=zi(wa(t,r,ua(r,s))).toVar();Bi(To(h.equals(zi(0))),(()=>{h.assign(zi(s.z,0,s.x.negate()))})),h.assign(Fo(h));const p=zi().toVar();return p.addAssign(i.element(Ii(0)).mul(Zp({theta:0,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),yc({start:Ii(1),end:e},(({i:e})=>{Bi(e.greaterThanEqual(n),(()=>{xc()}));const t=Pi(o.mul(Pi(e))).toVar();p.addAssign(i.element(e).mul(Zp({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(Zp({theta:t,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),ji(p,1)}));let eg=null;const tg=new WeakMap;function rg(e){let t=tg.get(e);if((void 0!==t?t.pmremVersion:-1)!==e.pmremVersion){const r=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(r))return null;t=eg.fromEquirectangular(e,t)}t.pmremVersion=e.pmremVersion,tg.set(e,t)}return t.texture}class sg extends Gs{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 J;s.isRenderTargetTexture=!0,this._texture=Bu(s),this._width=ln(0),this._height=ln(0),this._maxMip=ln(0),this.updateBeforeType=ws.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(){let e=this._pmrem;const t=e?e.pmremVersion:-1,r=this._value;t!==r.pmremVersion&&(e=!0===r.isPMREMTexture?r:rg(r),null!==e&&(this._pmrem=e,this.updateFromTexture(e)))}setup(e){null===eg&&(eg=e.createPMREMGenerator()),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this));const r=this.value;e.renderer.coordinateSystem===u&&!0!==r.isPMREMTexture&&!0===r.isRenderTargetTexture&&(t=zi(t.x.negate(),t.yz)),t=zi(t.x,t.y.negate(),t.z);let s=this.levelNode;return null===s&&e.context.getTextureLevel&&(s=e.context.getTextureLevel(this)),Yp(this._texture,t,s,this._width,this._height,this._maxMip)}}const ig=Ri(sg),ng=new WeakMap;class og extends Sc{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=ng.get(e);void 0===s&&(s=ig(e),ng.set(e,s)),r=s}const s=t.envMap?Gl("envMapIntensity","float",e.material):Gl("environmentIntensity","float",e.scene),i=!0===t.useAnisotropy||t.anisotropy>0?nd:Rl,n=r.context(ag(mn,i)).mul(s),o=r.context(ug(Cl)).mul(Math.PI).mul(s),a=hu(n),u=hu(o);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(u);const l=e.context.lightingModel.clearcoatRadiance;if(l){const e=r.context(ag(xn,El)).mul(s),t=hu(e);l.addAssign(t)}}}const ag=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=yl.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection($u)),r),getTextureLevel:()=>e}},ug=e=>({getUV:()=>e,getTextureLevel:()=>Pi(1)}),lg=new ee;class dg extends lh{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(lg),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new og(t):null}setupLightingModel(){return new Up}setupSpecular(){const e=fa(zi(.04),pn.rgb,fn);En.assign(e),wn.assign(1)}setupVariants(){const e=this.metalnessNode?Pi(this.metalnessNode):Rd;fn.assign(e);let t=this.roughnessNode?Pi(this.roughnessNode):Ad;t=jh({roughness:t}),mn.assign(t),this.setupSpecular(),pn.assign(ji(pn.rgb.mul(e.oneMinus()),pn.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const cg=new te;class hg extends dg{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(cg),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?Pi(this.iorNode):Gd;In.assign(e),En.assign(fa(ea(da(In.sub(1).div(In.add(1))).mul(vd),zi(1)).mul(_d),pn.rgb,fn)),wn.assign(fa(_d,1,fn))}setupLightingModel(){return new Up(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?Pi(this.clearcoatNode):Ed,t=this.clearcoatRoughnessNode?Pi(this.clearcoatRoughnessNode):wd;yn.assign(e),xn.assign(jh({roughness:t}))}if(this.useSheen){const e=this.sheenNode?zi(this.sheenNode):Fd,t=this.sheenRoughnessNode?Pi(this.sheenRoughnessNode):Ud;bn.assign(e),Tn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?Pi(this.iridescenceNode):Id,t=this.iridescenceIORNode?Pi(this.iridescenceIORNode):Ld,r=this.iridescenceThicknessNode?Pi(this.iridescenceThicknessNode):Dd;_n.assign(e),vn.assign(t),Nn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Vi(this.anisotropyNode):Pd).toVar();An.assign(e.length()),Bi(An.equal(0),(()=>{e.assign(Vi(1,0))})).Else((()=>{e.divAssign(Vi(An)),An.assign(An.saturate())})),Sn.assign(An.pow2().mix(mn.pow2(),1)),Rn.assign(sd[0].mul(e.x).add(sd[1].mul(e.y))),Cn.assign(sd[1].mul(e.x).sub(sd[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?Pi(this.transmissionNode):Vd,t=this.thicknessNode?Pi(this.thicknessNode):Od,r=this.attenuationDistanceNode?Pi(this.attenuationDistanceNode):kd,s=this.attenuationColorNode?zi(this.attenuationColorNode):zd;if(Ln.assign(e),Dn.assign(t),Vn.assign(r),On.assign(s),this.useDispersion){const e=this.dispersionNode?Pi(this.dispersionNode):Kd;Gn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?zi(this.clearcoatNormalNode):Md}setup(e){e.context.setupClearcoatNormal=()=>this.setupClearcoatNormal(e),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 pg extends Up{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,o=!1){super(e,t,r,s,i,n),this.useSSS=o}direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){if(!0===this.useSSS){const s=i.material,{thicknessColorNode:n,thicknessDistortionNode:o,thicknessAmbientNode:a,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=s,c=e.add(Rl.mul(o)).normalize(),h=Pi(yl.dot(c.negate()).saturate().pow(l).mul(d)),p=zi(h.add(a).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i)}}class gg extends hg{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=Pi(.1),this.thicknessAmbientNode=Pi(0),this.thicknessAttenuationNode=Pi(.1),this.thicknessPowerNode=Pi(2),this.thicknessScaleNode=Pi(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new pg(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 mg=Ei((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Vi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=$l("gradientMap","texture").context({getUV:()=>i});return zi(e.r)}{const e=i.fwidth().mul(.5);return fa(zi(.7),zi(1),Ta(Pi(.7).sub(e.x),Pi(.7).add(e.x),i.x))}}));class fg extends Fh{direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){const n=mg({normal:_l,lightDirection:e,builder:i}).mul(t);r.directDiffuse.addAssign(n.mul(Dh({diffuseColor:pn.rgb})))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Dh({diffuseColor:pn}))),r.indirectDiffuse.mulAssign(e)}}const yg=new re;class xg extends lh{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(yg),this.setValues(e)}setupLightingModel(){return new fg}}class bg extends Gs{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=zi(yl.z,0,yl.x.negate()).normalize(),t=yl.cross(e);return Vi(e.dot(Rl),t.dot(Rl)).mul(.495).add(.5)}}const Tg=Ci(bg),_g=new se;class vg extends lh{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(_g),this.setValues(e)}setupVariants(e){const t=Tg;let r;r=e.material.matcap?$l("matcap","texture").context({getUV:()=>t}):zi(fa(.2,.8,t.y)),pn.rgb.mulAssign(r.rgb)}}class Ng extends Gs{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 Yi(e,s,s.negate(),e).mul(r)}{const e=t,s=Zi(ji(1,0,0,0),ji(0,Io(e.x),Po(e.x).negate(),0),ji(0,Po(e.x),Io(e.x),0),ji(0,0,0,1)),i=Zi(ji(Io(e.y),0,Po(e.y),0),ji(0,1,0,0),ji(Po(e.y).negate(),0,Io(e.y),0),ji(0,0,0,1)),n=Zi(ji(Io(e.z),Po(e.z).negate(),0,0),ji(Po(e.z),Io(e.z),0,0),ji(0,0,1,0),ji(0,0,0,1));return s.mul(i).mul(n).mul(ji(r,1)).xyz}}}const Sg=Ri(Ng),Ag=new ie;class Rg extends lh{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.setDefaultValues(Ag),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:o}=this,a=al.mul(zi(i||0));let u=Vi(tl[0].xyz.length(),tl[1].xyz.length());if(null!==o&&(u=u.mul(Pi(o))),!1===s)if(r.isPerspectiveCamera)u=u.mul(a.z.negate());else{const e=Pi(2).div(ku.element(1).element(1));u=u.mul(e.mul(2))}let l=cl.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Ni(new Za(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=Pi(n||Bd),c=Sg(l,d);return ji(a.xy.add(c),a.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 Cg=new ne;class Eg extends Rg{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Cg),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return al.mul(zi(e||hl)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=cl.xy.toVar(),o=Ic.z.div(Ic.w);if(r&&r.isNode){const e=Pi(r);n.assign(Sg(n,e))}let a=null!==i?Vi(i):Xd;return!0===this.sizeAttenuation&&(a=a.mul(a.div(fl.z.negate()))),s&&s.isNode&&(a=a.mul(Vi(s))),n.mulAssign(a.mul(2)),n.assign(n.div(Ic.z)),n.y.assign(n.y.mul(o)),n.assign(n.mul(t.w)),t.addAssign(ji(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class wg extends Fh{constructor(){super(),this.shadowNode=Pi(1).toVar("shadowMask")}direct({shadowMask:e}){this.shadowNode.mulAssign(e)}finish(e){pn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(pn.rgb)}}const Mg=new oe;class Bg extends lh{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Mg),this.setValues(e)}setupLightingModel(){return new wg}}const Fg=Ei((({texture:e,uv:t})=>{const r=1e-4,s=zi().toVar();return Bi(t.x.lessThan(r),(()=>{s.assign(zi(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign(zi(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign(zi(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign(zi(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign(zi(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign(zi(0,0,-1))})).Else((()=>{const r=.01,i=e.sample(t.add(zi(-.01,0,0))).r.sub(e.sample(t.add(zi(r,0,0))).r),n=e.sample(t.add(zi(0,-.01,0))).r.sub(e.sample(t.add(zi(0,r,0))).r),o=e.sample(t.add(zi(0,0,-.01))).r.sub(e.sample(t.add(zi(0,0,r))).r);s.assign(zi(i,n,o))})),s.normalize()}));class Ug extends Mu{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return zi(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(Ii(Cu(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return Fg({texture:this,uv:e})}}const Pg=Ri(Ug);class Ig extends lh{static get type(){return"VolumeNodeMaterial"}constructor(t){super(),this.isVolumeNodeMaterial=!0,this.base=new e(16777215),this.map=null,this.steps=100,this.testNode=null,this.setValues(t)}setup(e){const t=Pg(this.map,null,0),r=Ei((({orig:e,dir:t})=>{const r=zi(-.5),s=zi(.5),i=t.reciprocal(),n=r.sub(e).mul(i),o=s.sub(e).mul(i),a=ea(n,o),u=ta(n,o),l=ta(a.x,ta(a.y,a.z)),d=ea(u.x,ea(u.y,u.z));return Vi(l,d)}));this.fragmentNode=Ei((()=>{const e=Ga(zi(ol.mul(ji(ju,1)))),s=Ga(cl.sub(e)).normalize(),i=Vi(r({orig:e,dir:s})).toVar();i.x.greaterThan(i.y).discard(),i.assign(Vi(ta(i.x,0),i.y));const n=zi(e.add(i.x.mul(s))).toVar(),o=zi(s.abs().reciprocal()).toVar(),a=Pi(ea(o.x,ea(o.y,o.z))).toVar("delta");a.divAssign($l("steps","float"));const u=ji($l("base","color"),0).toVar();return yc({type:"float",start:i.x,end:i.y,update:"+= delta"},(()=>{const e=cn("float","d").assign(t.sample(n.add(.5)).r);null!==this.testNode?this.testNode({map:t,mapValue:e,probe:n,finalColor:u}).append():(u.a.assign(1),xc()),n.addAssign(s.mul(a))})),u.a.equal(0).discard(),ji(u)}))(),super.setup(e)}}class Lg{constructor(e,t){this.nodes=e,this.info=t,this._context=self,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,null!==this._animationLoop&&this._animationLoop(t,r)};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 Dg{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.material.addEventListener("dispose",this.onMaterialDispose)}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)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set;for(const i of e){const e=i.node&&i.node.attribute?i.node.attribute:t.getAttribute(i.name);if(void 0===e)continue;r.push(e);const n=e.isInterleavedBufferAttribute?e.data:e;s.add(n)}return this.attributes=r,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}),o=this.getIndex(),a=null!==o,u=r.isInstancedBufferGeometry?r.instanceCount:e.count>1?e.count:1;if(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;a?p=o.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&&(r+=e.uuid+","),r+=e.receiveShadow+",",hs(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}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=gs(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=gs(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const Gg=[];class kg{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,o,a){const u=this.getChainMap(a);Gg[0]=e,Gg[1]=t,Gg[2]=n,Gg[3]=i;let l=u.get(Gg);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,o,a),u.set(Gg,l)):(l.updateClipping(o),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,o,a)):l.version=t.version)),Gg.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Dg)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,o,a,u,l,d){const c=this.getChainMap(d),h=new Og(e,t,r,s,i,n,o,a,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class zg{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 $g=1,Wg=2,Hg=3,jg=4,qg=16;class Xg extends zg{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return void 0!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===$g?this.backend.createAttribute(e):t===Wg?this.backend.createIndexAttribute(e):t===Hg?this.backend.createStorageAttribute(e):t===jg&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version=0;--t)if(e[t]>=65535)return!0;return!1}(t)?ae:ue)(t,1);return i.version=Kg(e),i}class Qg extends zg{constructor(e,t){super(),this.attributes=e,this.info=t,this.wireframes=new WeakMap,this.attributeCall=new WeakMap}has(e){const t=e.geometry;return super.has(t)&&!0===this.get(t).initialized}updateForRender(e){!1===this.has(e)&&this.initGeometry(e),this.updateAttributes(e)}initGeometry(e){const t=e.geometry;this.get(t).initialized=!0,this.info.memory.geometries++;const r=()=>{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)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,Hg):this.updateAttribute(e,$g);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,Wg);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,jg)}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}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=Yg(t),e.set(t,r)):r.version!==Kg(t)&&(this.attributes.delete(r),r=Yg(t),e.set(t,r)),s=r}return s}}class Zg{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,previousFrameCalls:0,timestampCalls:0},this.compute={calls:0,frameCalls:0,timestamp:0,previousFrameCalls:0,timestampCalls: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):console.error("THREE.WebGPUInfo: Unknown object type.")}updateTimestamp(e,t){0===this[e].timestampCalls&&(this[e].timestamp=0),this[e].timestamp+=t,this[e].timestampCalls++,this[e].timestampCalls>=this[e].previousFrameCalls&&(this[e].timestampCalls=0)}reset(){const e=this.render.frameCalls;this.render.previousFrameCalls=e;const t=this.compute.frameCalls;this.compute.previousFrameCalls=t,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 Jg{constructor(e){this.cacheKey=e,this.usedTimes=0}}class em extends Jg{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class tm extends Jg{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let rm=0;class sm{constructor(e,t,r,s=null,i=null){this.id=rm++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class im extends zg{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 o=this.programs.compute.get(n.computeShader);void 0===o&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),o=new sm(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,o),r.createProgram(o));const a=this._getComputeCacheKey(e,o);let u=this.caches.get(a);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,o,a,t)),u.usedTimes++,o.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(),o=e.material?e.material.name:"";let a=this.programs.vertex.get(n.vertexShader);void 0===a&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),a=new sm(n.vertexShader,"vertex",o),this.programs.vertex.set(n.vertexShader,a),r.createProgram(a));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new sm(n.fragmentShader,"fragment",o),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,a,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,a,u,l,t)):e.pipeline=d,d.usedTimes++,a.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 tm(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 em(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 nm extends zg{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))}_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.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?jg:Hg;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,o=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampler)t.update();else if(t.isSampledTexture){const e=this.textures.get(t.texture);t.needsBindingsUpdate(e.generation)&&(s=!0);const a=t.update(),u=t.texture;a&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,o+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,a,u,t.textureNode.value,s),this.textures.updateTexture(u),s=!0),!0===u.isStorageTexture){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}}!0===s&&this.backend.updateBindings(e,t,i?n:0,o)}}function om(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.z!==t.z?e.z-t.z:e.id-t.id}function am(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 um(e){return(e.transmission>0||e.transmissionNode)&&e.side===le&&!1===e.forceSinglePass}class lm{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,o){let a=this.renderItems[this.renderItemsIndex];return void 0===a?(a={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:o},this.renderItems[this.renderItemsIndex]=a):(a.id=e.id,a.object=e,a.geometry=t,a.material=r,a.groupOrder=s,a.renderOrder=e.renderOrder,a.z=i,a.group=n,a.clippingContext=o),this.renderItemsIndex++,a}push(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(um(r)&&this.transparentDoublePass.push(a),this.transparent.push(a)):this.opaque.push(a)}unshift(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===r.transparent||r.transmission>0?(um(r)&&this.transparentDoublePass.unshift(a),this.transparent.unshift(a)):this.opaque.unshift(a)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||om),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||am),this.transparent.length>1&&this.transparent.sort(t||am)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=o.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 B,l.format=e.stencilBuffer?ce:he,l.type=e.stencilBuffer?pe:x,l.image.width=a,l.image.height=u,i[t]=l),r.width===o.width&&o.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=a,l.image.height=u)),r.width=o.width,r.height=o.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(!1==(!0===e.isXRRenderTarget&&!0===e.hasExternalTextures))for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.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),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e),this.info.memory.textures--};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=bm){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),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.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return this.isEnvironmentTexture(e)||!0===e.isCompressedTexture||e.generateMipmaps}isEnvironmentTexture(e){const t=e.mapping;return t===H||t===j||t===_||t===v}_destroyTexture(e){this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e)}}class _m extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class vm extends dn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class Nm extends Ds{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new vi(t);return this._currentCond=wa(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new vi(t),s=wa(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new vi(e),this}build(e,...t){const r=Mi();wi(this);for(const t of this.nodes)t.build(e,"void");return wi(r),this.outputNode?this.outputNode.build(e,...t):super.build(e,...t)}else(...e){return console.warn("TSL.StackNode: .else() has been renamed to .Else()."),this.Else(...e)}elseif(...e){return console.warn("TSL.StackNode: .elseif() has been renamed to .ElseIf()."),this.ElseIf(...e)}}const Sm=Ri(Nm);class Am extends Ds{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}setup(e){super.setup(e);const t=this.members,r=[];for(let s=0;s{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)})),Bm=(e,t)=>la(Xn(4,e.mul(qn(1,e))),t),Fm=Ei((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Um=Ei((([e])=>zi(Fm(e.z.add(Fm(e.y.mul(1)))),Fm(e.z.add(Fm(e.x.mul(1)))),Fm(e.y.add(Fm(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Pm=Ei((([e,t,r])=>{const s=zi(e).toVar(),i=Pi(1.4).toVar(),n=Pi(0).toVar(),o=zi(s).toVar();return yc({start:Pi(0),end:Pi(3),type:"float",condition:"<="},(()=>{const e=zi(Um(o.mul(2))).toVar();s.addAssign(e.add(r.mul(Pi(.1).mul(t)))),o.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const a=Pi(Fm(s.z.add(Fm(s.x.add(Fm(s.y)))))).toVar();n.addAssign(a.div(i)),o.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class Im extends Ds{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;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 o=n.inputs;if(t.length===o.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const Lm=Ri(Im),Dm=e=>(...t)=>Lm(e,...t),Vm=ln(0).setGroup(on).onRenderUpdate((e=>e.time)),Om=ln(0).setGroup(on).onRenderUpdate((e=>e.deltaTime)),Gm=ln(0,"uint").setGroup(on).onRenderUpdate((e=>e.frameId)),km=Ei((([e,t,r=Vi(.5)])=>Sg(e.sub(r),t).add(r))),zm=Ei((([e,t,r=Vi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),$m=Ei((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=tl.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=tl;const i=$u.mul(s);return Ti(t)&&(i[0][0]=tl[0].length(),i[0][1]=0,i[0][2]=0),Ti(r)&&(i[1][0]=0,i[1][1]=tl[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,ku.mul(i).mul(hl)})),Wm=Ei((([e=null])=>{const t=rh();return rh(Xc(e)).sub(t).lessThan(0).select(Fc,e)}));class Hm extends Ds{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Au(),r=Pi(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),o=n.mod(s),a=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=Vi(o,a);return t.add(l).mul(u)}}const jm=Ri(Hm);class qm extends Ds{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=Pi(1),i=hl,n=vl){super("vec4"),this.textureXNode=e,this.textureYNode=t,this.textureZNode=r,this.scaleNode=s,this.positionNode=i,this.normalNode=n}setup(){const{textureXNode:e,textureYNode:t,textureZNode:r,scaleNode:s,positionNode:i,normalNode:n}=this;let o=n.abs().normalize();o=o.div(o.dot(zi(1)));const a=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=Bu(d,a).mul(o.x),g=Bu(c,u).mul(o.y),m=Bu(h,l).mul(o.z);return jn(p,g,m)}}const Xm=Ri(qm),Km=new fe,Ym=new r,Qm=new r,Zm=new r,Jm=new n,ef=new r(0,0,-1),tf=new s,rf=new r,sf=new r,nf=new s,of=new t,af=new me,uf=Fc.flipX();af.depthTexture=new B(1,1);let lf=!1;class df extends Mu{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||af.texture,uf),this._reflectorBaseNode=e.reflector||new cf(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=Ni(new df({defaultTexture:af.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._reflectorBaseNode=this._reflectorBaseNode,e}}class cf extends Ds{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new ye,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:o=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=o,this.updateBeforeType=n?ws.RENDER:ws.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new WeakMap}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(of),e.setSize(Math.round(of.width*r),Math.round(of.height*r))}setup(e){return this._updateResolution(af,e.renderer),super.setup(e)}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 me(0,0,{type:xe}),!0===this.generateMipmaps&&(t.texture.minFilter=be,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new B),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&lf)return!1;lf=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,o=this.getVirtualCamera(r),a=this.getRenderTarget(o);if(s.getDrawingBufferSize(of),this._updateResolution(a,s),Qm.setFromMatrixPosition(n.matrixWorld),Zm.setFromMatrixPosition(r.matrixWorld),Jm.extractRotation(n.matrixWorld),Ym.set(0,0,1),Ym.applyMatrix4(Jm),rf.subVectors(Qm,Zm),rf.dot(Ym)>0)return;rf.reflect(Ym).negate(),rf.add(Qm),Jm.extractRotation(r.matrixWorld),ef.set(0,0,-1),ef.applyMatrix4(Jm),ef.add(Zm),sf.subVectors(Qm,ef),sf.reflect(Ym).negate(),sf.add(Qm),o.coordinateSystem=r.coordinateSystem,o.position.copy(rf),o.up.set(0,1,0),o.up.applyMatrix4(Jm),o.up.reflect(Ym),o.lookAt(sf),o.near=r.near,o.far=r.far,o.updateMatrixWorld(),o.projectionMatrix.copy(r.projectionMatrix),Km.setFromNormalAndCoplanarPoint(Ym,Qm),Km.applyMatrix4(o.matrixWorldInverse),tf.set(Km.normal.x,Km.normal.y,Km.normal.z,Km.constant);const u=o.projectionMatrix;nf.x=(Math.sign(tf.x)+u.elements[8])/u.elements[0],nf.y=(Math.sign(tf.y)+u.elements[9])/u.elements[5],nf.z=-1,nf.w=(1+u.elements[10])/u.elements[14],tf.multiplyScalar(1/tf.dot(nf));u.elements[2]=tf.x,u.elements[6]=tf.y,u.elements[10]=s.coordinateSystem===l?tf.z-0:tf.z+1-0,u.elements[14]=tf.w,this.textureNode.value=a.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=a.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),h=s.autoClear;s.setMRT(null),s.setRenderTarget(a),s.autoClear=!0,s.render(t,o),s.setMRT(c),s.setRenderTarget(d),s.autoClear=h,i.visible=!0,lf=!1}}const hf=new Te(-1,1,1,-1,0,1);class pf extends _e{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new ve([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new ve(t,2))}}const gf=new pf;class mf extends G{constructor(e=null){super(gf,e),this.camera=hf,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,hf)}render(e){e.render(this,hf)}}const ff=new t;class yf extends Mu{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:xe}){const i=new me(t,r,s);super(i.texture,Au()),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 mf(new lh),this.updateBeforeType=ws.RENDER}get autoSize(){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.autoSize){this.pixelRatio=e.getPixelRatio();const t=e.getSize(ff);this.setSize(t.width,t.height)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new Mu(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const xf=(e,...t)=>Ni(new yf(Ni(e),...t)),bf=Ei((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===l?(e=Vi(e.x,e.y.oneMinus()).mul(2).sub(1),i=ji(zi(e,t),1)):i=ji(zi(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=ji(r.mul(i));return n.xyz.div(n.w)})),Tf=Ei((([e,t])=>{const r=t.mul(ji(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Vi(s.x,s.y.oneMinus())})),_f=Ei((([e,t,r])=>{const s=Cu(Fu(t)),i=Oi(e.mul(s)).toVar(),n=Fu(t,i).toVar(),o=Fu(t,i.sub(Oi(2,0))).toVar(),a=Fu(t,i.sub(Oi(1,0))).toVar(),u=Fu(t,i.add(Oi(1,0))).toVar(),l=Fu(t,i.add(Oi(2,0))).toVar(),d=Fu(t,i.add(Oi(0,2))).toVar(),c=Fu(t,i.add(Oi(0,1))).toVar(),h=Fu(t,i.sub(Oi(0,1))).toVar(),p=Fu(t,i.sub(Oi(0,2))).toVar(),g=Go(qn(Pi(2).mul(a).sub(o),n)).toVar(),m=Go(qn(Pi(2).mul(u).sub(l),n)).toVar(),f=Go(qn(Pi(2).mul(c).sub(d),n)).toVar(),y=Go(qn(Pi(2).mul(h).sub(p),n)).toVar(),x=bf(e,n,r).toVar(),b=g.lessThan(m).select(x.sub(bf(e.sub(Vi(Pi(1).div(s.x),0)),a,r)),x.negate().add(bf(e.add(Vi(Pi(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(x.sub(bf(e.add(Vi(0,Pi(1).div(s.y))),c,r)),x.negate().add(bf(e.sub(Vi(0,Pi(1).div(s.y))),h,r)));return Fo(ua(b,T))}));class vf extends R{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class Nf extends Ne{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class Sf extends Vs{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}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 Af=Ri(Sf);class Rf extends Uu{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(t=bs(e.itemSize),r=e.count),super(e,t,r),this.isStorageBufferNode=!0,this.access=Bs.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 Af(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Bs.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=nu(this.value),this._varying=Ga(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}generate(e){if(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 Cf=(e,t=null,r=0)=>Ni(new Rf(e,t,r));class Ef extends Nu{static get type(){return"VertexColorNode"}constructor(e=0){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}}class wf extends Ds{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const Mf=Ci(wf),Bf=new Ae,Ff=new n;class Uf extends Ds{static get type(){return"SceneNode"}constructor(e=Uf.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===Uf.BACKGROUND_BLURRINESS?s=Gl("backgroundBlurriness","float",r):t===Uf.BACKGROUND_INTENSITY?s=Gl("backgroundIntensity","float",r):t===Uf.BACKGROUND_ROTATION?s=ln("mat4").label("backgroundRotation").setGroup(on).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Se?(Bf.copy(r.backgroundRotation),Bf.x*=-1,Bf.y*=-1,Bf.z*=-1,Ff.makeRotationFromEuler(Bf)):Ff.identity(),Ff})):console.error("THREE.SceneNode: Unknown scope:",t),s}}Uf.BACKGROUND_BLURRINESS="backgroundBlurriness",Uf.BACKGROUND_INTENSITY="backgroundIntensity",Uf.BACKGROUND_ROTATION="backgroundRotation";const Pf=Ci(Uf,Uf.BACKGROUND_BLURRINESS),If=Ci(Uf,Uf.BACKGROUND_INTENSITY),Lf=Ci(Uf,Uf.BACKGROUND_ROTATION);class Df extends Mu{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=Bs.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);e.getNodeProperties(this).storeNode=this.storeNode}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Bs.READ_WRITE)}toReadOnly(){return this.setAccess(Bs.READ_ONLY)}toWriteOnly(){return this.setAccess(Bs.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),o=s.build(e,"vec4"),a=e.generateTextureStore(e,i,n,o);e.addLineFlowCode(a,this)}}const Vf=Ri(Df);class Of extends Ol{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 Gf=new WeakMap;class kf extends Gs{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=ws.OBJECT,this.updateAfterType=ws.OBJECT,this.previousModelWorldMatrix=ln(new n),this.previousProjectionMatrix=ln(new n).setGroup(on),this.previousCameraViewMatrix=ln(new n)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=$f(r);this.previousModelWorldMatrix.value.copy(s);const i=zf(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new n,i.previousCameraViewMatrix=new n,i.currentProjectionMatrix=new n,i.currentCameraViewMatrix=new n,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}){$f(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?ku:ln(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(al).mul(hl),s=this.previousProjectionMatrix.mul(t).mul(pl),i=r.xy.div(r.w),n=s.xy.div(s.w);return qn(i,n)}}function zf(e){let t=Gf.get(e);return void 0===t&&(t={},Gf.set(e,t)),t}function $f(e,t=0){const r=zf(e);let s=r[t];return void 0===s&&(r[t]=s=new n),s}const Wf=Ci(kf),Hf=Ei((([e,t])=>ea(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),jf=Ei((([e,t])=>ea(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),qf=Ei((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Xf=Ei((([e,t])=>fa(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),sa(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Kf=Ei((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return ji(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"}]}),Yf=Ei((([e])=>ey(e.rgb))),Qf=Ei((([e,t=Pi(1)])=>t.mix(ey(e.rgb),e.rgb))),Zf=Ei((([e,t=Pi(1)])=>{const r=jn(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 fa(e.rgb,s,i)})),Jf=Ei((([e,t=Pi(1)])=>{const r=zi(.57735,.57735,.57735),s=t.cos();return zi(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(aa(r,e.rgb).mul(s.oneMinus())))))})),ey=(e,t=zi(d.getLuminanceCoefficients(new r)))=>aa(e,t),ty=Ei((([e,t=zi(1),s=zi(0),i=zi(1),n=Pi(1),o=zi(d.getLuminanceCoefficients(new r,Re))])=>{const a=e.rgb.dot(zi(o)),u=ta(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return Bi(u.r.greaterThan(0),(()=>{u.r.assign(l.r)})),Bi(u.g.greaterThan(0),(()=>{u.g.assign(l.g)})),Bi(u.b.greaterThan(0),(()=>{u.b.assign(l.b)})),u.assign(a.add(u.sub(a).mul(n))),ji(u.rgb,e.a)}));class ry extends Gs{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 sy=Ri(ry),iy=new t;class ny extends Mu{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return e.object.isQuadMesh&&this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class oy extends ny{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(){return new this.constructor(this.passNode,this.textureName,this.previousTexture)}}class ay extends Gs{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 B;i.isRenderTargetTexture=!0,i.name="depth";const n=new me(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:xe,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=ln(0),this._cameraFar=ln(0),this._mrt=null,this.isPassNode=!0,this.updateBeforeType=ws.FRAME}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}isGlobal(){return!0}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=Ni(new oy(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=Ni(new oy(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=Zc(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=Yc(i,r,s)}return t}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,!0===e.backend.isWebGLBackend&&(this.renderTarget.samples=0),this.scope===ay.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r,camera:s}=this;this._pixelRatio=t.getPixelRatio();const i=t.getSize(iy);this.setSize(i.width,i.height);const n=t.getRenderTarget(),o=t.getMRT();this._cameraNear.value=s.near,this._cameraFar.value=s.far;for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(n),t.setMRT(o)}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio,s=this._height*this._pixelRatio;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}ay.COLOR="color",ay.DEPTH="depth";class uy extends ay{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(ay.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction(((e,r,s,i,n,o,a,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,o,a,u)}t.renderObject(e,r,s,i,n,o,a,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new lh;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=T;const t=vl.negate(),r=ku.mul(al),s=Pi(1),i=r.mul(ji(hl,1)),n=r.mul(ji(hl.add(t),1)),o=Fo(i.sub(n));return e.vertexNode=i.add(o.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=ji(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 ly=Ei((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),dy=Ei((([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"}]}),cy=Ei((([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"}]}),hy=Ei((([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)})),py=Ei((([e,t])=>{const r=Qi(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Qi(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=hy(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),gy=Qi(zi(1.6605,-.1246,-.0182),zi(-.5876,1.1329,-.1006),zi(-.0728,-.0083,1.1187)),my=Qi(zi(.6274,.0691,.0164),zi(.3293,.9195,.088),zi(.0433,.0113,.8956)),fy=Ei((([e])=>{const t=zi(e).toVar(),r=zi(t.mul(t)).toVar(),s=zi(r.mul(r)).toVar();return Pi(15.5).mul(s.mul(r)).sub(Xn(40.14,s.mul(t))).add(Xn(31.96,s).sub(Xn(6.868,r.mul(t))).add(Xn(.4298,r).add(Xn(.1191,t).sub(.00232))))})),yy=Ei((([e,t])=>{const r=zi(e).toVar(),s=Qi(zi(.856627153315983,.137318972929847,.11189821299995),zi(.0951212405381588,.761241990602591,.0767994186031903),zi(.0482516061458583,.101439036467562,.811302368396859)),i=Qi(zi(1.1271005818144368,-.1413297634984383,-.14132976349843826),zi(-.11060664309660323,1.157823702216272,-.11060664309660294),zi(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=Pi(-12.47393),o=Pi(4.026069);return r.mulAssign(t),r.assign(my.mul(r)),r.assign(s.mul(r)),r.assign(ta(r,1e-10)),r.assign(Co(r)),r.assign(r.sub(n).div(o.sub(n))),r.assign(ya(r,0,1)),r.assign(fy(r)),r.assign(i.mul(r)),r.assign(la(ta(zi(0),r),zi(2.2))),r.assign(gy.mul(r)),r.assign(ya(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),xy=Ei((([e,t])=>{const r=Pi(.76),s=Pi(.15);e=e.mul(t);const i=ea(e.r,ea(e.g,e.b)),n=wa(i.lessThan(.08),i.sub(Xn(6.25,i.mul(i))),.04);e.subAssign(n);const o=ta(e.r,ta(e.g,e.b));Bi(o.lessThan(r),(()=>e));const a=qn(1,r),u=qn(1,a.mul(a).div(o.add(a.sub(r))));e.mulAssign(u.div(o));const l=qn(1,Kn(1,s.mul(o.sub(u)).add(1)));return fa(e,zi(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class by extends Ds{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.code=e,this.includes=t,this.language=r}isGlobal(){return!0}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 Ty=Ri(by);class _y extends by{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}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 o=e.getPropertyName(n),a=this.getNodeFunction(e).getCode(o);return n.code=a+"\n","property"===t?o:e.format(`${o}()`,i,t)}}const vy=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Ny extends Ds{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new o,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:Pi()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=As(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?Rs(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 Sy=Ri(Ny);class Ay 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 Ry{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 Cy=new Ay;class Ey extends Ds{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new Ay,this._output=Sy(),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]=Sy(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]=Sy(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 Ry(this),t=Cy.get("THREE"),r=Cy.get("TSL"),s=this.getMethod(),i=[e,this._local,Cy,()=>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:Pi()}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=[hs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return ps(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 wy=Ri(Ey);function My(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||fl.z).negate()}const By=Ei((([e,t],r)=>{const s=My(r);return Ta(e,t,s)})),Fy=Ei((([e],t)=>{const r=My(t);return e.mul(e,r,r).negate().exp().oneMinus()})),Uy=Ei((([e,t])=>ji(t.toFloat().mix(Bn.rgb,e.toVec3()),Bn.a)));let Py=null,Iy=null;class Ly extends Ds{static get type(){return"RangeNode"}constructor(e=Pi(),t=Pi()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(vs(this.minNode.value)),r=e.getTypeLength(vs(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,o=e.getTypeLength(vs(i)),u=e.getTypeLength(vs(n));Py=Py||new s,Iy=Iy||new s,Py.setScalar(0),Iy.setScalar(0),1===o?Py.setScalar(i):i.isColor?Py.set(i.r,i.g,i.b,1):Py.set(i.x,i.y,i.z||0,i.w||0),1===u?Iy.setScalar(n):n.isColor?Iy.set(n.r,n.g,n.b,1):Iy.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;eNi(new Vy(e,t)),Gy=Oy("numWorkgroups","uvec3"),ky=Oy("workgroupId","uvec3"),zy=Oy("globalId","uvec3"),$y=Oy("localId","uvec3"),Wy=Oy("subgroupSize","uint");const Hy=Ri(class extends Ds{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 jy extends Vs{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 qy extends Ds{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e}label(e){return this.name=e,this}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Ni(new jy(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class Xy extends Gs{static get type(){return"AtomicFunctionNode"}constructor(e,t,r,s=null){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.storeNode=s}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=this.method,r=this.getNodeType(e),s=this.getInputType(e),i=this.pointerNode,n=this.valueNode,o=[];o.push(`&${i.build(e,s)}`),o.push(n.build(e,s));const a=`${e.getMethod(t,r)}( ${o.join(", ")} )`;if(null!==this.storeNode){const t=this.storeNode.build(e,s);e.addLineFlowCode(`${t} = ${a}`,this)}else e.addLineFlowCode(a,this)}}Xy.ATOMIC_LOAD="atomicLoad",Xy.ATOMIC_STORE="atomicStore",Xy.ATOMIC_ADD="atomicAdd",Xy.ATOMIC_SUB="atomicSub",Xy.ATOMIC_MAX="atomicMax",Xy.ATOMIC_MIN="atomicMin",Xy.ATOMIC_AND="atomicAnd",Xy.ATOMIC_OR="atomicOr",Xy.ATOMIC_XOR="atomicXor";const Ky=Ri(Xy),Yy=(e,t,r,s=null)=>{const i=Ky(e,t,r,s);return i.append(),i};let Qy;function Zy(e){Qy=Qy||new WeakMap;let t=Qy.get(e);return void 0===t&&Qy.set(e,t={}),t}function Jy(e){const t=Zy(e);return t.shadowMatrix||(t.shadowMatrix=ln("mat4").setGroup(on).onRenderUpdate((()=>(!0!==e.castShadow&&e.shadow.updateMatrices(e),e.shadow.matrix))))}function ex(e){const t=Zy(e);if(void 0===t.projectionUV){const r=Jy(e).mul(gl);t.projectionUV=r.xyz.div(r.w)}return t.projectionUV}function tx(e){const t=Zy(e);return t.position||(t.position=ln(new r).setGroup(on).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function rx(e){const t=Zy(e);return t.targetPosition||(t.targetPosition=ln(new r).setGroup(on).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function sx(e){const t=Zy(e);return t.viewPosition||(t.viewPosition=ln(new r).setGroup(on).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const ix=e=>$u.transformDirection(tx(e).sub(rx(e))),nx=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},ox=new WeakMap;class ax extends Ds{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=zi().toVar("totalDiffuse"),this.totalSpecularNode=zi().toVar("totalSpecular"),this.outgoingLightNode=zi().toVar("outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=[],t=this._lights;for(let r=0;re.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Ni(e));else{let s=null;if(null!==r&&(s=nx(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;ox.has(e)?s=ox.get(e):(s=Ni(new r(e)),ox.set(e,s)),t.push(s)}}this._lightNodes=t}setupLights(e,t){for(const r of t)r.build(e)}setup(e){null===this._lightNodes&&this.setupLightsNode(e);const t=e.context,r=t.lightingModel;let s=this.outgoingLightNode;if(r){const{_lightNodes:i,totalDiffuseNode:n,totalSpecularNode:o}=this;t.outgoingLight=s;const a=e.addStack();e.getDataFromNode(this).nodes=a.nodes,r.start(t,a,e),this.setupLights(e,i),r.indirect(t,a,e);const{backdrop:u,backdropAlpha:l}=t,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=t.reflectedLight;let g=d.add(h);null!==u&&(g=zi(null!==l?l.mix(g,u):u),t.material.transparent=!0),n.assign(g),o.assign(c.add(p)),s.assign(n.add(o)),r.finish(t,a,e),s=s.bypass(e.removeStack())}return s}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 ux extends Ds{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=ws.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({material:e}){lx.assign(e.shadowPositionNode||gl)}dispose(){this.updateBeforeType=ws.NONE}}const lx=zi().toVar("shadowPositionWorld");function dx(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 cx(e,t){return t=dx(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function hx(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 px(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function gx(e,t){return t=px(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function mx(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function fx(e,t,r){return r=gx(t,r=cx(e,r))}function yx(e,t,r){hx(e,r),mx(t,r)}var xx=Object.freeze({__proto__:null,resetRendererAndSceneState:fx,resetRendererState:cx,resetSceneState:gx,restoreRendererAndSceneState:yx,restoreRendererState:hx,restoreSceneState:mx,saveRendererAndSceneState:function(e,t,r={}){return r=px(t,r=dx(e,r))},saveRendererState:dx,saveSceneState:px});const bx=new WeakMap,Tx=Ei((([e,t,r])=>{let s=gl.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),_x=e=>{let t=bx.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=Gl("near","float",t).setGroup(on),s=Gl("far","float",t).setGroup(on),i=Yu(e);return Tx(i,r,s)})(e):null;t=new lh,t.colorNode=ji(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,bx.set(e,t)}return t},vx=Ei((({depthTexture:e,shadowCoord:t})=>Bu(e,t.xy).compare(t.z))),Nx=Ei((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Bu(e,t).compare(r),i=Gl("mapSize","vec2",r).setGroup(on),n=Gl("radius","float",r).setGroup(on),o=Vi(1).div(i),a=o.x.negate().mul(n),u=o.y.negate().mul(n),l=o.x.mul(n),d=o.y.mul(n),c=a.div(2),h=u.div(2),p=l.div(2),g=d.div(2);return jn(s(t.xy.add(Vi(a,u)),t.z),s(t.xy.add(Vi(0,u)),t.z),s(t.xy.add(Vi(l,u)),t.z),s(t.xy.add(Vi(c,h)),t.z),s(t.xy.add(Vi(0,h)),t.z),s(t.xy.add(Vi(p,h)),t.z),s(t.xy.add(Vi(a,0)),t.z),s(t.xy.add(Vi(c,0)),t.z),s(t.xy,t.z),s(t.xy.add(Vi(p,0)),t.z),s(t.xy.add(Vi(l,0)),t.z),s(t.xy.add(Vi(c,g)),t.z),s(t.xy.add(Vi(0,g)),t.z),s(t.xy.add(Vi(p,g)),t.z),s(t.xy.add(Vi(a,d)),t.z),s(t.xy.add(Vi(0,d)),t.z),s(t.xy.add(Vi(l,d)),t.z)).mul(1/17)})),Sx=Ei((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Bu(e,t).compare(r),i=Gl("mapSize","vec2",r).setGroup(on),n=Vi(1).div(i),o=n.x,a=n.y,u=t.xy,l=Uo(u.mul(i).add(.5));return u.subAssign(l.mul(n)),jn(s(u,t.z),s(u.add(Vi(o,0)),t.z),s(u.add(Vi(0,a)),t.z),s(u.add(n),t.z),fa(s(u.add(Vi(o.negate(),0)),t.z),s(u.add(Vi(o.mul(2),0)),t.z),l.x),fa(s(u.add(Vi(o.negate(),a)),t.z),s(u.add(Vi(o.mul(2),a)),t.z),l.x),fa(s(u.add(Vi(0,a.negate())),t.z),s(u.add(Vi(0,a.mul(2))),t.z),l.y),fa(s(u.add(Vi(o,a.negate())),t.z),s(u.add(Vi(o,a.mul(2))),t.z),l.y),fa(fa(s(u.add(Vi(o.negate(),a.negate())),t.z),s(u.add(Vi(o.mul(2),a.negate())),t.z),l.x),fa(s(u.add(Vi(o.negate(),a.mul(2))),t.z),s(u.add(Vi(o.mul(2),a.mul(2))),t.z),l.x),l.y)).mul(1/9)})),Ax=Ei((({depthTexture:e,shadowCoord:t})=>{const r=Pi(1).toVar(),s=Bu(e).sample(t.xy).rg,i=sa(t.z,s.x);return Bi(i.notEqual(Pi(1)),(()=>{const e=t.z.sub(s.x),n=ta(0,s.y.mul(s.y));let o=n.div(n.add(e.mul(e)));o=ya(qn(o,.3).div(.95-.3)),r.assign(ya(ta(i,o)))})),r})),Rx=Ei((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Pi(0).toVar(),n=Pi(0).toVar(),o=e.lessThanEqual(Pi(1)).select(Pi(0),Pi(2).div(e.sub(1))),a=e.lessThanEqual(Pi(1)).select(Pi(0),Pi(-1));yc({start:Ii(0),end:Ii(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Pi(e).mul(o)),l=s.sample(jn(Pc.xy,Vi(0,u).mul(t)).div(r)).x;i.addAssign(l),n.addAssign(l.mul(l))})),i.divAssign(e),n.divAssign(e);const u=Eo(n.sub(i.mul(i)));return Vi(i,u)})),Cx=Ei((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Pi(0).toVar(),n=Pi(0).toVar(),o=e.lessThanEqual(Pi(1)).select(Pi(0),Pi(2).div(e.sub(1))),a=e.lessThanEqual(Pi(1)).select(Pi(0),Pi(-1));yc({start:Ii(0),end:Ii(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Pi(e).mul(o)),l=s.sample(jn(Pc.xy,Vi(u,0).mul(t)).div(r));i.addAssign(l.x),n.addAssign(jn(l.y.mul(l.y),l.x.mul(l.x)))})),i.divAssign(e),n.divAssign(e);const u=Eo(n.sub(i.mul(i)));return Vi(i,u)})),Ex=[vx,Nx,Sx,Ax];let wx;const Mx=new mf;class Bx extends ux{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.isShadowNode=!0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){const n=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});return n.select(o,Pi(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=Gl("bias","float",r).setGroup(on);let n,o=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)o=o.xyz.div(o.w),n=o.z,s.coordinateSystem===l&&(n=n.mul(2).sub(1));else{const e=o.w;o=o.xy.div(e);const t=Gl("near","float",r.camera).setGroup(on),s=Gl("far","float",r.camera).setGroup(on);n=Jc(e.negate(),t,s)}return o=zi(o.x,o.y.oneMinus(),n.add(i)),o}getShadowFilterFn(e){return Ex[e]}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,n=new B(s.mapSize.width,s.mapSize.height);n.compareFunction=Ce;const o=e.createRenderTarget(s.mapSize.width,s.mapSize.height);if(o.depthTexture=n,s.camera.updateProjectionMatrix(),i===Ee){n.compareFunction=null,this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:we,type:xe}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:we,type:xe});const t=Bu(n),r=Bu(this.vsmShadowMapVertical.texture),i=Gl("blurSamples","float",s).setGroup(on),o=Gl("radius","float",s).setGroup(on),a=Gl("mapSize","vec2",s).setGroup(on);let u=this.vsmMaterialVertical||(this.vsmMaterialVertical=new lh);u.fragmentNode=Rx({samples:i,radius:o,size:a,shadowPass:t}).context(e.getSharedContext()),u.name="VSMVertical",u=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new lh),u.fragmentNode=Cx({samples:i,radius:o,size:a,shadowPass:r}).context(e.getSharedContext()),u.name="VSMHorizontal"}const a=Gl("intensity","float",s).setGroup(on),u=Gl("normalBias","float",s).setGroup(on),l=Jy(r).mul(lx.add(Cl.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===Ee?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:o.texture,depthTexture:h,shadowCoord:d,shadow:s}),g=Bu(o.texture,d),m=fa(1,p.rgb.mix(g,1),a.mul(g.a)).toVar();return this.shadowMap=o,this.shadow.map=o,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return Ei((()=>{let t=this._node;return this.setupShadowPosition(e),null===t&&(this._node=t=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(t=e.material.receivedShadowNode(t)),t}))()}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),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:o}=e,a=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u,s.camera.layers.mask=o.layers.mask;const l=i.getRenderObjectFunction(),d=i.getMRT(),c=!!d&&d.has("velocity");wx=fx(i,n,wx),n.overrideMaterial=_x(r),i.setRenderObjectFunction(((e,t,r,n,u,l,...d)=>{(!0===e.castShadow||e.receiveShadow&&a===Ee)&&(c&&(Ss(e).useVelocity=!0),e.onBeforeShadow(i,e,o,s.camera,n,t.overrideMaterial,l),i.renderObject(e,t,r,n,u,l,...d),e.onAfterShadow(i,e,o,s.camera,n,t.overrideMaterial,l))})),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(l),!0!==r.isPointLight&&a===Ee&&this.vsmPass(i),yx(i,n,wx)}vsmPass(e){const{shadow:t}=this;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height),e.setRenderTarget(this.vsmShadowMapVertical),Mx.material=this.vsmMaterialVertical,Mx.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),Mx.material=this.vsmMaterialHorizontal,Mx.render(e)}dispose(){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),super.dispose()}updateBefore(e){const{shadow:t}=this;(t.needsUpdate||t.autoUpdate)&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const Fx=(e,t)=>Ni(new Bx(e,t));class Ux extends Sc{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||ln(this.color).setGroup(on),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=ws.FRAME}customCacheKey(){return gs(this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}setupShadowNode(){return Fx(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const t=this.light.shadow.shadowNode;let s;s=void 0!==t?Ni(t):this.setupShadowNode(e),this.shadowNode=s,this.shadowColorNode=r=this.colorNode.mul(s),this.baseColorNode=this.colorNode}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)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const Px=Ei((e=>{const{lightDistance:t,cutoffDistance:r,decayExponent:s}=e,i=t.pow(s).max(.01).reciprocal();return r.greaterThan(0).select(i.mul(t.div(r).pow4().oneMinus().clamp().pow2()),i)})),Ix=new e,Lx=Ei((([e,t])=>{const r=e.toVar(),s=Go(r),i=Kn(1,ta(s.x,ta(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=Vi(r.xy).toVar(),o=t.mul(1.5).oneMinus();return Bi(s.z.greaterThanEqual(o),(()=>{Bi(r.z.greaterThan(0),(()=>{n.x.assign(qn(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(o),(()=>{const e=ko(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(o),(()=>{const e=ko(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))})),Vi(.125,.25).mul(n).add(Vi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),Dx=Ei((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>Bu(e,Lx(t,s.y)).compare(r))),Vx=Ei((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=Gl("radius","float",i).setGroup(on),o=Vi(-1,1).mul(n).mul(s.y);return Bu(e,Lx(t.add(o.xyy),s.y)).compare(r).add(Bu(e,Lx(t.add(o.yyy),s.y)).compare(r)).add(Bu(e,Lx(t.add(o.xyx),s.y)).compare(r)).add(Bu(e,Lx(t.add(o.yyx),s.y)).compare(r)).add(Bu(e,Lx(t,s.y)).compare(r)).add(Bu(e,Lx(t.add(o.xxy),s.y)).compare(r)).add(Bu(e,Lx(t.add(o.yxy),s.y)).compare(r)).add(Bu(e,Lx(t.add(o.xxx),s.y)).compare(r)).add(Bu(e,Lx(t.add(o.yxx),s.y)).compare(r)).mul(1/9)})),Ox=Ei((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),o=ln("float").setGroup(on).onRenderUpdate((()=>s.camera.near)),a=ln("float").setGroup(on).onRenderUpdate((()=>s.camera.far)),u=Gl("bias","float",s).setGroup(on),l=ln(s.mapSize).setGroup(on),d=Pi(1).toVar();return Bi(n.sub(a).lessThanEqual(0).and(n.sub(o).greaterThanEqual(0)),(()=>{const r=n.sub(o).div(a.sub(o)).toVar();r.addAssign(u);const c=i.normalize(),h=Vi(1).div(l.mul(Vi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),Gx=new s,kx=new t,zx=new t;class $x extends Bx{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Me?Dx:Vx}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return Ox({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,o=t.getFrameExtents();zx.copy(t.mapSize),zx.multiply(o),r.setSize(zx.width,zx.height),kx.copy(t.mapSize);const a=i.autoClear,u=i.getClearColor(Ix),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;e{const n=i.context.lightingModel,o=t.sub(fl),a=o.normalize(),u=o.length(),l=Px({lightDistance:u,cutoffDistance:r,decayExponent:s}),d=e.mul(l),c=i.context.reflectedLight;n.direct({lightDirection:a,lightColor:d,reflectedLight:c},i.stack,i)}));class Hx extends Ux{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=ln(0).setGroup(on),this.decayExponentNode=ln(2).setGroup(on)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return((e,t)=>Ni(new $x(e,t)))(this.light)}setup(e){super.setup(e),Wx({color:this.colorNode,lightViewPosition:sx(this.light),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode}).append()}}const jx=Ei((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),qx=Ei((([e=Au()],{renderer:t,material:r})=>{const s=Pi(1).toVar(),i=ma(e.mul(2).sub(1));if(r.alphaToCoverage&&t.samples>1){const e=Pi(i.fwidth()).toVar();s.assign(Ta(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();return s})),Xx=Ei((([e,t,r])=>{const s=Pi(r).toVar(),i=Pi(t).toVar(),n=Di(e).toVar();return wa(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Kx=Ei((([e,t])=>{const r=Di(t).toVar(),s=Pi(e).toVar();return wa(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),Yx=Ei((([e])=>{const t=Pi(e).toVar();return Ii(Mo(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),Qx=Ei((([e,t])=>{const r=Pi(e).toVar();return t.assign(Yx(r)),r.sub(Pi(t))})),Zx=Dm([Ei((([e,t,r,s,i,n])=>{const o=Pi(n).toVar(),a=Pi(i).toVar(),u=Pi(s).toVar(),l=Pi(r).toVar(),d=Pi(t).toVar(),c=Pi(e).toVar(),h=Pi(qn(1,a)).toVar();return qn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).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"}]}),Ei((([e,t,r,s,i,n])=>{const o=Pi(n).toVar(),a=Pi(i).toVar(),u=zi(s).toVar(),l=zi(r).toVar(),d=zi(t).toVar(),c=zi(e).toVar(),h=Pi(qn(1,a)).toVar();return qn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).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"}]})]),Jx=Dm([Ei((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Pi(d).toVar(),h=Pi(l).toVar(),p=Pi(u).toVar(),g=Pi(a).toVar(),m=Pi(o).toVar(),f=Pi(n).toVar(),y=Pi(i).toVar(),x=Pi(s).toVar(),b=Pi(r).toVar(),T=Pi(t).toVar(),_=Pi(e).toVar(),v=Pi(qn(1,p)).toVar(),N=Pi(qn(1,h)).toVar();return Pi(qn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]}),Ei((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Pi(d).toVar(),h=Pi(l).toVar(),p=Pi(u).toVar(),g=zi(a).toVar(),m=zi(o).toVar(),f=zi(n).toVar(),y=zi(i).toVar(),x=zi(s).toVar(),b=zi(r).toVar(),T=zi(t).toVar(),_=zi(e).toVar(),v=Pi(qn(1,p)).toVar(),N=Pi(qn(1,h)).toVar();return Pi(qn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]})]),eb=Ei((([e,t,r])=>{const s=Pi(r).toVar(),i=Pi(t).toVar(),n=Li(e).toVar(),o=Li(n.bitAnd(Li(7))).toVar(),a=Pi(Xx(o.lessThan(Li(4)),i,s)).toVar(),u=Pi(Xn(2,Xx(o.lessThan(Li(4)),s,i))).toVar();return Kx(a,Di(o.bitAnd(Li(1)))).add(Kx(u,Di(o.bitAnd(Li(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),tb=Ei((([e,t,r,s])=>{const i=Pi(s).toVar(),n=Pi(r).toVar(),o=Pi(t).toVar(),a=Li(e).toVar(),u=Li(a.bitAnd(Li(15))).toVar(),l=Pi(Xx(u.lessThan(Li(8)),o,n)).toVar(),d=Pi(Xx(u.lessThan(Li(4)),n,Xx(u.equal(Li(12)).or(u.equal(Li(14))),o,i))).toVar();return Kx(l,Di(u.bitAnd(Li(1)))).add(Kx(d,Di(u.bitAnd(Li(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"}]}),rb=Dm([eb,tb]),sb=Ei((([e,t,r])=>{const s=Pi(r).toVar(),i=Pi(t).toVar(),n=Wi(e).toVar();return zi(rb(n.x,i,s),rb(n.y,i,s),rb(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"}]}),ib=Ei((([e,t,r,s])=>{const i=Pi(s).toVar(),n=Pi(r).toVar(),o=Pi(t).toVar(),a=Wi(e).toVar();return zi(rb(a.x,o,n,i),rb(a.y,o,n,i),rb(a.z,o,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"}]}),nb=Dm([sb,ib]),ob=Ei((([e])=>{const t=Pi(e).toVar();return Xn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),ab=Ei((([e])=>{const t=Pi(e).toVar();return Xn(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),ub=Dm([ob,Ei((([e])=>{const t=zi(e).toVar();return Xn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),lb=Dm([ab,Ei((([e])=>{const t=zi(e).toVar();return Xn(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),db=Ei((([e,t])=>{const r=Ii(t).toVar(),s=Li(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Ii(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),cb=Ei((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(db(r,Ii(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(db(e,Ii(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(db(t,Ii(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(db(r,Ii(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(db(e,Ii(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(db(t,Ii(4))),t.addAssign(e)})),hb=Ei((([e,t,r])=>{const s=Li(r).toVar(),i=Li(t).toVar(),n=Li(e).toVar();return s.bitXorAssign(i),s.subAssign(db(i,Ii(14))),n.bitXorAssign(s),n.subAssign(db(s,Ii(11))),i.bitXorAssign(n),i.subAssign(db(n,Ii(25))),s.bitXorAssign(i),s.subAssign(db(i,Ii(16))),n.bitXorAssign(s),n.subAssign(db(s,Ii(4))),i.bitXorAssign(n),i.subAssign(db(n,Ii(14))),s.bitXorAssign(i),s.subAssign(db(i,Ii(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),pb=Ei((([e])=>{const t=Li(e).toVar();return Pi(t).div(Pi(Li(Ii(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),gb=Ei((([e])=>{const t=Pi(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"}]}),mb=Dm([Ei((([e])=>{const t=Ii(e).toVar(),r=Li(Li(1)).toVar(),s=Li(Li(Ii(3735928559)).add(r.shiftLeft(Li(2))).add(Li(13))).toVar();return hb(s.add(Li(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),Ei((([e,t])=>{const r=Ii(t).toVar(),s=Ii(e).toVar(),i=Li(Li(2)).toVar(),n=Li().toVar(),o=Li().toVar(),a=Li().toVar();return n.assign(o.assign(a.assign(Li(Ii(3735928559)).add(i.shiftLeft(Li(2))).add(Li(13))))),n.addAssign(Li(s)),o.addAssign(Li(r)),hb(n,o,a)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Ii(t).toVar(),n=Ii(e).toVar(),o=Li(Li(3)).toVar(),a=Li().toVar(),u=Li().toVar(),l=Li().toVar();return a.assign(u.assign(l.assign(Li(Ii(3735928559)).add(o.shiftLeft(Li(2))).add(Li(13))))),a.addAssign(Li(n)),u.addAssign(Li(i)),l.addAssign(Li(s)),hb(a,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),Ei((([e,t,r,s])=>{const i=Ii(s).toVar(),n=Ii(r).toVar(),o=Ii(t).toVar(),a=Ii(e).toVar(),u=Li(Li(4)).toVar(),l=Li().toVar(),d=Li().toVar(),c=Li().toVar();return l.assign(d.assign(c.assign(Li(Ii(3735928559)).add(u.shiftLeft(Li(2))).add(Li(13))))),l.addAssign(Li(a)),d.addAssign(Li(o)),c.addAssign(Li(n)),cb(l,d,c),l.addAssign(Li(i)),hb(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"}]}),Ei((([e,t,r,s,i])=>{const n=Ii(i).toVar(),o=Ii(s).toVar(),a=Ii(r).toVar(),u=Ii(t).toVar(),l=Ii(e).toVar(),d=Li(Li(5)).toVar(),c=Li().toVar(),h=Li().toVar(),p=Li().toVar();return c.assign(h.assign(p.assign(Li(Ii(3735928559)).add(d.shiftLeft(Li(2))).add(Li(13))))),c.addAssign(Li(l)),h.addAssign(Li(u)),p.addAssign(Li(a)),cb(c,h,p),c.addAssign(Li(o)),h.addAssign(Li(n)),hb(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"}]})]),fb=Dm([Ei((([e,t])=>{const r=Ii(t).toVar(),s=Ii(e).toVar(),i=Li(mb(s,r)).toVar(),n=Wi().toVar();return n.x.assign(i.bitAnd(Ii(255))),n.y.assign(i.shiftRight(Ii(8)).bitAnd(Ii(255))),n.z.assign(i.shiftRight(Ii(16)).bitAnd(Ii(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Ii(t).toVar(),n=Ii(e).toVar(),o=Li(mb(n,i,s)).toVar(),a=Wi().toVar();return a.x.assign(o.bitAnd(Ii(255))),a.y.assign(o.shiftRight(Ii(8)).bitAnd(Ii(255))),a.z.assign(o.shiftRight(Ii(16)).bitAnd(Ii(255))),a})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),yb=Dm([Ei((([e])=>{const t=Vi(e).toVar(),r=Ii().toVar(),s=Ii().toVar(),i=Pi(Qx(t.x,r)).toVar(),n=Pi(Qx(t.y,s)).toVar(),o=Pi(gb(i)).toVar(),a=Pi(gb(n)).toVar(),u=Pi(Zx(rb(mb(r,s),i,n),rb(mb(r.add(Ii(1)),s),i.sub(1),n),rb(mb(r,s.add(Ii(1))),i,n.sub(1)),rb(mb(r.add(Ii(1)),s.add(Ii(1))),i.sub(1),n.sub(1)),o,a)).toVar();return ub(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),Ei((([e])=>{const t=zi(e).toVar(),r=Ii().toVar(),s=Ii().toVar(),i=Ii().toVar(),n=Pi(Qx(t.x,r)).toVar(),o=Pi(Qx(t.y,s)).toVar(),a=Pi(Qx(t.z,i)).toVar(),u=Pi(gb(n)).toVar(),l=Pi(gb(o)).toVar(),d=Pi(gb(a)).toVar(),c=Pi(Jx(rb(mb(r,s,i),n,o,a),rb(mb(r.add(Ii(1)),s,i),n.sub(1),o,a),rb(mb(r,s.add(Ii(1)),i),n,o.sub(1),a),rb(mb(r.add(Ii(1)),s.add(Ii(1)),i),n.sub(1),o.sub(1),a),rb(mb(r,s,i.add(Ii(1))),n,o,a.sub(1)),rb(mb(r.add(Ii(1)),s,i.add(Ii(1))),n.sub(1),o,a.sub(1)),rb(mb(r,s.add(Ii(1)),i.add(Ii(1))),n,o.sub(1),a.sub(1)),rb(mb(r.add(Ii(1)),s.add(Ii(1)),i.add(Ii(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return lb(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),xb=Dm([Ei((([e])=>{const t=Vi(e).toVar(),r=Ii().toVar(),s=Ii().toVar(),i=Pi(Qx(t.x,r)).toVar(),n=Pi(Qx(t.y,s)).toVar(),o=Pi(gb(i)).toVar(),a=Pi(gb(n)).toVar(),u=zi(Zx(nb(fb(r,s),i,n),nb(fb(r.add(Ii(1)),s),i.sub(1),n),nb(fb(r,s.add(Ii(1))),i,n.sub(1)),nb(fb(r.add(Ii(1)),s.add(Ii(1))),i.sub(1),n.sub(1)),o,a)).toVar();return ub(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Ei((([e])=>{const t=zi(e).toVar(),r=Ii().toVar(),s=Ii().toVar(),i=Ii().toVar(),n=Pi(Qx(t.x,r)).toVar(),o=Pi(Qx(t.y,s)).toVar(),a=Pi(Qx(t.z,i)).toVar(),u=Pi(gb(n)).toVar(),l=Pi(gb(o)).toVar(),d=Pi(gb(a)).toVar(),c=zi(Jx(nb(fb(r,s,i),n,o,a),nb(fb(r.add(Ii(1)),s,i),n.sub(1),o,a),nb(fb(r,s.add(Ii(1)),i),n,o.sub(1),a),nb(fb(r.add(Ii(1)),s.add(Ii(1)),i),n.sub(1),o.sub(1),a),nb(fb(r,s,i.add(Ii(1))),n,o,a.sub(1)),nb(fb(r.add(Ii(1)),s,i.add(Ii(1))),n.sub(1),o,a.sub(1)),nb(fb(r,s.add(Ii(1)),i.add(Ii(1))),n,o.sub(1),a.sub(1)),nb(fb(r.add(Ii(1)),s.add(Ii(1)),i.add(Ii(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return lb(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),bb=Dm([Ei((([e])=>{const t=Pi(e).toVar(),r=Ii(Yx(t)).toVar();return pb(mb(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),Ei((([e])=>{const t=Vi(e).toVar(),r=Ii(Yx(t.x)).toVar(),s=Ii(Yx(t.y)).toVar();return pb(mb(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),Ei((([e])=>{const t=zi(e).toVar(),r=Ii(Yx(t.x)).toVar(),s=Ii(Yx(t.y)).toVar(),i=Ii(Yx(t.z)).toVar();return pb(mb(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),Ei((([e])=>{const t=ji(e).toVar(),r=Ii(Yx(t.x)).toVar(),s=Ii(Yx(t.y)).toVar(),i=Ii(Yx(t.z)).toVar(),n=Ii(Yx(t.w)).toVar();return pb(mb(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Tb=Dm([Ei((([e])=>{const t=Pi(e).toVar(),r=Ii(Yx(t)).toVar();return zi(pb(mb(r,Ii(0))),pb(mb(r,Ii(1))),pb(mb(r,Ii(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),Ei((([e])=>{const t=Vi(e).toVar(),r=Ii(Yx(t.x)).toVar(),s=Ii(Yx(t.y)).toVar();return zi(pb(mb(r,s,Ii(0))),pb(mb(r,s,Ii(1))),pb(mb(r,s,Ii(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Ei((([e])=>{const t=zi(e).toVar(),r=Ii(Yx(t.x)).toVar(),s=Ii(Yx(t.y)).toVar(),i=Ii(Yx(t.z)).toVar();return zi(pb(mb(r,s,i,Ii(0))),pb(mb(r,s,i,Ii(1))),pb(mb(r,s,i,Ii(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Ei((([e])=>{const t=ji(e).toVar(),r=Ii(Yx(t.x)).toVar(),s=Ii(Yx(t.y)).toVar(),i=Ii(Yx(t.z)).toVar(),n=Ii(Yx(t.w)).toVar();return zi(pb(mb(r,s,i,n,Ii(0))),pb(mb(r,s,i,n,Ii(1))),pb(mb(r,s,i,n,Ii(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),_b=Ei((([e,t,r,s])=>{const i=Pi(s).toVar(),n=Pi(r).toVar(),o=Ii(t).toVar(),a=zi(e).toVar(),u=Pi(0).toVar(),l=Pi(1).toVar();return yc(o,(()=>{u.addAssign(l.mul(yb(a))),l.mulAssign(i),a.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"}]}),vb=Ei((([e,t,r,s])=>{const i=Pi(s).toVar(),n=Pi(r).toVar(),o=Ii(t).toVar(),a=zi(e).toVar(),u=zi(0).toVar(),l=Pi(1).toVar();return yc(o,(()=>{u.addAssign(l.mul(xb(a))),l.mulAssign(i),a.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"}]}),Nb=Ei((([e,t,r,s])=>{const i=Pi(s).toVar(),n=Pi(r).toVar(),o=Ii(t).toVar(),a=zi(e).toVar();return Vi(_b(a,o,n,i),_b(a.add(zi(Ii(19),Ii(193),Ii(17))),o,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"}]}),Sb=Ei((([e,t,r,s])=>{const i=Pi(s).toVar(),n=Pi(r).toVar(),o=Ii(t).toVar(),a=zi(e).toVar(),u=zi(vb(a,o,n,i)).toVar(),l=Pi(_b(a.add(zi(Ii(19),Ii(193),Ii(17))),o,n,i)).toVar();return ji(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"}]}),Ab=Dm([Ei((([e,t,r,s,i,n,o])=>{const a=Ii(o).toVar(),u=Pi(n).toVar(),l=Ii(i).toVar(),d=Ii(s).toVar(),c=Ii(r).toVar(),h=Ii(t).toVar(),p=Vi(e).toVar(),g=zi(Tb(Vi(h.add(d),c.add(l)))).toVar(),m=Vi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Vi(Vi(Pi(h),Pi(c)).add(m)).toVar(),y=Vi(f.sub(p)).toVar();return Bi(a.equal(Ii(2)),(()=>Go(y.x).add(Go(y.y)))),Bi(a.equal(Ii(3)),(()=>ta(Go(y.x),Go(y.y)))),aa(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"}]}),Ei((([e,t,r,s,i,n,o,a,u])=>{const l=Ii(u).toVar(),d=Pi(a).toVar(),c=Ii(o).toVar(),h=Ii(n).toVar(),p=Ii(i).toVar(),g=Ii(s).toVar(),m=Ii(r).toVar(),f=Ii(t).toVar(),y=zi(e).toVar(),x=zi(Tb(zi(f.add(p),m.add(h),g.add(c)))).toVar();x.subAssign(.5),x.mulAssign(d),x.addAssign(.5);const b=zi(zi(Pi(f),Pi(m),Pi(g)).add(x)).toVar(),T=zi(b.sub(y)).toVar();return Bi(l.equal(Ii(2)),(()=>Go(T.x).add(Go(T.y)).add(Go(T.z)))),Bi(l.equal(Ii(3)),(()=>ta(ta(Go(T.x),Go(T.y)),Go(T.z)))),aa(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"}]})]),Rb=Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Pi(t).toVar(),n=Vi(e).toVar(),o=Ii().toVar(),a=Ii().toVar(),u=Vi(Qx(n.x,o),Qx(n.y,a)).toVar(),l=Pi(1e6).toVar();return yc({start:-1,end:Ii(1),name:"x",condition:"<="},(({x:e})=>{yc({start:-1,end:Ii(1),name:"y",condition:"<="},(({y:t})=>{const r=Pi(Ab(u,e,t,o,a,i,s)).toVar();l.assign(ea(l,r))}))})),Bi(s.equal(Ii(0)),(()=>{l.assign(Eo(l))})),l})).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Cb=Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Pi(t).toVar(),n=Vi(e).toVar(),o=Ii().toVar(),a=Ii().toVar(),u=Vi(Qx(n.x,o),Qx(n.y,a)).toVar(),l=Vi(1e6,1e6).toVar();return yc({start:-1,end:Ii(1),name:"x",condition:"<="},(({x:e})=>{yc({start:-1,end:Ii(1),name:"y",condition:"<="},(({y:t})=>{const r=Pi(Ab(u,e,t,o,a,i,s)).toVar();Bi(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),Bi(s.equal(Ii(0)),(()=>{l.assign(Eo(l))})),l})).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Eb=Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Pi(t).toVar(),n=Vi(e).toVar(),o=Ii().toVar(),a=Ii().toVar(),u=Vi(Qx(n.x,o),Qx(n.y,a)).toVar(),l=zi(1e6,1e6,1e6).toVar();return yc({start:-1,end:Ii(1),name:"x",condition:"<="},(({x:e})=>{yc({start:-1,end:Ii(1),name:"y",condition:"<="},(({y:t})=>{const r=Pi(Ab(u,e,t,o,a,i,s)).toVar();Bi(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)}))}))})),Bi(s.equal(Ii(0)),(()=>{l.assign(Eo(l))})),l})).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),wb=Dm([Rb,Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Pi(t).toVar(),n=zi(e).toVar(),o=Ii().toVar(),a=Ii().toVar(),u=Ii().toVar(),l=zi(Qx(n.x,o),Qx(n.y,a),Qx(n.z,u)).toVar(),d=Pi(1e6).toVar();return yc({start:-1,end:Ii(1),name:"x",condition:"<="},(({x:e})=>{yc({start:-1,end:Ii(1),name:"y",condition:"<="},(({y:t})=>{yc({start:-1,end:Ii(1),name:"z",condition:"<="},(({z:r})=>{const n=Pi(Ab(l,e,t,r,o,a,u,i,s)).toVar();d.assign(ea(d,n))}))}))})),Bi(s.equal(Ii(0)),(()=>{d.assign(Eo(d))})),d})).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Mb=Dm([Cb,Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Pi(t).toVar(),n=zi(e).toVar(),o=Ii().toVar(),a=Ii().toVar(),u=Ii().toVar(),l=zi(Qx(n.x,o),Qx(n.y,a),Qx(n.z,u)).toVar(),d=Vi(1e6,1e6).toVar();return yc({start:-1,end:Ii(1),name:"x",condition:"<="},(({x:e})=>{yc({start:-1,end:Ii(1),name:"y",condition:"<="},(({y:t})=>{yc({start:-1,end:Ii(1),name:"z",condition:"<="},(({z:r})=>{const n=Pi(Ab(l,e,t,r,o,a,u,i,s)).toVar();Bi(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),Bi(s.equal(Ii(0)),(()=>{d.assign(Eo(d))})),d})).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Bb=Dm([Eb,Ei((([e,t,r])=>{const s=Ii(r).toVar(),i=Pi(t).toVar(),n=zi(e).toVar(),o=Ii().toVar(),a=Ii().toVar(),u=Ii().toVar(),l=zi(Qx(n.x,o),Qx(n.y,a),Qx(n.z,u)).toVar(),d=zi(1e6,1e6,1e6).toVar();return yc({start:-1,end:Ii(1),name:"x",condition:"<="},(({x:e})=>{yc({start:-1,end:Ii(1),name:"y",condition:"<="},(({y:t})=>{yc({start:-1,end:Ii(1),name:"z",condition:"<="},(({z:r})=>{const n=Pi(Ab(l,e,t,r,o,a,u,i,s)).toVar();Bi(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)}))}))}))})),Bi(s.equal(Ii(0)),(()=>{d.assign(Eo(d))})),d})).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Fb=Ei((([e])=>{const t=e.y,r=e.z,s=zi().toVar();return Bi(t.lessThan(1e-4),(()=>{s.assign(zi(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(Mo(i)).mul(6).toVar();const n=Ii(Ko(i)),o=i.sub(Pi(n)),a=r.mul(t.oneMinus()),u=r.mul(t.mul(o).oneMinus()),l=r.mul(t.mul(o.oneMinus()).oneMinus());Bi(n.equal(Ii(0)),(()=>{s.assign(zi(r,l,a))})).ElseIf(n.equal(Ii(1)),(()=>{s.assign(zi(u,r,a))})).ElseIf(n.equal(Ii(2)),(()=>{s.assign(zi(a,r,l))})).ElseIf(n.equal(Ii(3)),(()=>{s.assign(zi(a,u,r))})).ElseIf(n.equal(Ii(4)),(()=>{s.assign(zi(l,a,r))})).Else((()=>{s.assign(zi(r,a,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Ub=Ei((([e])=>{const t=zi(e).toVar(),r=Pi(t.x).toVar(),s=Pi(t.y).toVar(),i=Pi(t.z).toVar(),n=Pi(ea(r,ea(s,i))).toVar(),o=Pi(ta(r,ta(s,i))).toVar(),a=Pi(o.sub(n)).toVar(),u=Pi().toVar(),l=Pi().toVar(),d=Pi().toVar();return d.assign(o),Bi(o.greaterThan(0),(()=>{l.assign(a.div(o))})).Else((()=>{l.assign(0)})),Bi(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{Bi(r.greaterThanEqual(o),(()=>{u.assign(s.sub(i).div(a))})).ElseIf(s.greaterThanEqual(o),(()=>{u.assign(jn(2,i.sub(r).div(a)))})).Else((()=>{u.assign(jn(4,r.sub(s).div(a)))})),u.mulAssign(1/6),Bi(u.lessThan(0),(()=>{u.addAssign(1)}))})),zi(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),Pb=Ei((([e])=>{const t=zi(e).toVar(),r=Hi(eo(t,zi(.04045))).toVar(),s=zi(t.div(12.92)).toVar(),i=zi(la(ta(t.add(zi(.055)),zi(0)).div(1.055),zi(2.4))).toVar();return fa(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ib=(e,t)=>{e=Pi(e),t=Pi(t);const r=Vi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return Ta(e.sub(r),e.add(r),t)},Lb=(e,t,r,s)=>fa(e,t,r[s].clamp()),Db=(e,t,r,s,i)=>fa(e,t,Ib(r,s[i])),Vb=Ei((([e,t,r])=>{const s=Fo(e).toVar("nDir"),i=qn(Pi(.5).mul(t.sub(r)),gl).div(s).toVar("rbmax"),n=qn(Pi(-.5).mul(t.sub(r)),gl).div(s).toVar("rbmin"),o=zi().toVar("rbminmax");o.x=s.x.greaterThan(Pi(0)).select(i.x,n.x),o.y=s.y.greaterThan(Pi(0)).select(i.y,n.y),o.z=s.z.greaterThan(Pi(0)).select(i.z,n.z);const a=ea(ea(o.x,o.y),o.z).toVar("correction");return gl.add(s.mul(a)).toVar("boxIntersection").sub(r)})),Ob=Ei((([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(Xn(r,r).sub(Xn(s,s)))),n}));var Gb=Object.freeze({__proto__:null,BRDF_GGX:Zh,BRDF_Lambert:Dh,BasicShadowFilter:vx,Break:xc,Const:Da,Continue:()=>bu("continue").append(),DFGApprox:Jh,D_GGX:Kh,Discard:Tu,EPSILON:fo,F_Schlick:Lh,Fn:Ei,INFINITY:yo,If:Bi,Loop:yc,NodeAccess:Bs,NodeShaderStage:Es,NodeType:Ms,NodeUpdateType:ws,PCFShadowFilter:Nx,PCFSoftShadowFilter:Sx,PI:xo,PI2:bo,Return:()=>bu("return").append(),Schlick_to_F0:tp,ScriptableNodeResources:Cy,ShaderNode:vi,TBNViewMatrix:sd,VSMShadowFilter:Ax,V_GGX_SmithCorrelated:qh,Var:La,abs:Go,acesFilmicToneMapping:py,acos:Vo,add:jn,addMethodChaining:Ys,addNodeElement:function(e){console.warn("THREE.TSLBase: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:yy,all:To,alphaT:Sn,and:so,anisotropy:An,anisotropyB:Cn,anisotropyT:Rn,any:_o,append:Fi,arrayBuffer:e=>Ni(new qs(e,"ArrayBuffer")),asin:Do,assign:zn,atan:Oo,atan2:Aa,atomicAdd:(e,t,r=null)=>Yy(Xy.ATOMIC_ADD,e,t,r),atomicAnd:(e,t,r=null)=>Yy(Xy.ATOMIC_AND,e,t,r),atomicFunc:Yy,atomicMax:(e,t,r=null)=>Yy(Xy.ATOMIC_MAX,e,t,r),atomicMin:(e,t,r=null)=>Yy(Xy.ATOMIC_MIN,e,t,r),atomicOr:(e,t,r=null)=>Yy(Xy.ATOMIC_OR,e,t,r),atomicStore:(e,t,r=null)=>Yy(Xy.ATOMIC_STORE,e,t,r),atomicSub:(e,t,r=null)=>Yy(Xy.ATOMIC_SUB,e,t,r),atomicXor:(e,t,r=null)=>Yy(Xy.ATOMIC_XOR,e,t,r),attenuationColor:On,attenuationDistance:Vn,attribute:Su,attributeArray:(e,t="float")=>{const r=_s(t),s=Ts(t),i=new Nf(e,r,s);return Cf(i,t,e)},backgroundBlurriness:Pf,backgroundIntensity:If,backgroundRotation:Lf,batch:hc,billboarding:$m,bitAnd:ao,bitNot:uo,bitOr:lo,bitXor:co,bitangentGeometry:Ql,bitangentLocal:Zl,bitangentView:Jl,bitangentWorld:ed,bitcast:Zo,blendBurn:Hf,blendColor:Kf,blendDodge:jf,blendOverlay:Xf,blendScreen:qf,blur:Jp,bool:Di,buffer:Pu,bufferAttribute:nu,bumpMap:hd,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),Hf(e)),bvec2:ki,bvec3:Hi,bvec4:Ki,bypass:gu,cache:hu,call:Wn,cameraFar:Gu,cameraIndex:Vu,cameraNear:Ou,cameraNormalMatrix:Hu,cameraPosition:ju,cameraProjectionMatrix:ku,cameraProjectionMatrixInverse:zu,cameraViewMatrix:$u,cameraWorldMatrix:Wu,cbrt:ga,cdl:ty,ceil:Bo,checker:jx,cineonToneMapping:cy,clamp:ya,clearcoat:yn,clearcoatRoughness:xn,code:Ty,color:Ui,colorSpaceToWorking:Ya,colorToDirection:e=>Ni(e).mul(2).sub(1),compute:du,cond:Ma,context:Fa,convert:en,convertColorSpace:(e,t,r)=>Ni(new ja(Ni(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():xf(e,...t),cos:Io,cross:ua,cubeTexture:Dl,dFdx:Ho,dFdy:jo,dashSize:Fn,defaultBuildStages:Us,defaultShaderStages:Fs,defined:Ti,degrees:No,deltaTime:Om,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),Uy(e,Fy(t))},densityFogFactor:Fy,depth:th,depthPass:(e,t,r)=>Ni(new ay(ay.DEPTH,e,t,r)),difference:oa,diffuseColor:pn,directPointLight:Wx,directionToColor:bh,dispersion:Gn,distance:na,div:Kn,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),jf(e)),dot:aa,drawIndex:oc,dynamicBufferAttribute:ou,element:Ji,emissive:gn,equal:Qn,equals:Jo,equirectUV:Nh,exp:So,exp2:Ao,expression:bu,faceDirection:Tl,faceForward:_a,faceforward:Ra,float:Pi,floor:Mo,fog:Uy,fract:Uo,frameGroup:nn,frameId:Gm,frontFacing:bl,fwidth:Yo,gain:(e,t)=>e.lessThan(.5)?Bm(e.mul(2),t).div(2):qn(1,Bm(Xn(qn(1,e),2),t).div(2)),gapSize:Un,getConstNodeType:_i,getCurrentStack:Mi,getDirection:Kp,getDistanceAttenuation:Px,getGeometryRoughness:Hh,getNormalFromDepth:_f,getParallaxCorrectNormal:Vb,getRoughness:jh,getScreenPosition:Tf,getShIrradianceAt:Ob,getTextureIndex:Cm,getViewPosition:bf,globalId:zy,glsl:(e,t)=>Ty(e,t,"glsl"),glslFn:(e,t)=>vy(e,t,"glsl"),grayscale:Yf,greaterThan:eo,greaterThanEqual:ro,hash:Mm,highpModelNormalViewMatrix:dl,highpModelViewMatrix:ll,hue:Jf,instance:uc,instanceIndex:rc,instancedArray:(e,t="float")=>{const r=_s(t),s=Ts(t),i=new vf(e,r,s);return Cf(i,t,e)},instancedBufferAttribute:au,instancedDynamicBufferAttribute:uu,instancedMesh:dc,int:Ii,inverseSqrt:wo,inversesqrt:Ca,invocationLocalIndex:nc,invocationSubgroupIndex:ic,ior:In,iridescence:_n,iridescenceIOR:vn,iridescenceThickness:Nn,ivec2:Oi,ivec3:$i,ivec4:qi,js:(e,t)=>Ty(e,t,"js"),label:Ua,length:zo,lengthSq:ma,lessThan:Jn,lessThanEqual:to,lightPosition:tx,lightProjectionUV:ex,lightShadowMatrix:Jy,lightTargetDirection:ix,lightTargetPosition:rx,lightViewPosition:sx,lightingContext:Cc,lights:(e=[])=>Ni(new ax).setLights(e),linearDepth:rh,linearToneMapping:ly,localId:$y,log:Ro,log2:Co,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(Ro(r.div(t)));return Pi(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("TSL.LoopNode: loop() has been renamed to Loop()."),yc(...e)),luminance:ey,mat2:Yi,mat3:Qi,mat4:Zi,matcapUV:Tg,materialAO:Qd,materialAlphaTest:md,materialAnisotropy:Pd,materialAnisotropyVector:Zd,materialAttenuationColor:zd,materialAttenuationDistance:kd,materialClearcoat:Ed,materialClearcoatNormal:Md,materialClearcoatRoughness:wd,materialColor:fd,materialDispersion:Kd,materialEmissive:xd,materialIOR:Gd,materialIridescence:Id,materialIridescenceIOR:Ld,materialIridescenceThickness:Dd,materialLightMap:Yd,materialLineDashOffset:qd,materialLineDashSize:Wd,materialLineGapSize:Hd,materialLineScale:$d,materialLineWidth:jd,materialMetalness:Rd,materialNormal:Cd,materialOpacity:bd,materialPointSize:Xd,materialReference:$l,materialReflectivity:Sd,materialRefractionRatio:Bl,materialRotation:Bd,materialRoughness:Ad,materialSheen:Fd,materialSheenRoughness:Ud,materialShininess:yd,materialSpecular:Td,materialSpecularColor:vd,materialSpecularIntensity:_d,materialSpecularStrength:Nd,materialThickness:Od,materialTransmission:Vd,max:ta,maxMipLevel:wu,mediumpModelViewMatrix:ul,metalness:fn,min:ea,mix:fa,mixElement:Na,mod:ra,modInt:Yn,modelDirection:el,modelNormalMatrix:nl,modelPosition:rl,modelScale:sl,modelViewMatrix:al,modelViewPosition:il,modelViewProjection:Jd,modelWorldMatrix:tl,modelWorldMatrixInverse:ol,morphReference:Nc,mrt:wm,mul:Xn,mx_aastep:Ib,mx_cell_noise_float:(e=Au())=>bb(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>Pi(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=Au(),t=3,r=2,s=.5,i=1)=>_b(e,Ii(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Au(),t=3,r=2,s=.5,i=1)=>Nb(e,Ii(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Au(),t=3,r=2,s=.5,i=1)=>vb(e,Ii(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Au(),t=3,r=2,s=.5,i=1)=>Sb(e,Ii(t),r,s).mul(i),mx_hsvtorgb:Fb,mx_noise_float:(e=Au(),t=1,r=0)=>yb(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Au(),t=1,r=0)=>xb(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Au(),t=1,r=0)=>{e=e.convert("vec2|vec3");return ji(xb(e),yb(e.add(Vi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=Au())=>Lb(e,t,r,"x"),mx_ramptb:(e,t,r=Au())=>Lb(e,t,r,"y"),mx_rgbtohsv:Ub,mx_safepower:(e,t=1)=>(e=Pi(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=Au())=>Db(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Au())=>Db(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:Pb,mx_transform_uv:(e=1,t=0,r=Au())=>r.mul(e).add(t),mx_worley_noise_float:(e=Au(),t=1)=>wb(e.convert("vec2|vec3"),t,Ii(1)),mx_worley_noise_vec2:(e=Au(),t=1)=>Mb(e.convert("vec2|vec3"),t,Ii(1)),mx_worley_noise_vec3:(e=Au(),t=1)=>Bb(e.convert("vec2|vec3"),t,Ii(1)),negate:$o,neutralToneMapping:xy,nodeArray:Ai,nodeImmutable:Ci,nodeObject:Ni,nodeObjects:Si,nodeProxy:Ri,normalFlat:Nl,normalGeometry:_l,normalLocal:vl,normalMap:ud,normalView:Sl,normalWorld:Al,normalize:Fo,not:no,notEqual:Zn,numWorkgroups:Gy,objectDirection:Xu,objectGroup:an,objectPosition:Yu,objectScale:Qu,objectViewPosition:Zu,objectWorldMatrix:Ku,oneMinus:Wo,or:io,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=Vm)=>e.fract(),oscSine:(e=Vm)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=Vm)=>e.fract().round(),oscTriangle:(e=Vm)=>e.add(.5).fract().mul(2).sub(1).abs(),output:Bn,outputStruct:Rm,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),Xf(e)),overloadingFn:Dm,parabola:Bm,parallaxDirection:id,parallaxUV:(e,t)=>e.sub(id.mul(t)),parameter:(e,t)=>Ni(new vm(e,t)),pass:(e,t,r)=>Ni(new ay(ay.COLOR,e,t,r)),passTexture:(e,t)=>Ni(new ny(e,t)),pcurve:(e,t,r)=>la(Kn(la(e,t),jn(la(e,t),la(qn(1,e),r))),1/t),perspectiveDepthToViewZ:Zc,pmremTexture:ig,pointUV:Mf,pointWidth:Pn,positionGeometry:cl,positionLocal:hl,positionPrevious:pl,positionView:fl,positionViewDirection:yl,positionWorld:gl,positionWorldDirection:ml,posterize:sy,pow:la,pow2:da,pow3:ca,pow4:ha,property:cn,radians:vo,rand:va,range:Dy,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),Uy(e,By(t,r))},rangeFogFactor:By,reciprocal:Xo,reference:Gl,referenceBuffer:kl,reflect:ia,reflectVector:Pl,reflectView:Fl,reflector:e=>Ni(new df(e)),refract:ba,refractVector:Il,refractView:Ul,reinhardToneMapping:dy,remainder:go,remap:fu,remapClamp:yu,renderGroup:on,renderOutput:vu,rendererReference:eu,rotate:Sg,rotateUV:km,roughness:mn,round:qo,rtt:xf,sRGBTransferEOTF:za,sRGBTransferOETF:$a,sampler:e=>(!0===e.isNode?e:Bu(e)).convert("sampler"),saturate:xa,saturation:Qf,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),qf(e)),screenCoordinate:Pc,screenSize:Uc,screenUV:Fc,scriptable:wy,scriptableValue:Sy,select:wa,setCurrentStack:wi,shaderStages:Ps,shadow:Fx,shadowPositionWorld:lx,shapeCircle:qx,sharedUniformGroup:sn,sheen:bn,sheenRoughness:Tn,shiftLeft:ho,shiftRight:po,shininess:Mn,sign:ko,sin:Po,sinc:(e,t)=>Po(xo.mul(t.mul(e).sub(1))).div(xo.mul(t.mul(e).sub(1))),skinning:e=>Ni(new gc(e)),skinningReference:mc,smoothstep:Ta,smoothstepElement:Sa,specularColor:En,specularF90:wn,spherizeUV:zm,split:(e,t)=>Ni(new $s(Ni(e),t)),spritesheetUV:jm,sqrt:Eo,stack:Sm,step:sa,storage:Cf,storageBarrier:()=>Hy("storage").append(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),Cf(e,t,r).setPBO(!0)),storageTexture:Vf,string:(e="")=>Ni(new qs(e,"string")),sub:qn,subgroupIndex:sc,subgroupSize:Wy,tan:Lo,tangentGeometry:Wl,tangentLocal:Hl,tangentView:jl,tangentWorld:ql,temp:Va,texture:Bu,texture3D:Pg,textureBarrier:()=>Hy("texture").append(),textureBicubic:bp,textureCubeUV:Yp,textureLoad:Fu,textureSize:Cu,textureStore:(e,t,r)=>{const s=Vf(e,t,r);return null!==r&&s.append(),s},thickness:Dn,time:Vm,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),Om.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),Vm.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),Vm.mul(e)),toOutputColorSpace:qa,toWorkingColorSpace:Xa,toneMapping:ru,toneMappingExposure:su,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Ni(new uy(t,r,Ni(s),Ni(i),Ni(n))),transformDirection:pa,transformNormal:wl,transformNormalToView:Ml,transformedBentNormalView:nd,transformedBitangentView:td,transformedBitangentWorld:rd,transformedClearcoatNormalView:El,transformedNormalView:Rl,transformedNormalWorld:Cl,transformedTangentView:Xl,transformedTangentWorld:Kl,transmission:Ln,transpose:Qo,triNoise3D:Pm,triplanarTexture:(...e)=>Xm(...e),triplanarTextures:Xm,trunc:Ko,tslFn:(...e)=>(console.warn("TSL.ShaderNode: tslFn() has been renamed to Fn()."),Ei(...e)),uint:Li,uniform:ln,uniformArray:Du,uniformGroup:rn,uniforms:(e,t)=>(console.warn("TSL.UniformArrayNode: uniforms() has been renamed to uniformArray()."),Ni(new Lu(e,t))),userData:(e,t,r)=>Ni(new Of(e,t,r)),uv:Au,uvec2:Gi,uvec3:Wi,uvec4:Xi,varying:Ga,varyingProperty:hn,vec2:Vi,vec3:zi,vec4:ji,vectorComponents:Is,velocity:Wf,vertexColor:e=>Ni(new Ef(e)),vertexIndex:tc,vertexStage:ka,vibrance:Zf,viewZToLogarithmicDepth:Jc,viewZToOrthographicDepth:Yc,viewZToPerspectiveDepth:Qc,viewport:Ic,viewportBottomLeft:kc,viewportCoordinate:Dc,viewportDepthTexture:Xc,viewportLinearDepth:sh,viewportMipTexture:Hc,viewportResolution:Oc,viewportSafeUV:Wm,viewportSharedTexture:fh,viewportSize:Lc,viewportTexture:Wc,viewportTopLeft:Gc,viewportUV:Vc,wgsl:(e,t)=>Ty(e,t,"wgsl"),wgslFn:(e,t)=>vy(e,t,"wgsl"),workgroupArray:(e,t)=>Ni(new qy("Workgroup",e,t)),workgroupBarrier:()=>Hy("workgroup").append(),workgroupId:ky,workingToColorSpace:Ka,xor:oo});const kb=new _m;class zb extends zg{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(kb,Re),kb.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(kb,Re),kb.a=1,n=!0;else if(!0===i.isNode){const r=this.get(e),n=i;kb.copy(s._clearColor);let o=r.backgroundMesh;if(void 0===o){const e=Fa(ji(n).mul(If),{getUV:()=>Lf.mul(Al),getTextureLevel:()=>Pf});let t=Jd;t=t.setZ(t.w);const s=new lh;s.name="Background.material",s.side=T,s.depthTest=!1,s.depthWrite=!1,s.fog=!1,s.lights=!1,s.vertexNode=t,s.colorNode=e,r.backgroundMeshNode=e,r.backgroundMesh=o=new G(new Be(1,32,32),s),o.frustumCulled=!1,o.name="Background.mesh",o.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)}}const a=n.getCacheKey();r.backgroundCacheKey!==a&&(r.backgroundMeshNode.node=ji(n).mul(If),r.backgroundMeshNode.needsUpdate=!0,o.material.needsUpdate=!0,r.backgroundCacheKey=a),t.unshift(o,o.geometry,o.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const o=s.xr.getEnvironmentBlendMode();if("additive"===o?kb.set(0,0,0,1):"alpha-blend"===o&&kb.set(0,0,0,0),!0===s.autoClear||!0===n){const e=r.clearColorValue;e.r=kb.r,e.g=kb.g,e.b=kb.b,e.a=kb.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(e.r*=e.a,e.g*=e.a,e.b*=e.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 $b=0;class Wb{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=$b++}}class Hb{constructor(e,t,r,s,i,n,o,a,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=o,this.updateAfterNodes=a,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 Wb(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class jb{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class qb{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}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 Xb{constructor(e,t,r=!1){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r}}class Kb extends Xb{constructor(e,t){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0}}class Yb{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let Qb=0;class Zb{constructor(e=null){this.id=Qb++,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 Jb extends Ds{static get type(){return"StructTypeNode"}constructor(e,t){super(),this.name=e,this.types=t,this.isStructTypeNode=!0}getMemberTypes(){return this.types}}class eT{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class tT extends eT{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class rT extends eT{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class sT extends eT{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class iT extends eT{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class nT extends eT{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class oT extends eT{constructor(e,t=new i){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class aT extends eT{constructor(e,t=new n){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class uT extends tT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class lT extends rT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class dT extends sT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class cT extends iT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class hT extends nT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class pT extends oT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class gT extends aT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const mT=[.125,.215,.35,.446,.526,.582],fT=20,yT=new Te(-1,1,1,-1,0,1),xT=new Ue(90,1),bT=new e;let TT=null,_T=0,vT=0;const NT=(1+Math.sqrt(5))/2,ST=1/NT,AT=[new r(-NT,ST,0),new r(NT,ST,0),new r(-ST,0,NT),new r(ST,0,NT),new r(0,NT,-ST),new r(0,NT,ST),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],RT=new WeakMap,CT=[3,1,5,0,4,2],ET=Kp(Au(),Su("faceIndex")).normalize(),wT=zi(ET.x,ET.y,ET.z);class MT{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=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=null){if(this._setSize(256),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=i||this._allocateTargets();return this.fromSceneAsync(e,t,r,s,n),n}TT=this._renderer.getRenderTarget(),_T=this._renderer.getActiveCubeFace(),vT=this._renderer.getActiveMipmapLevel();const n=i||this._allocateTargets();return n.depthBuffer=!0,this._sceneToCubeUV(e,r,s,n),t>0&&this._blur(n,0,0,t),this._applyPMREM(n),this._cleanup(n),n}async fromSceneAsync(e,t=0,r=.1,s=100,i=null){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=PT(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=IT(),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===_||e.mapping===v?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._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=mT[a-e+4-1]:0===a&&(u=0),s.push(u);const l=1/(o-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,x=new Float32Array(m*g*p),b=new Float32Array(f*g*p),T=new Float32Array(y*g*p);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=CT[e];x.set(s,m*g*i),b.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new _e;_.setAttribute("position",new Ne(x,m)),_.setAttribute("uv",new Ne(b,f)),_.setAttribute("faceIndex",new Ne(T,y)),t.push(_),i.push(new G(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=Du(new Array(fT).fill(0)),n=ln(new r(0,1,0)),o=ln(0),a=Pi(fT),u=ln(0),l=ln(1),d=Bu(null),c=ln(0),h=Pi(1/t),p=Pi(1/s),g=Pi(e),m={n:a,latitudinal:u,weights:i,poleAxis:n,outputDirection:wT,dTheta:o,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=UT("blur");return f.fragmentNode=Jp({...m,latitudinal:u.equal(1)}),RT.set(f,m),f}(i,e,t)}return i}async _compileMaterial(e){const t=new G(this._lodPlanes[0],e);await this._renderer.compile(t,yT)}_sceneToCubeUV(e,t,r,s){const i=xT;i.near=t,i.far=r;const n=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],a=this._renderer,u=a.autoClear;a.getClearColor(bT),a.autoClear=!1;let l=this._backgroundBox;if(null===l){const e=new Y({name:"PMREM.Background",side:T,depthWrite:!1,depthTest:!1});l=new G(new O,e)}let d=!1;const c=e.background;c?c.isColor&&(l.material.color.copy(c),e.background=null,d=!0):(l.material.color.copy(bT),d=!0),a.setRenderTarget(s),a.clear(),d&&a.render(l,i);for(let t=0;t<6;t++){const r=t%3;0===r?(i.up.set(0,n[t],0),i.lookAt(o[t],0,0)):1===r?(i.up.set(0,0,n[t]),i.lookAt(0,o[t],0)):(i.up.set(0,n[t],0),i.lookAt(0,0,o[t]));const u=this._cubeSize;FT(s,r*u,t>2?u:0,u,u),a.render(e,i)}a.autoClear=u,e.background=c}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===_||e.mapping===v;s?null===this._cubemapMaterial&&(this._cubemapMaterial=PT(e)):null===this._equirectMaterial&&(this._equirectMaterial=IT(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const o=this._cubeSize;FT(t,0,0,3*o,2*o),r.setRenderTarget(t),r.render(n,yT)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;tfT&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;ey-4?s-y+4:0),4*(this._cubeSize-x),3*x,2*x),a.setRenderTarget(t),a.render(l,yT)}}function BT(e,t,r){const s=new me(e,t,r);return s.texture.mapping=Fe,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function FT(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function UT(e){const t=new lh;return t.depthTest=!1,t.depthWrite=!1,t.blending=L,t.name=`PMREM_${e}`,t}function PT(e){const t=UT("cubemap");return t.fragmentNode=Dl(e,wT),t}function IT(e){const t=UT("equirect");return t.fragmentNode=Bu(e,Nh(wT),0),t}const LT=new WeakMap,DT=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),VT=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class OT{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.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.flow={code:""},this.chaining=[],this.stack=Sm(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new Zb,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.useComparisonMethod=!1}getBindGroupsCache(){let e=LT.get(this.renderer);return void 0===e&&(e=new Dg,LT.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new me(e,t,r)}createCubeRenderTarget(e,t){return new Sh(e,t)}createPMREMGenerator(){return new MT(this.renderer)}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 Wb(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new Wb(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 Ps)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}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")}( ${VT(n.r)}, ${VT(n.g)}, ${VT(n.b)} )`;const o=this.getTypeLength(i),a=this.getComponentType(i),u=e=>this.generateConst(a,e);if(2===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(o>4&&n&&(n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(o>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 jb(e,t);return 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||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===b)return"int";if(t===x)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;const r=bs(e);return("float"===t?"":t[0])+r}getTypeFromArray(e){return DT.get(e.constructor)}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 De||!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")}addStack(){return this.stack=Sm(this.stack),this.stacks.push(Mi()||this.stack),wi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,wi(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);return void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={}),s[t]}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);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new jb("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e,r);let i=s.structType;if(void 0===i){const e=this.structs.index++;i=new Jb("StructType"+e,t),this.structs[r].push(i),s.structType=i}return i}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 o=this.uniforms.index++;n=new qb(s||"nodeUniform"+o,t,e),this.uniforms[r].push(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);let o=n.variable;if(void 0===o){const e=i?"_const":"_var",a=this.vars[s]||(this.vars[s]=[]),u=this.vars[e]||(this.vars[e]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+u,this.vars[e]++),o=new Xb(t,r,i),i||a.push(o),n.variable=o}return o}isDeterministic(e){return e.isMathNode?this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode)):e.isOperatorNode?this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode)):!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this)){const s=this.getDataFromNode(e,"any");let i=s.varying;if(void 0===i){const e=this.varyings,n=e.length;null===t&&(t="nodeVarying"+n),i=new Kb(t,r),e.push(i),s.varying=i}return i}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 Yb("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}buildFunctionNode(e){const t=new _y,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 vm(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.cache,n=this.buildStage,o=this.stack,a={code:""};this.flow=a,this.vars={},this.cache=new Zb,this.stack=Sm();for(const r of Us)this.setBuildStage(r),a.result=e.build(this,t);return a.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.cache=i,this.stack=o,this.setBuildStage(n),a}getFunctionOperator(){return null}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.shaderStage;this.setShaderStage(e);const n=this.flowChildNode(t,r);return null!==s&&(n.code+=`${this.tab+s} = ${n.result};\n`),this.flowCode[e]=this.flowCode[e]+n.code,this.setShaderStage(i),n}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("Abstract function.")}getVar(e,t){return`${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(){console.warn("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(){console.warn("Abstract function.")}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new lh),e.build(this)}else this.addFlow("compute",e);for(const e of Us){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Ps){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}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new uT(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new lT(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new dT(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new cT(e);if("color"===t)return new hT(e);if("mat3"===t)return new pT(e);if("mat4"===t)return new gT(e);throw new Error(`Uniform "${t}" not declared.`)}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?this.format(`${e}.${"xyz".slice(0,i)}`,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${Ve} - Node System\n`}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}}class GT{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={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===ws.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===ws.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===ws.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===ws.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===ws.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===ws.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===ws.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===ws.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===ws.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 kT{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}kT.isNodeFunctionInput=!0;class zT extends Ux{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setup(e){super.setup(e);const t=e.context.lightingModel,r=this.colorNode,s=ix(this.light),i=e.context.reflectedLight;t.direct({lightDirection:s,lightColor:r,reflectedLight:i},e.stack,e)}}const $T=new n,WT=new n;let HT=null;class jT extends Ux{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=ln(new r).setGroup(on),this.halfWidth=ln(new r).setGroup(on),this.updateType=ws.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;WT.identity(),$T.copy(t.matrixWorld),$T.premultiply(r),WT.extractRotation($T),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(WT),this.halfHeight.value.applyMatrix4(WT)}setup(e){let t,r;super.setup(e),e.isAvailable("float32Filterable")?(t=Bu(HT.LTC_FLOAT_1),r=Bu(HT.LTC_FLOAT_2)):(t=Bu(HT.LTC_HALF_1),r=Bu(HT.LTC_HALF_2));const{colorNode:s,light:i}=this,n=e.context.lightingModel,o=sx(i),a=e.context.reflectedLight;n.directRectArea({lightColor:s,lightPosition:o,halfWidth:this.halfWidth,halfHeight:this.halfHeight,reflectedLight:a,ltc_1:t,ltc_2:r},e.stack,e)}static setLTC(e){HT=e}}class qT extends Ux{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=ln(0).setGroup(on),this.penumbraCosNode=ln(0).setGroup(on),this.cutoffDistanceNode=ln(0).setGroup(on),this.decayExponentNode=ln(0).setGroup(on)}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){const{coneCosNode:t,penumbraCosNode:r}=this;return Ta(t,r,e)}setup(e){super.setup(e);const t=e.context.lightingModel,{colorNode:r,cutoffDistanceNode:s,decayExponentNode:i,light:n}=this,o=sx(n).sub(fl),a=o.normalize(),u=a.dot(ix(n)),l=this.getSpotAttenuation(u),d=o.length(),c=Px({lightDistance:d,cutoffDistance:s,decayExponent:i});let h=r.mul(l).mul(c);if(n.map){const e=ex(n),t=Bu(n.map,e.xy).onRenderUpdate((()=>n.map));h=e.mul(2).sub(1).abs().lessThan(1).all().select(h.mul(t),h)}const p=e.context.reflectedLight;t.direct({lightDirection:a,lightColor:h,reflectedLight:p},e.stack,e)}}class XT extends qT{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e){const t=this.light.iesMap;let r=null;if(t&&!0===t.isTexture){const s=e.acos().mul(1/Math.PI);r=Bu(t,Vi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class KT extends Ux{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class YT extends Ux{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=tx(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=ln(new e).setGroup(on)}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=Sl.dot(s).mul(.5).add(.5),n=fa(r,t,i);e.context.irradiance.addAssign(n)}}class QT extends Ux{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=Du(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=Ob(Al,this.lightProbe);e.context.irradiance.addAssign(t)}}class ZT{parseFunction(){console.warn("Abstract function.")}}class JT{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}JT.isNodeFunction=!0;const e_=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,t_=/[a-z_0-9]+/gi,r_="#pragma main";class s_ extends JT{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:o,headerCode:a}=(e=>{const t=(e=e.trim()).indexOf(r_),r=-1!==t?e.slice(t+12):e,s=r.match(e_);if(null!==s&&5===s.length){const i=s[4],n=[];let o=null;for(;null!==(o=t_.exec(i));)n.push(o);const a=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,(()=>{if(!0===r.isCubeTexture||r.mapping===H||r.mapping===j||r.mapping===Fe){if(e.backgroundBlurriness>0||r.mapping===Fe)return ig(r);{let e;return e=!0===r.isCubeTexture?Dl(r):Bu(r),wh(e)}}if(!0===r.isTexture)return Bu(r,Fc.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("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=Gl("color","color",r).setGroup(on),t=Gl("density","float",r).setGroup(on);return Uy(e,Fy(t))}if(r.isFog){const e=Gl("color","color",r).setGroup(on),t=Gl("near","float",r).setGroup(on),s=Gl("far","float",r).setGroup(on);return Uy(e,By(t,s))}console.error("THREE.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?Dl(r):!0===r.isTexture?Bu(r):void console.error("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}hasOutputChange(e){return n_.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=Bu(e,Fc).renderOutput(t.toneMapping,t.currentColorSpace);return n_.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 GT,this.nodeBuilderCache=new Map,this.cacheLib={}}}const l_=new fe;class d_{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new i,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;i=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 o=t[n];o&&o.connect(i)}}function A_(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,o=this._glBaseLayer,a=this.getReferenceSpace(),u=t.getViewerPose(a);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(o.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(e,t,this._renderTarget),n=e.overrideMaterial||r.material,o=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:a,vertexShader:u}=o.getNodeBuilderState();return{fragmentShader:a,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");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 u_(this,r),this._animation=new Lg(this._nodes,this.info),this._attributes=new Xg(r),this._background=new zb(this,this._nodes),this._geometries=new Qg(this._attributes,this.info),this._textures=new Tm(this,r,this.info),this._pipelines=new im(r,this._nodes),this._bindings=new nm(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new kg(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new cm(this.lighting),this._bundles=new p_,this._renderContexts=new xm,this._animation.start(),this._initialized=!0,e()}))),this._initPromise}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,o=this._currentRenderObjectFunction,a=this._compilationPromises,u=!0===e.isScene?e:R_;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new d_),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)})),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=o,this._compilationPromises=a,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init();const r=this._renderScene(e,t);await this.backend.resolveTimestampAsync(r,"render")}async waitForGPU(){await this.backend.waitForGPU()}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,o=this._currentRenderContext,a=this._bundles.get(s,i),u=this.backend.get(a);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(o)||l;if(u.renderContexts.add(o),d){this.backend.beginBundle(o),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=a;const e=n.opaque;!0===this.opaque&&e.length>0&&this._renderObjects(e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(o,a),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=b,p.viewportValue.maxDepth=T,p.viewport=!1===p.viewportValue.equals(E_),p.scissorValue.copy(y).multiplyScalar(x).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(E_),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new d_),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h),M_.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),w_.setFromProjectionMatrix(M_,g);const _=this._renderLists.get(e,t);if(_.begin(),this._projectObject(e,t,0,_,p.clippingContext),_.finish(),!0===this.sortObjects&&_.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=_.occlusionQueryCount,this._background.update(u,_,p),this.backend.beginRender(p);const{bundles:v,lightsNode:N,transparentDoublePass:S,transparent:A,opaque:R}=_;if(v.length>0&&this._renderBundles(v,u,N),!0===this.opaque&&R.length>0&&this._renderObjects(R,t,u,N),!0===this.transparent&&A.length>0&&this._renderTransparents(A,S,t,u,N),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=o,this._currentRenderObjectFunction=a,null!==s){this.setRenderTarget(l,d,c);const e=this._quad;this._nodes.hasOutputChange(h.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(h.texture),e.material.needsUpdate=!0),this._renderScene(e,e.camera,!1)}return u.onAfterRender(this,e,t,h),p}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)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setSize(e,t,r=!0){this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const o=this._viewport;e.isVector4?o.copy(e):o.set(e,t,r,s),o.minDepth=i,o.maxDepth=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)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);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.getForClear(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}if(i.clearColorValue=this._clearColor,this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget){const e=this._quad;this._nodes.hasOutputChange(s.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(s.texture),e.material.needsUpdate=!0),this._renderScene(e,e.camera,!1)}}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return null!==this._renderTarget?h:this.toneMapping}get currentColorSpace(){return null!==this._renderTarget?Re:this.outputColorSpace}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.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}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const t=this._nodes.nodeFrame,r=t.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,t.renderId=this.info.calls;const s=this.backend,i=this._pipelines,n=this._bindings,o=this._nodes,a=Array.isArray(e)?e:[e];if(void 0===a[0]||!0!==a[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of a){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),o.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}o.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),a=i.getForCompute(t,r);s.compute(e,t,r,a)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e),await this.backend.resolveTimestampAsync(e,"compute")}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=B_.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=B_.copy(t).floor()}else t=B_.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)}copyTextureToTexture(e,t,r=null,s=null,i=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,o=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,o)}_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){if(!e.frustumCulled||w_.intersectsSprite(e)){!0===this.sortObjects&&B_.setFromMatrixPosition(e.matrixWorld).applyMatrix4(M_);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,B_.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||w_.intersectsObject(e))){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),B_.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(M_)),Array.isArray(n)){const o=t.groups;for(let a=0,u=o.length;a0){for(const{material:e}of t)e.side=T;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=We;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=le}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,o=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode)),i=e}!0===i.transparent&&i.side===le&&!1===i.forceSinglePass?(i.side=T,this._handleObjectFunction(e,i,t,r,o,n,a,"backSide"),i.side=We,this._handleObjectFunction(e,i,t,r,o,n,a,u),i.side=le):this._handleObjectFunction(e,i,t,r,o,n,a,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,o,a){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,o,a);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,o,a){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,o,a);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)}get compile(){return this.compileAsync}}class U_{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class P_ extends U_{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(qg-e%qg)%qg;var e}get buffer(){return this._buffer}update(){return!0}}class I_ extends P_{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let L_=0;class D_ extends I_{constructor(e,t){super("UniformBuffer_"+L_++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class V_ extends I_{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}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(){let e=0;for(let t=0,r=this.uniforms.length;t0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const o=i.node.precision;if(null!==o&&(t=q_[o]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==b){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=[],r=e.getMemberTypes();for(let e=0;ee*t),1)}u`}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=X_[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)}X_[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} ]`)}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 o=n.uniformGPU;if(void 0===o){const s=e.groupNode,a=s.name,u=this.getBindGroupArray(a,r);if("texture"===t)o=new $_(i.name,i.node,s),u.push(o);else if("cubeTexture"===t)o=new W_(i.name,i.node,s),u.push(o);else if("texture3D"===t)o=new H_(i.name,i.node,s),u.push(o);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new D_(e,s);t.name=e.name,u.push(t),o=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new G_(r+"_"+a,s),e[a]=n,u.push(n)),o=this.getNodeUniform(i,t),n.addUniform(o)}n.uniformGPU=o}return i}}let Q_=null,Z_=null;class J_{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampAsync(){}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return Q_=Q_||new t,this.renderer.getDrawingBufferSize(Q_)}setScissorTest(){}getClearColor(){const e=this.renderer;return Z_=Z_||new _m,e.getClearColor(Z_),Z_.getRGB(Z_,this.renderer.currentColorSpace),Z_}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:rt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${Ve} webgpu`),this.domElement=e),e}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)}dispose(){}}let ev=0;class tv{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 rv{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,o=e.isInterleavedBufferAttribute?e.data:e,a=r.get(o);let u,l=a.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),a.bufferGPU=l,a.bufferType=t,a.version=o.version),i instanceof Float32Array)u=s.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===b,id:ev++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new tv(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),o=n.bufferType,a=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(o,n.bufferGPU),0===a.length)r.bufferSubData(o,0,s);else{for(let e=0,t=a.length;e1?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 uv,lv,dv,cv=!1;class hv{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===cv&&(this._init(),cv=!0)}_init(){const e=this.gl;uv={[gr]:e.REPEAT,[mr]:e.CLAMP_TO_EDGE,[fr]:e.MIRRORED_REPEAT},lv={[yr]:e.NEAREST,[xr]:e.NEAREST_MIPMAP_NEAREST,[Le]:e.NEAREST_MIPMAP_LINEAR,[z]:e.LINEAR,[Ie]:e.LINEAR_MIPMAP_NEAREST,[M]:e.LINEAR_MIPMAP_LINEAR},dv={[br]:e.NEVER,[Tr]:e.ALWAYS,[Ce]:e.LESS,[_r]:e.LEQUAL,[vr]:e.EQUAL,[Nr]:e.GEQUAL,[Sr]:e.GREATER,[Ar]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!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:o}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let a=t;return t===n.RED&&(r===n.FLOAT&&(a=n.R32F),r===n.HALF_FLOAT&&(a=n.R16F),r===n.UNSIGNED_BYTE&&(a=n.R8),r===n.UNSIGNED_SHORT&&(a=n.R16),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.R8UI),r===n.UNSIGNED_SHORT&&(a=n.R16UI),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RG&&(r===n.FLOAT&&(a=n.RG32F),r===n.HALF_FLOAT&&(a=n.RG16F),r===n.UNSIGNED_BYTE&&(a=n.RG8),r===n.UNSIGNED_SHORT&&(a=n.RG16),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RG8UI),r===n.UNSIGNED_SHORT&&(a=n.RG16UI),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(a=n.RGB32F),r===n.HALF_FLOAT&&(a=n.RGB16F),r===n.UNSIGNED_BYTE&&(a=n.RGB8),r===n.UNSIGNED_SHORT&&(a=n.RGB16),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I),r===n.UNSIGNED_BYTE&&(a=s===ze&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(a=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(a=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGB8UI),r===n.UNSIGNED_SHORT&&(a=n.RGB16UI),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(a=n.RGBA32F),r===n.HALF_FLOAT&&(a=n.RGBA16F),r===n.UNSIGNED_BYTE&&(a=n.RGBA8),r===n.UNSIGNED_SHORT&&(a=n.RGBA16),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I),r===n.UNSIGNED_BYTE&&(a=s===ze&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(a=n.RGBA16UI),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_INT&&(a=n.DEPTH24_STENCIL8),r===n.FLOAT&&(a=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(a=n.DEPTH24_STENCIL8),a!==n.R16F&&a!==n.R32F&&a!==n.RG16F&&a!==n.RG32F&&a!==n.RGBA16F&&a!==n.RGBA32F||o.get("EXT_color_buffer_float"),a}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this;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,r.NONE),r.texParameteri(e,r.TEXTURE_WRAP_S,uv[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,uv[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||r.texParameteri(e,r.TEXTURE_WRAP_R,uv[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,lv[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,o=t.minFilter===z&&n?M:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,lv[o]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,dv[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===yr)return;if(t.minFilter!==Le&&t.minFilter!==M)return;if(t.type===E&&!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,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:o,depth:a}=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.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,o,a):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,o,a):e.isVideoTexture||r.texStorage2D(h,i,d,n,o),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:o,glType:a}=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,o,a,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:o,glFormat:a,glType:u,glInternalFormat:l}=this.backend.get(e);if(e.isRenderTargetTexture||void 0===n)return;const d=e=>e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||e instanceof OffscreenCanvas?e:e.data;if(this.backend.state.bindTexture(o,n),this.setTextureParameters(o,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==o||0!==a;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-a-l;s.blitFramebuffer(o,p,o+u,p+l,o,p,o+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,o,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,o,c-l-a,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t){const{gl:r}=this,s=t.renderTarget,{samples:i,depthTexture:n,depthBuffer:o,stencilBuffer:a,width:u,height:l}=s;if(r.bindRenderbuffer(r.RENDERBUFFER,e),o&&!a){let t=r.DEPTH_COMPONENT24;i>0?(n&&n.isDepthTexture&&n.type===r.FLOAT&&(t=r.DEPTH_COMPONENT32F),r.renderbufferStorageMultisample(r.RENDERBUFFER,i,t,u,l)):r.renderbufferStorage(r.RENDERBUFFER,t,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_ATTACHMENT,r.RENDERBUFFER,e)}else o&&a&&(i>0?r.renderbufferStorageMultisample(r.RENDERBUFFER,i,r.DEPTH24_STENCIL8,u,l):r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_STENCIL,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_STENCIL_ATTACHMENT,r.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:o,gl:a}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=a.createFramebuffer();a.bindFramebuffer(a.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?a.TEXTURE_CUBE_MAP_POSITIVE_X+n:a.TEXTURE_2D;a.framebufferTexture2D(a.READ_FRAMEBUFFER,a.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=a.createBuffer();a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.bufferData(a.PIXEL_PACK_BUFFER,g,a.STREAM_READ),a.readPixels(t,r,s,i,l,d,0),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),await o.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.getBufferSubData(a.PIXEL_PACK_BUFFER,0,f),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),a.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}}class pv{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 gv{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 mv={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",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query"};class fv{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:o,index:a}=this;0!==a?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),o.update(i,t,s,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:o,object:a,info:u}=this;0!==r&&(0!==o?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(a,t,i,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:o}=this;if(0===r)return;const a=s.get("WEBGL_multi_draw");if(null===a)for(let s=0;s0)){const e=t.queryQueue.shift();this.initTimestampQuery(e)}}async resolveTimestampAsync(e,t="render"){if(!this.disjoint||!this.trackTimestamp)return;const r=this.get(e);r.gpuQueries||(r.gpuQueries=[]);for(let e=0;e0&&(s.currentOcclusionQueries=s.occlusionQueries,s.currentOcclusionQueryObjects=s.occlusionQueryObjects,s.lastOcclusionObject=null,s.occlusionQueries=new Array(i),s.occlusionQueryObjects=new Array(i),s.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext,n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const o=e.textures;if(null!==o)for(let e=0;e0){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,o=s.msaaFrameBuffer,a=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let o=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?f.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances):this.hasFeature("WEBGL_multi_draw")?f.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):Rr("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):x>1?f.renderInstances(b,y,x):f.render(b,y)};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){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(o,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()}));t.push(i)}else 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"),o=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+o)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:o,vertexShader:a}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,o,a),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,o=s.createProgram(),a=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;emv[t]===e)),r=this.extensions;for(let e=0;e0){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r,\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:vv,stripIndexFormat:Ov},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:vv,stripIndexFormat:Ov},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,o=this.getTransferPipeline(s),a=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:FN,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:FN,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:Uv,storeOp:Bv,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(o,l,d),h(a,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:FN,baseArrayLayer:r});const o=[];for(let a=1;a1;for(let o=0;o]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,QN=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,ZN={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_multisampled_2d:"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 JN extends JT{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:o}=(e=>{const t=(e=e.trim()).match(YN);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=QN.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 eS extends ZT{parseFunction(e){return new JN(e)}}const tS="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},rS={[Bs.READ_ONLY]:"read",[Bs.WRITE_ONLY]:"write",[Bs.READ_WRITE]:"read_write"},sS={[gr]:"repeat",[mr]:"clamp",[fr]:"mirror"},iS={vertex:tS?tS.VERTEX:1,fragment:tS?tS.FRAGMENT:2,compute:tS?tS.COMPUTE:4},nS={instance:!0,swizzleAssign:!1,storageBuffer:!0},oS={"^^":"tsl_xor"},aS={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"},uS={},lS={tsl_xor:new by("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new by("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new by("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new by("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new by("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new by("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new by("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new by("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 by("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 by("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new by("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 by("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new by("\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")},dS={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"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(lS.pow_float=new by("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),lS.pow_vec2=new by("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[lS.pow_float]),lS.pow_vec3=new by("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[lS.pow_float]),lS.pow_vec4=new by("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[lS.pow_float]),dS.pow_float="tsl_pow_float",dS.pow_vec2="tsl_pow_vec2",dS.pow_vec3="tsl_pow_vec3",dS.pow_vec4="tsl_pow_vec4");let cS="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(cS+="diagnostic( off, derivative_uniformity );\n");class hS extends OT{constructor(e,t){super(e,t,new eS),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==y}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r):this.generateTextureLod(e,t,r,s,"0")}_generateVideoSample(e,t,r=this.shaderStage){if("fragment"===r)return`textureSampleBaseClampToEdge( ${e}, ${e}_sampler, vec2( ${t}.x, 1.0 - ${t}.y ) )`;console.error(`WebGPURenderer: THREE.VideoTexture does not support ${r} shader.`)}_generateTextureSampleLevel(e,t,r,s,i,n=this.shaderStage){return"fragment"!==n&&"compute"!==n||!1!==this.isUnfilterable(e)?this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s):`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`}generateWrapFunction(e){const t=`tsl_coord_${sS[e.wrapS]}S_${sS[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=uS[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const o=(e,t)=>{e===gr?(s.push(lS.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===mr?(s.push(lS.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===fr?(s.push(lS.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};o(e.wrapS,"x"),n+=",\n",o(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",o(e.wrapR,"z")),n+="\n\t);\n\n}\n",uS[t]=r=new by(n,s)}return r.build(this),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,o;const{primarySamples:a}=this.renderer.backend.utils.getTextureSampleData(e),u=a>1;o=e.isData3DTexture?"vec3":"vec2",n=u||e.isVideoTexture||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Pa(new xu(`textureDimensions( ${n} )`,o)),s.dimensionsSnippet[r]=i,(e.isDataArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Pa(new xu(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Pa(new xu("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,i),a=e.isData3DTexture?"vec3":"vec2",u=`${a}(${n}(${r}) * ${a}(${o}))`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){return!0===e.isVideoTexture||!0===e.isStorageTexture?`textureLoad( ${t}, ${r} )`:s?`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:`textureLoad( ${t}, ${r}, u32( ${i} ) )`}generateTextureStore(e,t,r,s){return`textureStore( ${t}, ${r}, ${s} )`}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===E||!1===this.isSampleCompare(e)&&e.minFilter===yr&&e.magFilter===yr||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=!0===e.isVideoTexture?this._generateVideoSample(t,r,i):this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i,n=this.shaderStage){let o=null;return o=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),o}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} 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||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?`NodeBuffer_${e.id}.${t}`:e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}_getUniformGroupCount(e){return Object.keys(this.uniforms[e]).length}getFunctionOperator(e){const t=oS[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?Bs.READ_ONLY:e.access}getStorageAccess(e,t){return rS[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 s;const o=e.groupNode,a=o.name,u=this.getBindGroupArray(a,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let n=null;const a=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?n=new $_(i.name,i.node,o,a):"cubeTexture"===t?n=new W_(i.name,i.node,o,a):"texture3D"===t&&(n=new H_(i.name,i.node,o,a)),n.store=!0===e.isStorageTextureNode,n.setVisibility(iS[r]),"fragment"!==r&&"compute"!==r||!1!==this.isUnfilterable(e.value)||!1!==n.store)u.push(n),s=[n];else{const e=new kN(`${i.name}_sampler`,i.node,o);e.setVisibility(iS[r]),u.push(e,n),s=[e,n]}}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const i=new("buffer"===t?D_:WN)(e,o);i.setVisibility(iS[r]),u.push(i),s=i}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new G_(a,o),n.setVisibility(iS[r]),e[a]=n,u.push(n)),s=this.getNodeUniform(i,t),n.addUniform(s)}n.uniformGPU=s}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`)}const s=this.getBuiltins("output");return s&&t.push("\t"+s),t.join(",\n")}getStructs(e){const t=[],r=this.structs[e];for(let e=0,s=r.length;e output : ${i};\n\n`)}return t.join("\n\n")}getVar(e,t){return`var ${t} : ${this.getType(e)}`}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)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;i1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.isDepthTexture)s=`texture_depth${n}_2d`;else if(!0===t.isVideoTexture)s="texture_external";else if(!0===t.isData3DTexture)s="texture_3d";else if(!0===i.node.isStorageTextureNode){s=`texture_storage_2d<${KN(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${o.binding++} ) @group( ${o.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.bufferType),n=t.bufferCount,a=n>0&&"buffer"===i.type?", "+n:"",u=t.isAtomic?`atomic<${r}>`:`${r}`,l=`\t${i.name} : array< ${u}${a} >\n`,d=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";s.push(this._getWGSLStructBinding("NodeBuffer_"+t.id,l,d,o.binding++,o.group))}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:o.binding++,id:o.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let o=r.join("\n");return o+=s.join("\n"),o+=i.join("\n"),o}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){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],o=n.outputNode,a=void 0!==o&&!0===o.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.Vertex = ${i.result};`;else if("fragment"===t)if(a)r.returnType=o.nodeType,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;\n\n",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}null!==this.material?(this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment)):this.computeShader=this._getWGSLComputeCode(e.compute,(this.object.workgroupSize||[64]).join(", "))}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getType(e){return aS[e]||e}isAvailable(e){let t=nS[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),nS[e]=t),t}_getWGSLMethod(e){return void 0!==lS[e]&&this._include(e),dS[e]}_include(e){const t=lS[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\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${cS}\n\n// uniforms\n${e.uniforms}\n\n// structs\n${e.structs}\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){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${t} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x + globalId.y * numWorkgroups.x * u32(${t}) + globalId.z * numWorkgroups.x * numWorkgroups.y * u32(${t});\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 pS{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=Gv.Depth24PlusStencil8:e.depth&&(t=Gv.Depth24Plus),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.samples}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}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?xv:e.isLineSegments||e.isMesh&&!0===t.wireframe?bv:e.isLine?Tv:e.isMesh?_v:void 0}getSampleCount(e){let t=1;return e>1&&(t=Math.pow(2,Math.floor(Math.log2(e))),2===t&&(t=4)),t}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===ge)return Gv.BGRA8Unorm;if(e===xe)return Gv.RGBA16Float;throw new Error("Unsupported outputType")}}const gS=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),mS=new Map([[De,["float16"]]]),fS=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class yS{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 o=s.device;let a=r.array;if(!1===e.normalized)if(a.constructor===Int16Array)a=new Int32Array(a);else if(a.constructor===Uint16Array&&(a=new Uint32Array(a),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=RN)),r.texture.isDepthTexture)s.sampleType=CN;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===b?s.sampleType=EN:e===x?s.sampleType=wN:e===E&&(this.backend.hasFeature("float32-filterable")?s.sampleType=AN:s.sampleType=RN)}r.isSampledCubeTexture?s.viewDimension=PN:r.texture.isDataArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=UN:r.isSampledTexture3D&&(s.viewDimension=IN),e.texture=s}else console.error(`WebGPUBindingUtils: Unsupported binding "${r}".`);s.push(e)}return r.createBindGroupLayout({entries:s})}createBindings(e,t,r,s=0){const{backend:i,bindGroupLayoutCache:n}=this,o=i.get(e);let a,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===o.groups&&(o.groups=[],o.versions=[]),o.versions[r]===s&&(a=o.groups[r])),void 0===a&&(a=this.createBindGroup(e,u),r>0&&(o.groups[r]=a,o.versions[r]=s)),o.group=a,o.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const o=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:o})}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}else if(t.isSampledTexture){const e=r.get(t.texture);let o;if(void 0!==e.externalTexture)o=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(o=e[s],void 0===o){const i=LN;let n;n=t.isSampledCubeTexture?PN:t.isSampledTexture3D?IN:t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?UN:FN,o=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:o})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class bS{constructor(e){this.backend=e}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:o,fragmentProgram:a}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;!0===s.transparent&&s.blending!==L&&(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},A={},R=e.context.depth,C=e.context.stencil;if(!0!==R&&!0!==C||(!0===R&&(A.format=v,A.depthWriteEnabled=s.depthWrite,A.depthCompare=_),!0===C&&(A.stencilFront=m,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),S.depthStencil=A),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise((e=>{l.createRenderPipelineAsync(S).then((t=>{c.pipeline=t,e()}))}));t.push(e)}}createBundleEncoder(e){const t=this.backend,{utils:r,device:s}=t,i=r.getCurrentDepthStencilFormat(e),n={label:"renderBundleEncoder",colorFormats:[r.getCurrentColorFormat(e)],depthStencilFormat:i,sampleCount:this._getSampleCount(e)};return s.createRenderBundleEncoder(n)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),o=[];for(const e of t){const t=r.get(e);o.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:o})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,o=e.blendEquation;if(s===Tt){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,a=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:o;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(o)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(a),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:nN},r={srcFactor:i,dstFactor:n,operation:nN}};if(e.premultipliedAlpha)switch(s){case U:i(qv,Qv,qv,Qv);break;case Nt:i(qv,qv,qv,qv);break;case vt:i(jv,Kv,jv,qv);break;case _t:i(jv,Xv,jv,Yv)}else switch(s){case U:i(Yv,Qv,qv,Qv);break;case Nt:i(Yv,qv,Yv,qv);break;case vt:i(jv,Kv,jv,qv);break;case _t:i(jv,Xv,jv,Xv)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case ot:t=jv;break;case at:t=qv;break;case ut:t=Xv;break;case pt:t=Kv;break;case lt:t=Yv;break;case gt:t=Qv;break;case ct:t=Zv;break;case mt:t=Jv;break;case ht:t=eN;break;case ft:t=tN;break;case dt:t=rN;break;case 211:t=sN;break;case 212:t=iN;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case Pr:t=Nv;break;case Ur:t=Mv;break;case Fr:t=Sv;break;case Br:t=Rv;break;case Mr:t=Av;break;case wr:t=wv;break;case Er:t=Cv;break;case Cr:t=Ev;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case zr:t=hN;break;case kr:t=pN;break;case Gr:t=gN;break;case Or:t=mN;break;case Vr:t=fN;break;case Dr:t=yN;break;case Lr:t=xN;break;case Ir:t=bN;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case st:t=nN;break;case it:t=oN;break;case nt:t=aN;break;case Wr:t=uN;break;case $r:t=lN;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?Vv:Ov),r.side){case We:s.frontFace=Pv,s.cullMode=Dv;break;case T:s.frontFace=Pv,s.cullMode=Lv;break;case le:s.frontFace=Pv,s.cullMode=Iv;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?cN:dN}_getDepthCompare(e){let t;if(!1===e.depthTest)t=Mv;else{const r=e.depthFunc;switch(r){case Bt:t=Nv;break;case Mt:t=Mv;break;case wt:t=Sv;break;case Et:t=Rv;break;case Ct:t=Av;break;case Rt:t=wv;break;case At:t=Cv;break;case St:t=Ev;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class TS extends J_{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.trackTimestamp=!0===e.trackTimestamp,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new pS(this),this.attributeUtils=new yS(this),this.bindingUtils=new xS(this),this.pipelineUtils=new bS(this),this.textureUtils=new XN(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference},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(ON),n=[];for(const e of i)s.features.has(e)&&n.push(e);const o={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(o)}else r=t.device;r.lost.then((t=>{const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}));const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(ON.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),this.updateSize()}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==r.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples||s.loadOp!==t.loadOp){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};r.addEventListener("dispose",e)}const n=e.getCacheKey();let o=i[n];if(void 0===o){const a=e.textures,u=[];let l;for(let s=0;s0&&(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:Fv}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const o=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(),t.currentPass.end(),r>0){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.prepareTimestampBuffer(e,t.encoder),this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;eo?(u.x=Math.min(t.dispatchCount,o),u.y=Math.ceil(t.dispatchCount/o)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.prepareTimestampBuffer(e,t.cmdEncoderGPU),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,context:s,pipeline:i}=e,n=e.getBindings(),o=this.get(s),a=this.get(i).pipeline,u=o.currentSets,l=o.currentPass,d=e.getDrawParameters();if(null===d)return;u.pipeline!==a&&(l.setPipeline(a),u.pipeline=a);const c=u.bindingGroups;for(let e=0,t=n.length;e{if(!0===r.isBatchedMesh){const e=r._multiDrawStarts,t=r._multiDrawCounts,s=r._multiDrawCount,i=r._multiDrawInstances;for(let r=0;r1?0:r;!0===p?l.drawIndexed(t[r],s,e[r]/h.array.BYTES_PER_ELEMENT,0,n):l.draw(t[r],s,e[r],n)}}else if(!0===p){const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndexedIndirect(e,0)}else l.drawIndexed(s,i,n,0,0);t.update(r,s,i)}else{const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndirect(e,0)}else l.draw(s,i,n,0);t.update(r,s,i)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),i=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==i.length){const e=this.get(n),r=[],s=new Uint32Array([0,0,0,0]);for(let t=0,n=i.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new yv(e)));super(new t(e),e),this.library=new vS,this.isWebGPURenderer=!0}}class SS extends is{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class AS{constructor(e,t=ji(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new lh;r.name="PostProcessing",this._quadMesh=new mf(r)}render(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=h,e.outputColorSpace=Re,this._quadMesh.render(e),e.toneMapping=t,e.outputColorSpace=r}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;this._quadMesh.material.fragmentNode=!0===this.outputColorTransform?vu(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=h,e.outputColorSpace=Re,await this._quadMesh.renderAsync(e),e.toneMapping=t,e.outputColorSpace=r}}class RS extends J{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=z,this.minFilter=z,this.isStorageTexture=!0}}class CS extends Nf{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class ES extends ns{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new os(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):console.error(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]?(console.error("THREE.NodeLoader: Node type not found:",e),Pi()):Ni(new this.nodes[e])}}class wS extends as{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 MS extends us{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 ES;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 wS;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}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 null!==e.renderer.nodes.modelViewMatrix||null!==e.renderer.nodes.modelNormalViewMatrix}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){const{object:t,material:r,geometry:s}=e,i=this.getRenderObjectData(e);if(!0!==i.worldMatrix.equals(t.matrixWorld))return i.worldMatrix.copy(t.matrixWorld),!1;const n=i.material;for(const e in n){const t=n[e],s=r[e];if(void 0!==t.equals){if(!1===t.equals(s))return t.copy(s),!1}else if(!0===s.isTexture){if(t.id!==s.id||t.version!==s.version)return t.id=s.id,t.version=s.version,!1}else if(t!==s)return n[e]=s,!1}if(n.transmission>0){const{width:t,height:r}=e.context;if(i.bufferWidth!==t||i.bufferHeight!==r)return i.bufferWidth=t,i.bufferHeight=r,!1}const o=i.geometry,a=s.attributes,u=o.attributes,l=Object.keys(u),d=Object.keys(a);if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(a),!1;for(const e of l){const t=u[e],r=a[e];if(void 0===r)return delete u[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const c=s.index,h=o.indexVersion,p=c?c.version:null;if(h!==p)return o.indexVersion=p,!1;if(o.drawRange.start!==s.drawRange.start||o.drawRange.count!==s.drawRange.count)return o.drawRange.start=s.drawRange.start,o.drawRange.count=s.drawRange.count,!1;if(i.morphTargetInfluences){let e=!1;for(let r=0;r>>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 ps=e=>hs(e),gs=e=>hs(e),ms=(...e)=>hs(e);function fs(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of ys(e))r.push(hs(s.slice(0,-4)),i.getCacheKey(t));return hs(r)}function*ys(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0))).buffer}var Es=Object.freeze({__proto__:null,arrayBufferToBase64:Rs,base64ToArrayBuffer:Cs,getCacheKey:fs,getDataFromObject:As,getLengthFromType:vs,getNodeChildren:ys,getTypeFromLength:Ts,getTypedArrayFromType:_s,getValueFromType:Ss,getValueType:Ns,hash:ms,hashArray:gs,hashString:ps});const ws={VERTEX:"vertex",FRAGMENT:"fragment"},Ms={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Bs={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Fs={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Us=["fragment","vertex"],Ps=["setup","analyze","generate"],Is=[...Us,"compute"],Ls=["x","y","z","w"];let Ds=0;class Vs extends a{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Ms.NONE,this.updateBeforeType=Ms.NONE,this.updateAfterType=Ms.NONE,this.uuid=u.generateUUID(),this.version=0,this.global=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:Ds++})}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.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,Ms.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Ms.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Ms.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of ys(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=ms(fs(this,e),this.customCacheKey()),this._cacheKeyVersion=this.version),this._cacheKey}customCacheKey(){return 0}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return t.outputNode||null}analyze(e){if(1===e.increaseUsage(this)){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);e.addNode(this),e.addChain(this);let s=null;const i=e.getBuildStage();if("setup"===i){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){t.initialized=!0;const r=this.setup(e),s=r&&!0===r.isNode;for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e);s&&r.build(e),t.outputNode=r}}else if("analyze"===i)this.analyze(e);else if("generate"===i){if(1===this.generate.length){const r=this.getNodeType(e),i=e.getDataFromNode(this);s=i.snippet,void 0===s?(s=this.generate(e)||"",i.snippet=s):void 0!==i.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),s=e.format(s,r,t)}else s=this.generate(e,t)||""}return e.removeChain(this),e.addSequentialNode(this),s}getSerializeChildren(){return ys(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(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.6,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 Os extends Vs{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)}generate(e){return`${this.node.build(e)}[ ${this.indexNode.build(e,"uint")} ]`}}class Gs extends Vs{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 ks extends Vs{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),o=e.getPropertyName(n);return e.addLineFlowCode(`${o} = ${i}`,this),s.snippet=i,s.propertyName=o,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class zs extends ks{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=this.nodes,i=e.getComponentType(r),n=[];for(const t of s){let r=t.build(e);const s=e.getComponentType(t.getNodeType(e));s!==i&&(r=e.format(r,s,i)),n.push(r)}const o=`${e.getType(r)}( ${n.join(", ")} )`;return e.format(o,r,t)}}const $s=Ls.join("");class Ws extends Vs{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(Ls.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))}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 o=r.build(e,n);i=this.components.length===s&&this.components===$s.slice(0,this.components.length)?e.format(o,n,t):e.format(`${o}.${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 Hs extends ks{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)),o=e.getTypeFromLength(r.length,n),a=s.build(e,o),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),Js=e=>Zs(e).split("").sort().join(""),ei={setup(e,t){const r=t.shift();return e(Ai(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(Ks.assign(r,...e),r);if(Ys.has(t)){const s=Ys.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&Ys.has(t.slice(0,t.length-6))){const s=Ys.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=Zs(t),Si(new Ws(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Js(t.slice(3).toLowerCase()),r=>Si(new Hs(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Js(t.slice(4).toLowerCase()),()=>Si(new js(Si(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Si(new Ws(e,t));if(!0===/^\d+$/.test(t))return Si(new Os(r,new Xs(Number(t),"uint")))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},ti=new WeakMap,ri=new WeakMap,si=function(e,t=null){for(const r in e)e[r]=Si(e[r],t);return e},ii=function(e,t=null){const r=e.length;for(let s=0;sSi(null!==s?Object.assign(e,s):e);return null===t?(...t)=>i(new e(...Ri(t))):null!==r?(r=Si(r),(...s)=>i(new e(t,...Ri(s),r))):(...r)=>i(new e(t,...Ri(r)))},oi=function(e,...t){return Si(new e(...Ri(t)))};class ai extends Vs{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t);if(s.onceOutput)return s.onceOutput;let i=null;if(t.layout){let s=ri.get(e.constructor);void 0===s&&(s=new WeakMap,ri.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=Si(e.buildFunctionNode(t)),s.set(t,n)),null!==e.currentFunctionNode&&e.currentFunctionNode.includes.push(n),i=Si(n.call(r))}else{const s=t.jsFunc,n=null!==r||s.length>1?s(r||[],e):s(e);i=Si(n)}return t.once&&(s.onceOutput=i),i}getOutputNode(e){const t=e.getNodeProperties(this);return null===t.outputNode&&(t.outputNode=this.setupOutput(e)),t.outputNode}setup(e){return this.getOutputNode(e)}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}generate(e,t){return this.getOutputNode(e).build(e,t)}}class ui extends Vs{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return Ai(e),Si(new ai(this,e))}setup(){return this.call()}}const li=[!1,!0],di=[0,1,2,3],ci=[-1,-2],hi=[.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],pi=new Map;for(const e of li)pi.set(e,new Xs(e));const gi=new Map;for(const e of di)gi.set(e,new Xs(e,"uint"));const mi=new Map([...gi].map((e=>new Xs(e.value,"int"))));for(const e of ci)mi.set(e,new Xs(e,"int"));const fi=new Map([...mi].map((e=>new Xs(e.value))));for(const e of hi)fi.set(e,new Xs(e));for(const e of hi)fi.set(-e,new Xs(-e));const yi={bool:pi,uint:gi,ints:mi,float:fi},xi=new Map([...pi,...fi]),bi=(e,t)=>xi.has(e)?xi.get(e):!0===e.isNode?e:new Xs(e,t),Ti=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[Ss(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Si(t.get(r[0]));if(1===r.length){const t=bi(r[0],e);return(e=>{try{return e.getNodeType()}catch(e){return}})(t)===e?Si(t):Si(new Gs(t,e))}const s=r.map((e=>bi(e)));return Si(new zs(s,e))}},_i=e=>"object"==typeof e&&null!==e?e.value:e,vi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Ni(e,t){return new Proxy(new ui(e,t),ei)}const Si=(e,t=null)=>function(e,t=null){const r=Ns(e);if("node"===r){let t=ti.get(e);return void 0===t&&(t=new Proxy(e,ei),ti.set(e,t),ti.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Si(bi(e,t)):"shader"===r?wi(e):e}(e,t),Ai=(e,t=null)=>new si(e,t),Ri=(e,t=null)=>new ii(e,t),Ci=(...e)=>new ni(...e),Ei=(...e)=>new oi(...e),wi=(e,t)=>{const r=new Ni(e,t),s=(...e)=>{let t;return Ai(e),t=e[0]&&e[0].isNode?[...e]:e[0],r.call(t)};return s.shaderNode=r,s.setLayout=e=>(r.setLayout(e),s),s.once=()=>(r.once=!0,s),s};Qs("toGlobal",(e=>(e.global=!0,e)));const Mi=e=>{Ks=e},Bi=()=>Ks,Fi=(...e)=>Ks.If(...e);function Ui(e){return Ks&&Ks.add(e),e}Qs("append",Ui);const Pi=new Ti("color"),Ii=new Ti("float",yi.float),Li=new Ti("int",yi.ints),Di=new Ti("uint",yi.uint),Vi=new Ti("bool",yi.bool),Oi=new Ti("vec2"),Gi=new Ti("ivec2"),ki=new Ti("uvec2"),zi=new Ti("bvec2"),$i=new Ti("vec3"),Wi=new Ti("ivec3"),Hi=new Ti("uvec3"),ji=new Ti("bvec3"),qi=new Ti("vec4"),Xi=new Ti("ivec4"),Ki=new Ti("uvec4"),Yi=new Ti("bvec4"),Qi=new Ti("mat2"),Zi=new Ti("mat3"),Ji=new Ti("mat4");Qs("toColor",Pi),Qs("toFloat",Ii),Qs("toInt",Li),Qs("toUint",Di),Qs("toBool",Vi),Qs("toVec2",Oi),Qs("toIVec2",Gi),Qs("toUVec2",ki),Qs("toBVec2",zi),Qs("toVec3",$i),Qs("toIVec3",Wi),Qs("toUVec3",Hi),Qs("toBVec3",ji),Qs("toVec4",qi),Qs("toIVec4",Xi),Qs("toUVec4",Ki),Qs("toBVec4",Yi),Qs("toMat2",Qi),Qs("toMat3",Zi),Qs("toMat4",Ji);const en=Ci(Os),tn=(e,t)=>Si(new Gs(Si(e),t));Qs("element",en),Qs("convert",tn);class rn extends ks{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getNodeType(e){return null===this.nodeType&&(this.nodeType=this.values[0].getNodeType(e)),this.nodeType}getElementType(e){return this.getNodeType(e)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const sn=(...e)=>{let t;if(1===e.length){const r=e[0];t=new rn(null,r.length,r)}else{const r=e[0],s=e[1];t=new rn(r,s)}return Si(t)};Qs("toArray",((e,t)=>sn(Array(t).fill(e))));class nn extends Vs{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 on=e=>new nn(e),an=(e,t=0)=>new nn(e,!0,t),un=an("frame"),ln=an("render"),dn=on("object");class cn extends qs{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=dn}label(e){return this.name=e,this}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate((t=>{const s=e(t,r);void 0!==s&&(this.value=s)}),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),o=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),a=e.getPropertyName(o);return void 0!==e.context.label&&delete e.context.label,e.format(a,r,t)}}const hn=(e,t)=>{const r=vi(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return Si(new cn(s,r))};class pn extends Vs{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0}getHash(e){return this.name||super.getHash(e)}isGlobal(){return!0}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 gn=(e,t)=>Si(new pn(e,t)),mn=(e,t)=>Si(new pn(e,t,!0)),fn=Ei(pn,"vec4","DiffuseColor"),yn=Ei(pn,"vec3","EmissiveColor"),xn=Ei(pn,"float","Roughness"),bn=Ei(pn,"float","Metalness"),Tn=Ei(pn,"float","Clearcoat"),_n=Ei(pn,"float","ClearcoatRoughness"),vn=Ei(pn,"vec3","Sheen"),Nn=Ei(pn,"float","SheenRoughness"),Sn=Ei(pn,"float","Iridescence"),An=Ei(pn,"float","IridescenceIOR"),Rn=Ei(pn,"float","IridescenceThickness"),Cn=Ei(pn,"float","AlphaT"),En=Ei(pn,"float","Anisotropy"),wn=Ei(pn,"vec3","AnisotropyT"),Mn=Ei(pn,"vec3","AnisotropyB"),Bn=Ei(pn,"color","SpecularColor"),Fn=Ei(pn,"float","SpecularF90"),Un=Ei(pn,"float","Shininess"),Pn=Ei(pn,"vec4","Output"),In=Ei(pn,"float","dashSize"),Ln=Ei(pn,"float","gapSize"),Dn=Ei(pn,"float","pointWidth"),Vn=Ei(pn,"float","IOR"),On=Ei(pn,"float","Transmission"),Gn=Ei(pn,"float","Thickness"),kn=Ei(pn,"float","AttenuationDistance"),zn=Ei(pn,"color","AttenuationColor"),$n=Ei(pn,"float","Dispersion");class Wn extends ks{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t}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 Ls.join("").slice(0,r)!==t.components}return!1}generate(e,t){const{targetNode:r,sourceNode:s}=this,i=this.needsSplitAssign(e),n=r.getNodeType(e),o=r.context({assign:!0}).build(e),a=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=o);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${a}`,this);const u=r.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))for(let e=0;e(t=t.length>1||t[0]&&!0===t[0].isNode?Ri(t):Ai(t[0]),Si(new jn(Si(e),t)));Qs("call",qn);class Xn extends ks{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Xn(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"=="===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("<"===r||">"===r||"<="===r||">="===r){const r=t?e.getTypeLength(t):Math.max(e.getTypeLength(n),e.getTypeLength(o));return r>1?`bvec${r}`:"bool"}if(e.isMatrix(n)){if("float"===o)return n;if(e.isVector(o))return e.getVectorFromMatrix(n);if(e.isMatrix(o))return n}else if(e.isMatrix(o)){if("float"===n)return o;if(e.isVector(n))return e.getVectorFromMatrix(o)}return e.getTypeLength(o)>e.getTypeLength(n)?o:n}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e,t);let o=null,a=null;"void"!==n?(o=s.getNodeType(e),a=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r?e.isVector(o)?a=o:o!==a&&(o=a="float"):">>"===r||"<<"===r?(o=n,a=e.changeComponentType(a,"uint")):e.isMatrix(o)?"float"===a?a="float":e.isVector(a)?a=e.getVectorFromMatrix(o):e.isMatrix(a)||(o=a=n):o=e.isMatrix(a)?"float"===o?"float":e.isVector(o)?e.getVectorFromMatrix(a):a=n:a=n):o=a=n;const u=s.build(e,o),l=void 0!==i?i.build(e,a):null,d=e.getTypeLength(t),c=e.getFunctionOperator(r);return"void"!==t?"<"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} < ${l} )`,n,t):"<="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} <= ${l} )`,n,t):">"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} > ${l} )`,n,t):">="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} >= ${l} )`,n,t):"!"===r||"~"===r?e.format(`(${r}${u})`,o,t):c?e.format(`${c}( ${u}, ${l} )`,n,t):e.isMatrix(o)&&"float"===a?e.format(`( ${l} ${r} ${u} )`,n,t):"float"===o&&e.isMatrix(a)?e.format(`${u} ${r} ${l}`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t):"void"!==o?c?e.format(`${c}( ${u}, ${l} )`,n,t):e.isMatrix(o)&&"float"===a?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t):void 0}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const Kn=Ci(Xn,"+"),Yn=Ci(Xn,"-"),Qn=Ci(Xn,"*"),Zn=Ci(Xn,"/"),Jn=Ci(Xn,"%"),eo=Ci(Xn,"=="),to=Ci(Xn,"!="),ro=Ci(Xn,"<"),so=Ci(Xn,">"),io=Ci(Xn,"<="),no=Ci(Xn,">="),oo=Ci(Xn,"&&"),ao=Ci(Xn,"||"),uo=Ci(Xn,"!"),lo=Ci(Xn,"^^"),co=Ci(Xn,"&"),ho=Ci(Xn,"~"),po=Ci(Xn,"|"),go=Ci(Xn,"^"),mo=Ci(Xn,"<<"),fo=Ci(Xn,">>");Qs("add",Kn),Qs("sub",Yn),Qs("mul",Qn),Qs("div",Zn),Qs("modInt",Jn),Qs("equal",eo),Qs("notEqual",to),Qs("lessThan",ro),Qs("greaterThan",so),Qs("lessThanEqual",io),Qs("greaterThanEqual",no),Qs("and",oo),Qs("or",ao),Qs("not",uo),Qs("xor",lo),Qs("bitAnd",co),Qs("bitNot",ho),Qs("bitOr",po),Qs("bitXor",go),Qs("shiftLeft",mo),Qs("shiftRight",fo);const yo=(...e)=>(console.warn("TSL.OperatorNode: .remainder() has been renamed to .modInt()."),Jn(...e));Qs("remainder",yo);class xo extends ks{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){super(),this.method=e,this.aNode=t,this.bNode=r,this.cNode=s,this.isMathNode=!0}getInputType(e){const t=this.aNode.getNodeType(e),r=this.bNode?this.bNode.getNodeType(e):null,s=this.cNode?this.cNode.getNodeType(e):null,i=e.isMatrix(t)?0:e.getTypeLength(t),n=e.isMatrix(r)?0:e.getTypeLength(r),o=e.isMatrix(s)?0:e.getTypeLength(s);return i>n&&i>o?t:n>o?r:o>i?s:t}getNodeType(e){const t=this.method;return t===xo.LENGTH||t===xo.DISTANCE||t===xo.DOT?"float":t===xo.CROSS?"vec3":t===xo.ALL?"bool":t===xo.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):t===xo.MOD?this.aNode.getNodeType(e):this.getInputType(e)}generate(e,t){let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,o=this.bNode,a=this.cNode,u=e.renderer.coordinateSystem;if(r===xo.TRANSFORM_DIRECTION){let r=n,s=o;e.isMatrix(r.getNodeType(e))?s=qi($i(s),0):r=qi($i(r),0);const i=Qn(r,s).xyz;return Io(i).build(e,t)}if(r===xo.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===xo.ONE_MINUS)return Yn(1,n).build(e,t);if(r===xo.RECIPROCAL)return Zn(1,n).build(e,t);if(r===xo.DIFFERENCE)return $o(Yn(n,o)).build(e,t);{const c=[];return r===xo.CROSS||r===xo.MOD?c.push(n.build(e,s),o.build(e,s)):u===l&&r===xo.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),o.build(e,i)):u===l&&(r===xo.MIN||r===xo.MAX)||r===xo.MOD?c.push(n.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):r===xo.REFRACT?c.push(n.build(e,i),o.build(e,i),a.build(e,"float")):r===xo.MIX?c.push(n.build(e,i),o.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)):(u===d&&r===xo.ATAN&&null!==o&&(r="atan2"),c.push(n.build(e,i)),null!==o&&c.push(o.build(e,i)),null!==a&&c.push(a.build(e,i))),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}xo.ALL="all",xo.ANY="any",xo.RADIANS="radians",xo.DEGREES="degrees",xo.EXP="exp",xo.EXP2="exp2",xo.LOG="log",xo.LOG2="log2",xo.SQRT="sqrt",xo.INVERSE_SQRT="inversesqrt",xo.FLOOR="floor",xo.CEIL="ceil",xo.NORMALIZE="normalize",xo.FRACT="fract",xo.SIN="sin",xo.COS="cos",xo.TAN="tan",xo.ASIN="asin",xo.ACOS="acos",xo.ATAN="atan",xo.ABS="abs",xo.SIGN="sign",xo.LENGTH="length",xo.NEGATE="negate",xo.ONE_MINUS="oneMinus",xo.DFDX="dFdx",xo.DFDY="dFdy",xo.ROUND="round",xo.RECIPROCAL="reciprocal",xo.TRUNC="trunc",xo.FWIDTH="fwidth",xo.TRANSPOSE="transpose",xo.BITCAST="bitcast",xo.EQUALS="equals",xo.MIN="min",xo.MAX="max",xo.MOD="mod",xo.STEP="step",xo.REFLECT="reflect",xo.DISTANCE="distance",xo.DIFFERENCE="difference",xo.DOT="dot",xo.CROSS="cross",xo.POW="pow",xo.TRANSFORM_DIRECTION="transformDirection",xo.MIX="mix",xo.CLAMP="clamp",xo.REFRACT="refract",xo.SMOOTHSTEP="smoothstep",xo.FACEFORWARD="faceforward";const bo=Ii(1e-6),To=Ii(1e6),_o=Ii(Math.PI),vo=Ii(2*Math.PI),No=Ci(xo,xo.ALL),So=Ci(xo,xo.ANY),Ao=Ci(xo,xo.RADIANS),Ro=Ci(xo,xo.DEGREES),Co=Ci(xo,xo.EXP),Eo=Ci(xo,xo.EXP2),wo=Ci(xo,xo.LOG),Mo=Ci(xo,xo.LOG2),Bo=Ci(xo,xo.SQRT),Fo=Ci(xo,xo.INVERSE_SQRT),Uo=Ci(xo,xo.FLOOR),Po=Ci(xo,xo.CEIL),Io=Ci(xo,xo.NORMALIZE),Lo=Ci(xo,xo.FRACT),Do=Ci(xo,xo.SIN),Vo=Ci(xo,xo.COS),Oo=Ci(xo,xo.TAN),Go=Ci(xo,xo.ASIN),ko=Ci(xo,xo.ACOS),zo=Ci(xo,xo.ATAN),$o=Ci(xo,xo.ABS),Wo=Ci(xo,xo.SIGN),Ho=Ci(xo,xo.LENGTH),jo=Ci(xo,xo.NEGATE),qo=Ci(xo,xo.ONE_MINUS),Xo=Ci(xo,xo.DFDX),Ko=Ci(xo,xo.DFDY),Yo=Ci(xo,xo.ROUND),Qo=Ci(xo,xo.RECIPROCAL),Zo=Ci(xo,xo.TRUNC),Jo=Ci(xo,xo.FWIDTH),ea=Ci(xo,xo.TRANSPOSE),ta=Ci(xo,xo.BITCAST),ra=Ci(xo,xo.EQUALS),sa=Ci(xo,xo.MIN),ia=Ci(xo,xo.MAX),na=Ci(xo,xo.MOD),oa=Ci(xo,xo.STEP),aa=Ci(xo,xo.REFLECT),ua=Ci(xo,xo.DISTANCE),la=Ci(xo,xo.DIFFERENCE),da=Ci(xo,xo.DOT),ca=Ci(xo,xo.CROSS),ha=Ci(xo,xo.POW),pa=Ci(xo,xo.POW,2),ga=Ci(xo,xo.POW,3),ma=Ci(xo,xo.POW,4),fa=Ci(xo,xo.TRANSFORM_DIRECTION),ya=e=>Qn(Wo(e),ha($o(e),1/3)),xa=e=>da(e,e),ba=Ci(xo,xo.MIX),Ta=(e,t=0,r=1)=>Si(new xo(xo.CLAMP,Si(e),Si(t),Si(r))),_a=e=>Ta(e),va=Ci(xo,xo.REFRACT),Na=Ci(xo,xo.SMOOTHSTEP),Sa=Ci(xo,xo.FACEFORWARD),Aa=wi((([e])=>{const t=da(e.xy,Oi(12.9898,78.233)),r=na(t,_o);return Lo(Do(r).mul(43758.5453))})),Ra=(e,t,r)=>ba(t,r,e),Ca=(e,t,r)=>Na(t,r,e),Ea=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),zo(e,t)),wa=Sa,Ma=Fo;Qs("all",No),Qs("any",So),Qs("equals",ra),Qs("radians",Ao),Qs("degrees",Ro),Qs("exp",Co),Qs("exp2",Eo),Qs("log",wo),Qs("log2",Mo),Qs("sqrt",Bo),Qs("inverseSqrt",Fo),Qs("floor",Uo),Qs("ceil",Po),Qs("normalize",Io),Qs("fract",Lo),Qs("sin",Do),Qs("cos",Vo),Qs("tan",Oo),Qs("asin",Go),Qs("acos",ko),Qs("atan",zo),Qs("abs",$o),Qs("sign",Wo),Qs("length",Ho),Qs("lengthSq",xa),Qs("negate",jo),Qs("oneMinus",qo),Qs("dFdx",Xo),Qs("dFdy",Ko),Qs("round",Yo),Qs("reciprocal",Qo),Qs("trunc",Zo),Qs("fwidth",Jo),Qs("atan2",Ea),Qs("min",sa),Qs("max",ia),Qs("mod",na),Qs("step",oa),Qs("reflect",aa),Qs("distance",ua),Qs("dot",da),Qs("cross",ca),Qs("pow",ha),Qs("pow2",pa),Qs("pow3",ga),Qs("pow4",ma),Qs("transformDirection",fa),Qs("mix",Ra),Qs("clamp",Ta),Qs("refract",va),Qs("smoothstep",Ca),Qs("faceForward",Sa),Qs("difference",la),Qs("saturate",_a),Qs("cbrt",ya),Qs("transpose",ea),Qs("rand",Aa);class Ba extends Vs{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 this.setup(e),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.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.getNodeProperties(this);n.condNode=t,n.ifNode=r.context({nodeBlock:r}),n.elseNode=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:o}=e.getNodeProperties(this),a="void"!==t,u=a?gn(r).build(e):"";s.nodeProperty=u;const l=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${l} ) {\n\n`).addFlowTab();let d=n.build(e,r);if(d&&(d=a?u+" = "+d+";":"return "+d+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+d+"\n\n"+e.tab+"}"),null!==o){e.addFlowCode(" else {\n\n").addFlowTab();let t=o.build(e,r);t&&(t=a?u+" = "+t+";":"return "+t+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(u,r,t)}}const Fa=Ci(Ba);Qs("select",Fa);const Ua=(...e)=>(console.warn("TSL.ConditionalNode: cond() has been renamed to select()."),Fa(...e));Qs("cond",Ua);class Pa extends Vs{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){this.node.build(e)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value});const r=this.node.build(e);return e.setContext(t),r}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const Ia=Ci(Pa),La=(e,t)=>Ia(e,{label:t});Qs("context",Ia),Qs("label",La);class Da extends Vs{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}getHash(e){return this.name||super.getHash(e)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let o=!1,a=!1;s&&(o=e.isDeterministic(t),a=n?s:o);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,a),c=e.getPropertyName(d);let h=c;if(a)if(n)h=o?`const ${c}`:`let ${c}`;else{const r=e.getArrayCount(t);h=`const ${e.getVar(d.type,c,r)}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const Va=Ci(Da),Oa=(e,t=null)=>Va(e,t).append(),Ga=(e,t=null)=>Va(e,t,!0).append();Qs("toVar",Oa),Qs("toConst",Ga);const ka=e=>(console.warn('TSL: "temp( node )" is deprecated. Use "Var( node )" or "node.toVar()" instead.'),Va(e));Qs("temp",ka);class za extends Vs{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0}isGlobal(){return!0}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);t.varying=r=e.getVaryingFromNode(this,s,i),t.node=this.node}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e)}analyze(e){return this.setupVarying(e),this.node.analyze(e)}generate(e){const t=e.getNodeProperties(this),r=this.setupVarying(e),s="fragment"===e.shaderStage&&!0===t.reassignPosition&&e.context.needsPositionReassign;if(void 0===t.propertyName||s){const i=this.getNodeType(e),n=e.getPropertyName(r,ws.VERTEX);e.flowNodeFromShaderStage(ws.VERTEX,this.node,i,n),t.propertyName=n,s?t.reassignPosition=!1:void 0===t.reassignPosition&&e.context.isPositionNodeInput&&(t.reassignPosition=!0)}return e.getPropertyName(r)}}const $a=Ci(za),Wa=e=>$a(e);Qs("toVarying",$a),Qs("toVertexStage",Wa),Qs("varying",((...e)=>(console.warn("TSL.VaryingNode: .varying() has been renamed to .toVarying()."),$a(...e)))),Qs("vertexStage",((...e)=>(console.warn("TSL.VaryingNode: .vertexStage() has been renamed to .toVertexStage()."),$a(...e))));const Ha=wi((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return ba(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),ja=wi((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return ba(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),qa="WorkingColorSpace",Xa="OutputColorSpace";class Ka extends ks{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===qa?c.workingColorSpace:t===Xa?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!==c.enabled&&r!==s&&r&&s?(c.getTransfer(r)===h&&(i=qi(Ha(i.rgb),i.a)),c.getPrimaries(r)!==c.getPrimaries(s)&&(i=qi(Zi(c._getMatrix(new n,r,s)).mul(i.rgb),i.a)),c.getTransfer(s)===h&&(i=qi(ja(i.rgb),i.a)),i):i}}const Ya=e=>Si(new Ka(Si(e),qa,Xa)),Qa=e=>Si(new Ka(Si(e),Xa,qa)),Za=(e,t)=>Si(new Ka(Si(e),qa,t)),Ja=(e,t)=>Si(new Ka(Si(e),t,qa));Qs("toOutputColorSpace",Ya),Qs("toWorkingColorSpace",Qa),Qs("workingToColorSpace",Za),Qs("colorSpaceToWorking",Ja);let eu=class extends Os{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 tu extends Vs{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=Ms.OBJECT}setGroup(e){return this.group=e,this}element(e){return Si(new eu(this,Si(e)))}setNodeType(e){const t=hn(null,e).getSelf();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;eSi(new ru(e,t,r));class iu extends ks{static get type(){return"ToneMappingNode"}constructor(e,t=ou,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return ms(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===p)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=qi(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const nu=(e,t,r)=>Si(new iu(e,Si(t),Si(r))),ou=su("toneMappingExposure","float");Qs("toneMapping",((e,t,r)=>nu(t,r,e)));class au extends qs{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=g,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(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=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,o=!0===r.isInterleavedBuffer?r:new m(r,i),a=new y(o,s,n);o.setUsage(this.usage),this.attribute=a,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=$a(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}}const uu=(e,t=null,r=0,s=0)=>Si(new au(e,t,r,s)),lu=(e,t=null,r=0,s=0)=>uu(e,t,r,s).setUsage(f),du=(e,t=null,r=0,s=0)=>uu(e,t,r,s).setInstanced(!0),cu=(e,t=null,r=0,s=0)=>lu(e,t,r,s).setInstanced(!0);Qs("toAttribute",(e=>uu(e.value)));class hu extends Vs{static get type(){return"ComputeNode"}constructor(e,t,r=[64]){super("void"),this.isComputeNode=!0,this.computeNode=e,this.count=t,this.workgroupSize=r,this.dispatchCount=0,this.version=1,this.name="",this.updateBeforeType=Ms.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}label(e){return this.name=e,this}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;eSi(new hu(Si(e),t,r));Qs("compute",pu);class gu extends Vs{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!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}}const mu=(e,t)=>Si(new gu(Si(e),t));Qs("cache",mu);class fu extends Vs{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 yu=Ci(fu);Qs("bypass",yu);class xu extends Vs{static get type(){return"RemapNode"}constructor(e,t,r,s=Ii(0),i=Ii(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 o=e.sub(t).div(r.sub(t));return!0===n&&(o=o.clamp()),o.mul(i.sub(s)).add(s)}}const bu=Ci(xu,null,null,{doClamp:!1}),Tu=Ci(xu);Qs("remap",bu),Qs("remapClamp",Tu);class _u extends Vs{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 vu=Ci(_u),Nu=e=>(e?Fa(e,vu("discard")):vu("discard")).append();Qs("discard",Nu);class Su extends ks{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||p,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||x;return r!==p&&(t=t.toneMapping(r)),s!==x&&s!==c.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const Au=(e,t=null,r=null)=>Si(new Su(Si(e),t,r));Qs("renderOutput",Au);class Ru extends Vs{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 $a(this).build(e,r)}return console.warn(`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 Cu=(e,t)=>Si(new Ru(e,t)),Eu=(e=0)=>Cu("uv"+(e>0?e:""),"vec2");class wu extends Vs{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 Mu=Ci(wu);class Bu extends cn{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Ms.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 Fu=Ci(Bu);class Uu extends cn{static get type(){return"TextureNode"}constructor(e,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.sampler=!0,this.updateMatrix=!1,this.updateType=Ms.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=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===b?"uvec4":this.value.type===T?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Eu(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=hn(this.value.matrix)),this._matrixUniform.mul($i(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?Ms.RENDER:Ms.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Li(Mu(this,this.levelNode).y).sub(t.y).sub(1))),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().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,o,a){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):a?e.generateTextureGrad(u,t,r,a,n):o?e.generateTextureCompare(u,t,r,o,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if("sampler"===t)return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:a,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=a?a.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);o=e.getPropertyName(y);const x=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${o} = ${x}`,this),n.snippet=x,n.propertyName=o}let a=o;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(a=Ja(vu(a,u),r.colorSpace).setup(e).build(e,u)),e.format(a,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){return console.warn("THREE.TextureNode: .uv() has been renamed. Use .sample() instead."),this.sample(e)}sample(e){const t=this.clone();return t.uvNode=Si(e),t.referenceNode=this.getSelf(),Si(t)}blur(e){const t=this.clone();return t.biasNode=Si(e).mul(Fu(t)),t.referenceNode=this.getSelf(),Si(t)}level(e){const t=this.clone();return t.levelNode=Si(e),t.referenceNode=this.getSelf(),Si(t)}size(e){return Mu(this,e)}bias(e){const t=this.clone();return t.biasNode=Si(e),t.referenceNode=this.getSelf(),Si(t)}compare(e){const t=this.clone();return t.compareNode=Si(e),t.referenceNode=this.getSelf(),Si(t)}grad(e,t){const r=this.clone();return r.gradNode=[Si(e),Si(t)],r.referenceNode=this.getSelf(),Si(r)}depth(e){const t=this.clone();return t.depthNode=Si(e),t.referenceNode=this.getSelf(),Si(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()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e}}const Pu=Ci(Uu),Iu=(...e)=>Pu(...e).setSampler(!1);class Lu extends cn{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Du=(e,t,r)=>Si(new Lu(e,t,r));class Vu extends Os{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 Ou extends Lu{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Ns(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Ms.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;rSi(new Ou(e,t)),ku=hn(0,"uint").setGroup(an("cameraIndex")).toVarying("v_cameraIndex"),zu=hn("float").label("cameraNear").setGroup(ln).onRenderUpdate((({camera:e})=>e.near)),$u=hn("float").label("cameraFar").setGroup(ln).onRenderUpdate((({camera:e})=>e.far)),Wu=wi((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Gu(r).setGroup(ln).label("cameraProjectionMatrices").element(ku).toVar("cameraProjectionMatrix")}else t=hn("mat4").label("cameraProjectionMatrix").setGroup(ln).onRenderUpdate((({camera:e})=>e.projectionMatrix));return t})).once()(),Hu=hn("mat4").label("cameraProjectionMatrixInverse").setGroup(ln).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse)),ju=wi((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Gu(r).setGroup(ln).label("cameraViewMatrices").element(ku).toVar("cameraViewMatrix")}else t=hn("mat4").label("cameraViewMatrix").setGroup(ln).onRenderUpdate((({camera:e})=>e.matrixWorldInverse));return t})).once()(),qu=hn("mat4").label("cameraWorldMatrix").setGroup(ln).onRenderUpdate((({camera:e})=>e.matrixWorld)),Xu=hn("mat3").label("cameraNormalMatrix").setGroup(ln).onRenderUpdate((({camera:e})=>e.normalMatrix)),Ku=hn(new r).label("cameraPosition").setGroup(ln).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld)));class Yu extends Vs{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Ms.OBJECT,this._uniformNode=new cn(null)}getNodeType(){const e=this.scope;return e===Yu.WORLD_MATRIX?"mat4":e===Yu.POSITION||e===Yu.VIEW_POSITION||e===Yu.DIRECTION||e===Yu.SCALE?"vec3":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===Yu.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===Yu.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===Yu.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===Yu.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===Yu.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}}generate(e){const t=this.scope;return t===Yu.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t!==Yu.POSITION&&t!==Yu.VIEW_POSITION&&t!==Yu.DIRECTION&&t!==Yu.SCALE||(this._uniformNode.nodeType="vec3"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}Yu.WORLD_MATRIX="worldMatrix",Yu.POSITION="position",Yu.SCALE="scale",Yu.VIEW_POSITION="viewPosition",Yu.DIRECTION="direction";const Qu=Ci(Yu,Yu.DIRECTION),Zu=Ci(Yu,Yu.WORLD_MATRIX),Ju=Ci(Yu,Yu.POSITION),el=Ci(Yu,Yu.SCALE),tl=Ci(Yu,Yu.VIEW_POSITION);class rl extends Yu{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const sl=Ei(rl,rl.DIRECTION),il=Ei(rl,rl.WORLD_MATRIX),nl=Ei(rl,rl.POSITION),ol=Ei(rl,rl.SCALE),al=Ei(rl,rl.VIEW_POSITION),ul=hn(new n).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),ll=hn(new o).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),dl=wi((e=>e.renderer.nodes.modelViewMatrix||cl)).once()().toVar("modelViewMatrix"),cl=ju.mul(il),hl=wi((e=>(e.context.isHighPrecisionModelViewMatrix=!0,hn("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highpModelViewMatrix"),pl=wi((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return hn("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highpModelNormalViewMatrix"),gl=Cu("position","vec3"),ml=gl.toVarying("positionLocal"),fl=gl.toVarying("positionPrevious"),yl=il.mul(ml).xyz.toVarying("v_positionWorld").context({needsPositionReassign:!0}),xl=ml.transformDirection(il).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection").context({needsPositionReassign:!0}),bl=wi((e=>e.context.setupPositionView()),"vec3").once()().toVarying("v_positionView").context({needsPositionReassign:!0}),Tl=bl.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class _l extends Vs{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===l&&r.side===_?"false":e.getFrontFacing()}}const vl=Ei(_l),Nl=Ii(vl).mul(2).sub(1),Sl=Cu("normal","vec3"),Al=wi((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('TSL.NormalNode: Vertex attribute "normal" not found on geometry.'),$i(0,1,0)):Sl),"vec3").once()().toVar("normalLocal"),Rl=bl.dFdx().cross(bl.dFdy()).normalize().toVar("normalFlat"),Cl=wi((e=>{let t;return t=!0===e.material.flatShading?Rl:$a(Ul(Al),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),El=$a(Cl.transformDirection(ju),"v_normalWorld").normalize().toVar("normalWorld"),wl=wi((e=>e.context.setupNormal().context({getUV:null})),"vec3").once()().mul(Nl).toVar("transformedNormalView"),Ml=wl.transformDirection(ju).toVar("transformedNormalWorld"),Bl=wi((e=>e.context.setupClearcoatNormal().context({getUV:null})),"vec3").once()().mul(Nl).toVar("transformedClearcoatNormalView"),Fl=wi((([e,t=il])=>{const r=Zi(t),s=e.div($i(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),Ul=wi((([e],t)=>{const r=t.renderer.nodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=ul.mul(e);return ju.transformDirection(s)})),Pl=hn(0).onReference((({material:e})=>e)).onRenderUpdate((({material:e})=>e.refractionRatio)),Il=Tl.negate().reflect(wl),Ll=Tl.negate().refract(wl,Pl),Dl=Il.transformDirection(ju).toVar("reflectVector"),Vl=Ll.transformDirection(ju).toVar("reflectVector");class Ol extends Uu{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===v?Dl:e.mapping===N?Vl:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),$i(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==d&&r.isRenderTargetTexture?t:$i(t.x.negate(),t.yz)}generateUV(e,t){return t.build(e,"vec3")}}const Gl=Ci(Ol);class kl extends Os{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 zl extends Vs{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=Ms.OBJECT}element(e){return Si(new kl(this,Si(e)))}setGroup(e){return this.group=e,this}label(e){return this.name=e,this}setNodeType(e){let t=null;t=null!==this.count?Du(null,e,this.count):Array.isArray(this.getValueFromReference())?Gu(null,e):"texture"===e?Pu(null):"cubeTexture"===e?Gl(null):hn(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.label(this.name),this.node=t.getSelf()}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;eSi(new zl(e,t,r)),Wl=(e,t,r,s)=>Si(new zl(e,t,s,r));class Hl extends zl{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 jl=(e,t,r=null)=>Si(new Hl(e,t,r)),ql=wi((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),Cu("tangent","vec4"))))(),Xl=ql.xyz.toVar("tangentLocal"),Kl=dl.mul(qi(Xl,0)).xyz.toVarying("v_tangentView").normalize().toVar("tangentView"),Yl=Kl.transformDirection(ju).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Ql=Kl.toVar("transformedTangentView"),Zl=Ql.transformDirection(ju).normalize().toVar("transformedTangentWorld"),Jl=e=>e.mul(ql.w).xyz,ed=$a(Jl(Sl.cross(ql)),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),td=$a(Jl(Al.cross(Xl)),"v_bitangentLocal").normalize().toVar("bitangentLocal"),rd=$a(Jl(Cl.cross(Kl)),"v_bitangentView").normalize().toVar("bitangentView"),sd=$a(Jl(El.cross(Yl)),"v_bitangentWorld").normalize().toVar("bitangentWorld"),id=Jl(wl.cross(Ql)).normalize().toVar("transformedBitangentView"),nd=id.transformDirection(ju).normalize().toVar("transformedBitangentWorld"),od=Zi(Kl,rd,Cl),ad=Tl.mul(od),ud=(()=>{let e=Mn.cross(Tl);return e=e.cross(Mn).normalize(),e=ba(e,wl,En.mul(xn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),ld=wi((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),o=t.dFdy(),a=i.dFdx(),u=i.dFdy(),l=r,d=o.cross(l),c=l.cross(n),h=d.mul(a.x).add(c.mul(u.x)),p=d.mul(a.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=Nl.mul(g.inverseSqrt());return Kn(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class dd extends ks{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=S}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=$i(s.xy.mul(r),s.z));let i=null;if(t===A)i=Ul(s);else if(t===S){i=!0===e.hasGeometryAttribute("tangent")?od.mul(s).normalize():ld({eye_pos:bl,surf_norm:Cl,mapN:s,uv:Eu()})}return i}}const cd=Ci(dd),hd=wi((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||Eu()),forceUVContext:!0}),s=Ii(r((e=>e)));return Oi(Ii(r((e=>e.add(e.dFdx())))).sub(s),Ii(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),pd=wi((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,o=t.dFdy().normalize().cross(n),a=n.cross(i),u=i.dot(o).mul(Nl),l=u.sign().mul(s.x.mul(o).add(s.y.mul(a)));return u.abs().mul(r).sub(l).normalize()}));class gd extends ks{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=hd({textureNode:this.textureNode,bumpScale:e});return pd({surf_pos:bl,surf_norm:Cl,dHdxy:t})}}const md=Ci(gd),fd=new Map;class yd extends Vs{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=fd.get(e);return void 0===r&&(r=jl(e,t),fd.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===yd.COLOR){const e=void 0!==t.color?this.getColor(r):$i();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===yd.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===yd.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:Ii(1);else if(r===yd.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===yd.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===yd.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===yd.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===yd.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===yd.NORMAL)t.normalMap?(s=cd(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?md(this.getTexture("bump").r,this.getFloat("bumpScale")):Cl;else if(r===yd.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===yd.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===yd.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?cd(this.getTexture(r),this.getCache(r+"Scale","vec2")):Cl;else if(r===yd.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===yd.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===yd.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Qi(tc.x,tc.y,tc.y.negate(),tc.x).mul(e.rg.mul(2).sub(Oi(1)).normalize().mul(e.b))}else s=tc;else if(r===yd.IRIDESCENCE_THICKNESS){const e=$l("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=$l("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===yd.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===yd.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===yd.IOR)s=this.getFloat(r);else if(r===yd.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===yd.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}yd.ALPHA_TEST="alphaTest",yd.COLOR="color",yd.OPACITY="opacity",yd.SHININESS="shininess",yd.SPECULAR="specular",yd.SPECULAR_STRENGTH="specularStrength",yd.SPECULAR_INTENSITY="specularIntensity",yd.SPECULAR_COLOR="specularColor",yd.REFLECTIVITY="reflectivity",yd.ROUGHNESS="roughness",yd.METALNESS="metalness",yd.NORMAL="normal",yd.CLEARCOAT="clearcoat",yd.CLEARCOAT_ROUGHNESS="clearcoatRoughness",yd.CLEARCOAT_NORMAL="clearcoatNormal",yd.EMISSIVE="emissive",yd.ROTATION="rotation",yd.SHEEN="sheen",yd.SHEEN_ROUGHNESS="sheenRoughness",yd.ANISOTROPY="anisotropy",yd.IRIDESCENCE="iridescence",yd.IRIDESCENCE_IOR="iridescenceIOR",yd.IRIDESCENCE_THICKNESS="iridescenceThickness",yd.IOR="ior",yd.TRANSMISSION="transmission",yd.THICKNESS="thickness",yd.ATTENUATION_DISTANCE="attenuationDistance",yd.ATTENUATION_COLOR="attenuationColor",yd.LINE_SCALE="scale",yd.LINE_DASH_SIZE="dashSize",yd.LINE_GAP_SIZE="gapSize",yd.LINE_WIDTH="linewidth",yd.LINE_DASH_OFFSET="dashOffset",yd.POINT_SIZE="size",yd.DISPERSION="dispersion",yd.LIGHT_MAP="light",yd.AO="ao";const xd=Ei(yd,yd.ALPHA_TEST),bd=Ei(yd,yd.COLOR),Td=Ei(yd,yd.SHININESS),_d=Ei(yd,yd.EMISSIVE),vd=Ei(yd,yd.OPACITY),Nd=Ei(yd,yd.SPECULAR),Sd=Ei(yd,yd.SPECULAR_INTENSITY),Ad=Ei(yd,yd.SPECULAR_COLOR),Rd=Ei(yd,yd.SPECULAR_STRENGTH),Cd=Ei(yd,yd.REFLECTIVITY),Ed=Ei(yd,yd.ROUGHNESS),wd=Ei(yd,yd.METALNESS),Md=Ei(yd,yd.NORMAL),Bd=Ei(yd,yd.CLEARCOAT),Fd=Ei(yd,yd.CLEARCOAT_ROUGHNESS),Ud=Ei(yd,yd.CLEARCOAT_NORMAL),Pd=Ei(yd,yd.ROTATION),Id=Ei(yd,yd.SHEEN),Ld=Ei(yd,yd.SHEEN_ROUGHNESS),Dd=Ei(yd,yd.ANISOTROPY),Vd=Ei(yd,yd.IRIDESCENCE),Od=Ei(yd,yd.IRIDESCENCE_IOR),Gd=Ei(yd,yd.IRIDESCENCE_THICKNESS),kd=Ei(yd,yd.TRANSMISSION),zd=Ei(yd,yd.THICKNESS),$d=Ei(yd,yd.IOR),Wd=Ei(yd,yd.ATTENUATION_DISTANCE),Hd=Ei(yd,yd.ATTENUATION_COLOR),jd=Ei(yd,yd.LINE_SCALE),qd=Ei(yd,yd.LINE_DASH_SIZE),Xd=Ei(yd,yd.LINE_GAP_SIZE),Kd=Ei(yd,yd.LINE_WIDTH),Yd=Ei(yd,yd.LINE_DASH_OFFSET),Qd=Ei(yd,yd.POINT_SIZE),Zd=Ei(yd,yd.DISPERSION),Jd=Ei(yd,yd.LIGHT_MAP),ec=Ei(yd,yd.AO),tc=hn(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))})),rc=wi((e=>e.context.setupModelViewProjection()),"vec4").once()().toVarying("v_modelViewProjection");class sc extends Vs{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===sc.VERTEX)s=e.getVertexIndex();else if(r===sc.INSTANCE)s=e.getInstanceIndex();else if(r===sc.DRAW)s=e.getDrawIndex();else if(r===sc.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===sc.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==sc.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=$a(this).build(e,t)}return i}}sc.VERTEX="vertex",sc.INSTANCE="instance",sc.SUBGROUP="subgroup",sc.INVOCATION_LOCAL="invocationLocal",sc.INVOCATION_SUBGROUP="invocationSubgroup",sc.DRAW="draw";const ic=Ei(sc,sc.VERTEX),nc=Ei(sc,sc.INSTANCE),oc=Ei(sc,sc.SUBGROUP),ac=Ei(sc,sc.INVOCATION_SUBGROUP),uc=Ei(sc,sc.INVOCATION_LOCAL),lc=Ei(sc,sc.DRAW);class dc extends Vs{static get type(){return"InstanceNode"}constructor(e,t,r){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Ms.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=Du(r.array,"mat4",Math.max(t,1)).element(nc);else{const e=new R(r.array,16,1);this.buffer=e;const t=r.usage===f?cu:du,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=Ji(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new C(s.array,3),t=s.usage===f?cu:du;this.bufferColor=e,n=$i(t(e,"vec3",3,0)),this.instanceColorNode=n}const o=i.mul(ml).xyz;if(ml.assign(o),e.hasGeometryAttribute("normal")){const e=Fl(Al,i);Al.assign(e)}null!==this.instanceColorNode&&mn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==f&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==f&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const cc=Ci(dc);class hc extends dc{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const pc=Ci(hc);class gc extends Vs{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=nc:this.batchingIdNode=lc);const t=wi((([e])=>{const t=Mu(Iu(this.batchMesh._indirectTexture),0),r=Li(e).modInt(Li(t)),s=Li(e).div(Li(t));return Iu(this.batchMesh._indirectTexture,Gi(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Li(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=Mu(Iu(s),0),n=Ii(r).mul(4).toInt().toVar(),o=n.modInt(i),a=n.div(Li(i)),u=Ji(Iu(s,Gi(o,a)),Iu(s,Gi(o.add(1),a)),Iu(s,Gi(o.add(2),a)),Iu(s,Gi(o.add(3),a))),l=this.batchMesh._colorsTexture;if(null!==l){const e=wi((([e])=>{const t=Mu(Iu(l),0).x,r=e,s=r.modInt(t),i=r.div(t);return Iu(l,Gi(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);mn("vec3","vBatchColor").assign(t)}const d=Zi(u);ml.assign(u.mul(ml));const c=Al.div($i(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;Al.assign(h),e.hasGeometryAttribute("tangent")&&Xl.mulAssign(d)}}const mc=Ci(gc),fc=new WeakMap;class yc extends Vs{static get type(){return"SkinningNode"}constructor(e,t=!1){let r,s,i;super("void"),this.skinnedMesh=e,this.useReference=t,this.updateType=Ms.OBJECT,this.skinIndexNode=Cu("skinIndex","uvec4"),this.skinWeightNode=Cu("skinWeight","vec4"),t?(r=$l("bindMatrix","mat4"),s=$l("bindMatrixInverse","mat4"),i=Wl("skeleton.boneMatrices","mat4",e.skeleton.bones.length)):(r=hn(e.bindMatrix,"mat4"),s=hn(e.bindMatrixInverse,"mat4"),i=Du(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length)),this.bindMatrixNode=r,this.bindMatrixInverseNode=s,this.boneMatricesNode=i,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=ml){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=Kn(o.mul(s.x).mul(d),a.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=Al){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=Kn(s.x.mul(o),s.y.mul(a),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=Wl("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,fl)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===As(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&fl.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(ml.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();Al.assign(t),e.hasGeometryAttribute("tangent")&&Xl.assign(t)}}generate(e,t){if("void"!==t)return ml.build(e,t)}update(e){const t=(this.useReference?e.object:this.skinnedMesh).skeleton;fc.get(t)!==e.frameId&&(fc.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const xc=e=>Si(new yc(e,!0));class bc extends Vs{static get type(){return"LoopNode"}constructor(e=[]){super(),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(n)?">=":"<"));const d={start:i,end:n,condition:u},c=d.start,h=d.end;let p="",g="",m="";l||(l="int"===a||"uint"===a?u.includes("<")?"++":"--":u.includes("<")?"+= 1.":"-= 1."),p+=e.getVar(a,o)+" = "+c,g+=o+" "+u+" "+h,m+=o+" "+l;const f=`for ( ${p}; ${g}; ${m} )`;e.addFlowCode((0===t?"\n":"")+e.tab+f+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tSi(new bc(Ri(e,"int"))).append(),_c=()=>vu("break").append(),vc=new WeakMap,Nc=new s,Sc=wi((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const o=Li(ic).mul(r).add(n),a=o.div(s),u=o.sub(a.mul(s));return Iu(e,Gi(u,a)).depth(i).mul(t)}));class Ac extends Vs{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=hn(1),this.updateType=Ms.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,o=void 0!==n?n.length:0,{texture:a,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,o=void 0!==n?n.length:0;let a=vc.get(e);if(void 0===a||a.count!==o){void 0!==a&&a.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*o),f=new E(m,h,p,o);f.type=w,f.needsUpdate=!0;const y=4*c;for(let b=0;b{const t=Ii(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Iu(this.mesh.morphTexture,Gi(Li(e).add(1),Li(nc))).r):t.assign($l("morphTargetInfluences","float").element(e).toVar()),!0===s&&ml.addAssign(Sc({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Li(0)})),!0===i&&Al.addAssign(Sc({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Li(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 Rc=Ci(Ac);class Cc extends Vs{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Ec extends Cc{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class wc extends Pa{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:$i().toVar("directDiffuse"),directSpecular:$i().toVar("directSpecular"),indirectDiffuse:$i().toVar("indirectDiffuse"),indirectSpecular:$i().toVar("indirectSpecular")};return{radiance:$i().toVar("radiance"),irradiance:$i().toVar("irradiance"),iblIrradiance:$i().toVar("iblIrradiance"),ambientOcclusion:Ii(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 Mc=Ci(wc);class Bc extends Cc{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let Fc,Uc;class Pc extends Vs{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===Pc.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Ms.NONE;return this.scope!==Pc.SIZE&&this.scope!==Pc.VIEWPORT||(e=Ms.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Pc.VIEWPORT?null!==t?Uc.copy(t.viewport):(e.getViewport(Uc),Uc.multiplyScalar(e.getPixelRatio())):null!==t?(Fc.width=t.width,Fc.height=t.height):e.getDrawingBufferSize(Fc)}setup(){const e=this.scope;let r=null;return r=e===Pc.SIZE?hn(Fc||(Fc=new t)):e===Pc.VIEWPORT?hn(Uc||(Uc=new s)):Oi(Dc.div(Lc)),r}generate(e){if(this.scope===Pc.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Lc).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Pc.COORDINATE="coordinate",Pc.VIEWPORT="viewport",Pc.SIZE="size",Pc.UV="uv";const Ic=Ei(Pc,Pc.UV),Lc=Ei(Pc,Pc.SIZE),Dc=Ei(Pc,Pc.COORDINATE),Vc=Ei(Pc,Pc.VIEWPORT),Oc=Vc.zw,Gc=Dc.sub(Vc.xy),kc=Gc.div(Oc),zc=wi((()=>(console.warn('TSL.ViewportNode: "viewportResolution" is deprecated. Use "screenSize" instead.'),Lc)),"vec2").once()(),$c=wi((()=>(console.warn('TSL.ViewportNode: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),Ic)),"vec2").once()(),Wc=wi((()=>(console.warn('TSL.ViewportNode: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),Ic.flipY())),"vec2").once()(),Hc=new t;class jc extends Uu{static get type(){return"ViewportTextureNode"}constructor(e=Ic,t=null,r=null){null===r&&((r=new M).minFilter=B),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=Ms.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(Hc);const r=this.value;r.image.width===Hc.width&&r.image.height===Hc.height||(r.image.width=Hc.width,r.image.height=Hc.height,r.needsUpdate=!0);const s=r.generateMipmaps;r.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(r),r.generateMipmaps=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const qc=Ci(jc),Xc=Ci(jc,null,null,{generateMipmaps:!0});let Kc=null;class Yc extends jc{static get type(){return"ViewportDepthTextureNode"}constructor(e=Ic,t=null){null===Kc&&(Kc=new F),super(e,t,Kc)}}const Qc=Ci(Yc);class Zc extends Vs{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===Zc.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Zc.DEPTH_BASE)null!==r&&(s=sh().assign(r));else if(t===Zc.DEPTH)s=e.isPerspectiveCamera?eh(bl.z,zu,$u):Jc(bl.z,zu,$u);else if(t===Zc.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=th(r,zu,$u);s=Jc(e,zu,$u)}else s=r;else s=Jc(bl.z,zu,$u);return s}}Zc.DEPTH_BASE="depthBase",Zc.DEPTH="depth",Zc.LINEAR_DEPTH="linearDepth";const Jc=(e,t,r)=>e.add(t).div(t.sub(r)),eh=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),th=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),rh=(e,t,r)=>{t=t.max(1e-6).toVar();const s=Mo(e.negate().div(t)),i=Mo(r.div(t));return s.div(i)},sh=Ci(Zc,Zc.DEPTH_BASE),ih=Ei(Zc,Zc.DEPTH),nh=Ci(Zc,Zc.LINEAR_DEPTH),oh=nh(Qc());ih.assign=e=>sh(e);const ah=Ci(class extends Vs{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}});class uh extends Vs{static get type(){return"ClippingNode"}constructor(e=uh.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===uh.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===uh.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return wi((()=>{const r=Ii().toVar("distanceToPlane"),s=Ii().toVar("distanceToGradient"),i=Ii(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Gu(t);Tc(n,(({i:t})=>{const n=e.element(t);r.assign(bl.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(Na(s.negate(),s,r))}))}const o=e.length;if(o>0){const t=Gu(e),n=Ii(1).toVar("intersectionClipOpacity");Tc(o,(({i:e})=>{const i=t.element(e);r.assign(bl.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(Na(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}fn.a.mulAssign(i),fn.a.equal(0).discard()}))()}setupDefault(e,t){return wi((()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Gu(t);Tc(r,(({i:t})=>{const r=e.element(t);bl.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=Gu(e),r=Vi(!0).toVar("clipped");Tc(s,(({i:e})=>{const s=t.element(e);r.assign(bl.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),wi((()=>{const s=Gu(e),i=ah(t.getClipDistance());Tc(r,(({i:e})=>{const t=s.element(e),r=bl.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}uh.ALPHA_TO_COVERAGE="alphaToCoverage",uh.DEFAULT="default",uh.HARDWARE="hardware";const lh=wi((([e])=>Lo(Qn(1e4,Do(Qn(17,e.x).add(Qn(.1,e.y)))).mul(Kn(.1,$o(Do(Qn(13,e.y).add(e.x)))))))),dh=wi((([e])=>lh(Oi(lh(e.xy),e.z)))),ch=wi((([e])=>{const t=ia(Ho(Xo(e.xyz)),Ho(Ko(e.xyz))),r=Ii(1).div(Ii(.05).mul(t)).toVar("pixScale"),s=Oi(Eo(Uo(Mo(r))),Eo(Po(Mo(r)))),i=Oi(dh(Uo(s.x.mul(e.xyz))),dh(Uo(s.y.mul(e.xyz)))),n=Lo(Mo(r)),o=Kn(Qn(n.oneMinus(),i.x),Qn(n,i.y)),a=sa(n,n.oneMinus()),u=$i(o.mul(o).div(Qn(2,a).mul(Yn(1,a))),o.sub(Qn(.5,a)).div(Yn(1,a)),Yn(1,Yn(1,o).mul(Yn(1,o)).div(Qn(2,a).mul(Yn(1,a))))),l=o.lessThan(a.oneMinus()).select(o.lessThan(a).select(u.x,u.y),u.z);return Ta(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class hh extends U{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.positionNode=null,this.geometryNode=null,this.depthNode=null,this.shadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null}customProgramCacheKey(){return this.type+fs(this)}build(e){this.setup(e)}setupObserver(e){return new cs(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=this.vertexNode||this.setupVertex(e);let i;e.stack.outputNode=s,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const n=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!==n&&e.stack.add(n);const o=qi(s,fn.a).max(0);if(i=this.setupOutput(e,o),Pn.assign(i),null!==this.outputNode&&(i=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(i=e,null!==r&&(i=e.merge(r))):null!==r&&(i=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=qi(t)),i=this.setupOutput(e,t)}e.stack.outputNode=i,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.samples;this.alphaToCoverage&&t>1?s=Si(new uh(uh.ALPHA_TO_COVERAGE)):e.stack.add(Si(new uh))}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.add(Si(new uh(uh.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?rh(bl.z,zu,$u):Jc(bl.z,zu,$u))}null!==s&&ih.assign(s).append()}setupPositionView(){return dl.mul(ml).xyz}setupModelViewProjection(){return Wu.mul(bl)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),rc}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&Rc(t).append(),!0===t.isSkinnedMesh&&xc(t).append(),this.displacementMap){const e=jl("displacementMap","texture"),t=jl("displacementScale","float"),r=jl("displacementBias","float");ml.addAssign(Al.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&mc(t).append(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&pc(t).append(),null!==this.positionNode&&ml.assign(this.positionNode.context({isPositionNodeInput:!0})),ml}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?qi(this.colorNode):bd;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=qi(r.xyz.mul(Cu("color","vec3")),r.a)),e.instanceColor){r=mn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=mn("vec3","vBatchColor").mul(r)}fn.assign(r);const s=this.opacityNode?Ii(this.opacityNode):vd;if(fn.a.assign(fn.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?Ii(this.alphaTestNode):xd;fn.a.lessThanEqual(e).discard()}!0===this.alphaHash&&fn.a.lessThan(ch(ml)).discard(),!1===this.transparent&&this.blending===P&&!1===this.alphaToCoverage&&fn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?$i(0):fn.rgb}setupNormal(){return this.normalNode?$i(this.normalNode):Md}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?jl("envMap","cubeTexture"):jl("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Bc(Jd)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:ec;t.push(new Ec(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}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 o=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e);o=Mc(n,t,r,s)}else null!==r&&(o=$i(null!==s?ba(o,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(yn.assign($i(i||_d)),o=o.add(yn)),o}setupOutput(e,t){if(!0===this.fog){const r=e.fogNode;r&&(Pn.assign(t),t=qi(r))}return 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=U.prototype.toJSON.call(this,e),s=ys(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,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.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.shadowPositionNode=e.shadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const ph=new I;class gh extends hh{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(ph),this.setValues(e)}}const mh=new L;class fh extends hh{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(mh),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?Ii(this.offsetNode):Yd,t=this.dashScaleNode?Ii(this.dashScaleNode):jd,r=this.dashSizeNode?Ii(this.dashSizeNode):qd,s=this.gapSizeNode?Ii(this.gapSizeNode):Xd;In.assign(r),Ln.assign(s);const i=$a(Cu("lineDistance").mul(t));(e?i.add(e):i).mod(In.add(Ln)).greaterThan(In).discard()}}let yh=null;class xh extends jc{static get type(){return"ViewportSharedTextureNode"}constructor(e=Ic,t=null){null===yh&&(yh=new M),super(e,t,yh)}updateReference(){return this}}const bh=Ci(xh),Th=new L;class _h extends hh{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(Th),this.useColor=e.vertexColors,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=D,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,o=wi((({start:e,end:t})=>{const r=Wu.element(2).element(2),s=Wu.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return qi(ba(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=wi((()=>{const e=Cu("instanceStart"),t=Cu("instanceEnd"),r=qi(dl.mul(qi(e,1))).toVar("start"),s=qi(dl.mul(qi(t,1))).toVar("end");if(i){const e=this.dashScaleNode?Ii(this.dashScaleNode):jd,t=this.offsetNode?Ii(this.offsetNode):Yd,r=Cu("instanceDistanceStart"),s=Cu("instanceDistanceEnd");let i=gl.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),mn("float","lineDistance").assign(i)}n&&(mn("vec3","worldStart").assign(r.xyz),mn("vec3","worldEnd").assign(s.xyz));const a=Vc.z.div(Vc.w),u=Wu.element(2).element(3).equal(-1);Fi(u,(()=>{Fi(r.z.lessThan(0).and(s.z.greaterThan(0)),(()=>{s.assign(o({start:r,end:s}))})).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(o({start:s,end:r}))}))}));const l=Wu.mul(r),d=Wu.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(a)),p.assign(p.normalize());const g=qi().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=ba(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),o=e.cross(n),a=mn("vec4","worldPos");a.assign(gl.y.lessThan(.5).select(r,s));const u=Kd.mul(.5);a.addAssign(qi(gl.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(a.addAssign(qi(gl.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),a.addAssign(qi(o.mul(u),0)),Fi(gl.y.greaterThan(1).or(gl.y.lessThan(0)),(()=>{a.subAssign(qi(o.mul(2).mul(u),0))}))),g.assign(Wu.mul(a));const l=$i().toVar();l.assign(gl.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Oi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(a)),e.x.assign(e.x.div(a)),e.assign(gl.x.lessThan(0).select(e.negate(),e)),Fi(gl.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(gl.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(Kd)),e.assign(e.div(Vc.w)),g.assign(gl.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(qi(e,0,0)))}return g}))();const a=wi((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),o=t.sub(e),a=i.dot(n),u=n.dot(o),l=i.dot(o),d=n.dot(n),c=o.dot(o).mul(d).sub(u.mul(u)),h=a.mul(u).sub(l.mul(d)).div(c).clamp(),p=a.add(u.mul(h)).div(d).clamp();return Oi(h,p)}));if(this.colorNode=wi((()=>{const e=Eu();if(i){const t=this.dashSizeNode?Ii(this.dashSizeNode):qd,r=this.gapSizeNode?Ii(this.gapSizeNode):Xd;In.assign(t),Ln.assign(r);const s=mn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(In.add(Ln)).greaterThan(In).discard()}const o=Ii(1).toVar("alpha");if(n){const e=mn("vec3","worldStart"),s=mn("vec3","worldEnd"),n=mn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=a({p1:e,p2:s,p3:$i(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Kd);if(!i)if(r&&t.samples>1){const e=h.fwidth();o.assign(Na(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){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=Ii(s.fwidth()).toVar("dlen");Fi(e.y.abs().greaterThan(1),(()=>{o.assign(Na(i.oneMinus(),i.add(1),s).oneMinus())}))}else Fi(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=Cu("instanceColorStart"),t=Cu("instanceColorEnd");u=gl.y.lessThan(.5).select(e,t).mul(bd)}else u=bd;return qi(u,o)}))(),this.transparent){const e=this.opacityNode?Ii(this.opacityNode):vd;this.outputNode=qi(this.colorNode.rgb.mul(e).add(bh().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 vh=e=>Si(e).mul(.5).add(.5),Nh=new V;class Sh extends hh{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Nh),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?Ii(this.opacityNode):vd;fn.assign(qi(vh(wl),e))}}class Ah extends ks{static get type(){return"EquirectUVNode"}constructor(e=xl){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,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 Oi(t,r)}}const Rh=Ci(Ah);class Ch extends O{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 G(5,5,5),n=Rh(xl),o=new hh;o.colorNode=Pu(t,n,0),o.side=_,o.blending=D;const a=new k(i,o),u=new z;u.add(a),t.minFilter===B&&(t.minFilter=$);const l=new W(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,a.geometry.dispose(),a.material.dispose(),this}}const Eh=new WeakMap;class wh extends ks{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=Gl();const t=new H;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Ms.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===j||r===q){if(Eh.has(e)){const t=Eh.get(e);Bh(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Ch(r.height);s.fromEquirectangularTexture(t,e),Bh(s.texture,e.mapping),this._cubeTexture=s.texture,Eh.set(e,s.texture),e.addEventListener("dispose",Mh)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function Mh(e){const t=e.target;t.removeEventListener("dispose",Mh);const r=Eh.get(t);void 0!==r&&(Eh.delete(t),r.dispose())}function Bh(e,t){t===j?e.mapping=v:t===q&&(e.mapping=N)}const Fh=Ci(wh);class Uh extends Cc{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=Fh(this.envNode)}}class Ph extends Cc{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=Ii(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class Ih{start(){}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class Lh extends Ih{constructor(){super()}indirect(e,t,r){const s=e.ambientOcclusion,i=e.reflectedLight,n=r.context.irradianceLightMap;i.indirectDiffuse.assign(qi(0)),n?i.indirectDiffuse.addAssign(n):i.indirectDiffuse.addAssign(qi(1,1,1,0)),i.indirectDiffuse.mulAssign(s),i.indirectDiffuse.mulAssign(fn.rgb)}finish(e,t,r){const s=r.material,i=e.outgoingLight,n=r.context.environment;if(n)switch(s.combine){case Y:i.rgb.assign(ba(i.rgb,i.rgb.mul(n.rgb),Rd.mul(Cd)));break;case K:i.rgb.assign(ba(i.rgb,n.rgb,Rd.mul(Cd)));break;case X:i.rgb.addAssign(n.rgb.mul(Rd.mul(Cd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",s.combine)}}}const Dh=new Q;class Vh extends hh{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Dh),this.setValues(e)}setupNormal(){return Cl}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Uh(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Ph(Jd)),t}setupOutgoingLight(){return fn.rgb}setupLightingModel(){return new Lh}}const Oh=wi((({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))})),Gh=wi((e=>e.diffuseColor.mul(1/Math.PI))),kh=wi((({dotNH:e})=>Un.mul(Ii(.5)).add(1).mul(Ii(1/Math.PI)).mul(e.pow(Un)))),zh=wi((({lightDirection:e})=>{const t=e.add(Tl).normalize(),r=wl.dot(t).clamp(),s=Tl.dot(t).clamp(),i=Oh({f0:Bn,f90:1,dotVH:s}),n=Ii(.25),o=kh({dotNH:r});return i.mul(n).mul(o)}));class $h extends Lh{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=wl.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Gh({diffuseColor:fn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(zh({lightDirection:e})).mul(Rd))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Gh({diffuseColor:fn}))),r.indirectDiffuse.mulAssign(e)}}const Wh=new Z;class Hh extends hh{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Wh),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Uh(t):null}setupLightingModel(){return new $h(!1)}}const jh=new J;class qh extends hh{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(jh),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Uh(t):null}setupLightingModel(){return new $h}setupVariants(){const e=(this.shininessNode?Ii(this.shininessNode):Td).max(1e-4);Un.assign(e);const t=this.specularNode||Nd;Bn.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Xh=wi((e=>{if(!1===e.geometry.hasAttribute("normal"))return Ii(0);const t=Cl.dFdx().abs().max(Cl.dFdy().abs());return t.x.max(t.y).max(t.z)})),Kh=wi((e=>{const{roughness:t}=e,r=Xh();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),Yh=wi((({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 Zn(.5,i.add(n).max(bo))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Qh=wi((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:o,dotNL:a})=>{const u=a.mul($i(e.mul(r),t.mul(s),o).length()),l=o.mul($i(e.mul(i),t.mul(n),a).length());return Zn(.5,u.add(l)).saturate()})).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"}]}),Zh=wi((({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"}]}),Jh=Ii(1/Math.PI),ep=wi((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),o=$i(t.mul(s),e.mul(i),n.mul(r)),a=o.dot(o),u=n.div(a);return Jh.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"}]}),tp=wi((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:o,USE_ANISOTROPY:a}=e,u=e.normalView||wl,l=i.pow2(),d=t.add(Tl).normalize(),c=u.dot(t).clamp(),h=u.dot(Tl).clamp(),p=u.dot(d).clamp(),g=Tl.dot(d).clamp();let m,f,y=Oh({f0:r,f90:s,dotVH:g});if(_i(o)&&(y=Sn.mix(y,n)),_i(a)){const e=wn.dot(t),r=wn.dot(Tl),s=wn.dot(d),i=Mn.dot(t),n=Mn.dot(Tl),o=Mn.dot(d);m=Qh({alphaT:Cn,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=ep({alphaT:Cn,alphaB:l,dotNH:p,dotTH:s,dotBH:o})}else m=Yh({alpha:l,dotNL:c,dotNV:h}),f=Zh({alpha:l,dotNH:p});return y.mul(m).mul(f)})),rp=wi((({roughness:e,dotNV:t})=>{const r=qi(-1,-.0275,-.572,.022),s=qi(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return Oi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),sp=wi((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=rp({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),ip=wi((({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($i(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"}]}),np=wi((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=Ii(1).div(r),i=t.pow2().oneMinus().max(.0078125);return Ii(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"}]}),op=wi((({dotNV:e,dotNL:t})=>Ii(1).div(Ii(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),ap=wi((({lightDirection:e})=>{const t=e.add(Tl).normalize(),r=wl.dot(e).clamp(),s=wl.dot(Tl).clamp(),i=wl.dot(t).clamp(),n=np({roughness:Nn,dotNH:i}),o=op({dotNV:s,dotNL:r});return vn.mul(n).mul(o)})),up=wi((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Oi(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"}]}),lp=wi((({f:e})=>{const t=e.length();return ia(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),dp=wi((({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(),o=i.div(n),a=r.greaterThan(0).select(o,ia(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(o));return e.cross(t).mul(a)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),cp=wi((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:o,p3:a})=>{const u=n.sub(i).toVar(),l=a.sub(i).toVar(),d=u.cross(l),c=$i().toVar();return Fi(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(Zi(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(o.sub(r)).normalize().toVar(),m=d.mul(a.sub(r)).normalize().toVar(),f=$i(0).toVar();f.addAssign(dp({v1:h,v2:p})),f.addAssign(dp({v1:p,v2:g})),f.addAssign(dp({v1:g,v2:m})),f.addAssign(dp({v1:m,v2:h})),c.assign($i(lp({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"}]}),hp=1/6,pp=e=>Qn(hp,Qn(e,Qn(e,e.negate().add(3)).sub(3)).add(1)),gp=e=>Qn(hp,Qn(e,Qn(e,Qn(3,e).sub(6))).add(4)),mp=e=>Qn(hp,Qn(e,Qn(e,Qn(-3,e).add(3)).add(3)).add(1)),fp=e=>Qn(hp,ha(e,3)),yp=e=>pp(e).add(gp(e)),xp=e=>mp(e).add(fp(e)),bp=e=>Kn(-1,gp(e).div(pp(e).add(gp(e)))),Tp=e=>Kn(1,fp(e).div(mp(e).add(fp(e)))),_p=(e,t,r)=>{const s=e.uvNode,i=Qn(s,t.zw).add(.5),n=Uo(i),o=Lo(i),a=yp(o.x),u=xp(o.x),l=bp(o.x),d=Tp(o.x),c=bp(o.y),h=Tp(o.y),p=Oi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Oi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Oi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Oi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=yp(o.y).mul(Kn(a.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),x=xp(o.y).mul(Kn(a.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(x)},vp=wi((([e,t=Ii(3)])=>{const r=Oi(e.size(Li(t))),s=Oi(e.size(Li(t.add(1)))),i=Zn(1,r),n=Zn(1,s),o=_p(e,qi(i,r),Uo(t)),a=_p(e,qi(n,s),Po(t));return Lo(t).mix(o,a)})),Np=wi((([e,t,r,s,i])=>{const n=$i(va(t.negate(),Io(e),Zn(1,s))),o=$i(Ho(i[0].xyz),Ho(i[1].xyz),Ho(i[2].xyz));return Io(n).mul(r.mul(o))})).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"}]}),Sp=wi((([e,t])=>e.mul(Ta(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),Ap=Xc(),Rp=Xc(),Cp=wi((([e,t,r],{material:s})=>{const i=(s.side===_?Ap:Rp).sample(e),n=Mo(Lc.x).mul(Sp(t,r));return vp(i,n)})),Ep=wi((([e,t,r])=>(Fi(r.notEqual(0),(()=>{const s=wo(t).negate().div(r);return Co(s.negate().mul(e))})),$i(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),wp=wi((([e,t,r,s,i,n,o,a,u,l,d,c,h,p,g])=>{let m,f;if(g){m=qi().toVar(),f=$i().toVar();const i=d.sub(1).mul(g.mul(.025)),n=$i(d.sub(i),d,d.add(i));Tc({start:0,end:3},(({i:i})=>{const d=n.element(i),g=Np(e,t,c,d,a),y=o.add(g),x=l.mul(u.mul(qi(y,1))),b=Oi(x.xy.div(x.w)).toVar();b.addAssign(1),b.divAssign(2),b.assign(Oi(b.x,b.y.oneMinus()));const T=Cp(b,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Ep(Ho(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=Np(e,t,c,d,a),n=o.add(i),g=l.mul(u.mul(qi(n,1))),y=Oi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Oi(y.x,y.y.oneMinus())),m=Cp(y,r,d),f=s.mul(Ep(Ho(i),h,p))}const y=f.rgb.mul(m.rgb),x=e.dot(t).clamp(),b=$i(sp({dotNV:x,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return qi(b.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),Mp=Zi(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Bp=(e,t)=>e.sub(t).div(e.add(t)).pow2(),Fp=wi((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=ba(e,t,Na(0,.03,s)),o=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();Fi(o.lessThan(0),(()=>$i(1)));const a=o.sqrt(),u=Bp(n,e),l=Oh({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=Ii(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return $i(1).add(t).div($i(1).sub(t))})(i.clamp(0,.9999)),g=Bp(p,n.toVec3()),m=Oh({f0:g,f90:1,dotVH:a}),f=$i(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,a,2),x=$i(h).add(f),b=l.mul(m).clamp(1e-5,.9999),T=b.sqrt(),_=d.pow2().mul(m).div($i(1).sub(b)),v=l.add(_).toVar(),N=_.sub(d).toVar();return Tc({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=$i(54856e-17,44201e-17,52481e-17),i=$i(1681e3,1795300,2208400),n=$i(43278e5,93046e5,66121e5),o=Ii(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let a=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return a=$i(a.x.add(o),a.y,a.z).div(1.0685e-7),Mp.mul(a)})(Ii(e).mul(y),Ii(e).mul(x)).mul(2);v.addAssign(N.mul(t))})),v.max($i(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"}]}),Up=wi((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=Fa(r.lessThan(.25),Ii(-339.2).mul(i).add(Ii(161.4).mul(r)).sub(25.9),Ii(-8.48).mul(i).add(Ii(14.3).mul(r)).sub(9.95)),o=Fa(r.lessThan(.25),Ii(44).mul(i).sub(Ii(23.7).mul(r)).add(3.26),Ii(1.97).mul(i).sub(Ii(3.27).mul(r)).add(.72));return Fa(r.lessThan(.25),0,Ii(.1).mul(r).sub(.025)).add(n.mul(s).add(o).exp()).mul(1/Math.PI).saturate()})),Pp=$i(.04),Ip=Ii(1);class Lp extends Ih{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}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=$i().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=$i().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=$i().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=$i().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=$i().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=wl.dot(Tl).clamp();this.iridescenceFresnel=Fp({outsideIOR:Ii(1),eta2:An,cosTheta1:e,thinFilmThickness:Rn,baseF0:Bn}),this.iridescenceF0=ip({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=yl,r=Ku.sub(yl).normalize(),s=Ml;e.backdrop=wp(s,r,xn,fn,Bn,Fn,t,il,ju,Wu,Vn,Gn,zn,kn,this.dispersion?$n:null),e.backdropAlpha=On,fn.a.mulAssign(ba(1,e.backdrop.a,On))}}computeMultiscattering(e,t,r){const s=wl.dot(Tl).clamp(),i=rp({roughness:xn,dotNV:s}),n=(this.iridescenceF0?Sn.mix(Bn,this.iridescenceF0):Bn).mul(i.x).add(r.mul(i.y)),o=i.x.add(i.y).oneMinus(),a=Bn.add(Bn.oneMinus().mul(.047619)),u=n.mul(a).div(o.mul(a).oneMinus());e.addAssign(n),t.addAssign(u.mul(o))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=wl.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(ap({lightDirection:e}))),!0===this.clearcoat){const r=Bl.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(tp({lightDirection:e,f0:Pp,f90:Ip,roughness:_n,normalView:Bl})))}r.directDiffuse.addAssign(s.mul(Gh({diffuseColor:fn.rgb}))),r.directSpecular.addAssign(s.mul(tp({lightDirection:e,f0:Bn,f90:1,roughness:xn,iridescence:this.iridescence,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:o}){const a=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=wl,h=Tl,p=bl.toVar(),g=up({N:c,V:h,roughness:xn}),m=n.sample(g).toVar(),f=o.sample(g).toVar(),y=Zi($i(m.x,0,m.y),$i(0,1,0),$i(m.z,0,m.w)).toVar(),x=Bn.mul(f.x).add(Bn.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(x).mul(cp({N:c,V:h,P:p,mInv:y,p0:a,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(fn).mul(cp({N:c,V:h,P:p,mInv:Zi(1,0,0,0,1,0,0,0,1),p0:a,p1:u,p2:l,p3:d})))}indirect(e,t,r){this.indirectDiffuse(e,t,r),this.indirectSpecular(e,t,r),this.ambientOcclusion(e,t,r)}indirectDiffuse({irradiance:e,reflectedLight:t}){t.indirectDiffuse.addAssign(e.mul(Gh({diffuseColor:fn})))}indirectSpecular({radiance:e,iblIrradiance:t,reflectedLight:r}){if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(t.mul(vn,Up({normal:wl,viewDir:Tl,roughness:Nn}))),!0===this.clearcoat){const e=Bl.dot(Tl).clamp(),t=sp({dotNV:e,specularColor:Pp,specularF90:Ip,roughness:_n});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const s=$i().toVar("singleScattering"),i=$i().toVar("multiScattering"),n=t.mul(1/Math.PI);this.computeMultiscattering(s,i,Fn);const o=s.add(i),a=fn.mul(o.r.max(o.g).max(o.b).oneMinus());r.indirectSpecular.addAssign(e.mul(s)),r.indirectSpecular.addAssign(i.mul(n)),r.indirectDiffuse.addAssign(a.mul(n))}ambientOcclusion({ambientOcclusion:e,reflectedLight:t}){const r=wl.dot(Tl).clamp().add(e),s=xn.mul(-16).oneMinus().negate().exp2(),i=e.sub(r.pow(s).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(e),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(e),t.indirectDiffuse.mulAssign(e),t.indirectSpecular.mulAssign(i)}finish(e){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Bl.dot(Tl).clamp(),r=Oh({dotVH:e,f0:Pp,f90:Ip}),s=t.mul(Tn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(Tn));t.assign(s)}if(!0===this.sheen){const e=vn.r.max(vn.g).max(vn.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const Dp=Ii(1),Vp=Ii(-2),Op=Ii(.8),Gp=Ii(-1),kp=Ii(.4),zp=Ii(2),$p=Ii(.305),Wp=Ii(3),Hp=Ii(.21),jp=Ii(4),qp=Ii(4),Xp=Ii(16),Kp=wi((([e])=>{const t=$i($o(e)).toVar(),r=Ii(-1).toVar();return Fi(t.x.greaterThan(t.z),(()=>{Fi(t.x.greaterThan(t.y),(()=>{r.assign(Fa(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(Fa(e.y.greaterThan(0),1,4))}))})).Else((()=>{Fi(t.z.greaterThan(t.y),(()=>{r.assign(Fa(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(Fa(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Yp=wi((([e,t])=>{const r=Oi().toVar();return Fi(t.equal(0),(()=>{r.assign(Oi(e.z,e.y).div($o(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(Oi(e.x.negate(),e.z.negate()).div($o(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(Oi(e.x.negate(),e.y).div($o(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(Oi(e.z.negate(),e.y).div($o(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(Oi(e.x.negate(),e.z).div($o(e.y)))})).Else((()=>{r.assign(Oi(e.x,e.y).div($o(e.z)))})),Qn(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Qp=wi((([e])=>{const t=Ii(0).toVar();return Fi(e.greaterThanEqual(Op),(()=>{t.assign(Dp.sub(e).mul(Gp.sub(Vp)).div(Dp.sub(Op)).add(Vp))})).ElseIf(e.greaterThanEqual(kp),(()=>{t.assign(Op.sub(e).mul(zp.sub(Gp)).div(Op.sub(kp)).add(Gp))})).ElseIf(e.greaterThanEqual($p),(()=>{t.assign(kp.sub(e).mul(Wp.sub(zp)).div(kp.sub($p)).add(zp))})).ElseIf(e.greaterThanEqual(Hp),(()=>{t.assign($p.sub(e).mul(jp.sub(Wp)).div($p.sub(Hp)).add(Wp))})).Else((()=>{t.assign(Ii(-2).mul(Mo(Qn(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Zp=wi((([e,t])=>{const r=e.toVar();r.assign(Qn(2,r).sub(1));const s=$i(r,1).toVar();return Fi(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"}]}),Jp=wi((([e,t,r,s,i,n])=>{const o=Ii(r),a=$i(t),u=Ta(Qp(o),Vp,n),l=Lo(u),d=Uo(u),c=$i(eg(e,a,d,s,i,n)).toVar();return Fi(l.notEqual(0),(()=>{const t=$i(eg(e,a,d.add(1),s,i,n)).toVar();c.assign(ba(c,t,l))})),c})),eg=wi((([e,t,r,s,i,n])=>{const o=Ii(r).toVar(),a=$i(t),u=Ii(Kp(a)).toVar(),l=Ii(ia(qp.sub(o),0)).toVar();o.assign(ia(o,qp));const d=Ii(Eo(o)).toVar(),c=Oi(Yp(a,u).mul(d.sub(2)).add(1)).toVar();return Fi(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(Qn(3,Xp))),c.y.addAssign(Qn(4,Eo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(Oi(),Oi())})),tg=wi((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:a})=>{const u=Vo(s),l=r.mul(u).add(i.cross(r).mul(Do(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return eg(e,l,t,n,o,a)})),rg=wi((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:o,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=$i(Fa(t,r,ca(r,s))).toVar();Fi(No(h.equals($i(0))),(()=>{h.assign($i(s.z,0,s.x.negate()))})),h.assign(Io(h));const p=$i().toVar();return p.addAssign(i.element(Li(0)).mul(tg({theta:0,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),Tc({start:Li(1),end:e},(({i:e})=>{Fi(e.greaterThanEqual(n),(()=>{_c()}));const t=Ii(o.mul(Ii(e))).toVar();p.addAssign(i.element(e).mul(tg({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(tg({theta:t,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),qi(p,1)}));let sg=null;const ig=new WeakMap;function ng(e){let t=ig.get(e);if((void 0!==t?t.pmremVersion:-1)!==e.pmremVersion){const r=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(r))return null;t=sg.fromEquirectangular(e,t)}t.pmremVersion=e.pmremVersion,ig.set(e,t)}return t.texture}class og extends ks{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 ee;s.isRenderTargetTexture=!0,this._texture=Pu(s),this._width=hn(0),this._height=hn(0),this._maxMip=hn(0),this.updateBeforeType=Ms.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(){let e=this._pmrem;const t=e?e.pmremVersion:-1,r=this._value;t!==r.pmremVersion&&(e=!0===r.isPMREMTexture?r:ng(r),null!==e&&(this._pmrem=e,this.updateFromTexture(e)))}setup(e){null===sg&&(sg=e.createPMREMGenerator()),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this));const r=this.value;e.renderer.coordinateSystem===l&&!0!==r.isPMREMTexture&&!0===r.isRenderTargetTexture&&(t=$i(t.x.negate(),t.yz)),t=$i(t.x,t.y.negate(),t.z);let s=this.levelNode;return null===s&&e.context.getTextureLevel&&(s=e.context.getTextureLevel(this)),Jp(this._texture,t,s,this._width,this._height,this._maxMip)}}const ag=Ci(og),ug=new WeakMap;class lg extends Cc{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=ug.get(e);void 0===s&&(s=ag(e),ug.set(e,s)),r=s}const s=t.envMap?$l("envMapIntensity","float",e.material):$l("environmentIntensity","float",e.scene),i=!0===t.useAnisotropy||t.anisotropy>0?ud:wl,n=r.context(dg(xn,i)).mul(s),o=r.context(cg(Ml)).mul(Math.PI).mul(s),a=mu(n),u=mu(o);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(u);const l=e.context.lightingModel.clearcoatRadiance;if(l){const e=r.context(dg(_n,Bl)).mul(s),t=mu(e);l.addAssign(t)}}}const dg=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Tl.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(ju)),r),getTextureLevel:()=>e}},cg=e=>({getUV:()=>e,getTextureLevel:()=>Ii(1)}),hg=new te;class pg extends hh{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(hg),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new lg(t):null}setupLightingModel(){return new Lp}setupSpecular(){const e=ba($i(.04),fn.rgb,bn);Bn.assign(e),Fn.assign(1)}setupVariants(){const e=this.metalnessNode?Ii(this.metalnessNode):wd;bn.assign(e);let t=this.roughnessNode?Ii(this.roughnessNode):Ed;t=Kh({roughness:t}),xn.assign(t),this.setupSpecular(),fn.assign(qi(fn.rgb.mul(e.oneMinus()),fn.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const gg=new re;class mg extends pg{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(gg),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?Ii(this.iorNode):$d;Vn.assign(e),Bn.assign(ba(sa(pa(Vn.sub(1).div(Vn.add(1))).mul(Ad),$i(1)).mul(Sd),fn.rgb,bn)),Fn.assign(ba(Sd,1,bn))}setupLightingModel(){return new Lp(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?Ii(this.clearcoatNode):Bd,t=this.clearcoatRoughnessNode?Ii(this.clearcoatRoughnessNode):Fd;Tn.assign(e),_n.assign(Kh({roughness:t}))}if(this.useSheen){const e=this.sheenNode?$i(this.sheenNode):Id,t=this.sheenRoughnessNode?Ii(this.sheenRoughnessNode):Ld;vn.assign(e),Nn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?Ii(this.iridescenceNode):Vd,t=this.iridescenceIORNode?Ii(this.iridescenceIORNode):Od,r=this.iridescenceThicknessNode?Ii(this.iridescenceThicknessNode):Gd;Sn.assign(e),An.assign(t),Rn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Oi(this.anisotropyNode):Dd).toVar();En.assign(e.length()),Fi(En.equal(0),(()=>{e.assign(Oi(1,0))})).Else((()=>{e.divAssign(Oi(En)),En.assign(En.saturate())})),Cn.assign(En.pow2().mix(xn.pow2(),1)),wn.assign(od[0].mul(e.x).add(od[1].mul(e.y))),Mn.assign(od[1].mul(e.x).sub(od[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?Ii(this.transmissionNode):kd,t=this.thicknessNode?Ii(this.thicknessNode):zd,r=this.attenuationDistanceNode?Ii(this.attenuationDistanceNode):Wd,s=this.attenuationColorNode?$i(this.attenuationColorNode):Hd;if(On.assign(e),Gn.assign(t),kn.assign(r),zn.assign(s),this.useDispersion){const e=this.dispersionNode?Ii(this.dispersionNode):Zd;$n.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?$i(this.clearcoatNormalNode):Ud}setup(e){e.context.setupClearcoatNormal=()=>this.setupClearcoatNormal(e),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 fg extends Lp{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,o=!1){super(e,t,r,s,i,n),this.useSSS=o}direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){if(!0===this.useSSS){const s=i.material,{thicknessColorNode:n,thicknessDistortionNode:o,thicknessAmbientNode:a,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=s,c=e.add(wl.mul(o)).normalize(),h=Ii(Tl.dot(c.negate()).saturate().pow(l).mul(d)),p=$i(h.add(a).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i)}}class yg extends mg{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=Ii(.1),this.thicknessAmbientNode=Ii(0),this.thicknessAttenuationNode=Ii(.1),this.thicknessPowerNode=Ii(2),this.thicknessScaleNode=Ii(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new fg(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 xg=wi((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Oi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=jl("gradientMap","texture").context({getUV:()=>i});return $i(e.r)}{const e=i.fwidth().mul(.5);return ba($i(.7),$i(1),Na(Ii(.7).sub(e.x),Ii(.7).add(e.x),i.x))}}));class bg extends Ih{direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){const n=xg({normal:Sl,lightDirection:e,builder:i}).mul(t);r.directDiffuse.addAssign(n.mul(Gh({diffuseColor:fn.rgb})))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Gh({diffuseColor:fn}))),r.indirectDiffuse.mulAssign(e)}}const Tg=new se;class _g extends hh{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Tg),this.setValues(e)}setupLightingModel(){return new bg}}class vg extends ks{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=$i(Tl.z,0,Tl.x.negate()).normalize(),t=Tl.cross(e);return Oi(e.dot(wl),t.dot(wl)).mul(.495).add(.5)}}const Ng=Ei(vg),Sg=new ie;class Ag extends hh{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Sg),this.setValues(e)}setupVariants(e){const t=Ng;let r;r=e.material.matcap?jl("matcap","texture").context({getUV:()=>t}):$i(ba(.2,.8,t.y)),fn.rgb.mulAssign(r.rgb)}}class Rg extends ks{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 Qi(e,s,s.negate(),e).mul(r)}{const e=t,s=Ji(qi(1,0,0,0),qi(0,Vo(e.x),Do(e.x).negate(),0),qi(0,Do(e.x),Vo(e.x),0),qi(0,0,0,1)),i=Ji(qi(Vo(e.y),0,Do(e.y),0),qi(0,1,0,0),qi(Do(e.y).negate(),0,Vo(e.y),0),qi(0,0,0,1)),n=Ji(qi(Vo(e.z),Do(e.z).negate(),0,0),qi(Do(e.z),Vo(e.z),0,0),qi(0,0,1,0),qi(0,0,0,1));return s.mul(i).mul(n).mul(qi(r,1)).xyz}}}const Cg=Ci(Rg),Eg=new ne;class wg extends hh{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.setDefaultValues(Eg),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:o}=this,a=dl.mul($i(i||0));let u=Oi(il[0].xyz.length(),il[1].xyz.length());if(null!==o&&(u=u.mul(Ii(o))),!1===s)if(r.isPerspectiveCamera)u=u.mul(a.z.negate());else{const e=Ii(2).div(Wu.element(1).element(1));u=u.mul(e.mul(2))}let l=gl.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Si(new tu(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=Ii(n||Pd),c=Cg(l,d);return qi(a.xy.add(c),a.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 Mg=new oe;class Bg extends wg{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Mg),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return dl.mul($i(e||ml)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=gl.xy.toVar(),o=Vc.z.div(Vc.w);if(r&&r.isNode){const e=Ii(r);n.assign(Cg(n,e))}let a=null!==i?Oi(i):Qd;return!0===this.sizeAttenuation&&(a=a.mul(a.div(bl.z.negate()))),s&&s.isNode&&(a=a.mul(Oi(s))),n.mulAssign(a.mul(2)),n.assign(n.div(Vc.z)),n.y.assign(n.y.mul(o)),n.assign(n.mul(t.w)),t.addAssign(qi(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class Fg extends Ih{constructor(){super(),this.shadowNode=Ii(1).toVar("shadowMask")}direct({shadowMask:e}){this.shadowNode.mulAssign(e)}finish(e){fn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(fn.rgb)}}const Ug=new ae;class Pg extends hh{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Ug),this.setValues(e)}setupLightingModel(){return new Fg}}const Ig=wi((({texture:e,uv:t})=>{const r=1e-4,s=$i().toVar();return Fi(t.x.lessThan(r),(()=>{s.assign($i(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign($i(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign($i(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign($i(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign($i(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign($i(0,0,-1))})).Else((()=>{const r=.01,i=e.sample(t.add($i(-.01,0,0))).r.sub(e.sample(t.add($i(r,0,0))).r),n=e.sample(t.add($i(0,-.01,0))).r.sub(e.sample(t.add($i(0,r,0))).r),o=e.sample(t.add($i(0,0,-.01))).r.sub(e.sample(t.add($i(0,0,r))).r);s.assign($i(i,n,o))})),s.normalize()}));class Lg extends Uu{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return $i(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(Li(Mu(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return Ig({texture:this,uv:e})}}const Dg=Ci(Lg);class Vg extends hh{static get type(){return"VolumeNodeMaterial"}constructor(t){super(),this.isVolumeNodeMaterial=!0,this.base=new e(16777215),this.map=null,this.steps=100,this.testNode=null,this.setValues(t)}setup(e){const t=Dg(this.map,null,0),r=wi((({orig:e,dir:t})=>{const r=$i(-.5),s=$i(.5),i=t.reciprocal(),n=r.sub(e).mul(i),o=s.sub(e).mul(i),a=sa(n,o),u=ia(n,o),l=ia(a.x,ia(a.y,a.z)),d=sa(u.x,sa(u.y,u.z));return Oi(l,d)}));this.fragmentNode=wi((()=>{const e=$a($i(ll.mul(qi(Ku,1)))),s=$a(gl.sub(e)).normalize(),i=Oi(r({orig:e,dir:s})).toVar();i.x.greaterThan(i.y).discard(),i.assign(Oi(ia(i.x,0),i.y));const n=$i(e.add(i.x.mul(s))).toVar(),o=$i(s.abs().reciprocal()).toVar(),a=Ii(sa(o.x,sa(o.y,o.z))).toVar("delta");a.divAssign(jl("steps","float"));const u=qi(jl("base","color"),0).toVar();return Tc({type:"float",start:i.x,end:i.y,update:"+= delta"},(()=>{const e=gn("float","d").assign(t.sample(n.add(.5)).r);null!==this.testNode?this.testNode({map:t,mapValue:e,probe:n,finalColor:u}).append():(u.a.assign(1),_c()),n.addAssign(s.mul(a))})),u.a.equal(0).discard(),qi(u)}))(),super.setup(e)}}class Og{constructor(e,t){this.nodes=e,this.info=t,this._context=self,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,null!==this._animationLoop&&this._animationLoop(t,r)};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 Gg{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.material.addEventListener("dispose",this.onMaterialDispose)}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)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set;for(const i of e){const e=i.node&&i.node.attribute?i.node.attribute:t.getAttribute(i.name);if(void 0===e)continue;r.push(e);const n=e.isInterleavedBufferAttribute?e.data:e;s.add(n)}return this.attributes=r,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}),o=this.getIndex(),a=null!==o,u=r.isInstancedBufferGeometry?r.instanceCount:e.count>1?e.count:1;if(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;a?p=o.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&&(r+=e.uuid+","),r+=e.receiveShadow+",",ps(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}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=ms(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=ms(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const $g=[];class Wg{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,o,a){const u=this.getChainMap(a);$g[0]=e,$g[1]=t,$g[2]=n,$g[3]=i;let l=u.get($g);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,o,a),u.set($g,l)):(l.updateClipping(o),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,o,a)):l.version=t.version)),$g.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Gg)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,o,a,u,l,d){const c=this.getChainMap(d),h=new zg(e,t,r,s,i,n,o,a,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Hg{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 jg=1,qg=2,Xg=3,Kg=4,Yg=16;class Qg extends Hg{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return void 0!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===jg?this.backend.createAttribute(e):t===qg?this.backend.createIndexAttribute(e):t===Xg?this.backend.createStorageAttribute(e):t===Kg&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version=0;--t)if(e[t]>=65535)return!0;return!1}(t)?ue:le)(t,1);return i.version=Zg(e),i}class em extends Hg{constructor(e,t){super(),this.attributes=e,this.info=t,this.wireframes=new WeakMap,this.attributeCall=new WeakMap}has(e){const t=e.geometry;return super.has(t)&&!0===this.get(t).initialized}updateForRender(e){!1===this.has(e)&&this.initGeometry(e),this.updateAttributes(e)}initGeometry(e){const t=e.geometry;this.get(t).initialized=!0,this.info.memory.geometries++;const r=()=>{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)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,Xg):this.updateAttribute(e,jg);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,qg);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Kg)}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}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=Jg(t),e.set(t,r)):r.version!==Zg(t)&&(this.attributes.delete(r),r=Jg(t),e.set(t,r)),s=r}return s}}class tm{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):console.error("THREE.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 rm{constructor(e){this.cacheKey=e,this.usedTimes=0}}class sm extends rm{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class im extends rm{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let nm=0;class om{constructor(e,t,r,s=null,i=null){this.id=nm++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class am extends Hg{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 o=this.programs.compute.get(n.computeShader);void 0===o&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),o=new om(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,o),r.createProgram(o));const a=this._getComputeCacheKey(e,o);let u=this.caches.get(a);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,o,a,t)),u.usedTimes++,o.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(),o=e.material?e.material.name:"";let a=this.programs.vertex.get(n.vertexShader);void 0===a&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),a=new om(n.vertexShader,"vertex",o),this.programs.vertex.set(n.vertexShader,a),r.createProgram(a));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new om(n.fragmentShader,"fragment",o),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,a,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,a,u,l,t)):e.pipeline=d,d.usedTimes++,a.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 im(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 sm(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 um extends Hg{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))}_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.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Kg:Xg;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,o=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampler)t.update();else if(t.isSampledTexture){const e=this.textures.get(t.texture);t.needsBindingsUpdate(e.generation)&&(s=!0);const a=t.update(),u=t.texture;a&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,o+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,a,u,t.textureNode.value,s),this.textures.updateTexture(u),s=!0),!0===u.isStorageTexture){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}}!0===s&&this.backend.updateBindings(e,t,i?n:0,o)}}function lm(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.z!==t.z?e.z-t.z:e.id-t.id}function dm(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 cm(e){return(e.transmission>0||e.transmissionNode)&&e.side===de&&!1===e.forceSinglePass}class hm{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,o){let a=this.renderItems[this.renderItemsIndex];return void 0===a?(a={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:o},this.renderItems[this.renderItemsIndex]=a):(a.id=e.id,a.object=e,a.geometry=t,a.material=r,a.groupOrder=s,a.renderOrder=e.renderOrder,a.z=i,a.group=n,a.clippingContext=o),this.renderItemsIndex++,a}push(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(cm(r)&&this.transparentDoublePass.push(a),this.transparent.push(a)):this.opaque.push(a)}unshift(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===r.transparent||r.transmission>0?(cm(r)&&this.transparentDoublePass.unshift(a),this.transparent.unshift(a)):this.opaque.unshift(a)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||lm),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||dm),this.transparent.length>1&&this.transparent.sort(t||dm)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=o.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 F,l.format=e.stencilBuffer?he:pe,l.type=e.stencilBuffer?ge:b,l.image.width=a,l.image.height=u,i[t]=l),r.width===o.width&&o.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=a,l.image.height=u)),r.width=o.width,r.height=o.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&&!0===e.hasExternalTextures)l&&!0===e.autoAllocateDepthBuffer&&this.updateTexture(l,h);else{for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.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),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e),this.info.memory.textures--};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=vm){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),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.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return this.isEnvironmentTexture(e)||!0===e.isCompressedTexture||e.generateMipmaps}isEnvironmentTexture(e){const t=e.mapping;return t===j||t===q||t===v||t===N}_destroyTexture(e){this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e)}}class Sm extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class Am extends pn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class Rm extends Vs{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new Ni(t);return this._currentCond=Fa(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new Ni(t),s=Fa(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new Ni(e),this}build(e,...t){const r=Bi();Mi(this);for(const t of this.nodes)t.build(e,"void");return Mi(r),this.outputNode?this.outputNode.build(e,...t):super.build(e,...t)}else(...e){return console.warn("TSL.StackNode: .else() has been renamed to .Else()."),this.Else(...e)}elseif(...e){return console.warn("TSL.StackNode: .elseif() has been renamed to .ElseIf()."),this.ElseIf(...e)}}const Cm=Ci(Rm);class Em extends Vs{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}setup(e){super.setup(e);const t=this.members,r=[];for(let s=0;s{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)})),Pm=(e,t)=>ha(Qn(4,e.mul(Yn(1,e))),t),Im=wi((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Lm=wi((([e])=>$i(Im(e.z.add(Im(e.y.mul(1)))),Im(e.z.add(Im(e.x.mul(1)))),Im(e.y.add(Im(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Dm=wi((([e,t,r])=>{const s=$i(e).toVar(),i=Ii(1.4).toVar(),n=Ii(0).toVar(),o=$i(s).toVar();return Tc({start:Ii(0),end:Ii(3),type:"float",condition:"<="},(()=>{const e=$i(Lm(o.mul(2))).toVar();s.addAssign(e.add(r.mul(Ii(.1).mul(t)))),o.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const a=Ii(Im(s.z.add(Im(s.x.add(Im(s.y)))))).toVar();n.addAssign(a.div(i)),o.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class Vm extends Vs{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;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 o=n.inputs;if(t.length===o.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const Om=Ci(Vm),Gm=e=>(...t)=>Om(e,...t),km=hn(0).setGroup(ln).onRenderUpdate((e=>e.time)),zm=hn(0).setGroup(ln).onRenderUpdate((e=>e.deltaTime)),$m=hn(0,"uint").setGroup(ln).onRenderUpdate((e=>e.frameId)),Wm=wi((([e,t,r=Oi(.5)])=>Cg(e.sub(r),t).add(r))),Hm=wi((([e,t,r=Oi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),jm=wi((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=il.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=il;const i=ju.mul(s);return _i(t)&&(i[0][0]=il[0].length(),i[0][1]=0,i[0][2]=0),_i(r)&&(i[1][0]=0,i[1][1]=il[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,Wu.mul(i).mul(ml)})),qm=wi((([e=null])=>{const t=nh();return nh(Qc(e)).sub(t).lessThan(0).select(Ic,e)}));class Xm extends Vs{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Eu(),r=Ii(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),o=n.mod(s),a=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=Oi(o,a);return t.add(l).mul(u)}}const Km=Ci(Xm);class Ym extends Vs{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=Ii(1),i=ml,n=Al){super("vec4"),this.textureXNode=e,this.textureYNode=t,this.textureZNode=r,this.scaleNode=s,this.positionNode=i,this.normalNode=n}setup(){const{textureXNode:e,textureYNode:t,textureZNode:r,scaleNode:s,positionNode:i,normalNode:n}=this;let o=n.abs().normalize();o=o.div(o.dot($i(1)));const a=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=Pu(d,a).mul(o.x),g=Pu(c,u).mul(o.y),m=Pu(h,l).mul(o.z);return Kn(p,g,m)}}const Qm=Ci(Ym),Zm=new ye,Jm=new r,ef=new r,tf=new r,rf=new o,sf=new r(0,0,-1),nf=new s,of=new r,af=new r,uf=new s,lf=new t,df=new fe,cf=Ic.flipX();df.depthTexture=new F(1,1);let hf=!1;class pf extends Uu{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||df.texture,cf),this._reflectorBaseNode=e.reflector||new gf(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=Si(new pf({defaultTexture:df.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._reflectorBaseNode=this._reflectorBaseNode,e}}class gf extends Vs{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new xe,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:o=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=o,this.updateBeforeType=n?Ms.RENDER:Ms.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new WeakMap}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(lf),e.setSize(Math.round(lf.width*r),Math.round(lf.height*r))}setup(e){return this._updateResolution(df,e.renderer),super.setup(e)}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 fe(0,0,{type:be}),!0===this.generateMipmaps&&(t.texture.minFilter=Te,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new F),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&hf)return!1;hf=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,o=this.getVirtualCamera(r),a=this.getRenderTarget(o);if(s.getDrawingBufferSize(lf),this._updateResolution(a,s),ef.setFromMatrixPosition(n.matrixWorld),tf.setFromMatrixPosition(r.matrixWorld),rf.extractRotation(n.matrixWorld),Jm.set(0,0,1),Jm.applyMatrix4(rf),of.subVectors(ef,tf),of.dot(Jm)>0)return;of.reflect(Jm).negate(),of.add(ef),rf.extractRotation(r.matrixWorld),sf.set(0,0,-1),sf.applyMatrix4(rf),sf.add(tf),af.subVectors(ef,sf),af.reflect(Jm).negate(),af.add(ef),o.coordinateSystem=r.coordinateSystem,o.position.copy(of),o.up.set(0,1,0),o.up.applyMatrix4(rf),o.up.reflect(Jm),o.lookAt(af),o.near=r.near,o.far=r.far,o.updateMatrixWorld(),o.projectionMatrix.copy(r.projectionMatrix),Zm.setFromNormalAndCoplanarPoint(Jm,ef),Zm.applyMatrix4(o.matrixWorldInverse),nf.set(Zm.normal.x,Zm.normal.y,Zm.normal.z,Zm.constant);const u=o.projectionMatrix;uf.x=(Math.sign(nf.x)+u.elements[8])/u.elements[0],uf.y=(Math.sign(nf.y)+u.elements[9])/u.elements[5],uf.z=-1,uf.w=(1+u.elements[10])/u.elements[14],nf.multiplyScalar(1/nf.dot(uf));u.elements[2]=nf.x,u.elements[6]=nf.y,u.elements[10]=s.coordinateSystem===d?nf.z-0:nf.z+1-0,u.elements[14]=nf.w,this.textureNode.value=a.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=a.depthTexture),i.visible=!1;const l=s.getRenderTarget(),c=s.getMRT(),h=s.autoClear;s.setMRT(null),s.setRenderTarget(a),s.autoClear=!0,s.render(t,o),s.setMRT(c),s.setRenderTarget(l),s.autoClear=h,i.visible=!0,hf=!1}}const mf=new _e(-1,1,1,-1,0,1);class ff extends ve{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Ne([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Ne(t,2))}}const yf=new ff;class xf extends k{constructor(e=null){super(yf,e),this.camera=mf,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,mf)}render(e){e.render(this,mf)}}const bf=new t;class Tf extends Uu{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new fe(t,r,s);super(i.texture,Eu()),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 xf(new hh),this.updateBeforeType=Ms.RENDER}get autoSize(){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.autoSize){this.pixelRatio=e.getPixelRatio();const t=e.getSize(bf);this.setSize(t.width,t.height)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new Uu(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const _f=(e,...t)=>Si(new Tf(Si(e),...t)),vf=wi((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===d?(e=Oi(e.x,e.y.oneMinus()).mul(2).sub(1),i=qi($i(e,t),1)):i=qi($i(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=qi(r.mul(i));return n.xyz.div(n.w)})),Nf=wi((([e,t])=>{const r=t.mul(qi(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Oi(s.x,s.y.oneMinus())})),Sf=wi((([e,t,r])=>{const s=Mu(Iu(t)),i=Gi(e.mul(s)).toVar(),n=Iu(t,i).toVar(),o=Iu(t,i.sub(Gi(2,0))).toVar(),a=Iu(t,i.sub(Gi(1,0))).toVar(),u=Iu(t,i.add(Gi(1,0))).toVar(),l=Iu(t,i.add(Gi(2,0))).toVar(),d=Iu(t,i.add(Gi(0,2))).toVar(),c=Iu(t,i.add(Gi(0,1))).toVar(),h=Iu(t,i.sub(Gi(0,1))).toVar(),p=Iu(t,i.sub(Gi(0,2))).toVar(),g=$o(Yn(Ii(2).mul(a).sub(o),n)).toVar(),m=$o(Yn(Ii(2).mul(u).sub(l),n)).toVar(),f=$o(Yn(Ii(2).mul(c).sub(d),n)).toVar(),y=$o(Yn(Ii(2).mul(h).sub(p),n)).toVar(),x=vf(e,n,r).toVar(),b=g.lessThan(m).select(x.sub(vf(e.sub(Oi(Ii(1).div(s.x),0)),a,r)),x.negate().add(vf(e.add(Oi(Ii(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(x.sub(vf(e.add(Oi(0,Ii(1).div(s.y))),c,r)),x.negate().add(vf(e.sub(Oi(0,Ii(1).div(s.y))),h,r)));return Io(ca(b,T))}));class Af extends C{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class Rf extends Se{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class Cf extends Os{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}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 Ef=Ci(Cf);class wf extends Lu{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(t=Ts(e.itemSize),r=e.count),super(e,t,r),this.isStorageBufferNode=!0,this.access=Fs.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 Ef(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Fs.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=uu(this.value),this._varying=$a(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}generate(e){if(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 Mf=(e,t=null,r=0)=>Si(new wf(e,t,r));class Bf extends Ru{static get type(){return"VertexColorNode"}constructor(e=0){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}}class Ff extends Vs{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const Uf=Ei(Ff),Pf=new Re,If=new o;class Lf extends Vs{static get type(){return"SceneNode"}constructor(e=Lf.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===Lf.BACKGROUND_BLURRINESS?s=$l("backgroundBlurriness","float",r):t===Lf.BACKGROUND_INTENSITY?s=$l("backgroundIntensity","float",r):t===Lf.BACKGROUND_ROTATION?s=hn("mat4").label("backgroundRotation").setGroup(ln).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Ae?(Pf.copy(r.backgroundRotation),Pf.x*=-1,Pf.y*=-1,Pf.z*=-1,If.makeRotationFromEuler(Pf)):If.identity(),If})):console.error("THREE.SceneNode: Unknown scope:",t),s}}Lf.BACKGROUND_BLURRINESS="backgroundBlurriness",Lf.BACKGROUND_INTENSITY="backgroundIntensity",Lf.BACKGROUND_ROTATION="backgroundRotation";const Df=Ei(Lf,Lf.BACKGROUND_BLURRINESS),Vf=Ei(Lf,Lf.BACKGROUND_INTENSITY),Of=Ei(Lf,Lf.BACKGROUND_ROTATION);class Gf extends Uu{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=Fs.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);e.getNodeProperties(this).storeNode=this.storeNode}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Fs.READ_WRITE)}toReadOnly(){return this.setAccess(Fs.READ_ONLY)}toWriteOnly(){return this.setAccess(Fs.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),o=s.build(e,"vec4"),a=e.generateTextureStore(e,i,n,o);e.addLineFlowCode(a,this)}}const kf=Ci(Gf);class zf extends zl{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 $f=new WeakMap;class Wf extends ks{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Ms.OBJECT,this.updateAfterType=Ms.OBJECT,this.previousModelWorldMatrix=hn(new o),this.previousProjectionMatrix=hn(new o).setGroup(ln),this.previousCameraViewMatrix=hn(new o)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=jf(r);this.previousModelWorldMatrix.value.copy(s);const i=Hf(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new o,i.previousCameraViewMatrix=new o,i.currentProjectionMatrix=new o,i.currentCameraViewMatrix=new o,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}){jf(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?Wu:hn(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(dl).mul(ml),s=this.previousProjectionMatrix.mul(t).mul(fl),i=r.xy.div(r.w),n=s.xy.div(s.w);return Yn(i,n)}}function Hf(e){let t=$f.get(e);return void 0===t&&(t={},$f.set(e,t)),t}function jf(e,t=0){const r=Hf(e);let s=r[t];return void 0===s&&(r[t]=s=new o),s}const qf=Ei(Wf),Xf=wi((([e,t])=>sa(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Kf=wi((([e,t])=>sa(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Yf=wi((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Qf=wi((([e,t])=>ba(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),oa(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Zf=wi((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return qi(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"}]}),Jf=wi((([e])=>sy(e.rgb))),ey=wi((([e,t=Ii(1)])=>t.mix(sy(e.rgb),e.rgb))),ty=wi((([e,t=Ii(1)])=>{const r=Kn(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 ba(e.rgb,s,i)})),ry=wi((([e,t=Ii(1)])=>{const r=$i(.57735,.57735,.57735),s=t.cos();return $i(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(da(r,e.rgb).mul(s.oneMinus())))))})),sy=(e,t=$i(c.getLuminanceCoefficients(new r)))=>da(e,t),iy=wi((([e,t=$i(1),s=$i(0),i=$i(1),n=Ii(1),o=$i(c.getLuminanceCoefficients(new r,Ce))])=>{const a=e.rgb.dot($i(o)),u=ia(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return Fi(u.r.greaterThan(0),(()=>{u.r.assign(l.r)})),Fi(u.g.greaterThan(0),(()=>{u.g.assign(l.g)})),Fi(u.b.greaterThan(0),(()=>{u.b.assign(l.b)})),u.assign(a.add(u.sub(a).mul(n))),qi(u.rgb,e.a)}));class ny extends ks{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 oy=Ci(ny),ay=new t;class uy extends Uu{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return e.object.isQuadMesh&&this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class ly extends uy{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(){return new this.constructor(this.passNode,this.textureName,this.previousTexture)}}class dy extends ks{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 F;i.isRenderTargetTexture=!0,i.name="depth";const n=new fe(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:be,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=hn(0),this._cameraFar=hn(0),this._mrt=null,this.isPassNode=!0,this.updateBeforeType=Ms.FRAME}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}isGlobal(){return!0}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=Si(new ly(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=Si(new ly(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=th(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=Jc(i,r,s)}return t}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,!0===e.backend.isWebGLBackend&&(this.renderTarget.samples=0),this.scope===dy.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r,camera:s}=this;this._pixelRatio=t.getPixelRatio();const i=t.getSize(ay);this.setSize(i.width,i.height);const n=t.getRenderTarget(),o=t.getMRT();this._cameraNear.value=s.near,this._cameraFar.value=s.far;for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(n),t.setMRT(o)}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio,s=this._height*this._pixelRatio;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}dy.COLOR="color",dy.DEPTH="depth";class cy extends dy{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(dy.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction(((e,r,s,i,n,o,a,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,o,a,u)}t.renderObject(e,r,s,i,n,o,a,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new hh;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=_;const t=Al.negate(),r=Wu.mul(dl),s=Ii(1),i=r.mul(qi(ml,1)),n=r.mul(qi(ml.add(t),1)),o=Io(i.sub(n));return e.vertexNode=i.add(o.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=qi(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 hy=wi((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),py=wi((([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"}]}),gy=wi((([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"}]}),my=wi((([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)})),fy=wi((([e,t])=>{const r=Zi(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Zi(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=my(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),yy=Zi($i(1.6605,-.1246,-.0182),$i(-.5876,1.1329,-.1006),$i(-.0728,-.0083,1.1187)),xy=Zi($i(.6274,.0691,.0164),$i(.3293,.9195,.088),$i(.0433,.0113,.8956)),by=wi((([e])=>{const t=$i(e).toVar(),r=$i(t.mul(t)).toVar(),s=$i(r.mul(r)).toVar();return Ii(15.5).mul(s.mul(r)).sub(Qn(40.14,s.mul(t))).add(Qn(31.96,s).sub(Qn(6.868,r.mul(t))).add(Qn(.4298,r).add(Qn(.1191,t).sub(.00232))))})),Ty=wi((([e,t])=>{const r=$i(e).toVar(),s=Zi($i(.856627153315983,.137318972929847,.11189821299995),$i(.0951212405381588,.761241990602591,.0767994186031903),$i(.0482516061458583,.101439036467562,.811302368396859)),i=Zi($i(1.1271005818144368,-.1413297634984383,-.14132976349843826),$i(-.11060664309660323,1.157823702216272,-.11060664309660294),$i(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=Ii(-12.47393),o=Ii(4.026069);return r.mulAssign(t),r.assign(xy.mul(r)),r.assign(s.mul(r)),r.assign(ia(r,1e-10)),r.assign(Mo(r)),r.assign(r.sub(n).div(o.sub(n))),r.assign(Ta(r,0,1)),r.assign(by(r)),r.assign(i.mul(r)),r.assign(ha(ia($i(0),r),$i(2.2))),r.assign(yy.mul(r)),r.assign(Ta(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),_y=wi((([e,t])=>{const r=Ii(.76),s=Ii(.15);e=e.mul(t);const i=sa(e.r,sa(e.g,e.b)),n=Fa(i.lessThan(.08),i.sub(Qn(6.25,i.mul(i))),.04);e.subAssign(n);const o=ia(e.r,ia(e.g,e.b));Fi(o.lessThan(r),(()=>e));const a=Yn(1,r),u=Yn(1,a.mul(a).div(o.add(a.sub(r))));e.mulAssign(u.div(o));const l=Yn(1,Zn(1,s.mul(o.sub(u)).add(1)));return ba(e,$i(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class vy extends Vs{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.code=e,this.includes=t,this.language=r}isGlobal(){return!0}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 Ny=Ci(vy);class Sy extends vy{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}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 o=e.getPropertyName(n),a=this.getNodeFunction(e).getCode(o);return n.code=a+"\n","property"===t?o:e.format(`${o}()`,i,t)}}const Ay=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Ry extends Vs{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new a,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:Ii()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Rs(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?Cs(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 Cy=Ci(Ry);class Ey 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 wy{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 My=new Ey;class By extends Vs{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new Ey,this._output=Cy(),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]=Cy(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]=Cy(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 wy(this),t=My.get("THREE"),r=My.get("TSL"),s=this.getMethod(),i=[e,this._local,My,()=>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:Ii()}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=[ps(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return gs(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 Fy=Ci(By);function Uy(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||bl.z).negate()}const Py=wi((([e,t],r)=>{const s=Uy(r);return Na(e,t,s)})),Iy=wi((([e],t)=>{const r=Uy(t);return e.mul(e,r,r).negate().exp().oneMinus()})),Ly=wi((([e,t])=>qi(t.toFloat().mix(Pn.rgb,e.toVec3()),Pn.a)));let Dy=null,Vy=null;class Oy extends Vs{static get type(){return"RangeNode"}constructor(e=Ii(),t=Ii()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(Ns(this.minNode.value)),r=e.getTypeLength(Ns(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,o=e.getTypeLength(Ns(i)),a=e.getTypeLength(Ns(n));Dy=Dy||new s,Vy=Vy||new s,Dy.setScalar(0),Vy.setScalar(0),1===o?Dy.setScalar(i):i.isColor?Dy.set(i.r,i.g,i.b,1):Dy.set(i.x,i.y,i.z||0,i.w||0),1===a?Vy.setScalar(n):n.isColor?Vy.set(n.r,n.g,n.b,1):Vy.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;eSi(new ky(e,t)),$y=zy("numWorkgroups","uvec3"),Wy=zy("workgroupId","uvec3"),Hy=zy("globalId","uvec3"),jy=zy("localId","uvec3"),qy=zy("subgroupSize","uint");const Xy=Ci(class extends Vs{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 Ky extends Os{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 Yy extends Vs{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e}label(e){return this.name=e,this}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Si(new Ky(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class Qy extends ks{static get type(){return"AtomicFunctionNode"}constructor(e,t,r,s=null){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.storeNode=s}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=this.method,r=this.getNodeType(e),s=this.getInputType(e),i=this.pointerNode,n=this.valueNode,o=[];o.push(`&${i.build(e,s)}`),null!==n&&o.push(n.build(e,s));const a=`${e.getMethod(t,r)}( ${o.join(", ")} )`;if(null!==this.storeNode){const t=this.storeNode.build(e,s);e.addLineFlowCode(`${t} = ${a}`,this)}else e.addLineFlowCode(a,this)}}Qy.ATOMIC_LOAD="atomicLoad",Qy.ATOMIC_STORE="atomicStore",Qy.ATOMIC_ADD="atomicAdd",Qy.ATOMIC_SUB="atomicSub",Qy.ATOMIC_MAX="atomicMax",Qy.ATOMIC_MIN="atomicMin",Qy.ATOMIC_AND="atomicAnd",Qy.ATOMIC_OR="atomicOr",Qy.ATOMIC_XOR="atomicXor";const Zy=Ci(Qy),Jy=(e,t,r,s=null)=>{const i=Zy(e,t,r,s);return i.append(),i};let ex;function tx(e){ex=ex||new WeakMap;let t=ex.get(e);return void 0===t&&ex.set(e,t={}),t}function rx(e){const t=tx(e);return t.shadowMatrix||(t.shadowMatrix=hn("mat4").setGroup(ln).onRenderUpdate((()=>(!0!==e.castShadow&&e.shadow.updateMatrices(e),e.shadow.matrix))))}function sx(e){const t=tx(e);if(void 0===t.projectionUV){const r=rx(e).mul(yl);t.projectionUV=r.xyz.div(r.w)}return t.projectionUV}function ix(e){const t=tx(e);return t.position||(t.position=hn(new r).setGroup(ln).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function nx(e){const t=tx(e);return t.targetPosition||(t.targetPosition=hn(new r).setGroup(ln).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function ox(e){const t=tx(e);return t.viewPosition||(t.viewPosition=hn(new r).setGroup(ln).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const ax=e=>ju.transformDirection(ix(e).sub(nx(e))),ux=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},lx=new WeakMap;class dx extends Vs{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=$i().toVar("totalDiffuse"),this.totalSpecularNode=$i().toVar("totalSpecular"),this.outgoingLightNode=$i().toVar("outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=[],t=this._lights;for(let r=0;re.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Si(e));else{let s=null;if(null!==r&&(s=ux(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;lx.has(e)?s=lx.get(e):(s=Si(new r(e)),lx.set(e,s)),t.push(s)}}this._lightNodes=t}setupLights(e,t){for(const r of t)r.build(e)}setup(e){null===this._lightNodes&&this.setupLightsNode(e);const t=e.context,r=t.lightingModel;let s=this.outgoingLightNode;if(r){const{_lightNodes:i,totalDiffuseNode:n,totalSpecularNode:o}=this;t.outgoingLight=s;const a=e.addStack();e.getDataFromNode(this).nodes=a.nodes,r.start(t,a,e),this.setupLights(e,i),r.indirect(t,a,e);const{backdrop:u,backdropAlpha:l}=t,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=t.reflectedLight;let g=d.add(h);null!==u&&(g=$i(null!==l?l.mix(g,u):u),t.material.transparent=!0),n.assign(g),o.assign(c.add(p)),s.assign(n.add(o)),r.finish(t,a,e),s=s.bypass(e.removeStack())}return s}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 cx extends Vs{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Ms.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({material:e}){hx.assign(e.shadowPositionNode||yl)}dispose(){this.updateBeforeType=Ms.NONE}}const hx=$i().toVar("shadowPositionWorld");function px(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 gx(e,t){return t=px(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function mx(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 fx(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function yx(e,t){return t=fx(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function xx(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function bx(e,t,r){return r=yx(t,r=gx(e,r))}function Tx(e,t,r){mx(e,r),xx(t,r)}var _x=Object.freeze({__proto__:null,resetRendererAndSceneState:bx,resetRendererState:gx,resetSceneState:yx,restoreRendererAndSceneState:Tx,restoreRendererState:mx,restoreSceneState:xx,saveRendererAndSceneState:function(e,t,r={}){return r=fx(t,r=px(e,r))},saveRendererState:px,saveSceneState:fx});const vx=new WeakMap,Nx=wi((([e,t,r])=>{let s=yl.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),Sx=e=>{let t=vx.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=$l("near","float",t).setGroup(ln),s=$l("far","float",t).setGroup(ln),i=Ju(e);return Nx(i,r,s)})(e):null;t=new hh,t.colorNode=qi(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,vx.set(e,t)}return t},Ax=wi((({depthTexture:e,shadowCoord:t})=>Pu(e,t.xy).compare(t.z))),Rx=wi((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Pu(e,t).compare(r),i=$l("mapSize","vec2",r).setGroup(ln),n=$l("radius","float",r).setGroup(ln),o=Oi(1).div(i),a=o.x.negate().mul(n),u=o.y.negate().mul(n),l=o.x.mul(n),d=o.y.mul(n),c=a.div(2),h=u.div(2),p=l.div(2),g=d.div(2);return Kn(s(t.xy.add(Oi(a,u)),t.z),s(t.xy.add(Oi(0,u)),t.z),s(t.xy.add(Oi(l,u)),t.z),s(t.xy.add(Oi(c,h)),t.z),s(t.xy.add(Oi(0,h)),t.z),s(t.xy.add(Oi(p,h)),t.z),s(t.xy.add(Oi(a,0)),t.z),s(t.xy.add(Oi(c,0)),t.z),s(t.xy,t.z),s(t.xy.add(Oi(p,0)),t.z),s(t.xy.add(Oi(l,0)),t.z),s(t.xy.add(Oi(c,g)),t.z),s(t.xy.add(Oi(0,g)),t.z),s(t.xy.add(Oi(p,g)),t.z),s(t.xy.add(Oi(a,d)),t.z),s(t.xy.add(Oi(0,d)),t.z),s(t.xy.add(Oi(l,d)),t.z)).mul(1/17)})),Cx=wi((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Pu(e,t).compare(r),i=$l("mapSize","vec2",r).setGroup(ln),n=Oi(1).div(i),o=n.x,a=n.y,u=t.xy,l=Lo(u.mul(i).add(.5));return u.subAssign(l.mul(n)),Kn(s(u,t.z),s(u.add(Oi(o,0)),t.z),s(u.add(Oi(0,a)),t.z),s(u.add(n),t.z),ba(s(u.add(Oi(o.negate(),0)),t.z),s(u.add(Oi(o.mul(2),0)),t.z),l.x),ba(s(u.add(Oi(o.negate(),a)),t.z),s(u.add(Oi(o.mul(2),a)),t.z),l.x),ba(s(u.add(Oi(0,a.negate())),t.z),s(u.add(Oi(0,a.mul(2))),t.z),l.y),ba(s(u.add(Oi(o,a.negate())),t.z),s(u.add(Oi(o,a.mul(2))),t.z),l.y),ba(ba(s(u.add(Oi(o.negate(),a.negate())),t.z),s(u.add(Oi(o.mul(2),a.negate())),t.z),l.x),ba(s(u.add(Oi(o.negate(),a.mul(2))),t.z),s(u.add(Oi(o.mul(2),a.mul(2))),t.z),l.x),l.y)).mul(1/9)})),Ex=wi((({depthTexture:e,shadowCoord:t})=>{const r=Ii(1).toVar(),s=Pu(e).sample(t.xy).rg,i=oa(t.z,s.x);return Fi(i.notEqual(Ii(1)),(()=>{const e=t.z.sub(s.x),n=ia(0,s.y.mul(s.y));let o=n.div(n.add(e.mul(e)));o=Ta(Yn(o,.3).div(.95-.3)),r.assign(Ta(ia(i,o)))})),r})),wx=wi((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Ii(0).toVar(),n=Ii(0).toVar(),o=e.lessThanEqual(Ii(1)).select(Ii(0),Ii(2).div(e.sub(1))),a=e.lessThanEqual(Ii(1)).select(Ii(0),Ii(-1));Tc({start:Li(0),end:Li(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Ii(e).mul(o)),l=s.sample(Kn(Dc.xy,Oi(0,u).mul(t)).div(r)).x;i.addAssign(l),n.addAssign(l.mul(l))})),i.divAssign(e),n.divAssign(e);const u=Bo(n.sub(i.mul(i)));return Oi(i,u)})),Mx=wi((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Ii(0).toVar(),n=Ii(0).toVar(),o=e.lessThanEqual(Ii(1)).select(Ii(0),Ii(2).div(e.sub(1))),a=e.lessThanEqual(Ii(1)).select(Ii(0),Ii(-1));Tc({start:Li(0),end:Li(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Ii(e).mul(o)),l=s.sample(Kn(Dc.xy,Oi(u,0).mul(t)).div(r));i.addAssign(l.x),n.addAssign(Kn(l.y.mul(l.y),l.x.mul(l.x)))})),i.divAssign(e),n.divAssign(e);const u=Bo(n.sub(i.mul(i)));return Oi(i,u)})),Bx=[Ax,Rx,Cx,Ex];let Fx;const Ux=new xf;class Px extends cx{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.isShadowNode=!0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){const n=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});return n.select(o,Ii(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=$l("bias","float",r).setGroup(ln);let n,o=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)o=o.xyz.div(o.w),n=o.z,s.coordinateSystem===d&&(n=n.mul(2).sub(1));else{const e=o.w;o=o.xy.div(e);const t=$l("near","float",r.camera).setGroup(ln),s=$l("far","float",r.camera).setGroup(ln);n=rh(e.negate(),t,s)}return o=$i(o.x,o.y.oneMinus(),n.add(i)),o}getShadowFilterFn(e){return Bx[e]}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,n=new F(s.mapSize.width,s.mapSize.height);n.compareFunction=Ee;const o=e.createRenderTarget(s.mapSize.width,s.mapSize.height);if(o.depthTexture=n,s.camera.updateProjectionMatrix(),i===we){n.compareFunction=null,this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Me,type:be}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Me,type:be});const t=Pu(n),r=Pu(this.vsmShadowMapVertical.texture),i=$l("blurSamples","float",s).setGroup(ln),o=$l("radius","float",s).setGroup(ln),a=$l("mapSize","vec2",s).setGroup(ln);let u=this.vsmMaterialVertical||(this.vsmMaterialVertical=new hh);u.fragmentNode=wx({samples:i,radius:o,size:a,shadowPass:t}).context(e.getSharedContext()),u.name="VSMVertical",u=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new hh),u.fragmentNode=Mx({samples:i,radius:o,size:a,shadowPass:r}).context(e.getSharedContext()),u.name="VSMHorizontal"}const a=$l("intensity","float",s).setGroup(ln),u=$l("normalBias","float",s).setGroup(ln),l=rx(r).mul(hx.add(Ml.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===we?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:o.texture,depthTexture:h,shadowCoord:d,shadow:s}),g=Pu(o.texture,d),m=ba(1,p.rgb.mix(g,1),a.mul(g.a)).toVar();return this.shadowMap=o,this.shadow.map=o,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return wi((()=>{let t=this._node;return this.setupShadowPosition(e),null===t&&(this._node=t=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(t=e.material.receivedShadowNode(t)),t}))()}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),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:o}=e,a=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u,s.camera.layers.mask=o.layers.mask;const l=i.getRenderObjectFunction(),d=i.getMRT(),c=!!d&&d.has("velocity");Fx=bx(i,n,Fx),n.overrideMaterial=Sx(r),i.setRenderObjectFunction(((e,t,r,n,u,l,...d)=>{(!0===e.castShadow||e.receiveShadow&&a===we)&&(c&&(As(e).useVelocity=!0),e.onBeforeShadow(i,e,o,s.camera,n,t.overrideMaterial,l),i.renderObject(e,t,r,n,u,l,...d),e.onAfterShadow(i,e,o,s.camera,n,t.overrideMaterial,l))})),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(l),!0!==r.isPointLight&&a===we&&this.vsmPass(i),Tx(i,n,Fx)}vsmPass(e){const{shadow:t}=this;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height),e.setRenderTarget(this.vsmShadowMapVertical),Ux.material=this.vsmMaterialVertical,Ux.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),Ux.material=this.vsmMaterialHorizontal,Ux.render(e)}dispose(){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),super.dispose()}updateBefore(e){const{shadow:t}=this;(t.needsUpdate||t.autoUpdate)&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const Ix=(e,t)=>Si(new Px(e,t));class Lx extends Cc{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||hn(this.color).setGroup(ln),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Ms.FRAME}customCacheKey(){return ms(this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}setupShadowNode(){return Ix(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const t=this.light.shadow.shadowNode;let s;s=void 0!==t?Si(t):this.setupShadowNode(e),this.shadowNode=s,this.shadowColorNode=r=this.colorNode.mul(s),this.baseColorNode=this.colorNode}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)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const Dx=wi((e=>{const{lightDistance:t,cutoffDistance:r,decayExponent:s}=e,i=t.pow(s).max(.01).reciprocal();return r.greaterThan(0).select(i.mul(t.div(r).pow4().oneMinus().clamp().pow2()),i)})),Vx=new e,Ox=wi((([e,t])=>{const r=e.toVar(),s=$o(r),i=Zn(1,ia(s.x,ia(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=Oi(r.xy).toVar(),o=t.mul(1.5).oneMinus();return Fi(s.z.greaterThanEqual(o),(()=>{Fi(r.z.greaterThan(0),(()=>{n.x.assign(Yn(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(o),(()=>{const e=Wo(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(o),(()=>{const e=Wo(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))})),Oi(.125,.25).mul(n).add(Oi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),Gx=wi((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>Pu(e,Ox(t,s.y)).compare(r))),kx=wi((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=$l("radius","float",i).setGroup(ln),o=Oi(-1,1).mul(n).mul(s.y);return Pu(e,Ox(t.add(o.xyy),s.y)).compare(r).add(Pu(e,Ox(t.add(o.yyy),s.y)).compare(r)).add(Pu(e,Ox(t.add(o.xyx),s.y)).compare(r)).add(Pu(e,Ox(t.add(o.yyx),s.y)).compare(r)).add(Pu(e,Ox(t,s.y)).compare(r)).add(Pu(e,Ox(t.add(o.xxy),s.y)).compare(r)).add(Pu(e,Ox(t.add(o.yxy),s.y)).compare(r)).add(Pu(e,Ox(t.add(o.xxx),s.y)).compare(r)).add(Pu(e,Ox(t.add(o.yxx),s.y)).compare(r)).mul(1/9)})),zx=wi((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),o=hn("float").setGroup(ln).onRenderUpdate((()=>s.camera.near)),a=hn("float").setGroup(ln).onRenderUpdate((()=>s.camera.far)),u=$l("bias","float",s).setGroup(ln),l=hn(s.mapSize).setGroup(ln),d=Ii(1).toVar();return Fi(n.sub(a).lessThanEqual(0).and(n.sub(o).greaterThanEqual(0)),(()=>{const r=n.sub(o).div(a.sub(o)).toVar();r.addAssign(u);const c=i.normalize(),h=Oi(1).div(l.mul(Oi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),$x=new s,Wx=new t,Hx=new t;class jx extends Px{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Be?Gx:kx}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return zx({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,o=t.getFrameExtents();Hx.copy(t.mapSize),Hx.multiply(o),r.setSize(Hx.width,Hx.height),Wx.copy(t.mapSize);const a=i.autoClear,u=i.getClearColor(Vx),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;e{const n=i.context.lightingModel,o=t.sub(bl),a=o.normalize(),u=o.length(),l=Dx({lightDistance:u,cutoffDistance:r,decayExponent:s}),d=e.mul(l),c=i.context.reflectedLight;n.direct({lightDirection:a,lightColor:d,reflectedLight:c},i.stack,i)}));class Xx extends Lx{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=hn(0).setGroup(ln),this.decayExponentNode=hn(2).setGroup(ln)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return((e,t)=>Si(new jx(e,t)))(this.light)}setup(e){super.setup(e),qx({color:this.colorNode,lightViewPosition:ox(this.light),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode}).append()}}const Kx=wi((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),Yx=wi((([e=Eu()],{renderer:t,material:r})=>{const s=Ii(1).toVar(),i=xa(e.mul(2).sub(1));if(r.alphaToCoverage&&t.samples>1){const e=Ii(i.fwidth()).toVar();s.assign(Na(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();return s})),Qx=wi((([e,t,r])=>{const s=Ii(r).toVar(),i=Ii(t).toVar(),n=Vi(e).toVar();return Fa(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Zx=wi((([e,t])=>{const r=Vi(t).toVar(),s=Ii(e).toVar();return Fa(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),Jx=wi((([e])=>{const t=Ii(e).toVar();return Li(Uo(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),eb=wi((([e,t])=>{const r=Ii(e).toVar();return t.assign(Jx(r)),r.sub(Ii(t))})),tb=Gm([wi((([e,t,r,s,i,n])=>{const o=Ii(n).toVar(),a=Ii(i).toVar(),u=Ii(s).toVar(),l=Ii(r).toVar(),d=Ii(t).toVar(),c=Ii(e).toVar(),h=Ii(Yn(1,a)).toVar();return Yn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).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"}]}),wi((([e,t,r,s,i,n])=>{const o=Ii(n).toVar(),a=Ii(i).toVar(),u=$i(s).toVar(),l=$i(r).toVar(),d=$i(t).toVar(),c=$i(e).toVar(),h=Ii(Yn(1,a)).toVar();return Yn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).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"}]})]),rb=Gm([wi((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Ii(d).toVar(),h=Ii(l).toVar(),p=Ii(u).toVar(),g=Ii(a).toVar(),m=Ii(o).toVar(),f=Ii(n).toVar(),y=Ii(i).toVar(),x=Ii(s).toVar(),b=Ii(r).toVar(),T=Ii(t).toVar(),_=Ii(e).toVar(),v=Ii(Yn(1,p)).toVar(),N=Ii(Yn(1,h)).toVar();return Ii(Yn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]}),wi((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Ii(d).toVar(),h=Ii(l).toVar(),p=Ii(u).toVar(),g=$i(a).toVar(),m=$i(o).toVar(),f=$i(n).toVar(),y=$i(i).toVar(),x=$i(s).toVar(),b=$i(r).toVar(),T=$i(t).toVar(),_=$i(e).toVar(),v=Ii(Yn(1,p)).toVar(),N=Ii(Yn(1,h)).toVar();return Ii(Yn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]})]),sb=wi((([e,t,r])=>{const s=Ii(r).toVar(),i=Ii(t).toVar(),n=Di(e).toVar(),o=Di(n.bitAnd(Di(7))).toVar(),a=Ii(Qx(o.lessThan(Di(4)),i,s)).toVar(),u=Ii(Qn(2,Qx(o.lessThan(Di(4)),s,i))).toVar();return Zx(a,Vi(o.bitAnd(Di(1)))).add(Zx(u,Vi(o.bitAnd(Di(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),ib=wi((([e,t,r,s])=>{const i=Ii(s).toVar(),n=Ii(r).toVar(),o=Ii(t).toVar(),a=Di(e).toVar(),u=Di(a.bitAnd(Di(15))).toVar(),l=Ii(Qx(u.lessThan(Di(8)),o,n)).toVar(),d=Ii(Qx(u.lessThan(Di(4)),n,Qx(u.equal(Di(12)).or(u.equal(Di(14))),o,i))).toVar();return Zx(l,Vi(u.bitAnd(Di(1)))).add(Zx(d,Vi(u.bitAnd(Di(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"}]}),nb=Gm([sb,ib]),ob=wi((([e,t,r])=>{const s=Ii(r).toVar(),i=Ii(t).toVar(),n=Hi(e).toVar();return $i(nb(n.x,i,s),nb(n.y,i,s),nb(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"}]}),ab=wi((([e,t,r,s])=>{const i=Ii(s).toVar(),n=Ii(r).toVar(),o=Ii(t).toVar(),a=Hi(e).toVar();return $i(nb(a.x,o,n,i),nb(a.y,o,n,i),nb(a.z,o,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"}]}),ub=Gm([ob,ab]),lb=wi((([e])=>{const t=Ii(e).toVar();return Qn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),db=wi((([e])=>{const t=Ii(e).toVar();return Qn(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),cb=Gm([lb,wi((([e])=>{const t=$i(e).toVar();return Qn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),hb=Gm([db,wi((([e])=>{const t=$i(e).toVar();return Qn(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),pb=wi((([e,t])=>{const r=Li(t).toVar(),s=Di(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Li(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),gb=wi((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(pb(r,Li(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(pb(e,Li(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(pb(t,Li(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(pb(r,Li(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(pb(e,Li(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(pb(t,Li(4))),t.addAssign(e)})),mb=wi((([e,t,r])=>{const s=Di(r).toVar(),i=Di(t).toVar(),n=Di(e).toVar();return s.bitXorAssign(i),s.subAssign(pb(i,Li(14))),n.bitXorAssign(s),n.subAssign(pb(s,Li(11))),i.bitXorAssign(n),i.subAssign(pb(n,Li(25))),s.bitXorAssign(i),s.subAssign(pb(i,Li(16))),n.bitXorAssign(s),n.subAssign(pb(s,Li(4))),i.bitXorAssign(n),i.subAssign(pb(n,Li(14))),s.bitXorAssign(i),s.subAssign(pb(i,Li(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),fb=wi((([e])=>{const t=Di(e).toVar();return Ii(t).div(Ii(Di(Li(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),yb=wi((([e])=>{const t=Ii(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"}]}),xb=Gm([wi((([e])=>{const t=Li(e).toVar(),r=Di(Di(1)).toVar(),s=Di(Di(Li(3735928559)).add(r.shiftLeft(Di(2))).add(Di(13))).toVar();return mb(s.add(Di(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),wi((([e,t])=>{const r=Li(t).toVar(),s=Li(e).toVar(),i=Di(Di(2)).toVar(),n=Di().toVar(),o=Di().toVar(),a=Di().toVar();return n.assign(o.assign(a.assign(Di(Li(3735928559)).add(i.shiftLeft(Di(2))).add(Di(13))))),n.addAssign(Di(s)),o.addAssign(Di(r)),mb(n,o,a)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),wi((([e,t,r])=>{const s=Li(r).toVar(),i=Li(t).toVar(),n=Li(e).toVar(),o=Di(Di(3)).toVar(),a=Di().toVar(),u=Di().toVar(),l=Di().toVar();return a.assign(u.assign(l.assign(Di(Li(3735928559)).add(o.shiftLeft(Di(2))).add(Di(13))))),a.addAssign(Di(n)),u.addAssign(Di(i)),l.addAssign(Di(s)),mb(a,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),wi((([e,t,r,s])=>{const i=Li(s).toVar(),n=Li(r).toVar(),o=Li(t).toVar(),a=Li(e).toVar(),u=Di(Di(4)).toVar(),l=Di().toVar(),d=Di().toVar(),c=Di().toVar();return l.assign(d.assign(c.assign(Di(Li(3735928559)).add(u.shiftLeft(Di(2))).add(Di(13))))),l.addAssign(Di(a)),d.addAssign(Di(o)),c.addAssign(Di(n)),gb(l,d,c),l.addAssign(Di(i)),mb(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"}]}),wi((([e,t,r,s,i])=>{const n=Li(i).toVar(),o=Li(s).toVar(),a=Li(r).toVar(),u=Li(t).toVar(),l=Li(e).toVar(),d=Di(Di(5)).toVar(),c=Di().toVar(),h=Di().toVar(),p=Di().toVar();return c.assign(h.assign(p.assign(Di(Li(3735928559)).add(d.shiftLeft(Di(2))).add(Di(13))))),c.addAssign(Di(l)),h.addAssign(Di(u)),p.addAssign(Di(a)),gb(c,h,p),c.addAssign(Di(o)),h.addAssign(Di(n)),mb(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"}]})]),bb=Gm([wi((([e,t])=>{const r=Li(t).toVar(),s=Li(e).toVar(),i=Di(xb(s,r)).toVar(),n=Hi().toVar();return n.x.assign(i.bitAnd(Li(255))),n.y.assign(i.shiftRight(Li(8)).bitAnd(Li(255))),n.z.assign(i.shiftRight(Li(16)).bitAnd(Li(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),wi((([e,t,r])=>{const s=Li(r).toVar(),i=Li(t).toVar(),n=Li(e).toVar(),o=Di(xb(n,i,s)).toVar(),a=Hi().toVar();return a.x.assign(o.bitAnd(Li(255))),a.y.assign(o.shiftRight(Li(8)).bitAnd(Li(255))),a.z.assign(o.shiftRight(Li(16)).bitAnd(Li(255))),a})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Tb=Gm([wi((([e])=>{const t=Oi(e).toVar(),r=Li().toVar(),s=Li().toVar(),i=Ii(eb(t.x,r)).toVar(),n=Ii(eb(t.y,s)).toVar(),o=Ii(yb(i)).toVar(),a=Ii(yb(n)).toVar(),u=Ii(tb(nb(xb(r,s),i,n),nb(xb(r.add(Li(1)),s),i.sub(1),n),nb(xb(r,s.add(Li(1))),i,n.sub(1)),nb(xb(r.add(Li(1)),s.add(Li(1))),i.sub(1),n.sub(1)),o,a)).toVar();return cb(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),wi((([e])=>{const t=$i(e).toVar(),r=Li().toVar(),s=Li().toVar(),i=Li().toVar(),n=Ii(eb(t.x,r)).toVar(),o=Ii(eb(t.y,s)).toVar(),a=Ii(eb(t.z,i)).toVar(),u=Ii(yb(n)).toVar(),l=Ii(yb(o)).toVar(),d=Ii(yb(a)).toVar(),c=Ii(rb(nb(xb(r,s,i),n,o,a),nb(xb(r.add(Li(1)),s,i),n.sub(1),o,a),nb(xb(r,s.add(Li(1)),i),n,o.sub(1),a),nb(xb(r.add(Li(1)),s.add(Li(1)),i),n.sub(1),o.sub(1),a),nb(xb(r,s,i.add(Li(1))),n,o,a.sub(1)),nb(xb(r.add(Li(1)),s,i.add(Li(1))),n.sub(1),o,a.sub(1)),nb(xb(r,s.add(Li(1)),i.add(Li(1))),n,o.sub(1),a.sub(1)),nb(xb(r.add(Li(1)),s.add(Li(1)),i.add(Li(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return hb(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),_b=Gm([wi((([e])=>{const t=Oi(e).toVar(),r=Li().toVar(),s=Li().toVar(),i=Ii(eb(t.x,r)).toVar(),n=Ii(eb(t.y,s)).toVar(),o=Ii(yb(i)).toVar(),a=Ii(yb(n)).toVar(),u=$i(tb(ub(bb(r,s),i,n),ub(bb(r.add(Li(1)),s),i.sub(1),n),ub(bb(r,s.add(Li(1))),i,n.sub(1)),ub(bb(r.add(Li(1)),s.add(Li(1))),i.sub(1),n.sub(1)),o,a)).toVar();return cb(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),wi((([e])=>{const t=$i(e).toVar(),r=Li().toVar(),s=Li().toVar(),i=Li().toVar(),n=Ii(eb(t.x,r)).toVar(),o=Ii(eb(t.y,s)).toVar(),a=Ii(eb(t.z,i)).toVar(),u=Ii(yb(n)).toVar(),l=Ii(yb(o)).toVar(),d=Ii(yb(a)).toVar(),c=$i(rb(ub(bb(r,s,i),n,o,a),ub(bb(r.add(Li(1)),s,i),n.sub(1),o,a),ub(bb(r,s.add(Li(1)),i),n,o.sub(1),a),ub(bb(r.add(Li(1)),s.add(Li(1)),i),n.sub(1),o.sub(1),a),ub(bb(r,s,i.add(Li(1))),n,o,a.sub(1)),ub(bb(r.add(Li(1)),s,i.add(Li(1))),n.sub(1),o,a.sub(1)),ub(bb(r,s.add(Li(1)),i.add(Li(1))),n,o.sub(1),a.sub(1)),ub(bb(r.add(Li(1)),s.add(Li(1)),i.add(Li(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return hb(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),vb=Gm([wi((([e])=>{const t=Ii(e).toVar(),r=Li(Jx(t)).toVar();return fb(xb(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),wi((([e])=>{const t=Oi(e).toVar(),r=Li(Jx(t.x)).toVar(),s=Li(Jx(t.y)).toVar();return fb(xb(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),wi((([e])=>{const t=$i(e).toVar(),r=Li(Jx(t.x)).toVar(),s=Li(Jx(t.y)).toVar(),i=Li(Jx(t.z)).toVar();return fb(xb(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),wi((([e])=>{const t=qi(e).toVar(),r=Li(Jx(t.x)).toVar(),s=Li(Jx(t.y)).toVar(),i=Li(Jx(t.z)).toVar(),n=Li(Jx(t.w)).toVar();return fb(xb(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Nb=Gm([wi((([e])=>{const t=Ii(e).toVar(),r=Li(Jx(t)).toVar();return $i(fb(xb(r,Li(0))),fb(xb(r,Li(1))),fb(xb(r,Li(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),wi((([e])=>{const t=Oi(e).toVar(),r=Li(Jx(t.x)).toVar(),s=Li(Jx(t.y)).toVar();return $i(fb(xb(r,s,Li(0))),fb(xb(r,s,Li(1))),fb(xb(r,s,Li(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),wi((([e])=>{const t=$i(e).toVar(),r=Li(Jx(t.x)).toVar(),s=Li(Jx(t.y)).toVar(),i=Li(Jx(t.z)).toVar();return $i(fb(xb(r,s,i,Li(0))),fb(xb(r,s,i,Li(1))),fb(xb(r,s,i,Li(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),wi((([e])=>{const t=qi(e).toVar(),r=Li(Jx(t.x)).toVar(),s=Li(Jx(t.y)).toVar(),i=Li(Jx(t.z)).toVar(),n=Li(Jx(t.w)).toVar();return $i(fb(xb(r,s,i,n,Li(0))),fb(xb(r,s,i,n,Li(1))),fb(xb(r,s,i,n,Li(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Sb=wi((([e,t,r,s])=>{const i=Ii(s).toVar(),n=Ii(r).toVar(),o=Li(t).toVar(),a=$i(e).toVar(),u=Ii(0).toVar(),l=Ii(1).toVar();return Tc(o,(()=>{u.addAssign(l.mul(Tb(a))),l.mulAssign(i),a.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"}]}),Ab=wi((([e,t,r,s])=>{const i=Ii(s).toVar(),n=Ii(r).toVar(),o=Li(t).toVar(),a=$i(e).toVar(),u=$i(0).toVar(),l=Ii(1).toVar();return Tc(o,(()=>{u.addAssign(l.mul(_b(a))),l.mulAssign(i),a.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"}]}),Rb=wi((([e,t,r,s])=>{const i=Ii(s).toVar(),n=Ii(r).toVar(),o=Li(t).toVar(),a=$i(e).toVar();return Oi(Sb(a,o,n,i),Sb(a.add($i(Li(19),Li(193),Li(17))),o,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"}]}),Cb=wi((([e,t,r,s])=>{const i=Ii(s).toVar(),n=Ii(r).toVar(),o=Li(t).toVar(),a=$i(e).toVar(),u=$i(Ab(a,o,n,i)).toVar(),l=Ii(Sb(a.add($i(Li(19),Li(193),Li(17))),o,n,i)).toVar();return qi(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"}]}),Eb=Gm([wi((([e,t,r,s,i,n,o])=>{const a=Li(o).toVar(),u=Ii(n).toVar(),l=Li(i).toVar(),d=Li(s).toVar(),c=Li(r).toVar(),h=Li(t).toVar(),p=Oi(e).toVar(),g=$i(Nb(Oi(h.add(d),c.add(l)))).toVar(),m=Oi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Oi(Oi(Ii(h),Ii(c)).add(m)).toVar(),y=Oi(f.sub(p)).toVar();return Fi(a.equal(Li(2)),(()=>$o(y.x).add($o(y.y)))),Fi(a.equal(Li(3)),(()=>ia($o(y.x),$o(y.y)))),da(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"}]}),wi((([e,t,r,s,i,n,o,a,u])=>{const l=Li(u).toVar(),d=Ii(a).toVar(),c=Li(o).toVar(),h=Li(n).toVar(),p=Li(i).toVar(),g=Li(s).toVar(),m=Li(r).toVar(),f=Li(t).toVar(),y=$i(e).toVar(),x=$i(Nb($i(f.add(p),m.add(h),g.add(c)))).toVar();x.subAssign(.5),x.mulAssign(d),x.addAssign(.5);const b=$i($i(Ii(f),Ii(m),Ii(g)).add(x)).toVar(),T=$i(b.sub(y)).toVar();return Fi(l.equal(Li(2)),(()=>$o(T.x).add($o(T.y)).add($o(T.z)))),Fi(l.equal(Li(3)),(()=>ia(ia($o(T.x),$o(T.y)),$o(T.z)))),da(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"}]})]),wb=wi((([e,t,r])=>{const s=Li(r).toVar(),i=Ii(t).toVar(),n=Oi(e).toVar(),o=Li().toVar(),a=Li().toVar(),u=Oi(eb(n.x,o),eb(n.y,a)).toVar(),l=Ii(1e6).toVar();return Tc({start:-1,end:Li(1),name:"x",condition:"<="},(({x:e})=>{Tc({start:-1,end:Li(1),name:"y",condition:"<="},(({y:t})=>{const r=Ii(Eb(u,e,t,o,a,i,s)).toVar();l.assign(sa(l,r))}))})),Fi(s.equal(Li(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"}]}),Mb=wi((([e,t,r])=>{const s=Li(r).toVar(),i=Ii(t).toVar(),n=Oi(e).toVar(),o=Li().toVar(),a=Li().toVar(),u=Oi(eb(n.x,o),eb(n.y,a)).toVar(),l=Oi(1e6,1e6).toVar();return Tc({start:-1,end:Li(1),name:"x",condition:"<="},(({x:e})=>{Tc({start:-1,end:Li(1),name:"y",condition:"<="},(({y:t})=>{const r=Ii(Eb(u,e,t,o,a,i,s)).toVar();Fi(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),Fi(s.equal(Li(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"}]}),Bb=wi((([e,t,r])=>{const s=Li(r).toVar(),i=Ii(t).toVar(),n=Oi(e).toVar(),o=Li().toVar(),a=Li().toVar(),u=Oi(eb(n.x,o),eb(n.y,a)).toVar(),l=$i(1e6,1e6,1e6).toVar();return Tc({start:-1,end:Li(1),name:"x",condition:"<="},(({x:e})=>{Tc({start:-1,end:Li(1),name:"y",condition:"<="},(({y:t})=>{const r=Ii(Eb(u,e,t,o,a,i,s)).toVar();Fi(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)}))}))})),Fi(s.equal(Li(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"}]}),Fb=Gm([wb,wi((([e,t,r])=>{const s=Li(r).toVar(),i=Ii(t).toVar(),n=$i(e).toVar(),o=Li().toVar(),a=Li().toVar(),u=Li().toVar(),l=$i(eb(n.x,o),eb(n.y,a),eb(n.z,u)).toVar(),d=Ii(1e6).toVar();return Tc({start:-1,end:Li(1),name:"x",condition:"<="},(({x:e})=>{Tc({start:-1,end:Li(1),name:"y",condition:"<="},(({y:t})=>{Tc({start:-1,end:Li(1),name:"z",condition:"<="},(({z:r})=>{const n=Ii(Eb(l,e,t,r,o,a,u,i,s)).toVar();d.assign(sa(d,n))}))}))})),Fi(s.equal(Li(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"}]})]),Ub=Gm([Mb,wi((([e,t,r])=>{const s=Li(r).toVar(),i=Ii(t).toVar(),n=$i(e).toVar(),o=Li().toVar(),a=Li().toVar(),u=Li().toVar(),l=$i(eb(n.x,o),eb(n.y,a),eb(n.z,u)).toVar(),d=Oi(1e6,1e6).toVar();return Tc({start:-1,end:Li(1),name:"x",condition:"<="},(({x:e})=>{Tc({start:-1,end:Li(1),name:"y",condition:"<="},(({y:t})=>{Tc({start:-1,end:Li(1),name:"z",condition:"<="},(({z:r})=>{const n=Ii(Eb(l,e,t,r,o,a,u,i,s)).toVar();Fi(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),Fi(s.equal(Li(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"}]})]),Pb=Gm([Bb,wi((([e,t,r])=>{const s=Li(r).toVar(),i=Ii(t).toVar(),n=$i(e).toVar(),o=Li().toVar(),a=Li().toVar(),u=Li().toVar(),l=$i(eb(n.x,o),eb(n.y,a),eb(n.z,u)).toVar(),d=$i(1e6,1e6,1e6).toVar();return Tc({start:-1,end:Li(1),name:"x",condition:"<="},(({x:e})=>{Tc({start:-1,end:Li(1),name:"y",condition:"<="},(({y:t})=>{Tc({start:-1,end:Li(1),name:"z",condition:"<="},(({z:r})=>{const n=Ii(Eb(l,e,t,r,o,a,u,i,s)).toVar();Fi(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)}))}))}))})),Fi(s.equal(Li(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"}]})]),Ib=wi((([e])=>{const t=e.y,r=e.z,s=$i().toVar();return Fi(t.lessThan(1e-4),(()=>{s.assign($i(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(Uo(i)).mul(6).toVar();const n=Li(Zo(i)),o=i.sub(Ii(n)),a=r.mul(t.oneMinus()),u=r.mul(t.mul(o).oneMinus()),l=r.mul(t.mul(o.oneMinus()).oneMinus());Fi(n.equal(Li(0)),(()=>{s.assign($i(r,l,a))})).ElseIf(n.equal(Li(1)),(()=>{s.assign($i(u,r,a))})).ElseIf(n.equal(Li(2)),(()=>{s.assign($i(a,r,l))})).ElseIf(n.equal(Li(3)),(()=>{s.assign($i(a,u,r))})).ElseIf(n.equal(Li(4)),(()=>{s.assign($i(l,a,r))})).Else((()=>{s.assign($i(r,a,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Lb=wi((([e])=>{const t=$i(e).toVar(),r=Ii(t.x).toVar(),s=Ii(t.y).toVar(),i=Ii(t.z).toVar(),n=Ii(sa(r,sa(s,i))).toVar(),o=Ii(ia(r,ia(s,i))).toVar(),a=Ii(o.sub(n)).toVar(),u=Ii().toVar(),l=Ii().toVar(),d=Ii().toVar();return d.assign(o),Fi(o.greaterThan(0),(()=>{l.assign(a.div(o))})).Else((()=>{l.assign(0)})),Fi(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{Fi(r.greaterThanEqual(o),(()=>{u.assign(s.sub(i).div(a))})).ElseIf(s.greaterThanEqual(o),(()=>{u.assign(Kn(2,i.sub(r).div(a)))})).Else((()=>{u.assign(Kn(4,r.sub(s).div(a)))})),u.mulAssign(1/6),Fi(u.lessThan(0),(()=>{u.addAssign(1)}))})),$i(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),Db=wi((([e])=>{const t=$i(e).toVar(),r=ji(so(t,$i(.04045))).toVar(),s=$i(t.div(12.92)).toVar(),i=$i(ha(ia(t.add($i(.055)),$i(0)).div(1.055),$i(2.4))).toVar();return ba(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Vb=(e,t)=>{e=Ii(e),t=Ii(t);const r=Oi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return Na(e.sub(r),e.add(r),t)},Ob=(e,t,r,s)=>ba(e,t,r[s].clamp()),Gb=(e,t,r,s,i)=>ba(e,t,Vb(r,s[i])),kb=wi((([e,t,r])=>{const s=Io(e).toVar("nDir"),i=Yn(Ii(.5).mul(t.sub(r)),yl).div(s).toVar("rbmax"),n=Yn(Ii(-.5).mul(t.sub(r)),yl).div(s).toVar("rbmin"),o=$i().toVar("rbminmax");o.x=s.x.greaterThan(Ii(0)).select(i.x,n.x),o.y=s.y.greaterThan(Ii(0)).select(i.y,n.y),o.z=s.z.greaterThan(Ii(0)).select(i.z,n.z);const a=sa(sa(o.x,o.y),o.z).toVar("correction");return yl.add(s.mul(a)).toVar("boxIntersection").sub(r)})),zb=wi((([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(Qn(r,r).sub(Qn(s,s)))),n}));var $b=Object.freeze({__proto__:null,BRDF_GGX:tp,BRDF_Lambert:Gh,BasicShadowFilter:Ax,Break:_c,Const:Ga,Continue:()=>vu("continue").append(),DFGApprox:rp,D_GGX:Zh,Discard:Nu,EPSILON:bo,F_Schlick:Oh,Fn:wi,INFINITY:To,If:Fi,Loop:Tc,NodeAccess:Fs,NodeShaderStage:ws,NodeType:Bs,NodeUpdateType:Ms,PCFShadowFilter:Rx,PCFSoftShadowFilter:Cx,PI:_o,PI2:vo,Return:()=>vu("return").append(),Schlick_to_F0:ip,ScriptableNodeResources:My,ShaderNode:Ni,TBNViewMatrix:od,VSMShadowFilter:Ex,V_GGX_SmithCorrelated:Yh,Var:Oa,abs:$o,acesFilmicToneMapping:fy,acos:ko,add:Kn,addMethodChaining:Qs,addNodeElement:function(e){console.warn("THREE.TSLBase: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:Ty,all:No,alphaT:Cn,and:oo,anisotropy:En,anisotropyB:Mn,anisotropyT:wn,any:So,append:Ui,array:sn,arrayBuffer:e=>Si(new Xs(e,"ArrayBuffer")),asin:Go,assign:Hn,atan:zo,atan2:Ea,atomicAdd:(e,t,r=null)=>Jy(Qy.ATOMIC_ADD,e,t,r),atomicAnd:(e,t,r=null)=>Jy(Qy.ATOMIC_AND,e,t,r),atomicFunc:Jy,atomicLoad:(e,t=null)=>Jy(Qy.ATOMIC_LOAD,e,null,t),atomicMax:(e,t,r=null)=>Jy(Qy.ATOMIC_MAX,e,t,r),atomicMin:(e,t,r=null)=>Jy(Qy.ATOMIC_MIN,e,t,r),atomicOr:(e,t,r=null)=>Jy(Qy.ATOMIC_OR,e,t,r),atomicStore:(e,t,r=null)=>Jy(Qy.ATOMIC_STORE,e,t,r),atomicSub:(e,t,r=null)=>Jy(Qy.ATOMIC_SUB,e,t,r),atomicXor:(e,t,r=null)=>Jy(Qy.ATOMIC_XOR,e,t,r),attenuationColor:zn,attenuationDistance:kn,attribute:Cu,attributeArray:(e,t="float")=>{const r=vs(t),s=_s(t),i=new Rf(e,r,s);return Mf(i,t,e)},backgroundBlurriness:Df,backgroundIntensity:Vf,backgroundRotation:Of,batch:mc,billboarding:jm,bitAnd:co,bitNot:ho,bitOr:po,bitXor:go,bitangentGeometry:ed,bitangentLocal:td,bitangentView:rd,bitangentWorld:sd,bitcast:ta,blendBurn:Xf,blendColor:Zf,blendDodge:Kf,blendOverlay:Qf,blendScreen:Yf,blur:rg,bool:Vi,buffer:Du,bufferAttribute:uu,bumpMap:md,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),Xf(e)),bvec2:zi,bvec3:ji,bvec4:Yi,bypass:yu,cache:mu,call:qn,cameraFar:$u,cameraIndex:ku,cameraNear:zu,cameraNormalMatrix:Xu,cameraPosition:Ku,cameraProjectionMatrix:Wu,cameraProjectionMatrixInverse:Hu,cameraViewMatrix:ju,cameraWorldMatrix:qu,cbrt:ya,cdl:iy,ceil:Po,checker:Kx,cineonToneMapping:gy,clamp:Ta,clearcoat:Tn,clearcoatRoughness:_n,code:Ny,color:Pi,colorSpaceToWorking:Ja,colorToDirection:e=>Si(e).mul(2).sub(1),compute:pu,cond:Ua,context:Ia,convert:tn,convertColorSpace:(e,t,r)=>Si(new Ka(Si(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():_f(e,...t),cos:Vo,cross:ca,cubeTexture:Gl,dFdx:Xo,dFdy:Ko,dashSize:In,defaultBuildStages:Ps,defaultShaderStages:Us,defined:_i,degrees:Ro,deltaTime:zm,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),Ly(e,Iy(t))},densityFogFactor:Iy,depth:ih,depthPass:(e,t,r)=>Si(new dy(dy.DEPTH,e,t,r)),difference:la,diffuseColor:fn,directPointLight:qx,directionToColor:vh,dispersion:$n,distance:ua,div:Zn,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),Kf(e)),dot:da,drawIndex:lc,dynamicBufferAttribute:lu,element:en,emissive:yn,equal:eo,equals:ra,equirectUV:Rh,exp:Co,exp2:Eo,expression:vu,faceDirection:Nl,faceForward:Sa,faceforward:wa,float:Ii,floor:Uo,fog:Ly,fract:Lo,frameGroup:un,frameId:$m,frontFacing:vl,fwidth:Jo,gain:(e,t)=>e.lessThan(.5)?Pm(e.mul(2),t).div(2):Yn(1,Pm(Qn(Yn(1,e),2),t).div(2)),gapSize:Ln,getConstNodeType:vi,getCurrentStack:Bi,getDirection:Zp,getDistanceAttenuation:Dx,getGeometryRoughness:Xh,getNormalFromDepth:Sf,getParallaxCorrectNormal:kb,getRoughness:Kh,getScreenPosition:Nf,getShIrradianceAt:zb,getTextureIndex:Mm,getViewPosition:vf,globalId:Hy,glsl:(e,t)=>Ny(e,t,"glsl"),glslFn:(e,t)=>Ay(e,t,"glsl"),grayscale:Jf,greaterThan:so,greaterThanEqual:no,hash:Um,highpModelNormalViewMatrix:pl,highpModelViewMatrix:hl,hue:ry,instance:cc,instanceIndex:nc,instancedArray:(e,t="float")=>{const r=vs(t),s=_s(t),i=new Af(e,r,s);return Mf(i,t,e)},instancedBufferAttribute:du,instancedDynamicBufferAttribute:cu,instancedMesh:pc,int:Li,inverseSqrt:Fo,inversesqrt:Ma,invocationLocalIndex:uc,invocationSubgroupIndex:ac,ior:Vn,iridescence:Sn,iridescenceIOR:An,iridescenceThickness:Rn,ivec2:Gi,ivec3:Wi,ivec4:Xi,js:(e,t)=>Ny(e,t,"js"),label:La,length:Ho,lengthSq:xa,lessThan:ro,lessThanEqual:io,lightPosition:ix,lightProjectionUV:sx,lightShadowMatrix:rx,lightTargetDirection:ax,lightTargetPosition:nx,lightViewPosition:ox,lightingContext:Mc,lights:(e=[])=>Si(new dx).setLights(e),linearDepth:nh,linearToneMapping:hy,localId:jy,log:wo,log2:Mo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(wo(r.div(t)));return Ii(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("TSL.LoopNode: loop() has been renamed to Loop()."),Tc(...e)),luminance:sy,mat2:Qi,mat3:Zi,mat4:Ji,matcapUV:Ng,materialAO:ec,materialAlphaTest:xd,materialAnisotropy:Dd,materialAnisotropyVector:tc,materialAttenuationColor:Hd,materialAttenuationDistance:Wd,materialClearcoat:Bd,materialClearcoatNormal:Ud,materialClearcoatRoughness:Fd,materialColor:bd,materialDispersion:Zd,materialEmissive:_d,materialIOR:$d,materialIridescence:Vd,materialIridescenceIOR:Od,materialIridescenceThickness:Gd,materialLightMap:Jd,materialLineDashOffset:Yd,materialLineDashSize:qd,materialLineGapSize:Xd,materialLineScale:jd,materialLineWidth:Kd,materialMetalness:wd,materialNormal:Md,materialOpacity:vd,materialPointSize:Qd,materialReference:jl,materialReflectivity:Cd,materialRefractionRatio:Pl,materialRotation:Pd,materialRoughness:Ed,materialSheen:Id,materialSheenRoughness:Ld,materialShininess:Td,materialSpecular:Nd,materialSpecularColor:Ad,materialSpecularIntensity:Sd,materialSpecularStrength:Rd,materialThickness:zd,materialTransmission:kd,max:ia,maxMipLevel:Fu,mediumpModelViewMatrix:cl,metalness:bn,min:sa,mix:ba,mixElement:Ra,mod:na,modInt:Jn,modelDirection:sl,modelNormalMatrix:ul,modelPosition:nl,modelScale:ol,modelViewMatrix:dl,modelViewPosition:al,modelViewProjection:rc,modelWorldMatrix:il,modelWorldMatrixInverse:ll,morphReference:Rc,mrt:Fm,mul:Qn,mx_aastep:Vb,mx_cell_noise_float:(e=Eu())=>vb(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>Ii(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=Eu(),t=3,r=2,s=.5,i=1)=>Sb(e,Li(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Eu(),t=3,r=2,s=.5,i=1)=>Rb(e,Li(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Eu(),t=3,r=2,s=.5,i=1)=>Ab(e,Li(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Eu(),t=3,r=2,s=.5,i=1)=>Cb(e,Li(t),r,s).mul(i),mx_hsvtorgb:Ib,mx_noise_float:(e=Eu(),t=1,r=0)=>Tb(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Eu(),t=1,r=0)=>_b(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Eu(),t=1,r=0)=>{e=e.convert("vec2|vec3");return qi(_b(e),Tb(e.add(Oi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=Eu())=>Ob(e,t,r,"x"),mx_ramptb:(e,t,r=Eu())=>Ob(e,t,r,"y"),mx_rgbtohsv:Lb,mx_safepower:(e,t=1)=>(e=Ii(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=Eu())=>Gb(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Eu())=>Gb(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:Db,mx_transform_uv:(e=1,t=0,r=Eu())=>r.mul(e).add(t),mx_worley_noise_float:(e=Eu(),t=1)=>Fb(e.convert("vec2|vec3"),t,Li(1)),mx_worley_noise_vec2:(e=Eu(),t=1)=>Ub(e.convert("vec2|vec3"),t,Li(1)),mx_worley_noise_vec3:(e=Eu(),t=1)=>Pb(e.convert("vec2|vec3"),t,Li(1)),negate:jo,neutralToneMapping:_y,nodeArray:Ri,nodeImmutable:Ei,nodeObject:Si,nodeObjects:Ai,nodeProxy:Ci,normalFlat:Rl,normalGeometry:Sl,normalLocal:Al,normalMap:cd,normalView:Cl,normalWorld:El,normalize:Io,not:uo,notEqual:to,numWorkgroups:$y,objectDirection:Qu,objectGroup:dn,objectPosition:Ju,objectScale:el,objectViewPosition:tl,objectWorldMatrix:Zu,oneMinus:qo,or:ao,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=km)=>e.fract(),oscSine:(e=km)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=km)=>e.fract().round(),oscTriangle:(e=km)=>e.add(.5).fract().mul(2).sub(1).abs(),output:Pn,outputStruct:wm,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),Qf(e)),overloadingFn:Gm,parabola:Pm,parallaxDirection:ad,parallaxUV:(e,t)=>e.sub(ad.mul(t)),parameter:(e,t)=>Si(new Am(e,t)),pass:(e,t,r)=>Si(new dy(dy.COLOR,e,t,r)),passTexture:(e,t)=>Si(new uy(e,t)),pcurve:(e,t,r)=>ha(Zn(ha(e,t),Kn(ha(e,t),ha(Yn(1,e),r))),1/t),perspectiveDepthToViewZ:th,pmremTexture:ag,pointUV:Uf,pointWidth:Dn,positionGeometry:gl,positionLocal:ml,positionPrevious:fl,positionView:bl,positionViewDirection:Tl,positionWorld:yl,positionWorldDirection:xl,posterize:oy,pow:ha,pow2:pa,pow3:ga,pow4:ma,property:gn,radians:Ao,rand:Aa,range:Gy,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),Ly(e,Py(t,r))},rangeFogFactor:Py,reciprocal:Qo,reference:$l,referenceBuffer:Wl,reflect:aa,reflectVector:Dl,reflectView:Il,reflector:e=>Si(new pf(e)),refract:va,refractVector:Vl,refractView:Ll,reinhardToneMapping:py,remainder:yo,remap:bu,remapClamp:Tu,renderGroup:ln,renderOutput:Au,rendererReference:su,rotate:Cg,rotateUV:Wm,roughness:xn,round:Yo,rtt:_f,sRGBTransferEOTF:Ha,sRGBTransferOETF:ja,sampler:e=>(!0===e.isNode?e:Pu(e)).convert("sampler"),saturate:_a,saturation:ey,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),Yf(e)),screenCoordinate:Dc,screenSize:Lc,screenUV:Ic,scriptable:Fy,scriptableValue:Cy,select:Fa,setCurrentStack:Mi,shaderStages:Is,shadow:Ix,shadowPositionWorld:hx,shapeCircle:Yx,sharedUniformGroup:an,sheen:vn,sheenRoughness:Nn,shiftLeft:mo,shiftRight:fo,shininess:Un,sign:Wo,sin:Do,sinc:(e,t)=>Do(_o.mul(t.mul(e).sub(1))).div(_o.mul(t.mul(e).sub(1))),skinning:e=>Si(new yc(e)),skinningReference:xc,smoothstep:Na,smoothstepElement:Ca,specularColor:Bn,specularF90:Fn,spherizeUV:Hm,split:(e,t)=>Si(new Ws(Si(e),t)),spritesheetUV:Km,sqrt:Bo,stack:Cm,step:oa,storage:Mf,storageBarrier:()=>Xy("storage").append(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),Mf(e,t,r).setPBO(!0)),storageTexture:kf,string:(e="")=>Si(new Xs(e,"string")),sub:Yn,subgroupIndex:oc,subgroupSize:qy,tan:Oo,tangentGeometry:ql,tangentLocal:Xl,tangentView:Kl,tangentWorld:Yl,temp:ka,texture:Pu,texture3D:Dg,textureBarrier:()=>Xy("texture").append(),textureBicubic:vp,textureCubeUV:Jp,textureLoad:Iu,textureSize:Mu,textureStore:(e,t,r)=>{const s=kf(e,t,r);return null!==r&&s.append(),s},thickness:Gn,time:km,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),zm.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),km.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),km.mul(e)),toOutputColorSpace:Ya,toWorkingColorSpace:Qa,toneMapping:nu,toneMappingExposure:ou,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Si(new cy(t,r,Si(s),Si(i),Si(n))),transformDirection:fa,transformNormal:Fl,transformNormalToView:Ul,transformedBentNormalView:ud,transformedBitangentView:id,transformedBitangentWorld:nd,transformedClearcoatNormalView:Bl,transformedNormalView:wl,transformedNormalWorld:Ml,transformedTangentView:Ql,transformedTangentWorld:Zl,transmission:On,transpose:ea,triNoise3D:Dm,triplanarTexture:(...e)=>Qm(...e),triplanarTextures:Qm,trunc:Zo,tslFn:(...e)=>(console.warn("TSL.ShaderNode: tslFn() has been renamed to Fn()."),wi(...e)),uint:Di,uniform:hn,uniformArray:Gu,uniformGroup:on,uniforms:(e,t)=>(console.warn("TSL.UniformArrayNode: uniforms() has been renamed to uniformArray()."),Si(new Ou(e,t))),userData:(e,t,r)=>Si(new zf(e,t,r)),uv:Eu,uvec2:ki,uvec3:Hi,uvec4:Ki,varying:$a,varyingProperty:mn,vec2:Oi,vec3:$i,vec4:qi,vectorComponents:Ls,velocity:qf,vertexColor:e=>Si(new Bf(e)),vertexIndex:ic,vertexStage:Wa,vibrance:ty,viewZToLogarithmicDepth:rh,viewZToOrthographicDepth:Jc,viewZToPerspectiveDepth:eh,viewport:Vc,viewportBottomLeft:Wc,viewportCoordinate:Gc,viewportDepthTexture:Qc,viewportLinearDepth:oh,viewportMipTexture:Xc,viewportResolution:zc,viewportSafeUV:qm,viewportSharedTexture:bh,viewportSize:Oc,viewportTexture:qc,viewportTopLeft:$c,viewportUV:kc,wgsl:(e,t)=>Ny(e,t,"wgsl"),wgslFn:(e,t)=>Ay(e,t,"wgsl"),workgroupArray:(e,t)=>Si(new Yy("Workgroup",e,t)),workgroupBarrier:()=>Xy("workgroup").append(),workgroupId:Wy,workingToColorSpace:Za,xor:lo});const Wb=new Sm;class Hb extends Hg{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(Wb,Ce),Wb.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(Wb,Ce),Wb.a=1,n=!0;else if(!0===i.isNode){const r=this.get(e),n=i;Wb.copy(s._clearColor);let o=r.backgroundMesh;if(void 0===o){const e=Ia(qi(n).mul(Vf),{getUV:()=>Of.mul(El),getTextureLevel:()=>Df});let t=rc;t=t.setZ(t.w);const s=new hh;s.name="Background.material",s.side=_,s.depthTest=!1,s.depthWrite=!1,s.fog=!1,s.lights=!1,s.vertexNode=t,s.colorNode=e,r.backgroundMeshNode=e,r.backgroundMesh=o=new k(new Fe(1,32,32),s),o.frustumCulled=!1,o.name="Background.mesh",o.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)}}const a=n.getCacheKey();r.backgroundCacheKey!==a&&(r.backgroundMeshNode.node=qi(n).mul(Vf),r.backgroundMeshNode.needsUpdate=!0,o.material.needsUpdate=!0,r.backgroundCacheKey=a),t.unshift(o,o.geometry,o.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const o=s.xr.getEnvironmentBlendMode();if("additive"===o?Wb.set(0,0,0,1):"alpha-blend"===o&&Wb.set(0,0,0,0),!0===s.autoClear||!0===n){const e=r.clearColorValue;e.r=Wb.r,e.g=Wb.g,e.b=Wb.b,e.a=Wb.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(e.r*=e.a,e.g*=e.a,e.b*=e.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 jb=0;class qb{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=jb++}}class Xb{constructor(e,t,r,s,i,n,o,a,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=o,this.updateAfterNodes=a,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 qb(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class Kb{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class Yb{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}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 Qb{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class Zb extends Qb{constructor(e,t){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0}}class Jb{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let eT=0;class tT{constructor(e=null){this.id=eT++,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 rT extends Vs{static get type(){return"StructTypeNode"}constructor(e,t){super(),this.name=e,this.types=t,this.isStructTypeNode=!0}getMemberTypes(){return this.types}}class sT{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class iT extends sT{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class nT extends sT{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class oT extends sT{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class aT extends sT{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class uT extends sT{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class lT extends sT{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=16,this.itemSize=4}}class dT extends sT{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class cT extends sT{constructor(e,t=new o){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class hT extends iT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class pT extends nT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class gT extends oT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class mT extends aT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class fT extends uT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class yT extends lT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class xT extends dT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class bT extends cT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const TT=[.125,.215,.35,.446,.526,.582],_T=20,vT=new _e(-1,1,1,-1,0,1),NT=new Pe(90,1),ST=new e;let AT=null,RT=0,CT=0;const ET=(1+Math.sqrt(5))/2,wT=1/ET,MT=[new r(-ET,wT,0),new r(ET,wT,0),new r(-wT,0,ET),new r(wT,0,ET),new r(0,ET,-wT),new r(0,ET,wT),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],BT=new WeakMap,FT=[3,1,5,0,4,2],UT=Zp(Eu(),Cu("faceIndex")).normalize(),PT=$i(UT.x,UT.y,UT.z);class IT{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=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=null){if(this._setSize(256),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=i||this._allocateTargets();return this.fromSceneAsync(e,t,r,s,n),n}AT=this._renderer.getRenderTarget(),RT=this._renderer.getActiveCubeFace(),CT=this._renderer.getActiveMipmapLevel();const n=i||this._allocateTargets();return n.depthBuffer=!0,this._sceneToCubeUV(e,r,s,n),t>0&&this._blur(n,0,0,t),this._applyPMREM(n),this._cleanup(n),n}async fromSceneAsync(e,t=0,r=.1,s=100,i=null){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=OT(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=GT(),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===v||e.mapping===N?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._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=TT[a-e+4-1]:0===a&&(u=0),s.push(u);const l=1/(o-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,x=new Float32Array(m*g*p),b=new Float32Array(f*g*p),T=new Float32Array(y*g*p);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=FT[e];x.set(s,m*g*i),b.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new ve;_.setAttribute("position",new Se(x,m)),_.setAttribute("uv",new Se(b,f)),_.setAttribute("faceIndex",new Se(T,y)),t.push(_),i.push(new k(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=Gu(new Array(_T).fill(0)),n=hn(new r(0,1,0)),o=hn(0),a=Ii(_T),u=hn(0),l=hn(1),d=Pu(null),c=hn(0),h=Ii(1/t),p=Ii(1/s),g=Ii(e),m={n:a,latitudinal:u,weights:i,poleAxis:n,outputDirection:PT,dTheta:o,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=VT("blur");return f.fragmentNode=rg({...m,latitudinal:u.equal(1)}),BT.set(f,m),f}(i,e,t)}return i}async _compileMaterial(e){const t=new k(this._lodPlanes[0],e);await this._renderer.compile(t,vT)}_sceneToCubeUV(e,t,r,s){const i=NT;i.near=t,i.far=r;const n=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],a=this._renderer,u=a.autoClear;a.getClearColor(ST),a.autoClear=!1;let l=this._backgroundBox;if(null===l){const e=new Q({name:"PMREM.Background",side:_,depthWrite:!1,depthTest:!1});l=new k(new G,e)}let d=!1;const c=e.background;c?c.isColor&&(l.material.color.copy(c),e.background=null,d=!0):(l.material.color.copy(ST),d=!0),a.setRenderTarget(s),a.clear(),d&&a.render(l,i);for(let t=0;t<6;t++){const r=t%3;0===r?(i.up.set(0,n[t],0),i.lookAt(o[t],0,0)):1===r?(i.up.set(0,0,n[t]),i.lookAt(0,o[t],0)):(i.up.set(0,n[t],0),i.lookAt(0,0,o[t]));const u=this._cubeSize;DT(s,r*u,t>2?u:0,u,u),a.render(e,i)}a.autoClear=u,e.background=c}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===v||e.mapping===N;s?null===this._cubemapMaterial&&(this._cubemapMaterial=OT(e)):null===this._equirectMaterial&&(this._equirectMaterial=GT(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const o=this._cubeSize;DT(t,0,0,3*o,2*o),r.setRenderTarget(t),r.render(n,vT)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;t_T&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;e<_T;++e){const t=e/p,r=Math.exp(-t*t/2);m.push(r),0===e?f+=r:ey-4?s-y+4:0),4*(this._cubeSize-x),3*x,2*x),a.setRenderTarget(t),a.render(l,vT)}}function LT(e,t,r){const s=new fe(e,t,r);return s.texture.mapping=Ue,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function DT(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function VT(e){const t=new hh;return t.depthTest=!1,t.depthWrite=!1,t.blending=D,t.name=`PMREM_${e}`,t}function OT(e){const t=VT("cubemap");return t.fragmentNode=Gl(e,PT),t}function GT(e){const t=VT("equirect");return t.fragmentNode=Pu(e,Rh(PT),0),t}const kT=new WeakMap,zT=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),$T=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class WT{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.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.flow={code:""},this.chaining=[],this.stack=Cm(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new tT,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.useComparisonMethod=!1}getBindGroupsCache(){let e=kT.get(this.renderer);return void 0===e&&(e=new Gg,kT.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new fe(e,t,r)}createCubeRenderTarget(e,t){return new Ch(e,t)}createPMREMGenerator(){return new IT(this.renderer)}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 qb(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new qb(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 Is)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}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")}( ${$T(n.r)}, ${$T(n.g)}, ${$T(n.b)} )`;const o=this.getTypeLength(i),a=this.getComponentType(i),u=e=>this.generateConst(a,e);if(2===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(o>4&&n&&(n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(o>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 Kb(e,t);return 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||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===T)return"int";if(t===b)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=Ts(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return zT.get(e.constructor)}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 Ve||!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")}addStack(){return this.stack=Cm(this.stack),this.stacks.push(Bi()||this.stack),Mi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,Mi(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);return void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={}),s[t]}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);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new Kb("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e,r);let i=s.structType;if(void 0===i){const e=this.structs.index++;i=new rT("StructType"+e,t),this.structs[r].push(i),s.structType=i}return i}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 o=this.uniforms.index++;n=new Yb(s||"nodeUniform"+o,t,e),this.uniforms[r].push(n),i.uniform=n}return n}getArrayCount(e){let t=null;return e.isArrayNode?t=e.count:e.isVarNode&&e.node.isArrayNode&&(t=e.node.count),t}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s);let o=n.variable;if(void 0===o){const a=i?"_const":"_var",u=this.vars[s]||(this.vars[s]=[]),l=this.vars[a]||(this.vars[a]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+l,this.vars[a]++);const d=this.getArrayCount(e);o=new Qb(t,r,i,d),i||u.push(o),n.variable=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)){const s=this.getDataFromNode(e,"any");let i=s.varying;if(void 0===i){const e=this.varyings,n=e.length;null===t&&(t="nodeVarying"+n),i=new Zb(t,r),e.push(i),s.varying=i}return i}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 Jb("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}buildFunctionNode(e){const t=new Sy,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 Am(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.cache,n=this.buildStage,o=this.stack,a={code:""};this.flow=a,this.vars={},this.cache=new tT,this.stack=Cm();for(const r of Ps)this.setBuildStage(r),a.result=e.build(this,t);return a.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.cache=i,this.stack=o,this.setBuildStage(n),a}getFunctionOperator(){return null}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.shaderStage;this.setShaderStage(e);const n=this.flowChildNode(t,r);return null!==s&&(n.code+=`${this.tab+s} = ${n.result};\n`),this.flowCode[e]=this.flowCode[e]+n.code,this.setShaderStage(i),n}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("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(){console.warn("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(){console.warn("Abstract function.")}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new hh),e.build(this)}else this.addFlow("compute",e);for(const e of Ps){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Is){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}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new hT(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new pT(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new gT(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new mT(e);if("color"===t)return new fT(e);if("mat2"===t)return new yT(e);if("mat3"===t)return new xT(e);if("mat4"===t)return new bT(e);throw new Error(`Uniform "${t}" not declared.`)}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?this.format(`${e}.${"xyz".slice(0,i)}`,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${Oe} - Node System\n`}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}}class HT{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={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Ms.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===Ms.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===Ms.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Ms.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===Ms.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===Ms.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Ms.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===Ms.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===Ms.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 jT{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}jT.isNodeFunctionInput=!0;class qT extends Lx{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setup(e){super.setup(e);const t=e.context.lightingModel,r=this.colorNode,s=ax(this.light),i=e.context.reflectedLight;t.direct({lightDirection:s,lightColor:r,reflectedLight:i},e.stack,e)}}const XT=new o,KT=new o;let YT=null;class QT extends Lx{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=hn(new r).setGroup(ln),this.halfWidth=hn(new r).setGroup(ln),this.updateType=Ms.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;KT.identity(),XT.copy(t.matrixWorld),XT.premultiply(r),KT.extractRotation(XT),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(KT),this.halfHeight.value.applyMatrix4(KT)}setup(e){let t,r;super.setup(e),e.isAvailable("float32Filterable")?(t=Pu(YT.LTC_FLOAT_1),r=Pu(YT.LTC_FLOAT_2)):(t=Pu(YT.LTC_HALF_1),r=Pu(YT.LTC_HALF_2));const{colorNode:s,light:i}=this,n=e.context.lightingModel,o=ox(i),a=e.context.reflectedLight;n.directRectArea({lightColor:s,lightPosition:o,halfWidth:this.halfWidth,halfHeight:this.halfHeight,reflectedLight:a,ltc_1:t,ltc_2:r},e.stack,e)}static setLTC(e){YT=e}}class ZT extends Lx{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=hn(0).setGroup(ln),this.penumbraCosNode=hn(0).setGroup(ln),this.cutoffDistanceNode=hn(0).setGroup(ln),this.decayExponentNode=hn(0).setGroup(ln)}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){const{coneCosNode:t,penumbraCosNode:r}=this;return Na(t,r,e)}setup(e){super.setup(e);const t=e.context.lightingModel,{colorNode:r,cutoffDistanceNode:s,decayExponentNode:i,light:n}=this,o=ox(n).sub(bl),a=o.normalize(),u=a.dot(ax(n)),l=this.getSpotAttenuation(u),d=o.length(),c=Dx({lightDistance:d,cutoffDistance:s,decayExponent:i});let h=r.mul(l).mul(c);if(n.map){const e=sx(n),t=Pu(n.map,e.xy).onRenderUpdate((()=>n.map));h=e.mul(2).sub(1).abs().lessThan(1).all().select(h.mul(t),h)}const p=e.context.reflectedLight;t.direct({lightDirection:a,lightColor:h,reflectedLight:p},e.stack,e)}}class JT extends ZT{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e){const t=this.light.iesMap;let r=null;if(t&&!0===t.isTexture){const s=e.acos().mul(1/Math.PI);r=Pu(t,Oi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class e_ extends Lx{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class t_ extends Lx{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=ix(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=hn(new e).setGroup(ln)}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=Cl.dot(s).mul(.5).add(.5),n=ba(r,t,i);e.context.irradiance.addAssign(n)}}class r_ extends Lx{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=Gu(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=zb(El,this.lightProbe);e.context.irradiance.addAssign(t)}}class s_{parseFunction(){console.warn("Abstract function.")}}class i_{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}i_.isNodeFunction=!0;const n_=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,o_=/[a-z_0-9]+/gi,a_="#pragma main";class u_ extends i_{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:o,headerCode:a}=(e=>{const t=(e=e.trim()).indexOf(a_),r=-1!==t?e.slice(t+12):e,s=r.match(n_);if(null!==s&&5===s.length){const i=s[4],n=[];let o=null;for(;null!==(o=o_.exec(i));)n.push(o);const a=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,(()=>{if(!0===r.isCubeTexture||r.mapping===j||r.mapping===q||r.mapping===Ue){if(e.backgroundBlurriness>0||r.mapping===Ue)return ag(r);{let e;return e=!0===r.isCubeTexture?Gl(r):Pu(r),Fh(e)}}if(!0===r.isTexture)return Pu(r,Ic.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("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=$l("color","color",r).setGroup(ln),t=$l("density","float",r).setGroup(ln);return Ly(e,Iy(t))}if(r.isFog){const e=$l("color","color",r).setGroup(ln),t=$l("near","float",r).setGroup(ln),s=$l("far","float",r).setGroup(ln);return Ly(e,Py(t,s))}console.error("THREE.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?Gl(r):!0===r.isTexture?Pu(r):void console.error("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}hasOutputChange(e){return d_.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=Pu(e,Ic).renderOutput(t.toneMapping,t.currentColorSpace);return d_.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 HT,this.nodeBuilderCache=new Map,this.cacheLib={}}}const g_=new ye;class m_{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;i=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 o=t[n];o&&o.connect(i)}}function B_(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,o=this._glBaseLayer,a=this.getReferenceSpace(),u=t.getViewerPose(a);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(o.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(e,t,this._renderTarget),n=e.overrideMaterial||r.material,o=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:a,vertexShader:u}=o.getNodeBuilderState();return{fragmentShader:a,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");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 p_(this,r),this._animation=new Og(this._nodes,this.info),this._attributes=new Qg(r),this._background=new Hb(this,this._nodes),this._geometries=new em(this._attributes,this.info),this._textures=new Nm(this,r,this.info),this._pipelines=new am(r,this._nodes),this._bindings=new um(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Wg(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new gm(this.lighting),this._bundles=new x_,this._renderContexts=new _m,this._animation.start(),this._initialized=!0,e()}))),this._initPromise}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,o=this._currentRenderObjectFunction,a=this._compilationPromises,u=!0===e.isScene?e:F_;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new m_),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)})),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=o,this._compilationPromises=a,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init(),this._renderScene(e,t)}async waitForGPU(){await this.backend.waitForGPU()}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,o=this._currentRenderContext,a=this._bundles.get(s,i),u=this.backend.get(a);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(o)||l;if(u.renderContexts.add(o),d){this.backend.beginBundle(o),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=a;const e=n.opaque;!0===this.opaque&&e.length>0&&this._renderObjects(e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(o,a),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=b,p.viewportValue.maxDepth=T,p.viewport=!1===p.viewportValue.equals(P_),p.scissorValue.copy(y).multiplyScalar(x).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(P_),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new m_),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h),L_.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),I_.setFromProjectionMatrix(L_,g);const _=this._renderLists.get(e,t);if(_.begin(),this._projectObject(e,t,0,_,p.clippingContext),_.finish(),!0===this.sortObjects&&_.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=_.occlusionQueryCount,this._background.update(u,_,p),this.backend.beginRender(p);const{bundles:v,lightsNode:N,transparentDoublePass:S,transparent:A,opaque:R}=_;if(v.length>0&&this._renderBundles(v,u,N),!0===this.opaque&&R.length>0&&this._renderObjects(R,t,u,N),!0===this.transparent&&A.length>0&&this._renderTransparents(A,S,t,u,N),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=o,this._currentRenderObjectFunction=a,null!==s){this.setRenderTarget(l,d,c);const e=this._quad;this._nodes.hasOutputChange(h.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(h.texture),e.material.needsUpdate=!0);const t=this.xr.enabled;this.xr.enabled=!1,this._renderScene(e,e.camera,!1),this.xr.enabled=t}return u.onAfterRender(this,e,t,h),p}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)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setSize(e,t,r=!0){this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const o=this._viewport;e.isVector4?o.copy(e):o.set(e,t,r,s),o.minDepth=i,o.maxDepth=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)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);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.getForClear(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}if(i.clearColorValue=this._clearColor,this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget){const e=this._quad;this._nodes.hasOutputChange(s.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(s.texture),e.material.needsUpdate=!0),this._renderScene(e,e.camera,!1)}}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return null!==this._renderTarget&&!0!==this._renderTarget.isXRRenderTarget?p:this.toneMapping}get currentColorSpace(){return null!==this._renderTarget&&!0!==this._renderTarget.isXRRenderTarget?Ce:this.outputColorSpace}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.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}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const t=this._nodes.nodeFrame,r=t.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,t.renderId=this.info.calls;const s=this.backend,i=this._pipelines,n=this._bindings,o=this._nodes,a=Array.isArray(e)?e:[e];if(void 0===a[0]||!0!==a[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of a){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),o.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}o.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),a=i.getForCompute(t,r);s.compute(e,t,r,a)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e)}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=D_.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=D_.copy(t).floor()}else t=D_.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)}copyTextureToTexture(e,t,r=null,s=null,i=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,o=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,o)}_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){if(!e.frustumCulled||I_.intersectsSprite(e)){!0===this.sortObjects&&D_.setFromMatrixPosition(e.matrixWorld).applyMatrix4(L_);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,D_.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||I_.intersectsObject(e))){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),D_.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(L_)),Array.isArray(n)){const o=t.groups;for(let a=0,u=o.length;a0){for(const{material:e}of t)e.side=_;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=He;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=de}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,o=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode)),i=e}!0===i.transparent&&i.side===de&&!1===i.forceSinglePass?(i.side=_,this._handleObjectFunction(e,i,t,r,o,n,a,"backSide"),i.side=He,this._handleObjectFunction(e,i,t,r,o,n,a,u),i.side=de):this._handleObjectFunction(e,i,t,r,o,n,a,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,o,a){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,o,a);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,o,a){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,o,a);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)}get compile(){return this.compileAsync}}class O_{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class G_ extends O_{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(Yg-e%Yg)%Yg;var e}get buffer(){return this._buffer}update(){return!0}}class k_ extends G_{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let z_=0;class $_ extends k_{constructor(e,t){super("UniformBuffer_"+z_++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class W_ extends k_{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}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(){let e=0;for(let t=0,r=this.uniforms.length;t0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const o=i.node.precision;if(null!==o&&(t=J_[o]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==T){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=[],r=e.getMemberTypes();for(let e=0;ee*t),1)}u`}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=ev[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)}ev[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} ]`)}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 o=n.uniformGPU;if(void 0===o){const s=e.groupNode,a=s.name,u=this.getBindGroupArray(a,r);if("texture"===t)o=new K_(i.name,i.node,s),u.push(o);else if("cubeTexture"===t)o=new Y_(i.name,i.node,s),u.push(o);else if("texture3D"===t)o=new Q_(i.name,i.node,s),u.push(o);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new $_(e,s);t.name=e.name,u.push(t),o=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new j_(r+"_"+a,s),e[a]=n,u.push(n)),o=this.getNodeUniform(i,t),n.addUniform(o)}n.uniformGPU=o}return i}}let sv=null,iv=null;class nv{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={render:null,compute:null}}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void st("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return void st(`WebGPURenderer: No timestamp query pool for type '${e}' found.`);const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return sv=sv||new t,this.renderer.getDrawingBufferSize(sv)}setScissorTest(){}getClearColor(){const e=this.renderer;return iv=iv||new Sm,e.getClearColor(iv),iv.getRGB(iv,this.renderer.currentColorSpace),iv}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:it(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${Oe} webgpu`),this.domElement=e),e}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)}dispose(){}}let ov,av,uv=0;class lv{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 dv{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,o=e.isInterleavedBufferAttribute?e.data:e,a=r.get(o);let u,l=a.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),a.bufferGPU=l,a.bufferType=t,a.version=o.version),i instanceof Float32Array)u=s.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===T,id:uv++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new lv(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),o=n.bufferType,a=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(o,n.bufferGPU),0===a.length)r.bufferSubData(o,0,s);else{for(let e=0,t=a.length;e1?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 pv,gv,mv,fv=!1;class yv{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===fv&&(this._init(),fv=!0)}_init(){const e=this.gl;pv={[fr]:e.REPEAT,[yr]:e.CLAMP_TO_EDGE,[xr]:e.MIRRORED_REPEAT},gv={[br]:e.NEAREST,[Tr]:e.NEAREST_MIPMAP_NEAREST,[De]:e.NEAREST_MIPMAP_LINEAR,[$]:e.LINEAR,[Le]:e.LINEAR_MIPMAP_NEAREST,[B]:e.LINEAR_MIPMAP_LINEAR},mv={[_r]:e.NEVER,[vr]:e.ALWAYS,[Ee]:e.LESS,[Nr]:e.LEQUAL,[Sr]:e.EQUAL,[Ar]:e.GEQUAL,[Rr]:e.GREATER,[Cr]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!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:o}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let a=t;return t===n.RED&&(r===n.FLOAT&&(a=n.R32F),r===n.HALF_FLOAT&&(a=n.R16F),r===n.UNSIGNED_BYTE&&(a=n.R8),r===n.UNSIGNED_SHORT&&(a=n.R16),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.R8UI),r===n.UNSIGNED_SHORT&&(a=n.R16UI),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RG&&(r===n.FLOAT&&(a=n.RG32F),r===n.HALF_FLOAT&&(a=n.RG16F),r===n.UNSIGNED_BYTE&&(a=n.RG8),r===n.UNSIGNED_SHORT&&(a=n.RG16),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RG8UI),r===n.UNSIGNED_SHORT&&(a=n.RG16UI),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(a=n.RGB32F),r===n.HALF_FLOAT&&(a=n.RGB16F),r===n.UNSIGNED_BYTE&&(a=n.RGB8),r===n.UNSIGNED_SHORT&&(a=n.RGB16),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I),r===n.UNSIGNED_BYTE&&(a=s===$e&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(a=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(a=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGB8UI),r===n.UNSIGNED_SHORT&&(a=n.RGB16UI),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(a=n.RGBA32F),r===n.HALF_FLOAT&&(a=n.RGBA16F),r===n.UNSIGNED_BYTE&&(a=n.RGBA8),r===n.UNSIGNED_SHORT&&(a=n.RGBA16),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I),r===n.UNSIGNED_BYTE&&(a=s===$e&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(a=n.RGBA16UI),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_INT&&(a=n.DEPTH24_STENCIL8),r===n.FLOAT&&(a=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(a=n.DEPTH24_STENCIL8),a!==n.R16F&&a!==n.R32F&&a!==n.RG16F&&a!==n.RG32F&&a!==n.RGBA16F&&a!==n.RGBA32F||o.get("EXT_color_buffer_float"),a}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this;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,r.NONE),r.texParameteri(e,r.TEXTURE_WRAP_S,pv[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,pv[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||r.texParameteri(e,r.TEXTURE_WRAP_R,pv[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,gv[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,o=t.minFilter===$&&n?B:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,gv[o]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,mv[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===br)return;if(t.minFilter!==De&&t.minFilter!==B)return;if(t.type===w&&!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,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:o,depth:a}=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.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,o,a):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,o,a):e.isVideoTexture||r.texStorage2D(h,i,d,n,o),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:o,glType:a}=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,o,a,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:o,glFormat:a,glType:u,glInternalFormat:l}=this.backend.get(e);if(e.isRenderTargetTexture||void 0===n)return;const d=e=>e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||e instanceof OffscreenCanvas?e:e.data;if(this.backend.state.bindTexture(o,n),this.setTextureParameters(o,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==o||0!==a;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-a-l;s.blitFramebuffer(o,p,o+u,p+l,o,p,o+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,o,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,o,c-l-a,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t){const{gl:r}=this,s=t.renderTarget,{samples:i,depthTexture:n,depthBuffer:o,stencilBuffer:a,width:u,height:l}=s;if(r.bindRenderbuffer(r.RENDERBUFFER,e),o&&!a){let t=r.DEPTH_COMPONENT24;i>0?(n&&n.isDepthTexture&&n.type===r.FLOAT&&(t=r.DEPTH_COMPONENT32F),r.renderbufferStorageMultisample(r.RENDERBUFFER,i,t,u,l)):r.renderbufferStorage(r.RENDERBUFFER,t,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_ATTACHMENT,r.RENDERBUFFER,e)}else o&&a&&(i>0?r.renderbufferStorageMultisample(r.RENDERBUFFER,i,r.DEPTH24_STENCIL8,u,l):r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_STENCIL,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_STENCIL_ATTACHMENT,r.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:o,gl:a}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=a.createFramebuffer();a.bindFramebuffer(a.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?a.TEXTURE_CUBE_MAP_POSITIVE_X+n:a.TEXTURE_2D;a.framebufferTexture2D(a.READ_FRAMEBUFFER,a.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=a.createBuffer();a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.bufferData(a.PIXEL_PACK_BUFFER,g,a.STREAM_READ),a.readPixels(t,r,s,i,l,d,0),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),await o.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.getBufferSubData(a.PIXEL_PACK_BUFFER,0,f),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),a.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}}class xv{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 bv{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 Tv={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",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query"};class _v{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:o,index:a}=this;0!==a?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),o.update(i,t,s,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:o,object:a,info:u}=this;0!==r&&(0!==o?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(a,t,i,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:o}=this;if(0===r)return;const a=s.get("WEBGL_multi_draw");if(null===a)for(let s=0;sthis.maxQueries)return null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e.id,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);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){console.error("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.id);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){console.error("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=[];for(const[t,r]of this.queryStates)if("ended"===r){const r=this.queries[t];e.push(this.resolveQuery(r))}if(0===e.length)return this.lastValue;const t=(await Promise.all(e)).reduce(((e,t)=>e+t),0);return this.lastValue=t,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,t}catch(e){return console.error("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){console.error("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 Sv extends nv{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.trackTimestamp=!0===e.trackTimestamp,this._currentContext=null,this._knownBindings=new WeakSet,this._xrFamebuffer=null}init(e){super.init(e);const t=this.parameters,r=void 0!==t.context?t.context:e.domElement.getContext("webgl2");function s(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=s,e.domElement.addEventListener("webglcontextlost",s,!1),this.gl=r,this.extensions=new xv(this),this.capabilities=new bv(this),this.attributeUtils=new dv(this),this.textureUtils=new yv(this),this.bufferRenderer=new _v(this),this.state=new cv(this),this.utils=new hv(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.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile")}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async waitForGPU(){await this.utils._clientWaitAsync()}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFamebuffer=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}),e.autoAllocateDepthBuffer=!1}}initTimestampQuery(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t]||(this.timestampQueryPool[t]=new Nv(this.gl,t,2048));const r=this.timestampQueryPool[t];null!==r.allocateQueriesForContext(e)&&r.beginQuery(e)}prepareTimestampBuffer(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t].endQuery(e)}getContext(){return this.gl}beginRender(e){const{state:t,gl:r}=this,s=this.get(e);if(this.initTimestampQuery(e),s.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1),e.viewport?this.updateViewport(e):t.viewport(0,0,r.drawingBufferWidth,r.drawingBufferHeight),e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}const i=e.occlusionQueryCount;i>0&&(s.currentOcclusionQueries=s.occlusionQueries,s.currentOcclusionQueryObjects=s.occlusionQueryObjects,s.lastOcclusionObject=null,s.occlusionQueries=new Array(i),s.occlusionQueryObjects=new Array(i),s.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext,n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const o=e.textures;if(null!==o)for(let e=0;e0){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,o=s.msaaFrameBuffer,a=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let o=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?f.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances):this.hasFeature("WEBGL_multi_draw")?f.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):st("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):x>1?f.renderInstances(b,y,x):f.render(b,y)};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){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(o,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()}));t.push(i)}else 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"),o=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+o)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:o,vertexShader:a}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,o,a),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,o=s.createProgram(),a=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;eTv[t]===e)),r=this.extensions;for(let e=0;e0){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r,\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:wv,stripIndexFormat:jv},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:wv,stripIndexFormat:jv},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,o=this.getTransferPipeline(s),a=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:ON,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:ON,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:Gv,storeOp:Vv,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(o,l,d),h(a,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:ON,baseArrayLayer:r});const o=[];for(let a=1;a1;for(let o=0;o]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,iS=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,nS={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_multisampled_2d:"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 oS extends i_{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:o}=(e=>{const t=(e=e.trim()).match(sS);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=iS.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 aS extends s_{parseFunction(e){return new oS(e)}}const uS="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},lS={[Fs.READ_ONLY]:"read",[Fs.WRITE_ONLY]:"write",[Fs.READ_WRITE]:"read_write"},dS={[fr]:"repeat",[yr]:"clamp",[xr]:"mirror"},cS={vertex:uS?uS.VERTEX:1,fragment:uS?uS.FRAGMENT:2,compute:uS?uS.COMPUTE:4},hS={instance:!0,swizzleAssign:!1,storageBuffer:!0},pS={"^^":"tsl_xor"},gS={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"},mS={},fS={tsl_xor:new vy("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new vy("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new vy("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new vy("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new vy("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new vy("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new vy("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new vy("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 vy("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 vy("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new vy("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 vy("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new vy("\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")},yS={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"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(fS.pow_float=new vy("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),fS.pow_vec2=new vy("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[fS.pow_float]),fS.pow_vec3=new vy("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[fS.pow_float]),fS.pow_vec4=new vy("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[fS.pow_float]),yS.pow_float="tsl_pow_float",yS.pow_vec2="tsl_pow_vec2",yS.pow_vec3="tsl_pow_vec3",yS.pow_vec4="tsl_pow_vec4");let xS="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(xS+="diagnostic( off, derivative_uniformity );\n");class bS extends WT{constructor(e,t){super(e,t,new aS),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==x}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r):this.generateTextureLod(e,t,r,s,"0")}_generateVideoSample(e,t,r=this.shaderStage){if("fragment"===r)return`textureSampleBaseClampToEdge( ${e}, ${e}_sampler, vec2( ${t}.x, 1.0 - ${t}.y ) )`;console.error(`WebGPURenderer: THREE.VideoTexture does not support ${r} shader.`)}_generateTextureSampleLevel(e,t,r,s,i,n=this.shaderStage){return"fragment"!==n&&"compute"!==n||!1!==this.isUnfilterable(e)?this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s):`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`}generateWrapFunction(e){const t=`tsl_coord_${dS[e.wrapS]}S_${dS[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=mS[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const o=(e,t)=>{e===fr?(s.push(fS.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===yr?(s.push(fS.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===xr?(s.push(fS.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};o(e.wrapS,"x"),n+=",\n",o(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",o(e.wrapR,"z")),n+="\n\t);\n\n}\n",mS[t]=r=new vy(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,o;const{primarySamples:a}=this.renderer.backend.utils.getTextureSampleData(e),u=a>1;o=e.isData3DTexture?"vec3":"vec2",n=u||e.isVideoTexture||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Da(new _u(`textureDimensions( ${n} )`,o)),s.dimensionsSnippet[r]=i,(e.isDataArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Da(new _u(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Da(new _u("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,i),a=e.isData3DTexture?"vec3":"vec2",u=`${a}(${n}(${r}) * ${a}(${o}))`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){return!0===e.isVideoTexture||!0===e.isStorageTexture?`textureLoad( ${t}, ${r} )`:s?`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:`textureLoad( ${t}, ${r}, u32( ${i} ) )`}generateTextureStore(e,t,r,s){return`textureStore( ${t}, ${r}, ${s} )`}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===w||!1===this.isSampleCompare(e)&&e.minFilter===br&&e.magFilter===br||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=!0===e.isVideoTexture?this._generateVideoSample(t,r,i):this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i,n=this.shaderStage){let o=null;return o=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),o}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} 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||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?`NodeBuffer_${e.id}.${t}`:e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}_getUniformGroupCount(e){return Object.keys(this.uniforms[e]).length}getFunctionOperator(e){const t=pS[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?Fs.READ_ONLY:e.access}getStorageAccess(e,t){return lS[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 s;const o=e.groupNode,a=o.name,u=this.getBindGroupArray(a,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let n=null;const a=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?n=new K_(i.name,i.node,o,a):"cubeTexture"===t?n=new Y_(i.name,i.node,o,a):"texture3D"===t&&(n=new Q_(i.name,i.node,o,a)),n.store=!0===e.isStorageTextureNode,n.setVisibility(cS[r]),"fragment"!==r&&"compute"!==r||!1!==this.isUnfilterable(e.value)||!1!==n.store)u.push(n),s=[n];else{const e=new XN(`${i.name}_sampler`,i.node,o);e.setVisibility(cS[r]),u.push(e,n),s=[e,n]}}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const i=new("buffer"===t?$_:QN)(e,o);i.setVisibility(cS[r]),u.push(i),s=i}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new j_(a,o),n.setVisibility(cS[r]),e[a]=n,u.push(n)),s=this.getNodeUniform(i,t),n.addUniform(s)}n.uniformGPU=s}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`)}const s=this.getBuiltins("output");return s&&t.push("\t"+s),t.join(",\n")}getStructs(e){const t=[],r=this.structs[e];for(let e=0,s=r.length;e output : ${i};\n\n`)}return t.join("\n\n")}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","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;i1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.isDepthTexture)s=`texture_depth${n}_2d`;else if(!0===t.isVideoTexture)s="texture_external";else if(!0===t.isData3DTexture)s="texture_3d";else if(!0===i.node.isStorageTextureNode){s=`texture_storage_2d<${rS(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${o.binding++} ) @group( ${o.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.bufferType),n=t.bufferCount,a=n>0&&"buffer"===i.type?", "+n:"",u=t.isAtomic?`atomic<${r}>`:`${r}`,l=`\t${i.name} : array< ${u}${a} >\n`,d=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";s.push(this._getWGSLStructBinding("NodeBuffer_"+t.id,l,d,o.binding++,o.group))}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:o.binding++,id:o.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let o=r.join("\n");return o+=s.join("\n"),o+=i.join("\n"),o}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){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],o=n.outputNode,a=void 0!==o&&!0===o.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.Vertex = ${i.result};`;else if("fragment"===t)if(a)r.returnType=o.nodeType,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;\n\n",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}null!==this.material?(this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment)):this.computeShader=this._getWGSLComputeCode(e.compute,(this.object.workgroupSize||[64]).join(", "))}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getType(e){return gS[e]||e}isAvailable(e){let t=hS[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),hS[e]=t),t}_getWGSLMethod(e){return void 0!==fS[e]&&this._include(e),yS[e]}_include(e){const t=fS[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\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${xS}\n\n// uniforms\n${e.uniforms}\n\n// structs\n${e.structs}\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){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${t} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x + globalId.y * numWorkgroups.x * u32(${t}) + globalId.z * numWorkgroups.x * numWorkgroups.y * u32(${t});\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 TS{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=qv.Depth24PlusStencil8:e.depth&&(t=qv.Depth24Plus),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.samples}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}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?Av:e.isLineSegments||e.isMesh&&!0===t.wireframe?Rv:e.isLine?Cv:e.isMesh?Ev:void 0}getSampleCount(e){let t=1;return e>1&&(t=Math.pow(2,Math.floor(Math.log2(e))),2===t&&(t=4)),t}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===me)return qv.BGRA8Unorm;if(e===be)return qv.RGBA16Float;throw new Error("Unsupported outputType")}}const _S=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),vS=new Map([[Ve,["float16"]]]),NS=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class SS{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 o=s.device;let a=r.array;if(!1===e.normalized)if(a.constructor===Int16Array)a=new Int32Array(a);else if(a.constructor===Uint16Array&&(a=new Uint32Array(a),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=UN)),r.texture.isDepthTexture)s.sampleType=PN;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===T?s.sampleType=IN:e===b?s.sampleType=LN:e===w&&(this.backend.hasFeature("float32-filterable")?s.sampleType=FN:s.sampleType=UN)}r.isSampledCubeTexture?s.viewDimension=kN:r.texture.isDataArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=GN:r.isSampledTexture3D&&(s.viewDimension=zN),e.texture=s}else console.error(`WebGPUBindingUtils: Unsupported binding "${r}".`);s.push(e)}return r.createBindGroupLayout({entries:s})}createBindings(e,t,r,s=0){const{backend:i,bindGroupLayoutCache:n}=this,o=i.get(e);let a,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===o.groups&&(o.groups=[],o.versions=[]),o.versions[r]===s&&(a=o.groups[r])),void 0===a&&(a=this.createBindGroup(e,u),r>0&&(o.groups[r]=a,o.versions[r]=s)),o.group=a,o.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const o=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:o})}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}else if(t.isSampledTexture){const e=r.get(t.texture);let o;if(void 0!==e.externalTexture)o=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(o=e[s],void 0===o){const i=$N;let n;n=t.isSampledCubeTexture?kN:t.isSampledTexture3D?zN:t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?GN:ON,o=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:o})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class RS{constructor(e){this.backend=e}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:o,fragmentProgram:a}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;!0===s.transparent&&s.blending!==D&&(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},A={},R=e.context.depth,C=e.context.stencil;if(!0!==R&&!0!==C||(!0===R&&(A.format=v,A.depthWriteEnabled=s.depthWrite,A.depthCompare=_),!0===C&&(A.stencilFront=m,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),S.depthStencil=A),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise((e=>{l.createRenderPipelineAsync(S).then((t=>{c.pipeline=t,e()}))}));t.push(e)}}createBundleEncoder(e){const t=this.backend,{utils:r,device:s}=t,i=r.getCurrentDepthStencilFormat(e),n={label:"renderBundleEncoder",colorFormats:[r.getCurrentColorFormat(e)],depthStencilFormat:i,sampleCount:this._getSampleCount(e)};return s.createRenderBundleEncoder(n)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),o=[];for(const e of t){const t=r.get(e);o.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:o})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,o=e.blendEquation;if(s===vt){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,a=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:o;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(o)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(a),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:hN},r={srcFactor:i,dstFactor:n,operation:hN}};if(e.premultipliedAlpha)switch(s){case P:i(eN,iN,eN,iN);break;case At:i(eN,eN,eN,eN);break;case St:i(Jv,rN,Jv,eN);break;case Nt:i(Jv,tN,Jv,sN)}else switch(s){case P:i(sN,iN,eN,iN);break;case At:i(sN,eN,sN,eN);break;case St:i(Jv,rN,Jv,eN);break;case Nt:i(Jv,tN,Jv,tN)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case ut:t=Jv;break;case lt:t=eN;break;case dt:t=tN;break;case mt:t=rN;break;case ct:t=sN;break;case ft:t=iN;break;case pt:t=nN;break;case yt:t=oN;break;case gt:t=aN;break;case xt:t=uN;break;case ht:t=lN;break;case 211:t=dN;break;case 212:t=cN;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case Ir:t=Mv;break;case Pr:t=Dv;break;case Ur:t=Bv;break;case Fr:t=Uv;break;case Br:t=Fv;break;case Mr:t=Lv;break;case wr:t=Pv;break;case Er:t=Iv;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case $r:t=bN;break;case zr:t=TN;break;case kr:t=_N;break;case Gr:t=vN;break;case Or:t=NN;break;case Vr:t=SN;break;case Dr:t=AN;break;case Lr:t=RN;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case nt:t=hN;break;case ot:t=pN;break;case at:t=gN;break;case Hr:t=mN;break;case Wr:t=fN;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?Hv:jv),r.side){case He:s.frontFace=kv,s.cullMode=Wv;break;case _:s.frontFace=kv,s.cullMode=$v;break;case de:s.frontFace=kv,s.cullMode=zv;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?xN:yN}_getDepthCompare(e){let t;if(!1===e.depthTest)t=Dv;else{const r=e.depthFunc;switch(r){case Ut:t=Mv;break;case Ft:t=Dv;break;case Bt:t=Bv;break;case Mt:t=Uv;break;case wt:t=Fv;break;case Et:t=Lv;break;case Ct:t=Pv;break;case Rt:t=Iv;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class CS extends vv{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 st("WebGPUTimestampQueryPool: Maximum number of queries exceeded."),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e.id,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));let o=0;for(const[,t]of e){const e=n[t],r=n[t+1];o+=Number(r-e)/1e6}return this.resultBuffer.unmap(),this.lastValue=o,o}catch(e){return console.error("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){console.error("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){console.error("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 ES extends nv{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.trackTimestamp=!0===e.trackTimestamp,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new TS(this),this.attributeUtils=new SS(this),this.bindingUtils=new AS(this),this.pipelineUtils=new RS(this),this.textureUtils=new tS(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference},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(jN),n=[];for(const e of i)s.features.has(e)&&n.push(e);const o={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(o)}else r=t.device;r.lost.then((t=>{const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}));const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(jN.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),this.updateSize()}get coordinateSystem(){return d}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==r.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples||s.loadOp!==t.loadOp){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};r.addEventListener("dispose",e)}const n=e.getCacheKey();let o=i[n];if(void 0===o){const a=e.textures,u=[];let l;for(let s=0;s0&&(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:Ov}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const o=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(),t.currentPass.end(),r>0){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?(u.x=Math.min(t.dispatchCount,o),u.y=Math.ceil(t.dispatchCount/o)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,context:s,pipeline:i}=e,n=e.getBindings(),o=this.get(s),a=this.get(i).pipeline,u=o.currentSets,l=o.currentPass,d=e.getDrawParameters();if(null===d)return;u.pipeline!==a&&(l.setPipeline(a),u.pipeline=a);const c=u.bindingGroups;for(let e=0,t=n.length;e{if(!0===r.isBatchedMesh){const e=r._multiDrawStarts,t=r._multiDrawCounts,s=r._multiDrawCount,i=r._multiDrawInstances;for(let r=0;r1?0:r;!0===p?l.drawIndexed(t[r],s,e[r]/h.array.BYTES_PER_ELEMENT,0,n):l.draw(t[r],s,e[r],n)}}else if(!0===p){const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndexedIndirect(e,0)}else l.drawIndexed(s,i,n,0,0);t.update(r,s,i)}else{const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndirect(e,0)}else l.draw(s,i,n,0);t.update(r,s,i)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),i=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==i.length){const e=this.get(n),r=[],s=new Uint32Array([0,0,0,0]);for(let t=0,n=i.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new Sv(e)));super(new t(e),e),this.library=new MS,this.isWebGPURenderer=!0}}class FS extends ns{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class US{constructor(e,t=qi(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new hh;r.name="PostProcessing",this._quadMesh=new xf(r)}render(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=Ce,this._quadMesh.render(e),e.toneMapping=t,e.outputColorSpace=r}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;this._quadMesh.material.fragmentNode=!0===this.outputColorTransform?Au(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=Ce,await this._quadMesh.renderAsync(e),e.toneMapping=t,e.outputColorSpace=r}}class PS extends ee{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=$,this.minFilter=$,this.isStorageTexture=!0}}class IS extends Rf{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class LS extends os{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new as(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):console.error(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]?(console.error("THREE.NodeLoader: Node type not found:",e),Ii()):Si(new this.nodes[e])}}class DS extends us{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 VS extends ls{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 LS;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 DS;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t