UNPKG

@takram/three-atmosphere

Version:
1 lines 85.3 kB
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("three/tsl"),S=require("three"),tt=require("@takram/three-geospatial"),Z=require("./shared2.cjs"),V=require("three/webgpu"),p=require("@takram/three-geospatial/webgpu"),he=require("three/src/nodes/core/NodeUtils.js"),k="float",Sn="float",O="float",Ne="float",yn="float",Ve="float",Tn="vec3",gt="vec3",ht="vec3",ze="vec3",ut="vec3",Ae="vec3",be="vec3",Pt=t.struct({width:k,expTerm:O,expScale:Ne,linearTerm:Ne,constantTerm:O},"DensityProfileLayer"),Tt=t.struct({layer0:Pt.layout.name,layer1:Pt.layout.name},"DensityProfile"),ae={worldToUnit:O,solarIrradiance:ht,sunAngularRadius:Sn,bottomRadius:k,topRadius:k,rayleighDensity:Tt.layout.name,rayleighScattering:ut,mieDensity:Tt.layout.name,mieScattering:ut,mieExtinction:ut,miePhaseFunctionG:O,absorptionDensity:Tt.layout.name,absorptionExtinction:ut,groundAlbedo:gt,minCosLight:O,sunRadianceToLuminance:gt,skyRadianceToLuminance:gt,luminanceScale:O,transmittanceTextureSize:"uvec2",irradianceTextureSize:"uvec2",multipleScatteringTextureSize:"uvec2",scatteringTextureRadiusSize:"uint",scatteringTextureCosViewSize:"uint",scatteringTextureCosLightSize:"uint",scatteringTextureCosViewLightSize:"uint"},$=t.struct(ae,"AtmosphereParameters");function Fe(o,e){const{width:n,expTerm:s,expScale:i,linearTerm:a,constantTerm:r}=o;return Pt({width:t.float(n*e),expTerm:t.float(s),expScale:t.float(i/e),linearTerm:t.float(a/e),constantTerm:t.float(r)})}function Zt(o,e){return Tt({layer0:Fe(o.layers[0],e),layer1:Fe(o.layers[1],e)})}const Le=Symbol("DESTRUCTIBLE");function H(o){if(tt.reinterpretType(o),o[Le]===!0)return o;for(const e in ae)Object.hasOwn(ae,e)&&(o[e]=o.get(e));return o[Le]=!0,o}class pe{constructor(e){this.parameters=e;const{worldToUnit:n,solarIrradiance:s,sunAngularRadius:i,bottomRadius:a,topRadius:r,rayleighDensity:c,rayleighScattering:d,mieDensity:u,mieScattering:l,mieExtinction:m,miePhaseFunctionG:g,absorptionDensity:h,absorptionExtinction:x,groundAlbedo:f,minCosLight:y,sunRadianceToLuminance:C,skyRadianceToLuminance:T,luminanceScale:v,transmittanceTextureSize:w,irradianceTextureSize:N,multipleScatteringTextureSize:M,scatteringTextureRadiusSize:F,scatteringTextureCosViewSize:L,scatteringTextureCosLightSize:U,scatteringTextureCosViewLightSize:R}=e;this.parametersNode=H($({worldToUnit:t.float(n),solarIrradiance:t.vec3(s),sunAngularRadius:t.float(i),bottomRadius:t.float(a*n),topRadius:t.float(r*n),rayleighDensity:Zt(c,n),rayleighScattering:t.vec3(d.x/n,d.y/n,d.z/n),mieDensity:Zt(u,n),mieScattering:t.vec3(l.x/n,l.y/n,l.z/n),mieExtinction:t.vec3(m.x/n,m.y/n,m.z/n),miePhaseFunctionG:t.float(g),absorptionDensity:Zt(h,n),absorptionExtinction:t.vec3(x.x/n,x.y/n,x.z/n),groundAlbedo:t.vec3(f),minCosLight:t.float(y),sunRadianceToLuminance:t.vec3(C),skyRadianceToLuminance:t.vec3(T),luminanceScale:t.float(v),transmittanceTextureSize:t.ivec2(w),irradianceTextureSize:t.ivec2(N),multipleScatteringTextureSize:t.uvec2(M),scatteringTextureRadiusSize:t.uint(F),scatteringTextureCosViewSize:t.uint(L),scatteringTextureCosLightSize:t.uint(U),scatteringTextureCosViewLightSize:t.uint(R)}).toConst("atmosphereParameters"))}dispose(){}}function it(o){if(typeof o.context.getAtmosphere!="function")throw new Error("getAtmosphere() was not found in the builder context.");const e=o.context.getAtmosphere();if(!(e instanceof pe))throw new Error("getAtmosphere() must return an instanceof AtmosphereContextBase.");return e}class Ue extends pe{constructor(e,n){super(e),this.lambdas=t.uniform(new S.Vector3(680,550,440)),this.luminanceFromRadiance=t.uniform("mat3"),this.textureType=n}}class Ie{setup(e,n){this.parameters=e,this.textureType=n}dispose(){}}const ot=p.FnLayout({name:"clampCosine",type:O,inputs:[{name:"cosine",type:O}]})(([o])=>t.clamp(o,-1,1)),De=p.FnLayout({name:"clampDistance",type:O,inputs:[{name:"cosine",type:O}]})(([o])=>t.max(o,0)),Ft=p.FnLayout({name:"clampRadius",type:k,inputs:[{name:"parameters",type:$},{name:"radius",type:k}]})(([o,e])=>{const{topRadius:n,bottomRadius:s}=H(o);return t.clamp(e,s,n)}),mt=p.FnLayout({name:"sqrtSafe",type:O,inputs:[{name:"area",type:yn}]})(([o])=>t.sqrt(t.max(o,0))),ft=p.FnLayout({name:"distanceToTopAtmosphereBoundary",type:k,inputs:[{name:"parameters",type:$},{name:"radius",type:k},{name:"cosView",type:O}]})(([o,e,n])=>{const{topRadius:s}=H(o),i=e.pow2().mul(n.pow2().sub(1)).add(s.pow2());return De(e.negate().mul(n).add(mt(i)))}),Cn=p.FnLayout({name:"distanceToBottomAtmosphereBoundary",type:k,inputs:[{name:"parameters",type:$},{name:"radius",type:k},{name:"cosView",type:O}]})(([o,e,n])=>{const{bottomRadius:s}=H(o),i=e.pow2().mul(n.pow2().sub(1)).add(s.pow2());return De(e.negate().mul(n).sub(mt(i)))}),Pe=p.FnLayout({name:"distanceToNearestAtmosphereBoundary",type:k,inputs:[{name:"parameters",type:$},{name:"radius",type:k},{name:"cosView",type:O},{name:"intersectsGround",type:"bool"}]})(([o,e,n,s])=>s.select(Cn(o,e,n),ft(o,e,n))),ge=p.FnLayout({name:"rayIntersectsGround",type:"bool",inputs:[{name:"parameters",type:$},{name:"radius",type:k},{name:"cosView",type:O}]})(([o,e,n])=>{const{bottomRadius:s}=H(o);return n.lessThan(0).and(e.pow2().mul(n.pow2().sub(1)).add(s.pow2()).greaterThanEqual(0))}),dt=p.FnLayout({name:"getTextureCoordFromUnitRange",type:"float",inputs:[{name:"unit",type:"float"},{name:"textureSize",type:"float"}]})(([o,e])=>t.div(.5,e).add(o.mul(e.reciprocal().oneMinus()))),fn=p.FnLayout({name:"getTransmittanceTextureUV",type:"vec2",inputs:[{name:"parameters",type:$},{name:"radius",type:k},{name:"cosView",type:O}]})(([o,e,n])=>{const{topRadius:s,bottomRadius:i,transmittanceTextureSize:a}=H(o),r=t.sqrt(s.pow2().sub(i.pow2())).toConst(),c=mt(e.pow2().sub(i.pow2())).toConst(),d=ft(o,e,n),u=s.sub(e).toConst(),l=c.add(r),m=d.remap(u,l),g=c.div(r);return t.vec2(dt(m,a.x),dt(g,a.y))}),yt=p.FnVar((o,e,n)=>s=>{const i=it(s),{parametersNode:a}=i,r=fn(a,e,n);return o.sample(r).rgb}),It=p.FnVar((o,e,n,s,i)=>a=>{const r=it(a),{parametersNode:c}=r,d=Ft(c,t.sqrt(s.pow2().add(t.mul(2,e,n,s)).add(e.pow2()))).toConst(),u=ot(e.mul(n).add(s).div(d)).toConst(),l=t.vec3(0).toVar();return t.If(i,()=>{l.assign(yt(o,d,u.negate()).div(yt(o,e,n.negate())).min(1))}).Else(()=>{l.assign(yt(o,e,n).div(yt(o,d,u)).min(1))}),l}),St=p.FnVar((o,e,n)=>s=>{const i=it(s),{parametersNode:a}=i,{sunAngularRadius:r,bottomRadius:c}=a,d=c.div(e).toConst(),u=t.sqrt(t.max(d.pow2().oneMinus(),0)).negate();return yt(o,e,n).mul(t.smoothstep(d.negate().mul(r),d.mul(r),n.sub(u)))}),Lt=p.FnLayout({name:"rayleighPhaseFunction",type:Ve,inputs:[{name:"cosViewLight",type:O}]})(([o])=>t.div(3,t.mul(16,t.PI)).mul(o.pow2().add(1))),Gt=p.FnLayout({name:"miePhaseFunction",type:Ve,inputs:[{name:"g",type:O},{name:"cosViewLight",type:O}]})(([o,e])=>t.div(3,t.PI.mul(8)).mul(o.pow2().oneMinus()).div(o.pow2().add(2)).mul(e.pow2().add(1)).div(o.pow2().sub(o.mul(2).mul(e)).add(1).pow(1.5))),Be=p.FnLayout({name:"getScatteringTextureCoord",type:"vec4",inputs:[{name:"parameters",type:$},{name:"radius",type:k},{name:"cosView",type:O},{name:"cosLight",type:O},{name:"cosViewLight",type:O},{name:"intersectsGround",type:"bool"}]})(([o,e,n,s,i,a])=>{const{topRadius:r,bottomRadius:c,minCosLight:d,scatteringTextureRadiusSize:u,scatteringTextureCosViewSize:l,scatteringTextureCosLightSize:m}=H(o),g=t.sqrt(r.pow2().sub(c.pow2())).toConst(),h=mt(e.pow2().sub(c.pow2())).toConst(),x=dt(h.div(g),u),f=e.mul(n).toConst(),y=f.pow2().sub(e.pow2()).add(c.pow2()).toConst(),C=t.float(0).toVar();t.If(a,()=>{const R=f.negate().sub(mt(y)),z=e.sub(c).toConst(),E=h;C.assign(dt(E.equal(z).select(0,R.remap(z,E)),l.div(2)).oneMinus().mul(.5))}).Else(()=>{const R=f.negate().add(mt(y.add(g.pow2()))),z=r.sub(e).toConst(),E=h.add(g);C.assign(dt(R.remap(z,E),l.div(2)).add(1).mul(.5))});const T=r.sub(c).toConst(),v=g,N=ft(o,c,s).remap(T,v).toConst(),F=ft(o,c,d).remap(T,v),L=dt(t.max(N.div(F).oneMinus(),0).div(N.add(1)),m),U=i.add(1).mul(.5);return t.vec4(U,L,C,x)}),Bt=p.FnVar((o,e,n,s,i,a)=>r=>{const c=it(r),{parametersNode:d}=c,{scatteringTextureCosViewLightSize:u}=d,l=Be(d,e,n,s,i,a).toConst(),m=l.x.mul(u.sub(1)).toConst(),g=t.floor(m).toConst(),h=m.sub(g).toConst(),x=t.vec3(g.add(l.y).div(u),l.z,l.w),f=t.vec3(g.add(1).add(l.y).div(u),l.z,l.w);return o.sample(x).mul(h.oneMinus()).add(o.sample(f).mul(h)).rgb}),vn=p.FnLayout({name:"getIrradianceTextureUV",type:"vec2",inputs:[{name:"parameters",type:$},{name:"radius",type:k},{name:"cosLight",type:O}]})(([o,e,n])=>{const{topRadius:s,bottomRadius:i,irradianceTextureSize:a}=H(o),r=e.remap(i,s),c=n.mul(.5).add(.5);return t.vec2(dt(c,a.x),dt(r,a.y))}),xe=p.FnVar((o,e,n)=>s=>{const i=it(s),{parametersNode:a}=i,r=vn(a,e,n);return o.sample(r).rgb}),Me=p.FnLayout({name:"getLayerDensity",type:O,inputs:[{name:"layer",type:Pt},{name:"altitude",type:k}]})(([o,e])=>{const n=o.get("expTerm"),s=o.get("expScale"),i=o.get("linearTerm"),a=o.get("constantTerm");return n.mul(t.exp(s.mul(e))).add(i.mul(e)).add(a).saturate()}),Dt=p.FnLayout({name:"getProfileDensity",type:O,inputs:[{name:"layer",type:Tt},{name:"altitude",type:k}]})(([o,e])=>e.lessThan(o.get("layer0").get("width")).select(Me(o.get("layer0"),e),Me(o.get("layer1"),e))),lt=p.FnLayout({name:"getUnitRangeFromTextureCoord",type:"float",inputs:[{name:"coord",type:"float"},{name:"textureSize",type:"float"}]})(([o,e])=>{const n=e.reciprocal();return o.sub(n.mul(.5)).div(n.oneMinus())}),Ot=t.struct({radius:k,cosView:O,cosLight:O,cosViewLight:O,intersectsGround:"bool"},"ScatteringParams"),wn=p.FnLayout({typeOnly:!0,name:"getParamsFromScatteringTextureCoord",type:Ot,inputs:[{name:"parameters",type:$},{name:"coord",type:"vec4"}]})(([o,e])=>{const{bottomRadius:n,topRadius:s,minCosLight:i,scatteringTextureRadiusSize:a,scatteringTextureCosViewSize:r,scatteringTextureCosLightSize:c}=H(o),d=t.sqrt(s.pow2().sub(n.pow2())).toConst(),u=d.mul(lt(e.w,a)).toConst(),l=t.sqrt(u.pow2().add(n.pow2())),m=t.float(0).toVar(),g=t.bool().toVar();t.If(e.z.lessThan(.5),()=>{const M=l.sub(n).toConst(),F=u,L=M.add(F.sub(M).mul(lt(e.z.mul(2).oneMinus(),r.div(2)))).toConst();m.assign(L.equal(0).select(-1,ot(u.pow2().add(L.pow2()).negate().div(t.mul(2,l,L))))),g.assign(t.bool(!0))}).Else(()=>{const M=s.sub(l).toConst(),F=u.add(d),L=M.add(F.sub(M).mul(lt(e.z.mul(2).sub(1),r.div(2)))).toConst();m.assign(L.equal(0).select(1,ot(d.pow2().sub(u.pow2()).sub(L.pow2()).div(t.mul(2,l,L))))),g.assign(t.bool(!1))});const h=lt(e.y,c).toConst(),x=s.sub(n).toConst(),f=d,C=ft(o,n,i).remap(x,f).toConst(),T=C.sub(h.mul(C)).div(h.mul(C).add(1)),v=x.add(t.min(T,C).mul(f.sub(x))).toConst(),w=v.equal(0).select(1,ot(d.pow2().sub(v.pow2()).div(t.mul(2,n,v)))),N=ot(e.x.mul(2).sub(1));return Ot(l,m,w,N,g)}),Nn=p.FnLayout({typeOnly:!0,name:"getParamsFromScatteringTextureFragCoord",type:Ot,inputs:[{name:"parameters",type:$},{name:"fragCoord",type:"vec3"}]})(([o,e])=>{const{scatteringTextureRadiusSize:n,scatteringTextureCosViewSize:s,scatteringTextureCosLightSize:i,scatteringTextureCosViewLightSize:a}=H(o),r=t.floor(e.x.div(i)),c=e.x.mod(i),d=t.vec4(a.sub(1),i,s,n),u=t.vec4(r,c,e.y,e.z).div(d),l=wn(o,u).toConst(),m=l.get("radius"),g=l.get("cosView"),h=l.get("cosLight"),x=l.get("cosViewLight").toVar(),f=l.get("intersectsGround"),y=t.sqrt(g.pow2().oneMinus().mul(h.pow2().oneMinus())).toConst();return x.assign(t.clamp(x,g.mul(h).sub(y),g.mul(h).add(y))),Ot(m,g,h,x,f)}),Oe=p.FnLayout({name:"getExtrapolatedSingleMieScattering",type:ht,inputs:[{name:"scattering",type:"vec4"},{name:"rayleighScattering",type:"vec3"},{name:"mieScattering",type:"vec3"}]})(([o,e,n])=>{const s=t.vec3(0).toVar();return t.If(o.r.greaterThanEqual(1e-5),()=>{s.assign(o.rgb.mul(o.a).div(o.r).mul(e.r.div(n.r)).mul(n.div(e)))}),s}),bn=t.struct({scattering:ht,singleMieScattering:ht},"CombinedScattering"),xt=p.FnVar((o,e,n,s,i,a,r,c)=>d=>{const u=it(d),{rayleighScattering:l,mieScattering:m,scatteringTextureCosViewLightSize:g}=H(o),h=Be(o,s,i,a,r,c).toConst(),x=h.x.mul(g.sub(1)).toConst(),f=t.floor(x).toConst(),y=x.sub(f).toConst(),C=t.vec3(f.add(h.y).div(g),h.z,h.w).toConst(),T=t.vec3(f.add(1).add(h.y).div(g),h.z,h.w).toConst(),v=t.vec3(0).toVar(),w=t.vec3(0).toVar();if(u.parameters.combinedScatteringTextures){const N=t.add(e.sample(C).mul(y.oneMinus()),e.sample(T).mul(y)).toConst();v.assign(N.rgb),w.assign(Oe(N,l,m))}else v.assign(t.add(e.sample(C).mul(y.oneMinus()),e.sample(T).mul(y)).rgb),w.assign(t.add(n.sample(C).mul(y.oneMinus()),n.sample(T).mul(y)).rgb);return bn(v,w)}),Mt=t.struct({radiance:ze,transmittance:gt},"RadianceTransfer"),Fn=p.FnLayout({name:"getSubUVFromTextureUnit",type:"vec2",inputs:[{name:"unit",type:"vec2"},{name:"textureSize",type:"vec2"}]})(([o,e])=>o.add(t.float(.5).div(e)).mul(e.div(e.add(1)))),qe=p.FnLayout({name:"getTextureUnitFromSubUV",type:"vec2",inputs:[{name:"subUV",type:"vec2"},{name:"textureSize",type:"vec2"}]})(([o,e])=>o.sub(t.float(.5).div(e)).mul(e.div(e.sub(1)))),Ee=t.struct({rayleighScattering:ut,mieScattering:ut,scattering:ut,extinction:ut},"AtmosphereMedium"),Se=p.FnLayout({name:"sampleAtmosphereMedium",type:Ee,inputs:[{name:"parameters",type:$},{name:"altitude",type:k}]})(([o,e])=>{const n=H(o),s=Dt(n.rayleighDensity,e),i=Dt(n.mieDensity,e),a=Dt(n.absorptionDensity,e),r=s.mul(n.rayleighScattering),c=r,d=i.mul(n.mieScattering),u=i.mul(n.mieExtinction),l=a.mul(n.absorptionExtinction),m=t.add(r,d),g=t.add(c,u,l);return Ee(r,d,m,g)}),Ln=t.struct({multipleScattering:ze,transferFactor:gt},"MultipleScattering"),Ge=p.FnVar((o,e,n,s,i,a)=>{const{solarIrradiance:r,bottomRadius:c,groundAlbedo:d}=H(o),u=ge(o,n,s).toConst(),l=Pe(o,n,s,u).toConst(),m=t.vec3(0).toVar(),g=t.vec3(0).toVar(),h=t.vec3(1).toVar(),x=t.float(0).toVar(),f=20;return t.Loop({type:"float",start:0,end:f},({i:y})=>{const C=l.mul(y.add(.3)).div(f).toConst(),T=C.sub(x).toConst();x.assign(C);const v=Ft(o,t.sqrt(C.pow2().add(t.mul(2,n,s,C)).add(n.pow2()))).toConst(),w=ot(n.mul(i).add(C.mul(a)).div(v)).toConst(),N=v.sub(c),M=Se(o,N).toConst(),F=M.get("scattering"),L=M.get("extinction"),U=L.mul(T).toConst(),R=t.exp(U.negate()).toConst(),z=St(e,v,w).toConst(),E=F.sub(F.mul(R)).div(L).toConst();g.addAssign(h.mul(E));const A=z.mul(F.mul(1/(4*Math.PI))).toConst(),D=A.sub(A.mul(R)).div(L).toConst();m.addAssign(h.mul(D)),h.mulAssign(R)}),t.If(u,()=>{const y=ot(n.mul(i).add(l.mul(a)).div(c)).toConst(),C=St(e,c,y).toConst();m.addAssign(r.mul(C,h,y.saturate(),d,1/Math.PI))}),Ln(m,g)}),ke=p.FnVar((o,e,n,s)=>{const{topRadius:i,bottomRadius:a,multipleScatteringTextureSize:r}=H(o),c=Fn(t.vec2(s.mul(.5).add(.5),n.sub(a).div(i.sub(a))).saturate(),r);return e.sample(c).rgb}),Mn=t.struct({scattering:ht,singleMieScattering:ht,higherOrderScattering:Tn},"Scattering"),We=p.FnVar((o,e,n)=>s=>{const i=it(s),{parametersNode:a}=i,{solarIrradiance:r,bottomRadius:c}=a,d=Nn(a,n).toConst(),u=d.get("radius"),l=d.get("cosView"),m=d.get("cosLight"),g=d.get("cosViewLight"),h=d.get("intersectsGround"),x=Pe(a,u,l,h).toConst(),C=t.mix(14,30,x.mul(1/100)).toConst(),T=C.floor().toConst(),v=T.reciprocal().toConst(),w=x.mul(T).div(C).toConst(),N=Lt(g).toConst(),M=t.vec3(0).toVar(),F=t.vec3(0).toVar(),L=t.vec3(0).toVar(),U=t.vec3(1).toVar();return t.Loop({type:"float",start:0,end:C},({i:R})=>{const z=R.mul(v).toVar(),E=R.add(1).mul(v).toVar();z.mulAssign(z),E.mulAssign(E),z.mulAssign(w),E.assign(E.greaterThan(1).select(x,w.mul(E)));const A=E.sub(z),D=z.add(A.mul(.3)),I=Ft(a,t.sqrt(D.pow2().add(t.mul(2,u,l,D)).add(u.pow2()))).toConst(),b=ot(u.mul(m).add(D.mul(g)).div(I)).toConst(),q=I.sub(c),P=Se(a,q).toConst(),B=P.get("rayleighScattering"),G=P.get("mieScattering"),_=P.get("scattering"),X=P.get("extinction"),et=X.mul(A),j=t.exp(et.negate()).toConst(),at=St(o,I,b).toConst(),K=ke(a,e,I,b).mul(_).toConst();let Q=at.mul(B);i.parameters.higherOrderScatteringTexture||(Q=Q.add(K.div(N))),Q=r.mul(Q).toConst();const Y=Q.sub(Q.mul(j)).div(X).toConst();M.addAssign(U.mul(Y));const nt=r.mul(at.mul(G)).toConst(),Rt=nt.sub(nt.mul(j)).div(X).toConst();F.addAssign(U.mul(Rt));const st=r.mul(K),J=st.sub(st.mul(j)).div(X).toConst();L.addAssign(U.mul(J)),U.mulAssign(j)}),Mn(M,F,L)}),En=p.FnVar((o,e,n,s,i,a,r)=>{const{lutNode:c,parametersNode:d,scatteringSampleCount:u}=o,l=c.getTextureNode("transmittance"),m=c.getTextureNode("multipleScattering"),{solarIrradiance:g,bottomRadius:h,miePhaseFunctionG:x}=d,f=t.mix(u.x,u.y,a.mul(1/100)).toConst(),y=f.floor().toConst(),C=y.reciprocal().toConst(),T=a.mul(y).div(f).toConst(),v=Gt(x,i).toConst(),w=Lt(i).toConst(),N=t.vec2(r.y,r.y.add(r.x)).toConst(),M=t.vec3(0).toVar(),F=t.vec3(1).toVar();return t.Loop({type:"float",start:0,end:f},({i:L})=>{const U=L.mul(C).toVar(),R=L.add(1).mul(C).toVar();U.mulAssign(U),R.mulAssign(R),U.mulAssign(T),R.assign(R.greaterThan(1).select(a,T.mul(R)));const z=R.sub(U),E=U.add(z.mul(p.stbn)),A=Ft(d,t.sqrt(E.pow2().add(t.mul(2,e,n,E)).add(e.pow2()))).toConst(),D=ot(e.mul(s).add(E.mul(i)).div(A)).toConst(),I=A.sub(h),b=Se(d,I).toConst(),q=b.get("rayleighScattering"),P=b.get("mieScattering"),B=b.get("scattering"),G=b.get("extinction"),_=G.mul(z),X=t.exp(_.negate()).toConst(),et=St(l,A,D).toConst(),j=ke(d,m,A,D).mul(B).toConst(),at=t.step(t.vec2(E,N.y),t.vec2(N.x,E)).toConst(),K=at.x.add(at.y).min(1).toConst(),Q=t.add(q.mul(w),P.mul(v));let Y;o.parameters.higherOrderScatteringTexture?Y=g.mul(et.mul(Q).mul(K).add(j)).toConst():Y=g.mul(et.mul(Q).add(j).mul(K)).toConst();const nt=Y.sub(Y.mul(X)).div(G).toConst();M.addAssign(F.mul(nt)),F.mulAssign(X)}),Mt(M,F)}),$t=p.FnLayout({name:"computeOpticalDepthToTopAtmosphereBoundary",type:k,inputs:[{name:"parameters",type:$},{name:"profile",type:Tt},{name:"radius",type:k},{name:"cosView",type:O}]})(([o,e,n,s])=>{const{bottomRadius:i}=H(o),a=500,r=ft(o,n,s).div(a).toConst(),c=t.float(0).toVar();return t.Loop({start:0,end:a,condition:"<="},({i:d})=>{const u=t.float(d).mul(r).toConst(),l=t.sqrt(t.add(u.pow2(),t.mul(2,n,s,u),n.pow2())).toConst(),m=Dt(e,l.sub(i)),g=t.vec2(d).equal(t.vec2(0,a)).any().select(.5,1);c.addAssign(m.mul(g).mul(r))}),c}),Rn=p.FnLayout({name:"computeTransmittanceToTopAtmosphereBoundary",type:gt,inputs:[{name:"parameters",type:$},{name:"radius",type:k},{name:"cosView",type:O}]})(([o,e,n])=>{const{rayleighDensity:s,rayleighScattering:i,mieDensity:a,mieExtinction:r,absorptionDensity:c,absorptionExtinction:d}=H(o),u=$t(o,s,e,n),l=$t(o,a,e,n),m=$t(o,c,e,n),g=t.add(i.mul(u),r.mul(l),d.mul(m)).toConst();return t.exp(g.negate())}),Vn=p.FnLayout({typeOnly:!0,name:"getParamsFromTransmittanceTextureUV",type:"vec2",inputs:[{name:"parameters",type:$},{name:"uv",type:"vec2"}]})(([o,e])=>{const{topRadius:n,bottomRadius:s,transmittanceTextureSize:i}=H(o),a=lt(e.x,i.x),r=lt(e.y,i.y),c=t.sqrt(n.pow2().sub(s.pow2())).toConst(),d=c.mul(r).toConst(),u=t.sqrt(d.pow2().add(s.pow2())),l=n.sub(u).toConst(),m=d.add(c),g=l.add(a.mul(m.sub(l))).toConst(),h=g.equal(0).select(1,c.pow2().sub(d.pow2()).sub(g.pow2()).div(t.mul(2,u,g)));return t.vec2(u,h)}),He=p.FnVar(o=>e=>{const n=it(e),{parametersNode:s}=n,{transmittanceTextureSize:i}=s,a=Vn(s,o.div(i)).toConst(),r=a.x,c=a.y;return Rn(s,r,c)}),zn=p.FnLayout({typeOnly:!0,name:"getParamsFromIrradianceTextureUV",type:"vec2",inputs:[{name:"parameters",type:$},{name:"uv",type:"vec2"}]})(([o,e])=>{const{topRadius:n,bottomRadius:s,irradianceTextureSize:i}=H(o),a=lt(e.x,i.x),r=lt(e.y,i.y),c=s.add(r.mul(n.sub(s))),d=ot(a.mul(2).sub(1));return t.vec2(c,d)}),Ze=p.FnVar((o,e,n)=>s=>{const i=it(s),{parametersNode:a}=i,{miePhaseFunctionG:r,irradianceTextureSize:c}=a,d=zn(a,n.div(c)).toConst(),u=d.x,l=d.y,m=32,g=Math.PI/m,h=Math.PI/m,x=t.vec3(0).toVar(),f=t.vec3(t.sqrt(l.pow2().oneMinus()),0,l).toConst();return t.Loop({start:0,end:m/2,name:"j"},({j:y})=>{const C=t.float(y).add(.5).mul(h).toConst();t.Loop({start:0,end:m*2},({i:T})=>{const v=t.float(T).add(.5).mul(g).toConst(),w=t.vec3(t.cos(v).mul(t.sin(C)),t.sin(v).mul(t.sin(C)),t.cos(C)).toConst(),N=t.sin(C).mul(h*g),M=w.dot(f),F=xt(a,o,o,u,w.z,l,M,t.bool(!1));let L=t.vec3(0);i.parameters.higherOrderScatteringTexture&&(L=Bt(e,u,w.z,l,M,t.bool(!1)));const U=F.get("scattering"),R=F.get("singleMieScattering"),z=Lt(M),E=Gt(r,M);x.addAssign(U.mul(z).add(R.mul(E)).add(L).mul(w.z,N))})}),x});function Xt(o){const e=new S.RenderTarget(1,1,{depthBuffer:!1,format:S.RGBAFormat}),n=e.texture;return n.minFilter=S.LinearFilter,n.magFilter=S.LinearFilter,n.colorSpace=S.NoColorSpace,n.generateMipmaps=!1,n.name=o,e}function Qt(o){const e=new S.RenderTarget3D(1,1,1,{depthBuffer:!1,format:S.RGBAFormat}),n=e.texture;return n.minFilter=S.LinearFilter,n.magFilter=S.LinearFilter,n.colorSpace=S.NoColorSpace,n.generateMipmaps=!1,n.name=o,e}function jt(o,e,n){o.texture.type=e,o.setSize(n.x,n.y)}function _t(o,e,n){o.texture.type=e,o.setSize(n.x,n.y,n.z),o.texture.isArrayTexture=!1}class An extends Ue{}class Un extends Ie{constructor(){super(),this.mesh=new V.QuadMesh,this.layer=t.uniform(0),this.mesh.name="AtmosphereLUTTexturesWebGL",this.transmittanceRT=Xt("transmittance"),this.multipleScatteringRT=Xt("multipleScattering"),this.scatteringRT=Qt("scattering"),this.singleMieScatteringRT=Qt("singleMieScattering"),this.higherOrderScatteringRT=Qt("higherOrderScattering"),this.irradianceRT=Xt("irradiance")}get(e){return this[`${e}RT`].texture}createContext(){return Z.invariant(this.parameters!=null),Z.invariant(this.textureType!=null),new An(this.parameters,this.textureType)}renderToRenderTarget(e,n,s){s!=null&&n.textures.push(...s.filter(i=>i!=null)),e.setRenderTarget(n),this.mesh.render(e),n.textures.length=1}renderToRenderTarget3D(e,n,s,i){i!=null&&n.textures.push(...i.filter(a=>a!=null));for(let a=0;a<n.depth;++a)s.value=a,e.setRenderTarget(n,a),this.mesh.render(e);n.textures.length=1}createMaterial(e){const n=new V.NodeMaterial;return n.fragmentNode=e,n.needsUpdate=!0,n}computeTransmittance(e,n){this.transmittanceMaterial?.dispose(),this.transmittanceMaterial=this.createMaterial(t.mrt({transmittance:He(t.screenCoordinate).context({getAtmosphere:()=>n})})),this.mesh.material=this.transmittanceMaterial,this.renderToRenderTarget(e,this.transmittanceRT)}computeMultipleScattering(e,n){const{parameters:s,parametersNode:i}=n,a=64,r=p.FnVar(d=>{const u=t.float(d),l=u.mul(2*Math.PI/((1+Math.sqrt(5))/2)),m=t.acos(u.add(.5).mul(2/a).oneMinus()),g=t.cos(m),h=t.sin(m),x=t.cos(l),f=t.sin(l);return t.vec3(x.mul(h),f.mul(h),g)}),c=t.Fn(()=>{const d=t.vec2(s.multipleScatteringTextureSize),u=qe(t.screenCoordinate.div(d),d).toConst(),{topRadius:l,bottomRadius:m}=i,g=u.x.mul(2).sub(1).toConst(),h=t.vec3(0,t.sqrt(g.pow2().oneMinus().saturate()),g).toConst(),x=0,f=m.add(u.y.add(x).saturate().mul(l.sub(m).sub(x))).toConst(),y=t.vec3(0).toVar(),C=t.vec3(0).toVar();return t.Loop({start:0,end:a},({i:T})=>{const v=r(T).toConst(),w=v.z,N=v.dot(h).toConst(),M=Ge(i,t.texture(this.transmittanceRT.texture),f,w,g,N).context({getAtmosphere:()=>n}).toConst();y.addAssign(M.get("multipleScattering").div(a)),C.addAssign(M.get("transferFactor").div(a))}),y.mul(C.oneMinus().reciprocal())});this.multipleScatteringMaterial?.dispose(),this.multipleScatteringMaterial=this.createMaterial(t.mrt({multipleScattering:t.vec4(c(),1)})),this.mesh.material=this.multipleScatteringMaterial,this.renderToRenderTarget(e,this.multipleScatteringRT)}computeScattering(e,n){const{parameters:s}=n;this.scatteringMaterial?.dispose(),this.scatteringMaterial=this.createMaterial((()=>{const a=We(t.texture(this.transmittanceRT.texture),t.texture(this.multipleScatteringRT.texture),t.vec3(t.screenCoordinate,this.layer.add(.5))).context({getAtmosphere:()=>n}).toConst(),r=a.get("scattering"),c=a.get("singleMieScattering"),d=a.get("higherOrderScattering"),u={};return s.combinedScatteringTextures?u.scattering=t.vec4(r,c.r):(u.scattering=t.vec4(r,c.r),u.singleMieScattering=t.vec4(c,1)),s.higherOrderScatteringTexture&&(u.higherOrderScattering=t.vec4(d,1)),t.mrt(u)})()),this.mesh.material=this.scatteringMaterial;const i=[];s.combinedScatteringTextures||i.push(this.singleMieScatteringRT.texture),s.higherOrderScatteringTexture&&i.push(this.higherOrderScatteringRT.texture),this.renderToRenderTarget3D(e,this.scatteringRT,this.layer,i)}computeIrradiance(e,n){this.irradianceMaterial?.dispose(),this.irradianceMaterial=this.createMaterial(t.mrt({irradiance:Ze(t.texture3D(this.scatteringRT.texture),t.texture3D(this.higherOrderScatteringRT.texture),t.screenCoordinate).context({getAtmosphere:()=>n})})),this.mesh.material=this.irradianceMaterial,this.renderToRenderTarget(e,this.irradianceRT)}setup(e,n){jt(this.transmittanceRT,n,e.transmittanceTextureSize),jt(this.multipleScatteringRT,n,e.multipleScatteringTextureSize),_t(this.scatteringRT,n,e.scatteringTextureSize),e.combinedScatteringTextures||_t(this.singleMieScatteringRT,n,e.scatteringTextureSize),e.higherOrderScatteringTexture&&_t(this.higherOrderScatteringRT,n,e.scatteringTextureSize),jt(this.irradianceRT,n,e.irradianceTextureSize),super.setup(e,n)}dispose(){this.transmittanceRT.dispose(),this.multipleScatteringRT.dispose(),this.scatteringRT.dispose(),this.irradianceRT.dispose(),this.transmittanceMaterial?.dispose(),this.multipleScatteringMaterial?.dispose(),this.scatteringMaterial?.dispose(),this.irradianceMaterial?.dispose(),this.mesh.geometry.dispose(),super.dispose()}}function Kt(o){const e=new V.StorageTexture(1,1);return e.minFilter=S.LinearFilter,e.magFilter=S.LinearFilter,e.colorSpace=S.NoColorSpace,e.generateMipmaps=!1,e.name=o,e}function Yt(o){const e=new V.Storage3DTexture(1,1,1);return e.minFilter=S.LinearFilter,e.magFilter=S.LinearFilter,e.colorSpace=S.NoColorSpace,e.generateMipmaps=!1,e.name=o,e}function Jt(o,e,n){o.type=e,tt.reinterpretType(o.image),o.image.width=n.x,o.image.height=n.y}function te(o,e,n){o.type=e,tt.reinterpretType(o.image),o.image.width=n.x,o.image.height=n.y,o.image.depth=n.z}class In extends Ue{}class Dn extends Ie{constructor(){super(),this.transmittance=Kt("transmittance"),this.multipleScattering=Kt("multipleScattering"),this.scattering=Yt("scattering"),this.singleMieScattering=Yt("singleMieScattering"),this.higherOrderScattering=Yt("higherOrderScattering"),this.irradiance=Kt("irradiance")}get(e){return this[e]}createContext(){return Z.invariant(this.parameters!=null),Z.invariant(this.textureType!=null),new In(this.parameters,this.textureType)}computeTransmittance(e,n){const{parameters:s}=n,{x:i,y:a}=s.transmittanceTextureSize;this.transmittanceNode?.dispose(),this.transmittanceNode=t.Fn(()=>{const r=t.uvec2(i,a);t.If(t.globalId.xy.greaterThanEqual(r).any(),()=>{t.Return()});const c=He(t.vec2(t.globalId.xy).add(.5));t.textureStore(this.transmittance,t.globalId.xy,c)})().context({getAtmosphere:()=>n}).computeKernel([8,8,1]).setName("transmittance"),e.compute(this.transmittanceNode,[Math.ceil(i/8),Math.ceil(a/8),1])}computeMultipleScattering(e,n){const{parameters:s,parametersNode:i}=n,{x:a,y:r}=s.multipleScatteringTextureSize,c=64,d=p.FnVar(u=>{const l=t.float(u),m=l.mul(2*Math.PI/((1+Math.sqrt(5))/2)),g=t.acos(l.add(.5).mul(2/c).oneMinus()),h=t.cos(g),x=t.sin(g),f=t.cos(m),y=t.sin(m);return t.vec3(f.mul(x),y.mul(x),h)});this.multipleScatteringNode?.dispose(),this.multipleScatteringNode=t.Fn(()=>{const u=t.workgroupArray("vec3",c),l=t.workgroupArray("vec3",c),m=t.vec2(a,r).toConst(),g=t.vec2(t.globalId.xy).add(.5),h=qe(g.div(m),m).toConst(),x=t.globalId.z,{topRadius:f,bottomRadius:y}=i,C=h.x.mul(2).sub(1).toConst(),T=t.vec3(0,t.sqrt(C.pow2().oneMinus().saturate()),C).toConst(),v=0,w=y.add(h.y.add(v).saturate().mul(f.sub(y).sub(v))).toConst(),N=d(x).toConst(),M=N.z,F=N.dot(T).toConst(),L=Ge(i,t.texture(this.transmittance),w,M,C,F).toConst();u.element(x).assign(L.get("multipleScattering").div(c)),l.element(x).assign(L.get("transferFactor").div(c)),t.workgroupBarrier();for(let z=c>>1;z>0;z>>>=1){const E=t.uint(z);t.If(x.lessThan(E),()=>{u.element(x).addAssign(u.element(x.add(E))),l.element(x).addAssign(l.element(x.add(E)))}),t.workgroupBarrier()}t.If(x.greaterThan(0),()=>{t.Return()});const U=u.element(t.uint(0)),R=l.element(t.uint(0));t.textureStore(this.multipleScattering,t.globalId.xy,t.vec4(U.mul(R.oneMinus().reciprocal()),1))})().context({getAtmosphere:()=>n}).computeKernel([1,1,c]).setName("multipleScattering"),e.compute(this.multipleScatteringNode,[a,r,1])}computeScattering(e,n){const{parameters:s}=n,{x:i,y:a,z:r}=s.scatteringTextureSize;this.scatteringNode?.dispose(),this.scatteringNode=t.Fn(()=>{const c=t.uvec3(i,a,r);t.If(t.globalId.greaterThanEqual(c).any(),()=>{t.Return()});const d=We(t.texture(this.transmittance),t.texture(this.multipleScattering),t.vec3(t.globalId).add(.5)).toConst(),u=d.get("scattering"),l=d.get("singleMieScattering");if(s.combinedScatteringTextures?t.textureStore(this.scattering,t.globalId,t.vec4(u,l.r)):(t.textureStore(this.scattering,t.globalId,t.vec4(u,1)),t.textureStore(this.singleMieScattering,t.globalId,t.vec4(l,1))),s.higherOrderScatteringTexture){const m=d.get("higherOrderScattering");t.textureStore(this.higherOrderScattering,t.globalId,t.vec4(m,1))}})().context({getAtmosphere:()=>n}).computeKernel([4,4,4]).setName("scattering"),e.compute(this.scatteringNode,[Math.ceil(i/4),Math.ceil(a/4),Math.ceil(r/4)])}computeIrradiance(e,n){const{parameters:s}=n,{x:i,y:a}=s.irradianceTextureSize;this.irradianceNode?.dispose(),this.irradianceNode=t.Fn(()=>{const r=t.uvec2(i,a);t.If(t.globalId.xy.greaterThanEqual(r).any(),()=>{t.Return()});const c=Ze(t.texture3D(this.scattering),t.texture3D(this.higherOrderScattering),t.vec2(t.globalId.xy).add(.5));t.textureStore(this.irradiance,t.globalId.xy,c)})().context({getAtmosphere:()=>n}).computeKernel([8,8,1]).setName("irradiance"),e.compute(this.irradianceNode,[Math.ceil(i/8),Math.ceil(a/8),1])}setup(e,n){Jt(this.transmittance,n,e.transmittanceTextureSize),Jt(this.multipleScattering,n,e.multipleScatteringTextureSize),te(this.scattering,n,e.scatteringTextureSize),e.combinedScatteringTextures||te(this.singleMieScattering,n,e.scatteringTextureSize),e.higherOrderScatteringTexture&&te(this.higherOrderScattering,n,e.scatteringTextureSize),Jt(this.irradiance,n,e.irradianceTextureSize),super.setup(e,n)}dispose(){this.transmittance.dispose(),this.multipleScattering.dispose(),this.scattering.dispose(),this.singleMieScattering.dispose(),this.higherOrderScattering.dispose(),this.irradiance.dispose(),this.transmittanceNode?.dispose(),this.multipleScatteringNode?.dispose(),this.scatteringNode?.dispose(),this.irradianceNode?.dispose(),super.dispose()}}class ct{constructor(e=0,n=0,s=0,i=0,a=0){this.width=e,this.expTerm=n,this.expScale=s,this.linearTerm=i,this.constantTerm=a}copy(e){return this.width=e.width,this.expTerm=e.expTerm,this.expScale=e.expScale,this.linearTerm=e.linearTerm,this.constantTerm=e.constantTerm,this}clone(){return new ct().copy(this)}}class Ct{constructor(e){this.layers=e}copy(e){return this.layers=[e.layers[0].clone(),e.layers[1].clone()],this}clone(){return new Ct([this.layers[0].clone(),this.layers[1].clone()])}}const Pn=new S.Vector3(.2126,.7152,.0722);class Et{constructor(){this.worldToUnit=.001,this.solarIrradiance=new S.Vector3(1.474,1.8504,1.91198),this.sunAngularRadius=.004675,this.bottomRadius=636e4,this.topRadius=642e4,this.rayleighDensity=new Ct([new ct,new ct(0,1,-1/8e3)]),this.rayleighScattering=new S.Vector3(5802e-9,13558e-9,331e-7),this.mieDensity=new Ct([new ct,new ct(0,1,-1/1200)]),this.mieScattering=new S.Vector3().setScalar(3996e-9),this.mieExtinction=new S.Vector3().setScalar(444e-8),this.miePhaseFunctionG=.8,this.absorptionDensity=new Ct([new ct(25e3,0,0,1/15e3,-2/3),new ct(0,0,0,-1/15e3,8/3)]),this.absorptionExtinction=new S.Vector3(65e-8,1881e-9,85e-9),this.groundAlbedo=new S.Vector3().setScalar(.3),this.minCosLight=Math.cos(tt.radians(120)),this.sunRadianceToLuminance=new S.Vector3(98242.786222,69954.398112,66475.012354),this.skyRadianceToLuminance=new S.Vector3(114974.91644,71305.954816,65310.548555),this.luminanceScale=1/Pn.dot(this.sunRadianceToLuminance),this.combinedScatteringTextures=!0,this.higherOrderScatteringTexture=!0,this.transmittanceTextureSize=new S.Vector2(256,64),this.irradianceTextureSize=new S.Vector2(64,16),this.multipleScatteringTextureSize=new S.Vector2(64,64),this.scatteringTextureRadiusSize=32,this.scatteringTextureCosViewSize=128,this.scatteringTextureCosLightSize=32,this.scatteringTextureCosViewLightSize=8,this.scatteringTextureSize=new S.Vector3,this.update()}copy(e){return this.worldToUnit=e.worldToUnit,this.solarIrradiance.copy(e.solarIrradiance),this.sunAngularRadius=e.sunAngularRadius,this.bottomRadius=e.bottomRadius,this.topRadius=e.topRadius,this.rayleighDensity.copy(e.rayleighDensity),this.rayleighScattering.copy(e.rayleighScattering),this.mieDensity.copy(e.mieDensity),this.mieScattering.copy(e.mieScattering),this.mieExtinction.copy(e.mieExtinction),this.miePhaseFunctionG=e.miePhaseFunctionG,this.absorptionDensity.copy(e.absorptionDensity),this.absorptionExtinction.copy(e.absorptionExtinction),this.groundAlbedo.copy(e.groundAlbedo),this.minCosLight=e.minCosLight,this.sunRadianceToLuminance.copy(e.sunRadianceToLuminance),this.skyRadianceToLuminance.copy(e.skyRadianceToLuminance),this.luminanceScale=e.luminanceScale,this.combinedScatteringTextures=e.combinedScatteringTextures,this.transmittanceTextureSize.copy(e.transmittanceTextureSize),this.irradianceTextureSize.copy(e.irradianceTextureSize),this.multipleScatteringTextureSize.copy(e.multipleScatteringTextureSize),this.scatteringTextureRadiusSize=e.scatteringTextureRadiusSize,this.scatteringTextureCosViewSize=e.scatteringTextureCosViewSize,this.scatteringTextureCosLightSize=e.scatteringTextureCosLightSize,this.scatteringTextureCosViewLightSize=e.scatteringTextureCosViewLightSize,this.scatteringTextureSize.copy(e.scatteringTextureSize),this}update(){return this.scatteringTextureSize.set(this.scatteringTextureCosViewLightSize*this.scatteringTextureCosLightSize,this.scatteringTextureCosViewSize,this.scatteringTextureRadiusSize),this}clone(){return new Et().copy(this)}get minCosSun(){return this.minCosLight}set minCosSun(e){this.minCosLight=e}get scatteringTextureCosSunSize(){return this.scatteringTextureCosLightSize}set scatteringTextureCosSunSize(e){this.scatteringTextureCosLightSize=e}get scatteringTextureCosViewSunSize(){return this.scatteringTextureCosViewLightSize}set scatteringTextureCosViewSunSize(e){this.scatteringTextureCosViewLightSize=e}get transmittancePrecisionLog(){return!1}set transmittancePrecisionLog(e){}}const{resetRendererState:Bn,restoreRendererState:On}=V.RendererUtils;async function qn(o){const e=o[Symbol.iterator]();return await new Promise((n,s)=>{const i=()=>{try{const{value:a,done:r}=e.next();r===!0?n(a):Z.requestIdleCallback(i)}catch(a){s(a instanceof Error?a:new Error)}};Z.requestIdleCallback(i)})}let ee;function Ut(o,e){return ee=Bn(o,ee),o.setClearColor(0,0),o.autoClear=!1,e(),On(o,ee),!0}const ne=new S.Texture,se=(()=>{const o=new S.Data3DTexture(new Uint8Array(4));return o.format=S.RGBAFormat,o.needsUpdate=!0,o})(),Gn={type:"update"};class $e extends V.Node{constructor(e=new Et,n){super(null),this.textureNodes={transmittance:p.outputTexture(this,ne),multipleScattering:p.outputTexture(this,ne),scattering:p.outputTexture3D(this,se),singleMieScattering:p.outputTexture3D(this,se),higherOrderScattering:p.outputTexture3D(this,se),irradiance:p.outputTexture(this,ne)},this.updating=!1,this.updateBeforeType=V.NodeUpdateType.FRAME,this.parameters=e,this.textureType=n}static get type(){return"AtmosphereLUTNode"}getTextureNode(e){return this.textureNodes[e]}dispatchUpdate(){this.dispatchEvent(Gn)}*performCompute(e,n){const{textures:s}=this;Z.invariant(s!=null),yield Ut(e,()=>{s.computeTransmittance(e,n),this.dispatchUpdate()}),yield Ut(e,()=>{s.computeMultipleScattering(e,n),this.dispatchUpdate()}),yield Ut(e,()=>{s.computeScattering(e,n),this.dispatchUpdate()}),yield Ut(e,()=>{s.computeIrradiance(e,n),this.dispatchUpdate()})}async updateTextures(e){Z.invariant(this.textures!=null);const n=this.textures.createContext();this.updating=!0;try{await qn(this.performCompute(e,n))}finally{this.updating=!1,n.dispose(),this.disposeQueue?.()}}updateBefore({renderer:e}){e==null||this.version===this.currentVersion||(this.currentVersion=this.version,this.updateTextures(e).catch(n=>{throw n instanceof Error?n:new Error}))}setup(e){if(this.textures==null){this.textures=p.isWebGPU(e)?new Dn:new Un;const{transmittance:s,irradiance:i,multipleScattering:a,scattering:r,singleMieScattering:c,higherOrderScattering:d}=this.textureNodes;s.value=this.textures.get("transmittance"),a.value=this.textures.get("multipleScattering"),r.value=this.textures.get("scattering"),c.value=this.textures.get("singleMieScattering"),d.value=this.textures.get("higherOrderScattering"),i.value=this.textures.get("irradiance")}const n=tt.isFloatLinearSupported(e.renderer)?this.textureType??S.FloatType:S.HalfFloatType;return this.parameters.update(),this.textures.setup(this.parameters,n),super.setup(e)}dispose(){if(this.updating){this.disposeQueue=()=>{this.dispose(),this.disposeQueue=void 0};return}this.textures?.dispose(),this.textures=void 0,super.dispose()}}const kn=new S.Vector3,Wn=new tt.Geodetic;class ye extends pe{constructor(e=new Et,n=new $e(e)){super(e),this.matrixWorldToECEF=t.uniform("mat4").setName("matrixWorldToECEF"),this.matrixECIToECEF=t.uniform("mat4").setName("matrixECIToECEF"),this.sunDirectionECEF=t.uniform("vec3").setName("sunDirectionECEF"),this.moonDirectionECEF=t.uniform("vec3").setName("moonDirectionECEF"),this.matrixMoonFixedToECEF=t.uniform("mat4").setName("matrixMoonFixedToECEF"),this.scatteringSampleCount=t.uniform(new S.Vector2(4,14)),this.matrixECEFToWorld=t.uniform("mat4").setName("matrixECEFToWorld").onRenderUpdate((s,{value:i})=>{i.copy(this.matrixWorldToECEF.value).transpose()}),this.cameraPositionECEF=t.uniform("vec3").setName("cameraPositionECEF").onRenderUpdate((s,{value:i})=>{const a=this.camera??s.camera;a!=null&&i.setFromMatrixPosition(a.matrixWorld).applyMatrix4(this.matrixWorldToECEF.value)}),this.altitudeCorrectionECEF=t.uniform("vec3").setName("altitudeCorrectionECEF").onRenderUpdate((s,{value:i})=>{const a=this.camera??s.camera;a!=null&&Z.getAltitudeCorrectionOffset(i.setFromMatrixPosition(a.matrixWorld).applyMatrix4(this.matrixWorldToECEF.value),this.parameters.bottomRadius,this.ellipsoid,i)}),this.cameraHeight=t.uniform(0).setName("cameraHeight").onRenderUpdate((s,i)=>{const a=this.camera??s.camera;if(a==null)return;const r=kn.setFromMatrixPosition(a.matrixWorld).applyMatrix4(this.matrixWorldToECEF.value);i.value=Wn.setFromECEF(r).height}),this.cameraPositionUnit=this.cameraPositionECEF.mul(this.parametersNode.worldToUnit).toConst("cameraPositionUnit"),this.altitudeCorrectionUnit=this.altitudeCorrectionECEF.mul(this.parametersNode.worldToUnit).toConst("altitudeCorrectionUnit"),this.ellipsoid=tt.Ellipsoid.WGS84,this.correctAltitude=!0,this.constrainCamera=!0,this.showGround=!0,this.accurateShadowScattering=!0,this.raymarchScattering=!0,this.lutNode=n}dispose(){this.lutNode.dispose(),super.dispose()}}const Hn=ye;function W(o){if(typeof o.context.getAtmosphere!="function")throw new Error("getAtmosphere() was not found in the builder context.");const e=o.context.getAtmosphere();if(!(e instanceof ye))throw new Error("getAtmosphere() must return an instanceof AtmosphereContext.");return e}const Zn=t.Fn(o=>{const{parametersNode:e}=W(o),{worldToUnit:n}=e;return t.positionView.z.mul(n)}).once()().toVar("viewZUnit"),re=(o,e,n,s,i,a)=>{const r=Ft(o,t.sqrt(a.pow2().add(t.mul(2,e,n,a)).add(e.pow2()))).toConst(),c=e.mul(n).add(a).div(r).toConst(),d=e.mul(s).add(a.mul(i)).div(r).toConst();return{radius:r,cosView:c,cosLight:d}},$n=p.FnVar((o,e,n,s,i)=>{const{lutNode:a,parametersNode:r}=o,c=a.getTextureNode("transmittance"),d=a.getTextureNode("scattering"),u=a.getTextureNode("singleMieScattering"),{topRadius:l,bottomRadius:m,miePhaseFunctionG:g}=r,h=e.length().toVar();e=e.toVar(),o.constrainCamera&&t.If(h.lessThan(m),()=>{h.assign(m),e.assign(e.normalize().mul(h))});const x=e.dot(n).toVar(),f=x.negate().sub(mt(x.pow2().sub(h.pow2()).add(l.pow2()))).toConst();s=s.toVar(),t.If(f.greaterThan(0),()=>{e.assign(e.add(n.mul(f))),h.assign(l),x.addAssign(f),s.y.assign(s.y.sub(f).max(0))});const y=t.vec3(0).toVar(),C=t.vec3(1).toVar();return t.If(h.lessThanEqual(l),()=>{const T=x.div(h).toConst(),v=e.dot(i).div(h).toConst(),w=n.dot(i).toConst(),N=ge(r,h,T).toVar();C.assign(N.select(0,yt(c,h,T))),o.showGround||N.assign(t.bool(!1));const M=t.vec3(0).toVar(),F=t.vec3(0).toVar(),L=b=>{const q=re(r,h,T,v,w,b),P=xt(r,d,u,q.radius,q.cosView,q.cosLight,w,N).toConst(),B=It(c,h,T,b,N);return{S:P.get("scattering"),M:P.get("singleMieScattering"),T:B}},U=s.y.add(s.x).toConst(),R=()=>{const b=L(s.x);M.assign(b.T.mul(b.S)),F.assign(b.T.mul(b.M))},z=()=>{const b=xt(r,d,u,h,T,v,w,N).toConst(),q=b.get("scattering"),P=b.get("singleMieScattering"),B=L(s.y),G=L(U);M.assign(q.sub(B.T.mul(B.S).sub(G.T.mul(G.S)).max(0))),F.assign(P.sub(B.T.mul(B.M).sub(G.T.mul(G.M)).max(0)))},E=t.If(s.x.equal(0),()=>{const b=xt(r,d,u,h,T,v,w,N).toConst();M.assign(b.get("scattering")),F.assign(b.get("singleMieScattering"))});o.accurateShadowScattering?E.Else(z):E.Else(R);let A=t.vec3(0);if(o.parameters.higherOrderScatteringTexture){const b=a.getTextureNode("higherOrderScattering");A=Bt(b,h,T,v,w,N)}const D=Lt(w),I=Gt(g,w);y.assign(M.mul(D).add(F.mul(I)).add(A))}),Mt(y,C)}),Xn=p.FnVar((o,e,n,s,i,a,r)=>{const{lutNode:c,parametersNode:d}=o,u=c.getTextureNode("transmittance"),l=c.getTextureNode("scattering"),m=c.getTextureNode("singleMieScattering"),{rayleighScattering:g,mieScattering:h,miePhaseFunctionG:x}=d,f=ge(d,e,n).toConst(),y=It(u,e,n,a,f).toConst(),C=t.vec3(0).toVar(),T=t.vec3(0).toVar(),v=(A,D)=>{const I=re(d,e,n,s,i,A),b=xt(d,l,m,I.radius,I.cosView,I.cosLight,i,f).toConst();return{S:b.get("scattering"),M:b.get("singleMieScattering"),T:D??It(u,e,n,A,f)}},w=r.y.add(r.x).toConst(),N=t.vec3(r.xy,a).greaterThan(t.vec3(0,0,w)).toConst(),M=N.x,F=()=>{const A=xt(d,l,m,e,n,s,i,f).toConst(),D=a.sub(r.x).max(0).toConst(),I=v(D,M.select(It(u,e,n,D,f),y)),b=A.get("scattering"),q=A.get("singleMieScattering");C.assign(b.sub(I.T.mul(I.S))),T.assign(q.sub(I.T.mul(I.M)))},L=()=>{const A=v(w),D=v(a,y);C.assign(A.T.mul(A.S).sub(y.mul(D.S))),T.assign(A.T.mul(A.M).sub(y.mul(D.M)))},U=()=>{const A=xt(d,l,m,e,n,s,i,f).toConst(),D=A.get("scattering"),I=A.get("singleMieScattering"),b=v(r.y),q=v(w),P=v(a);C.assign(D.sub(y.mul(P.S),b.T.mul(b.S).sub(q.T.mul(q.S)).max(0))),T.assign(I.sub(y.mul(P.M),b.T.mul(b.M).sub(q.T.mul(q.M)).max(0)))};o.accurateShadowScattering?t.If(M.and(N.y.not()).and(N.z),L).ElseIf(M.and(N.z),U).Else(F):F(),o.parameters.combinedScatteringTextures&&T.assign(Oe(t.vec4(C,T.r),g,h)),T.assign(T.mul(t.smoothstep(0,.01,s)));let R=t.vec3(0);if(o.parameters.higherOrderScatteringTexture){const A=c.getTextureNode("higherOrderScattering"),D=Bt(A,e,n,s,i,f).toConst(),I=re(d,e,n,s,i,a),b=Bt(A,I.radius,I.cosView,I.cosLight,i,f).toConst();R=D.sub(y.mul(b))}const z=Lt(i),E=Gt(x,i);return C.assign(C.mul(z).add(T.mul(E)).add(R)),Mt(C,y)}),Qn=p.FnVar((o,e,n,s,i,a,r)=>{const c=En(o,e,n,s,i,a,r).toConst(),d=c.get("radiance"),u=c.get("transmittance");return Mt(d,u)}),jn=p.FnVar((o,e,n,s,i)=>{const{parametersNode:a}=o,{topRadius:r,bottomRadius:c}=a,d=t.vec3(0).toVar(),u=t.vec3(1).toVar(),l=n.sub(e).toConst(),m=e.dot(l).negate().div(l.dot(l)).saturate().toConst(),g=e.add(m.mul(l)).length().toConst();return t.If(g.lessThan(r),()=>{const h=l.length().toConst();if(!o.raymarchScattering){const F=c.add(r.sub(c).mul(.01)).toConst(),L=n.mul(F.div(n.length()).max(1)).toConst(),U=l.div(h);e=t.mix(e.mul(F.div(e.length()).max(1)),e.add(L.sub(n)),e.normalize().dot(U).pow2()).toConst(),n=L}const x=n.sub(e).normalize().toConst(),f=e.length().toVar(),y=e.dot(x).toVar(),C=y.negate().sub(mt(y.pow2().sub(f.pow2()).add(r.pow2()))).toConst(),T=e.toVar();s=s.toVar(),t.If(C.greaterThan(0),()=>{T.addAssign(x.mul(C)),f.assign(r),y.addAssign(C),s.y.assign(s.y.sub(C).max(0))});const v=y.div(f),w=T.dot(i).div(f),N=x.dot(i),M=T.distance(n);if(o.raymarchScattering){const F=Qn(o,f,v,w,N,M,s).toConst();d.assign(F.get("radiance")),u.assign(F.get("transmittance"))}else{const F=Xn(o,f,v,w,N,M,s).toConst();d.assign(F.get("radiance")),u.assign(F.get("transmittance"))}if(!o.raymarchScattering){const F=h.div(e.distance(n));d.assign(d.mul(F)),u.assign(u.pow(F))}}),Mt(d,u)}),Xe=t.struct({direct:ht,indirect:ht},"SplitIrradiance"),_n=p.FnVar((o,e,n,s)=>{const{lutNode:i,parametersNode:a}=o,r=i.getTextureNode("transmittance"),c=i.getTextureNode("irradiance"),{solarIrradiance:d}=a,u=e.length().toConst(),l=e.dot(s).div(u).toConst(),m=d.mul(St(r,u,l),n.dot(s).max(0)),g=xe(c,u,l).mul(n.dot(e).div(u).add(1).mul(.5));return Xe(m,g)}),Kn=p.FnVar((o,e,n,s)=>{const{lutNode:i}=o,a=i.getTextureNode("irradiance"),r=e.length().toConst(),c=e.dot(s).div(r).toConst();return xe(a,r,c).mul(n.dot(e).div(r).add(1).mul(.5))}),Yn=p.FnVar((o,e,n)=>{const{lutNode:s,parametersNode:i}=o,a=s.getTextureNode("transmittance"),r=s.getTextureNode("irradiance"),{solarIrradiance:c}=i,d=e.length().toConst(),u=e.dot(n).div(d).toConst(),l=c.mul(St(a,d,u)),m=xe(r,d,u).mul(t.PI2);return Xe(l,m)}),Qe=p.FnVar(()=>o=>{const e=it(o),{parametersNode:n}=e,{solarIrradiance:s,sunAngularRadius:i,sunRadianceToLuminance:a,luminanceScale:r}=n;return s.div(t.PI.mul(i.pow2())).mul(a.mul(r))}),je=t.struct({luminance:Ae,transmittance:gt},"LuminanceTransfer"),ce=p.FnVar((o,e,n,s)=>i=>{const a=W(i),{parametersNode:r}=a,{skyRadianceToLuminance:c,luminanceScale:d}=r,u=$n(a,o,e,n,s),l=u.get("radiance").mul(c.mul(d));return je(l,u.get("transmittance"))}),ue=p.FnVar((o,e,n,s)=>i=>{const a=W(i),{parametersNode:r}=a,{skyRadianceToLuminance:c,luminanceScale:d}=r,u=jn(a,o,e,n,s).toConst(),l=u.get("radiance").mul(c.mul(d));return je(l,u.get("transmittance"))}),_e=t.struct({direct:be,indirect:be},"SplitIlluminance"),de=p.FnVar((o,e,n)=>s=>{const i=W(s),{parametersNode:a}=i,{sunRadianceToLuminance:r,skyRadianceToLuminance:c,luminanceScale:d}=a,u=_n(i,o,e,n).toConst(),l=u.get("direct").mul(r.mul(d)),m=u.get("indirect").mul(c.mul(d));return _e(l,m)}),Ke=p.FnVar((o,e,n)=>s=>{const i=W(s),{parametersNode:a}=i,{skyRadianceToLuminance:r,luminanceScale:c}=a;return Kn(i,o,e,n).mul(r.mul(c))}),Jn=p.FnVar((o,e)=>n=>{const s=W(n),{parametersNode:i}=s,{sunRadianceToLuminance:a,skyRadianceToLuminance:r,luminanceScale:c}=i,d=Yn(s,o,e).toConst(),u=d.get("direct").mul(a.mul(c)),l=d.get("indirect").mul(r.mul(c));return _e(u,l)}),ts=p.FnLayout({name:"getLunarRadiance",type:Ae,inputs:[{name:"parameters",type:$},{name:"moonAngularRadius",type:"float"}]})(([o,e])=>{const{solarIrradiance:n,sunRadianceToLuminance:s,luminanceScale:i}=H(o);return n.mul(25e-7).div(t.PI.mul(e.pow2())).mul(s.mul(i))}),es=p.FnLayout({name:"raySphereIntersectionNormal",type:"vec3",inputs:[{name:"rayDirection",type:"vec3"},{name:"centerDirection",type:"vec3"},{name:"angularRadius",type:"float"}]})(([o,e,n])=>{const s=e.dot(o),i=e.sub(o.mul(s)).negate().toConst(),a=t.sqrt(n.pow2().sub(i.dot(i)).max(0));return i.sub(o.mul(a)).div(n)}),ns=p.FnLayout({name:"orenNayarDiffuse",type:"float",inputs:[{name:"lightDirection",type:"vec3"},{name:"viewDirection",type:"vec3"},{name:"normal",type:"vec3"}]})(([o,e,n])=>{const s=n.dot(o).toConst(),i=n.dot(e).toConst(),a=o.dot(e).sub(s.mul(i)).toConst(),r=t.mix(1,t.max(s,i).max(.1),a.smoothstep(0,.1)),c=1/Math.PI*(1-.5*(1/1.33)+.17*(1/1.13)),d=1/Math.PI*(.45*(1/1.09));return s.max(0).mul(a.div(r).mul(d).add(c))});class Ye extends V.TempNode{constructor(){super("vec4"),this.angularRadius=t.uniform(.0045),this.intensity=t.uniform(1),this.displacementScale=t.uniform(65535*.5/1727400)}static get type(){return"MoonNode"}setup(e){const n=W(e),{rayDirectionECEF:s}=this;if(s==null)return;const{sunDirectionECEF:i,moonDirectionECEF:a,matrixMoonFixedToECEF:r}=n;return t.Fn(()=>{const c=t.cos(this.angularRadius).oneMinus().mul(2),d=s.sub(a),u=d.dot(d),l=t.fwidth(u),m=t.vec2().toVar(),g=t.vec3().toVar(),h=t.vec3().toVar();t.If(u.lessThan(c),()=>{g.assign(es(s,a,this.angularRadius)),h.assign(r.transpose().mul(t.vec4(g,0)).xyz),m.assign(t.equirectUV(h.xzy))});const x=t.dFdx(m).toConst(),f=t.dFdy(m).toConst(),y=t.dFdx(h).toConst(),C=t.dFdy(h).toConst(),T=t.vec4(0).toVar();return t.If(u.lessThan(c),()=>{if(this.displacementNode!=null){const M=this.displacementNode.sample(m.add(x)).x,F=this.displacementNode.sample(m.sub(x)).x,L=this.displacementNode.sample(m.add(f)).x,U=this.displacementNode.sample(m.sub(f)).x,R=M.sub(F).mul(.5),z=L.sub(U).mul(.5),E=C.cross(h).toConst(),A=h.cross(y).toConst(),D=y.dot(E).toConst(),I=E.mul(R).add(A.mul(z)).mul(D.sign()),b=h.mul(D.abs()).sub(I.mul(this.displacementScale)).normalize();h.assign(t.mix(h,b,g.dot(s.negate()).smoothstep(0,.3))),g.assign(r.mul(t.vec4(h,0)).xyz)}const v=this.colorNode?.sample(m).xyz??1,w=ns(i,s.negate(),g),N=t.smoothstep(c,c.sub(l),u);T.assign(t.vec4(ts(n.parametersNode,this.angularRadius).mul(this.intensity).mul(v).mul(w),N))}),T})()}}const{resetRendererState:ss,restoreRendererState:os}=V.RendererUtils;function is(){const o=new V.RenderTarget(1,1,{depthBuffer:!1,type:S.HalfFloatType,format:S.RGBAFormat}),e=o.texture;return e.minFilter=S.LinearFilter,e.magFilter=S.LinearFilter,e.generateMipmaps=!1,e.name="Stars",o}const as=p.FnLayout({name:"log10",type:"float",inputs:[{name:"x",type:"float"}]})(([o])=>t.log(o).mul(1/Math.log(10))),rs=p.FnVar((o,e)=>{const s=o.add(as(e.mul(425e8)).mul(2.5)).toConst();return t.pow(10,s.mul(-.4)).mul(108e3)}),cs=new S.Vector2;class Je extends V.TempNode{constructor(e=Z.DEFAULT_STARS_DATA_URL){super("vec3"),this.pointSize=t.uniform(1),this.intensity=t.uniform(1e3),this.magnitudeRange=t.uniform(new S.Vector2(-2,8)),this.material=new V.PointsNodeMaterial,this.points=new S.Sprite(this.material),this.updateBeforeType=V.NodeUpdateType.FRAME,this.material.name="Stars",this.data=e,this.renderTarget=is(),this.textureNode=p.outputTexture(this,this.renderTarget.texture)}static get type(){return"StarsNode"}getTextureNode(){return this.textureNode}setSize(e,n){return this.renderTarget.setSize(e,n),this}updateBefore(e){const{renderer:n}=e,s=this.camera??e.camera;if(n==null||s==null)return